Return to BSD News archive
Received: by minnie.vk1xwt.ampr.org with NNTP id AA6221 ; Wed, 06 Jan 93 03:10:25 EST Path: sserve!manuel.anu.edu.au!munnari.oz.au!uunet!mcsun!fuug!kiae!demos!newsserv From: "Andrew A. Chernov, Black Mage" <ache@astral.msk.su> Newsgroups: comp.unix.bsd Subject: [386bsd] Patch for curses library, make it clean 8-bit Date: Fri, 08 Jan 93 18:06:29 +0300 Distribution: world Organization: Ha-oh-lahm Yetzirah Message-ID: <WHrXPJh8b6@astral.msk.su> Sender: news-service@newcom.kiae.su Reply-To: ache@astral.msk.su Lines: 864 Standard curses library use eight bit for standout mode, so 8-bit characters displays like highlighted 7-bit characters. This patch produce library which is fully compatible with all curses programs and add 8-bit chars to all input/display functions. *** addbytes.c.was Sun Apr 21 00:13:50 1991 --- addbytes.c Fri Jan 8 15:46:02 1993 *************** *** 37,49 **** # include "curses.ext" /* * This routine adds the character to the current position * */ ! waddbytes(win, bytes, count) reg WINDOW *win; ! reg char *bytes; reg int count; { #define SYNCH_OUT() {win->_cury = y; win->_curx = x;} --- 37,65 ---- # include "curses.ext" + waddbytes(win, bytes, count) + reg WINDOW *win; + reg char *bytes; + int count; + { + chtype c; + reg int i; + + for (i = 0; i < count; i++) { + c = (unsigned char) *bytes++; + if (_waddbytes(win, &c, 1) == ERR) + return ERR; + } + return OK; + } + /* * This routine adds the character to the current position * */ ! _waddbytes(win, bytes, count) reg WINDOW *win; ! reg chtype *bytes; reg int count; { #define SYNCH_OUT() {win->_cury = y; win->_curx = x;} *************** *** 52,69 **** reg int newx; SYNCH_IN(); - # ifdef FULLDEBUG - fprintf(outf, "ADDBYTES('%c') at (%d, %d)\n", c, y, x); - # endif while (count--) { ! register int c; ! static char blanks[] = " "; c = *bytes++; switch (c) { case '\t': SYNCH_IN(); ! if (waddbytes(win, blanks, 8-(x%8)) == ERR) { return ERR; } SYNCH_OUT(); --- 68,82 ---- reg int newx; SYNCH_IN(); while (count--) { ! register chtype c; ! static chtype blanks[] = {' ',' ',' ',' ',' ',' ',' ',' '}; c = *bytes++; switch (c) { case '\t': SYNCH_IN(); ! if (_waddbytes(win, blanks, 8-(x%8)) == ERR) { return ERR; } SYNCH_OUT(); *** addch.c.was Sun Apr 21 00:13:50 1991 --- addch.c Fri Jan 8 15:40:46 1993 *************** *** 43,49 **** */ waddch(win, c) WINDOW *win; ! char c; { ! return waddbytes(win, &c, 1); } --- 43,49 ---- */ waddch(win, c) WINDOW *win; ! chtype c; { ! return _waddbytes(win, &c, 1); } *** addstr.c.was Sun Apr 21 00:13:50 1991 --- addstr.c Fri Jan 8 17:22:38 1993 *************** *** 43,52 **** */ waddstr(win,str) reg WINDOW *win; ! reg char *str; { # ifdef DEBUG fprintf(outf, "WADDSTR(\"%s\")\n", str); # endif ! return waddbytes(win, str, strlen(str)); } --- 43,59 ---- */ waddstr(win,str) reg WINDOW *win; ! char *str; { + chtype c; + reg char *s; # ifdef DEBUG fprintf(outf, "WADDSTR(\"%s\")\n", str); # endif ! for (s = str; *s;) { ! c = (unsigned char) *s++; ! if (_waddbytes(win, &c, 1) == ERR) ! return ERR; ! } ! return OK; } *** box.c.was Sun Apr 21 00:13:50 1991 --- box.c Fri Jan 8 17:00:54 1993 *************** *** 44,54 **** */ box(win, vert, hor) reg WINDOW *win; ! char vert, hor; { reg int i; reg int endy, endx; ! reg char *fp, *lp; endx = win->_maxx; endy = win->_maxy - 1; --- 44,54 ---- */ box(win, vert, hor) reg WINDOW *win; ! chtype vert, hor; { reg int i; reg int endy, endx; ! reg chtype *fp, *lp; endx = win->_maxx; endy = win->_maxy - 1; *** clrtobot.c.was Sun Apr 21 00:13:51 1991 --- clrtobot.c Fri Jan 8 15:51:42 1993 *************** *** 45,51 **** reg WINDOW *win; { reg int y; ! reg char *sp, *end, *maxx; reg int startx, minx; startx = win->_curx; --- 45,51 ---- reg WINDOW *win; { reg int y; ! reg chtype *sp, *end, *maxx; reg int startx, minx; startx = win->_curx; *** clrtoeol.c.was Sun Apr 21 00:13:51 1991 --- clrtoeol.c Fri Jan 8 15:53:06 1993 *************** *** 44,52 **** wclrtoeol(win) reg WINDOW *win; { ! reg char *sp, *end; reg int y, x; ! reg char *maxx; reg int minx; y = win->_cury; --- 44,52 ---- wclrtoeol(win) reg WINDOW *win; { ! reg chtype *sp, *end; reg int y, x; ! reg chtype *maxx; reg int minx; y = win->_cury; *** cr_put.c.was Sun Apr 21 00:13:51 1991 --- cr_put.c Fri Jan 8 16:46:36 1993 *************** *** 180,185 **** --- 180,186 ---- { register int i, j, k; register int soutcol, soutline; + chtype ch; plodcnt = plodflg = cnt; soutcol = outcol; *************** *** 373,381 **** if (plodflg) /* avoid a complex calculation */ plodcnt--; else { ! i = curscr->_y[outline][outcol]; ! if ((i&_STANDOUT) == (curscr->_flags&_STANDOUT)) ! _putchar(i & 0177); else goto nondes; } --- 374,382 ---- if (plodflg) /* avoid a complex calculation */ plodcnt--; else { ! ch = curscr->_y[outline][outcol]; ! if ((ch&_STANDOUT) == (curscr->_flags&_STANDOUT)) ! _putchar(ch); else goto nondes; } *** curses.h.was Sun Apr 21 00:13:52 1991 --- curses.h Fri Jan 8 17:03:22 1993 *************** *** 44,49 **** --- 44,51 ---- #define bool char #define reg register + typedef unsigned short chtype; + #define TRUE (1) #define FALSE (0) #define ERR (0) *************** *** 55,61 **** #define _FLUSH 010 #define _FULLLINE 020 #define _IDLINE 040 ! #define _STANDOUT 0200 #define _NOCHANGE -1 #define _puts(s) tputs(s, 0, _putchar) --- 57,63 ---- #define _FLUSH 010 #define _FULLLINE 020 #define _IDLINE 040 ! #define _STANDOUT 0400 #define _NOCHANGE -1 #define _puts(s) tputs(s, 0, _putchar) *************** *** 92,98 **** bool _clear; bool _leave; bool _scroll; ! char **_y; short *_firstch; short *_lastch; struct _win_st *_nextp, *_orig; --- 94,100 ---- bool _clear; bool _leave; bool _scroll; ! chtype **_y; short *_firstch; short *_lastch; struct _win_st *_nextp, *_orig; *************** *** 127,133 **** #define addch(ch) VOID(waddch(stdscr, ch)) #define getch() VOID(wgetch(stdscr)) #define addbytes(da,co) VOID(waddbytes(stdscr, da,co)) ! #define addstr(str) VOID(waddbytes(stdscr, str, strlen(str))) #define getstr(str) VOID(wgetstr(stdscr, str)) #define move(y, x) VOID(wmove(stdscr, y, x)) #define clear() VOID(wclear(stdscr)) --- 129,135 ---- #define addch(ch) VOID(waddch(stdscr, ch)) #define getch() VOID(wgetch(stdscr)) #define addbytes(da,co) VOID(waddbytes(stdscr, da,co)) ! #define addstr(str) VOID(waddstr(stdscr, str)) #define getstr(str) VOID(wgetstr(stdscr, str)) #define move(y, x) VOID(wmove(stdscr, y, x)) #define clear() VOID(wclear(stdscr)) *************** *** 151,157 **** #define mvwaddbytes(win,y,x,da,co) \ VOID(wmove(win,y,x)==ERR?ERR:waddbytes(win,da,co)) #define mvwaddstr(win,y,x,str) \ ! VOID(wmove(win,y,x)==ERR?ERR:waddbytes(win,str,strlen(str))) #define mvwgetstr(win,y,x,str) VOID(wmove(win,y,x)==ERR?ERR:wgetstr(win,str)) #define mvwinch(win,y,x) VOID(wmove(win,y,x) == ERR ? ERR : winch(win)) #define mvwdelch(win,y,x) VOID(wmove(win,y,x) == ERR ? ERR : wdelch(win)) --- 153,159 ---- #define mvwaddbytes(win,y,x,da,co) \ VOID(wmove(win,y,x)==ERR?ERR:waddbytes(win,da,co)) #define mvwaddstr(win,y,x,str) \ ! VOID(wmove(win,y,x)==ERR?ERR:waddstr(win,str)) #define mvwgetstr(win,y,x,str) VOID(wmove(win,y,x)==ERR?ERR:wgetstr(win,str)) #define mvwinch(win,y,x) VOID(wmove(win,y,x) == ERR ? ERR : winch(win)) #define mvwdelch(win,y,x) VOID(wmove(win,y,x) == ERR ? ERR : wdelch(win)) *************** *** 174,180 **** #define scrollok(win,bf) (win->_scroll = bf) #define flushok(win,bf) (bf ? (win->_flags |= _FLUSH):(win->_flags &= ~_FLUSH)) #define getyx(win,y,x) y = win->_cury, x = win->_curx ! #define winch(win) (win->_y[win->_cury][win->_curx] & 0177) #define raw() (_tty.sg_flags|=RAW, _pfast=_rawmode=TRUE, \ ioctl(_tty_ch, TIOCSETP, &_tty)) --- 176,182 ---- #define scrollok(win,bf) (win->_scroll = bf) #define flushok(win,bf) (bf ? (win->_flags |= _FLUSH):(win->_flags &= ~_FLUSH)) #define getyx(win,y,x) y = win->_cury, x = win->_curx ! #define winch(win) (win->_y[win->_cury][win->_curx] & 0xFF) #define raw() (_tty.sg_flags|=RAW, _pfast=_rawmode=TRUE, \ ioctl(_tty_ch, TIOCSETP, &_tty)) *** delch.c.was Sun Apr 21 00:13:52 1991 --- delch.c Fri Jan 8 15:56:16 1993 *************** *** 45,53 **** wdelch(win) reg WINDOW *win; { ! reg char *temp1, *temp2; ! reg char *end; ! reg int lch; end = &win->_y[win->_cury][win->_maxx - 1]; temp1 = &win->_y[win->_cury][win->_curx]; --- 45,52 ---- wdelch(win) reg WINDOW *win; { ! reg chtype *temp1, *temp2; ! reg chtype *end; end = &win->_y[win->_cury][win->_maxx - 1]; temp1 = &win->_y[win->_cury][win->_curx]; *** deleteln.c.was Sun Apr 21 00:13:52 1991 --- deleteln.c Fri Jan 8 16:00:59 1993 *************** *** 45,53 **** wdeleteln(win) reg WINDOW *win; { ! reg char *temp; reg int y; ! reg char *end; reg int x; # ifdef DEBUG --- 45,53 ---- wdeleteln(win) reg WINDOW *win; { ! reg chtype *temp; reg int y; ! reg chtype *end; reg int x; # ifdef DEBUG *************** *** 58,64 **** if (win->_orig == NULL) win->_y[y] = win->_y[y + 1]; else ! bcopy(win->_y[y + 1], win->_y[y], win->_maxx); touchline(win, y, 0, win->_maxx - 1); } if (win->_orig == NULL) --- 58,64 ---- if (win->_orig == NULL) win->_y[y] = win->_y[y + 1]; else ! bcopy(win->_y[y + 1], win->_y[y], win->_maxx * sizeof(chtype)); touchline(win, y, 0, win->_maxx - 1); } if (win->_orig == NULL) *** erase.c.was Sun Apr 21 00:13:53 1991 --- erase.c Fri Jan 8 16:03:21 1993 *************** *** 45,51 **** reg WINDOW *win; { reg int y; ! reg char *sp, *end, *start, *maxx; reg int minx; # ifdef DEBUG --- 45,51 ---- reg WINDOW *win; { reg int y; ! reg chtype *sp, *end, *start, *maxx; reg int minx; # ifdef DEBUG *** getch.c.was Sun Apr 21 00:13:53 1991 --- getch.c Fri Jan 8 16:06:46 1993 *************** *** 45,51 **** reg WINDOW *win; { reg bool weset = FALSE; ! reg char inp; if (!win->_scroll && (win->_flags&_FULLWIN) && win->_curx == win->_maxx - 1 && win->_cury == win->_maxy - 1) --- 45,51 ---- reg WINDOW *win; { reg bool weset = FALSE; ! reg int inp; if (!win->_scroll && (win->_flags&_FULLWIN) && win->_curx == win->_maxx - 1 && win->_cury == win->_maxy - 1) *************** *** 58,70 **** weset++; } inp = getchar(); # ifdef DEBUG fprintf(outf,"WGETCH got '%s'\n",unctrl(inp)); # endif if (_echoit) { mvwaddch(curscr, win->_cury + win->_begy, ! win->_curx + win->_begx, inp); ! waddch(win, inp); } if (weset) nocbreak(); --- 58,72 ---- weset++; } inp = getchar(); + if (inp != EOF) { # ifdef DEBUG fprintf(outf,"WGETCH got '%s'\n",unctrl(inp)); # endif if (_echoit) { mvwaddch(curscr, win->_cury + win->_begy, ! win->_curx + win->_begx, (unsigned char) inp); ! waddch(win, (unsigned char) inp); ! } } if (weset) nocbreak(); *** getstr.c.was Sun Apr 21 00:13:54 1991 --- getstr.c Fri Jan 8 16:09:33 1993 *************** *** 44,56 **** wgetstr(win,str) reg WINDOW *win; reg char *str; { ! while ((*str = wgetch(win)) != ERR && *str != '\n') ! str++; ! if (*str == ERR) { *str = '\0'; return ERR; - } - *str = '\0'; return OK; } --- 44,55 ---- wgetstr(win,str) reg WINDOW *win; reg char *str; { + int c; ! while ((c = wgetch(win)) != ERR && c != EOF && c != '\n') ! *str++ = c; *str = '\0'; + if (c == ERR) return ERR; return OK; } *** insch.c.was Sun Apr 21 00:13:54 1991 --- insch.c Fri Jan 8 16:11:22 1993 *************** *** 44,53 **** */ winsch(win, c) reg WINDOW *win; ! char c; { ! reg char *temp1, *temp2; ! reg char *end; end = &win->_y[win->_cury][win->_curx]; temp1 = &win->_y[win->_cury][win->_maxx - 1]; --- 44,53 ---- */ winsch(win, c) reg WINDOW *win; ! chtype c; { ! reg chtype *temp1, *temp2; ! reg chtype *end; end = &win->_y[win->_cury][win->_curx]; temp1 = &win->_y[win->_cury][win->_maxx - 1]; *** insertln.c.was Sun Apr 21 00:13:55 1991 --- insertln.c Fri Jan 8 16:00:59 1993 *************** *** 45,53 **** winsertln(win) reg WINDOW *win; { ! reg char *temp; reg int y; ! reg char *end; reg int x; #ifdef DEBUG --- 45,53 ---- winsertln(win) reg WINDOW *win; { ! reg chtype *temp; reg int y; ! reg chtype *end; reg int x; #ifdef DEBUG *************** *** 59,65 **** if (win->_orig == NULL) win->_y[y] = win->_y[y - 1]; else ! bcopy(win->_y[y - 1], win->_y[y], win->_maxx); touchline(win, y, 0, win->_maxx - 1); } if (win->_orig == NULL) --- 59,65 ---- if (win->_orig == NULL) win->_y[y] = win->_y[y - 1]; else ! bcopy(win->_y[y - 1], win->_y[y], win->_maxx * sizeof(chtype)); touchline(win, y, 0, win->_maxx - 1); } if (win->_orig == NULL) *** newwin.c.was Sun Apr 21 00:13:56 1991 --- newwin.c Fri Jan 8 16:18:59 1993 *************** *** 55,61 **** int num_lines, num_cols, begy, begx; { reg WINDOW *win; ! reg char *sp; reg int i, by, bx, nl, nc; reg int j; --- 55,61 ---- int num_lines, num_cols, begy, begx; { reg WINDOW *win; ! reg chtype *sp; reg int i, by, bx, nl, nc; reg int j; *************** *** 87,93 **** win->_lastch[i] = _NOCHANGE; } for (i = 0; i < nl; i++) ! if ((win->_y[i] = malloc(nc * sizeof win->_y[0])) == NULL) { for (j = 0; j < i; j++) free(win->_y[j]); free(win->_firstch); --- 87,93 ---- win->_lastch[i] = _NOCHANGE; } for (i = 0; i < nl; i++) ! if ((win->_y[i] = (chtype *) malloc(nc * sizeof(chtype))) == NULL) { for (j = 0; j < i; j++) free(win->_y[j]); free(win->_firstch); *************** *** 188,194 **** # ifdef DEBUG fprintf(outf, "MAKENEW: nl = %d\n", nl); # endif ! if ((win->_y = (char **) malloc(nl * sizeof win->_y[0])) == NULL) { free(win); return NULL; } --- 188,194 ---- # ifdef DEBUG fprintf(outf, "MAKENEW: nl = %d\n", nl); # endif ! if ((win->_y = (chtype **) malloc(nl * sizeof(chtype *))) == NULL) { free(win); return NULL; } *** overlay.c.was Sun Apr 21 00:13:56 1991 --- overlay.c Fri Jan 8 16:21:04 1993 *************** *** 36,42 **** #endif /* not lint */ # include "curses.ext" - # include <ctype.h> # define min(a,b) (a < b ? a : b) # define max(a,b) (a > b ? a : b) --- 36,41 ---- *************** *** 48,54 **** overlay(win1, win2) reg WINDOW *win1, *win2; { ! reg char *sp, *end; reg int x, y, endy, endx, starty, startx; reg int y1,y2; --- 47,53 ---- overlay(win1, win2) reg WINDOW *win1, *win2; { ! reg chtype *sp, *end; reg int x, y, endy, endx, starty, startx; reg int y1,y2; *************** *** 70,76 **** end = &win1->_y[y1][endx - win1->_begx]; x = startx - win2->_begx; for (sp = &win1->_y[y1][startx - win1->_begx]; sp < end; sp++) { ! if (!isspace(*sp)) mvwaddch(win2, y2, x, *sp); x++; } --- 69,75 ---- end = &win1->_y[y1][endx - win1->_begx]; x = startx - win2->_begx; for (sp = &win1->_y[y1][startx - win1->_begx]; sp < end; sp++) { ! if (*sp != ' ') mvwaddch(win2, y2, x, *sp); x++; } *** overwrite.c.was Sun Apr 21 00:13:56 1991 --- overwrite.c Fri Jan 8 16:00:59 1993 *************** *** 48,54 **** overwrite(win1, win2) reg WINDOW *win1, *win2; { - reg char *sp, *end; reg int x, y, endy, endx, starty, startx; # ifdef DEBUG --- 48,53 ---- *************** *** 66,72 **** x = endx - startx; for (y = starty; y < endy; y++) { bcopy(&win1->_y[y - win1->_begy][startx - win1->_begx], ! &win2->_y[y - win2->_begy][startx - win2->_begx], x); touchline(win2, y, startx - win2->_begx, endx - win2->_begx); } } --- 65,71 ---- x = endx - startx; for (y = starty; y < endy; y++) { bcopy(&win1->_y[y - win1->_begy][startx - win1->_begx], ! &win2->_y[y - win2->_begy][startx - win2->_begx], x * sizeof(chtype)); touchline(win2, y, startx - win2->_begx, endx - win2->_begx); } } *** printw.c.was Sun Apr 21 00:13:56 1991 --- printw.c Fri Jan 8 16:23:10 1993 *************** *** 111,117 **** register int c = n; while (--c >= 0) { ! if (waddch(win, *buf++) == ERR) return (-1); } return n; --- 111,117 ---- register int c = n; while (--c >= 0) { ! if (waddch(win, (unsigned char) *buf++) == ERR) return (-1); } return n; *** refresh.c.was Sun Apr 21 00:13:57 1991 --- refresh.c Fri Jan 8 16:36:09 1993 *************** *** 169,177 **** reg WINDOW *win; short wy; { ! reg char *nsp, *csp, *ce; reg short wx, lch, y; reg int nlsp, clsp; /* last space in lines */ wx = win->_firstch[wy] - win->_ch_off; if (wx >= win->_maxx) --- 169,179 ---- reg WINDOW *win; short wy; { ! reg chtype *nsp, *csp, *ce; reg short wx, lch, y; reg int nlsp, clsp; /* last space in lines */ + char *ce_tcap; + static chtype blank[] = {' ','\0'}; wx = win->_firstch[wy] - win->_ch_off; if (wx >= win->_maxx) *************** *** 186,192 **** y = wy + win->_begy; if (curwin) ! csp = " "; else csp = &curscr->_y[wy + win->_begy][wx + win->_begx]; --- 188,194 ---- y = wy + win->_begy; if (curwin) ! csp = blank; else csp = &curscr->_y[wy + win->_begy][wx + win->_begx]; *************** *** 199,207 **** } if (!curwin) ! ce = CE; else ! ce = NULL; while (wx <= lch) { if (*nsp != *csp) { --- 201,209 ---- } if (!curwin) ! ce_tcap = CE; else ! ce_tcap = NULL; while (wx <= lch) { if (*nsp != *csp) { *************** *** 212,218 **** ly = y; lx = wx + win->_begx; while (*nsp != *csp && wx <= lch) { ! if (ce != NULL && wx >= nlsp && *nsp == ' ') { /* * check for clear to end-of-line */ --- 214,220 ---- ly = y; lx = wx + win->_begx; while (*nsp != *csp && wx <= lch) { ! if (ce_tcap != NULL && wx >= nlsp && *nsp == ' ') { /* * check for clear to end-of-line */ *************** *** 235,241 **** *csp++ = ' '; return OK; } ! ce = NULL; } /* * enter/exit standout mode as appropriate --- 237,243 ---- *csp++ = ' '; return OK; } ! ce_tcap = NULL; } /* * enter/exit standout mode as appropriate *************** *** 260,268 **** curscr->_flags &= ~_STANDOUT; } if (!curwin) ! _putchar((*csp = *nsp) & 0177); else ! _putchar(*nsp & 0177); if (win->_flags&_FULLWIN && !curwin) scroll(curscr); ly = win->_begy+win->_cury; --- 262,270 ---- curscr->_flags &= ~_STANDOUT; } if (!curwin) ! _putchar((*csp = *nsp)); else ! _putchar(*nsp); if (win->_flags&_FULLWIN && !curwin) scroll(curscr); ly = win->_begy+win->_cury; *************** *** 274,285 **** return ERR; } if (!curwin) ! _putchar((*csp++ = *nsp) & 0177); else ! _putchar(*nsp & 0177); # ifdef FULLDEBUG fprintf(outf, ! "MAKECH:putchar(%c)\n", *nsp & 0177); # endif if (UC && (*nsp & _STANDOUT)) { _putchar('\b'); --- 276,287 ---- return ERR; } if (!curwin) ! _putchar((*csp++ = *nsp)); else ! _putchar(*nsp); # ifdef FULLDEBUG fprintf(outf, ! "MAKECH:putchar(%c)\n", *nsp); # endif if (UC && (*nsp & _STANDOUT)) { _putchar('\b'); -- In-This-Life: Andrew A. Chernov | "Hay mas dicha, mas contento Internet: ache@astral.msk.su | "Que adorar una hermosura Organization: The RELCOM Corp., | "Brujuleada entre los lejos Moscow, Russia | "De lo imposible?!" (Calderon)