scs@lokkur.UUCP (Steve Simmons) (03/27/89)
In the recent posting of sc6, a macro "ctl(c)" was used to create control characters. On some preprocessors, it caused major league barfing. The macro was defined #define ctl(x) ('x'&037) and used ctl(a) This caused severe problems with C preprocessors that don't like to substitute inside of quotes. The following patches change the macro definition to #define ctl(x) (x&037) and change the usage to match. I believe the changed code is a more generally accepted (portable) form. Many thanks for the new sc6, by the way -- the help facility alone is worth the hassle of upgrading. Steve Simmons *** original/cmds.c Thu Mar 23 20:48:34 1989 --- cmds.c Thu Mar 23 21:12:50 1989 *************** *** 319,337 **** case 'r': case 'l': case 'h': ! case ctl(f): ! case ctl(b): return ('r'); case 'c': case 'j': case 'k': ! case ctl(p): ! case ctl(n): return ('c'); case 'm': return ((ch == 'p') ? 'm' : 0); case ESC: ! case ctl (g): return (ESC); default: return (0); } --- 319,337 ---- case 'r': case 'l': case 'h': ! case ctl('f'): ! case ctl('b'): return ('r'); case 'c': case 'j': case 'k': ! case ctl('p'): ! case ctl('n'): return ('c'); case 'm': return ((ch == 'p') ? 'm' : 0); case ESC: ! case ctl ('g'): return (ESC); default: return (0); } *** original/lex.c Thu Mar 23 20:48:07 1989 --- lex.c Thu Mar 23 21:15:31 1989 *************** *** 65,71 **** #include "statres.h" 0, 0}; ! #define ctl(x) ('x'&037) yylex () { --- 65,71 ---- #include "statres.h" 0, 0}; ! #define ctl(x) (x&037) yylex () { *************** *** 255,264 **** c = getchar(); switch (c) { ! case SMG$K_TRM_LEFT: c = ctl(b); break; ! case SMG$K_TRM_RIGHT: c = ctl(f); break; ! case SMG$K_TRM_UP: c = ctl(p); break; ! case SMG$K_TRM_DOWN: c = ctl(n); break; default: c = c & 0x7f; } return (c); --- 255,264 ---- c = getchar(); switch (c) { ! case SMG$K_TRM_LEFT: c = ctl('b'); break; ! case SMG$K_TRM_RIGHT: c = ctl('f'); break; ! case SMG$K_TRM_UP: c = ctl('p'); break; ! case SMG$K_TRM_DOWN: c = ctl('n'); break; default: c = c & 0x7f; } return (c); *************** *** 320,328 **** #endif char dont_use[] = { ! ctl(z), ctl(r), ctl(l), ctl(b), ctl(c), ctl(f), ctl(g), ctl([), ! ctl(h), ctl(m), ctl(j), ctl(n), ctl(p), ctl(q), ctl(s), ctl(t), ! ctl(u), ctl(v), ctl(e), ctl(a), ctl(i), ctl(w), 0, }; charout(c) --- 320,328 ---- #endif char dont_use[] = { ! ctl('z'), ctl('r'), ctl('l'), ctl('b'), ctl('c'), ctl('f'), ctl('g'), ctl('['), ! ctl('h'), ctl('m'), ctl('j'), ctl('n'), ctl('p'), ctl('q'), ctl('s'), ctl('t'), ! ctl('u'), ctl('v'), ctl('e'), ctl('a'), ctl('i'), ctl('w'), 0, }; charout(c) *************** *** 342,351 **** if (tgetent(buf, getenv("TERM")) <= 0) return; ! km[0].k_str = tgetstr("kl", &p); km[0].k_val = ctl(b); ! km[1].k_str = tgetstr("kr", &p); km[1].k_val = ctl(f); ! km[2].k_str = tgetstr("ku", &p); km[2].k_val = ctl(p); ! km[3].k_str = tgetstr("kd", &p); km[3].k_val = ctl(n); ktmp = tgetstr("ks",&p); if (ktmp) { (void) strcpy(ks_buf, ktmp); --- 342,351 ---- if (tgetent(buf, getenv("TERM")) <= 0) return; ! km[0].k_str = tgetstr("kl", &p); km[0].k_val = ctl('b'); ! km[1].k_str = tgetstr("kr", &p); km[1].k_val = ctl('f'); ! km[2].k_str = tgetstr("ku", &p); km[2].k_val = ctl('p'); ! km[3].k_str = tgetstr("kd", &p); km[3].k_val = ctl('n'); ktmp = tgetstr("ks",&p); if (ktmp) { (void) strcpy(ks_buf, ktmp); *************** *** 375,383 **** #ifdef TIOCSLTC (void)ioctl(fileno(stdin), TIOCGLTC, (char *)&old_chars); new_chars = old_chars; ! if (old_chars.t_lnextc == ctl(v)) new_chars.t_lnextc = -1; ! if (old_chars.t_rprntc == ctl(r)) new_chars.t_rprntc = -1; (void)ioctl(fileno(stdin), TIOCSLTC, (char *)&new_chars); #endif --- 375,383 ---- #ifdef TIOCSLTC (void)ioctl(fileno(stdin), TIOCGLTC, (char *)&old_chars); new_chars = old_chars; ! if (old_chars.t_lnextc == ctl('v')) new_chars.t_lnextc = -1; ! if (old_chars.t_rprntc == ctl('r')) new_chars.t_rprntc = -1; (void)ioctl(fileno(stdin), TIOCSLTC, (char *)&new_chars); #endif *************** *** 502,511 **** c = getch(); switch (c) { ! case KEY_LEFT: c = ctl(b); break; ! case KEY_RIGHT: c = ctl(f); break; ! case KEY_UP: c = ctl(p); break; ! case KEY_DOWN: c = ctl(n); break; #ifdef KEY_C1 /* This stuff works for a wyse wy75 in ANSI mode under 5.3. Good luck. */ /* It is supposed to map the curses keypad back to the numeric equiv. */ --- 502,511 ---- c = getch(); switch (c) { ! case KEY_LEFT: c = ctl('b'); break; ! case KEY_RIGHT: c = ctl('f'); break; ! case KEY_UP: c = ctl('p'); break; ! case KEY_DOWN: c = ctl('n'); break; #ifdef KEY_C1 /* This stuff works for a wyse wy75 in ANSI mode under 5.3. Good luck. */ /* It is supposed to map the curses keypad back to the numeric equiv. */ *************** *** 520,526 **** case KEY_F(10): c = '8'; break; case KEY_F0: c = '9'; break; case KEY_C3: c = '.'; break; ! case KEY_ENTER: c = ctl(m); break; #endif #ifndef INTERNATIONAL default: c = c & 0x7f; --- 520,526 ---- case KEY_F(10): c = '8'; break; case KEY_F0: c = '9'; break; case KEY_C3: c = '.'; break; ! case KEY_ENTER: c = ctl('m'); break; #endif #ifndef INTERNATIONAL default: c = c & 0x7f; *** original/sc.c Thu Mar 23 20:47:59 1989 --- sc.c Thu Mar 23 21:17:12 1989 *************** *** 659,665 **** if ((c < ' ') || ( c == DEL )) switch (c) { #ifdef SIGTSTP ! case ctl (z): deraw(); (void) kill(getpid(),SIGTSTP); --- 659,665 ---- if ((c < ' ') || ( c == DEL )) switch (c) { #ifdef SIGTSTP ! case ctl ('z'): deraw(); (void) kill(getpid(),SIGTSTP); *************** *** 668,681 **** goraw(); break; #endif ! case ctl (r): ! case ctl (l): FullUpdate++; ! if (c == ctl (r)) showneed = 1; (void) clearok(stdscr,1); break; ! case ctl (x): FullUpdate++; showexpr = 1; (void) clearok(stdscr,1); --- 668,681 ---- goraw(); break; #endif ! case ctl ('r'): ! case ctl ('l'): FullUpdate++; ! if (c == ctl ('r')) showneed = 1; (void) clearok(stdscr,1); break; ! case ctl ('x'): FullUpdate++; showexpr = 1; (void) clearok(stdscr,1); *************** *** 683,707 **** default: error ("No such command (^%c)", c + 0100); break; ! case ctl (b): backcol(arg); break; ! case ctl (c): running = 0; break; ! case ctl (e): switch (nmgetch()) { ! case ctl (p): case 'k': doend (-1, 0); break; ! case ctl (n): case 'j': doend ( 1, 0); break; ! case ctl (b): case 'h': ! case ctl (h): doend ( 0,-1); break; ! case ctl (f): case 'l': ! case ctl (i): case ' ': doend ( 0, 1); break; case ESC: ! case ctl (g): break; default: --- 683,707 ---- default: error ("No such command (^%c)", c + 0100); break; ! case ctl ('b'): backcol(arg); break; ! case ctl ('c'): running = 0; break; ! case ctl ('e'): switch (nmgetch()) { ! case ctl ('p'): case 'k': doend (-1, 0); break; ! case ctl ('n'): case 'j': doend ( 1, 0); break; ! case ctl ('b'): case 'h': ! case ctl ('h'): doend ( 0,-1); break; ! case ctl ('f'): case 'l': ! case ctl ('i'): case ' ': doend ( 0, 1); break; case ESC: ! case ctl ('g'): break; default: *************** *** 711,720 **** break; ! case ctl (f): forwcol(arg); break; ! case ctl (g): case ESC: /* ctl ([) */ showrange = 0; linelim = -1; --- 711,720 ---- break; ! case ctl ('f'): forwcol(arg); break; ! case ctl ('g'): case ESC: /* ctl ([) */ showrange = 0; linelim = -1; *************** *** 722,728 **** (void) clrtoeol (); break; case DEL: ! case ctl (h): if (linelim <= 0) { /* not editing line */ backcol(arg); /* treat like ^B */ break; --- 722,728 ---- (void) clrtoeol (); break; case DEL: ! case ctl ('h'): if (linelim <= 0) { /* not editing line */ backcol(arg); /* treat like ^B */ break; *************** *** 730,736 **** while (--arg>=0) if (linelim > 0) line[--linelim] = 0; break; ! case ctl (i): /* tab */ if (linelim <= 0) { /* not editing line */ forwcol(arg); break; --- 730,736 ---- while (--arg>=0) if (linelim > 0) line[--linelim] = 0; break; ! case ctl ('i'): /* tab */ if (linelim <= 0) { /* not editing line */ forwcol(arg); break; *************** *** 747,754 **** } linelim = strlen (line); break; ! case ctl (m): ! case ctl (j): showrange = 0; if (linelim < 0) line[linelim = 0] = 0; --- 747,754 ---- } linelim = strlen (line); break; ! case ctl ('m'): ! case ctl ('j'): showrange = 0; if (linelim < 0) line[linelim = 0] = 0; *************** *** 758,774 **** linelim = -1; } break; ! case ctl (n): forwrow(arg); break; ! case ctl (p): backrow(arg); break; ! case ctl (q): break; /* ignore flow control */ ! case ctl (s): break; /* ignore flow control */ ! case ctl (t): error( "Toggle: a:auto c:cell e:ext funcs n:numeric t:top x:encrypt $:pre-scale"); (void) refresh(); --- 758,774 ---- linelim = -1; } break; ! case ctl ('n'): forwrow(arg); break; ! case ctl ('p'): backrow(arg); break; ! case ctl ('q'): break; /* ignore flow control */ ! case ctl ('s'): break; /* ignore flow control */ ! case ctl ('t'): error( "Toggle: a:auto c:cell e:ext funcs n:numeric t:top x:encrypt $:pre-scale"); (void) refresh(); *************** *** 815,821 **** extfunc? "en" : "dis"); break; case ESC: ! case ctl (g): break; default: error ("Invalid toggle command"); --- 815,821 ---- extfunc? "en" : "dis"); break; case ESC: ! case ctl ('g'): break; default: error ("Invalid toggle command"); *************** *** 823,842 **** FullUpdate++; modflg++; break; ! case ctl (u): narg = arg * 4; nedistate = 1; break; ! case ctl (v): /* insert variable name */ if (linelim > 0) { (void) sprintf (line+linelim,"%s", v_name(currow, curcol)); linelim = strlen (line); } break; ! case ctl (w): /* insert variable expression */ if (linelim > 0) editexp(currow,curcol); break; ! case ctl (a): /* insert variable value */ if (linelim > 0) { struct ent *p = tbl[currow][curcol]; --- 823,842 ---- FullUpdate++; modflg++; break; ! case ctl ('u'): narg = arg * 4; nedistate = 1; break; ! case ctl ('v'): /* insert variable name */ if (linelim > 0) { (void) sprintf (line+linelim,"%s", v_name(currow, curcol)); linelim = strlen (line); } break; ! case ctl ('w'): /* insert variable expression */ if (linelim > 0) editexp(currow,curcol); break; ! case ctl ('a'): /* insert variable value */ if (linelim > 0) { struct ent *p = tbl[currow][curcol]; *************** *** 1033,1039 **** break; case ESC: ! case ctl (g): break; default: error("Invalid region command"); --- 1033,1039 ---- break; case ESC: ! case ctl ('g'): break; default: error("Invalid region command"); *************** *** 1062,1068 **** error (""); /* clear line */ ! if ( rcqual == ESC || rcqual == ctl(g)) break; switch (c) { --- 1062,1068 ---- error (""); /* clear line */ ! if ( rcqual == ESC || rcqual == ctl('g')) break; switch (c) { *************** *** 1474,1480 **** if (ch != 'n' && ch != 'N') { if (writefile(curfile, 0, 0, maxrow, maxcol) < 0) return (1); ! } else if (ch == ctl (g) || ch == ESC) return(1); } else if (modflg) { char ch, lin[100]; --- 1474,1480 ---- if (ch != 'n' && ch != 'N') { if (writefile(curfile, 0, 0, maxrow, maxcol) < 0) return (1); ! } else if (ch == ctl ('g') || ch == ESC) return(1); } else if (modflg) { char ch, lin[100]; *** original/sc.h Thu Mar 23 21:10:03 1989 --- sc.h Thu Mar 23 21:12:10 1989 *************** *** 138,144 **** #define is_leftflush 0010 #define is_deleted 0020 ! #define ctl(c) ('c'&037) #define ESC 033 #define DEL 0177 --- 138,144 ---- #define is_leftflush 0010 #define is_deleted 0020 ! #define ctl(c) (c&037) #define ESC 033 #define DEL 0177 -- + Steve Simmons, Inland Sea Software, Ltd. scs@lokkur.dexter.mi.us + | 9353 Hidden Lake, Dexter, MI. 48130 313-426-8981 | + "When Dexter's on the Internet can Hell be far behind?" +