damon@upba.UUCP (Damon Scaggs) (12/21/87)
Enclosed are two patches for the program screen in the comp.sources.unix
archives. The first is a VERY minor fix to make screens pay attention if
you disable SIGHUP in your .profile file. The second fixes a more serious
bug that occurs when you have programs updating two seperate screens
simultaneously. Escape code arguments were kept globally rather than local
to a specific screen and could collide with each other if you received them
from more than one screen at a time.
The following is a shar file containing the two patches, so you can't just
send this through patch directly.
Damon Scaggs
ihnp4!upba!damon
----------------------------------------------------------------------------
: This is a shar archive. Extract with sh, not csh.
: This archive ends with exit, so do not worry about trailing junk.
echo 'Extracting PATCH1'
sed 's/^X//' > PATCH1 << '+ END-OF-FILE PATCH1'
X*** screen.c.old Fri Dec 11 13:18:54 1987
X--- screen.c Fri Dec 11 13:18:52 1987
X***************
X*** 241,247
X #ifdef LOADAV
X InitKmem ();
X #endif
X! signal (SIGHUP, Finit);
X signal (SIGINT, Finit);
X signal (SIGQUIT, Finit);
X signal (SIGTERM, Finit);
X
X--- 241,248 -----
X #ifdef LOADAV
X InitKmem ();
X #endif
X! if (signal (SIGHUP, Finit) == SIG_IGN)
X! signal (SIGHUP, SIG_IGN);
X signal (SIGINT, Finit);
X signal (SIGQUIT, Finit);
X signal (SIGTERM, Finit);
+ END-OF-FILE PATCH1
chmod 'u=rw,g=rw,o=' 'PATCH1'
echo ' -rw-rw---- 1 damon 503 Dec 11 13:22 PATCH1 (as sent)'
echo -n ' '
/bin/ls -l PATCH1
echo 'Extracting PATCH2'
sed 's/^X//' > PATCH2 << '+ END-OF-FILE PATCH2'
X*** ansi.c.old Fri Dec 11 13:46:42 1987
X--- ansi.c Fri Dec 11 13:52:55 1987
X***************
X*** 33,39
X M_CR,
X };
X
X- #define MAXARGS 64
X #define EXPENSIVE 1000
X
X extern char *getenv(), *tgetstr(), *tgoto(), *malloc();
X
X--- 33,38 -----
X M_CR,
X };
X
X #define EXPENSIVE 1000
X
X extern char *getenv(), *tgetstr(), *tgoto(), *malloc();
X***************
X*** 54,62
X static char *CS, *DL, *DC, *IC, *IM, *EI, *UP, *ND, *KS, *KE;
X static char *MB, *MD, *MH, *MR, *ME;
X static AM;
X- static args[MAXARGS];
X- static char GotArg[MAXARGS];
X- static NumArgs;
X static char GlobalAttr, TmpAttr;
X static char *OldImage, *OldAttr;
X static last_x, last_y;
X
X--- 53,58 -----
X static char *CS, *DL, *DC, *IC, *IM, *EI, *UP, *ND, *KS, *KE;
X static char *MB, *MD, *MH, *MR, *ME;
X static AM;
X static char GlobalAttr, TmpAttr;
X static char *OldImage, *OldAttr;
X static last_x, last_y;
X***************
X*** 374,380
X case ESC:
X switch (c) {
X case '[':
X! NumArgs = 0;
X intermediate = 0;
X bzero ((char *)args, MAXARGS * sizeof (int));
X bzero (GotArg, MAXARGS);
X
X--- 370,376 -----
X case ESC:
X switch (c) {
X case '[':
X! curr->NumArgs = 0;
X intermediate = 0;
X bzero ((char *)curr->args, MAXARGS * sizeof (int));
X bzero (curr->GotArg, MAXARGS);
X***************
X*** 376,383
X case '[':
X NumArgs = 0;
X intermediate = 0;
X! bzero ((char *)args, MAXARGS * sizeof (int));
X! bzero (GotArg, MAXARGS);
X curr->state = CSI;
X break;
X case ']':
X
X--- 372,379 -----
X case '[':
X curr->NumArgs = 0;
X intermediate = 0;
X! bzero ((char *)curr->args, MAXARGS * sizeof (int));
X! bzero (curr->GotArg, MAXARGS);
X curr->state = CSI;
X break;
X case ']':
X***************
X*** 406,414
X switch (c) {
X case '0': case '1': case '2': case '3': case '4':
X case '5': case '6': case '7': case '8': case '9':
X! if (NumArgs < MAXARGS) {
X! args[NumArgs] = 10 * args[NumArgs] + c - '0';
X! GotArg[NumArgs] = 1;
X }
X break;
X case ';': case ':':
X
X--- 402,411 -----
X switch (c) {
X case '0': case '1': case '2': case '3': case '4':
X case '5': case '6': case '7': case '8': case '9':
X! if (curr->NumArgs < MAXARGS) {
X! curr->args[curr->NumArgs] =
X! 10 * curr->args[curr->NumArgs] + c - '0';
X! curr->GotArg[curr->NumArgs] = 1;
X }
X break;
X case ';': case ':':
X***************
X*** 412,418
X }
X break;
X case ';': case ':':
X! NumArgs++; break;
X default:
X if (Special (c))
X break;
X
X--- 409,415 -----
X }
X break;
X case ';': case ':':
X! curr->NumArgs++; break;
X default:
X if (Special (c))
X break;
X***************
X*** 417,423
X if (Special (c))
X break;
X if (c >= '@' && c <= '~') {
X! NumArgs++;
X DoCSI (c, intermediate);
X curr->state = LIT;
X } else if ((c >= ' ' && c <= '/') || (c >= '<' && c <= '?')) {
X
X--- 414,420 -----
X if (Special (c))
X break;
X if (c >= '@' && c <= '~') {
X! curr->NumArgs++;
X DoCSI (c, intermediate);
X curr->state = LIT;
X } else if ((c >= ' ' && c <= '/') || (c >= '<' && c <= '?')) {
X***************
X*** 548,554
X }
X
X static DoCSI (c, intermediate) {
X! register i, a1 = args[0], a2 = args[1];
X
X if (NumArgs >= MAXARGS)
X NumArgs = MAXARGS;
X
X--- 545,551 -----
X }
X
X static DoCSI (c, intermediate) {
X! register i, a1 = curr->args[0], a2 = curr->args[1];
X
X if (curr->NumArgs >= MAXARGS)
X curr->NumArgs = MAXARGS;
X***************
X*** 550,560
X static DoCSI (c, intermediate) {
X register i, a1 = args[0], a2 = args[1];
X
X! if (NumArgs >= MAXARGS)
X! NumArgs = MAXARGS;
X! for (i = 0; i < NumArgs; ++i)
X! if (args[i] == 0)
X! GotArg[i] = 0;
X switch (intermediate) {
X case 0:
X switch (c) {
X
X--- 547,557 -----
X static DoCSI (c, intermediate) {
X register i, a1 = curr->args[0], a2 = curr->args[1];
X
X! if (curr->NumArgs >= MAXARGS)
X! curr->NumArgs = MAXARGS;
X! for (i = 0; i < curr->NumArgs; ++i)
X! if (curr->args[i] == 0)
X! curr->GotArg[i] = 0;
X switch (intermediate) {
X case 0:
X switch (c) {
X***************
X*** 559,566
X case 0:
X switch (c) {
X case 'H': case 'f':
X! if (!GotArg[0]) a1 = 1;
X! if (!GotArg[1]) a2 = 1;
X if (curr->origin)
X a1 += curr->top;
X if (a1 < 1)
X
X--- 556,563 -----
X case 0:
X switch (c) {
X case 'H': case 'f':
X! if (!curr->GotArg[0]) a1 = 1;
X! if (!curr->GotArg[1]) a2 = 1;
X if (curr->origin)
X a1 += curr->top;
X if (a1 < 1)
X***************
X*** 577,583
X curr->x = a2;
X break;
X case 'J':
X! if (!GotArg[0] || a1 < 0 || a1 > 2)
X a1 = 0;
X switch (a1) {
X case 0:
X
X--- 574,580 -----
X curr->x = a2;
X break;
X case 'J':
X! if (!curr->GotArg[0] || a1 < 0 || a1 > 2)
X a1 = 0;
X switch (a1) {
X case 0:
X***************
X*** 591,597
X }
X break;
X case 'K':
X! if (!GotArg[0] || a1 < 0 || a2 > 2)
X a1 = 0;
X switch (a1) {
X case 0:
X
X--- 588,594 -----
X }
X break;
X case 'K':
X! if (!curr->GotArg[0] || a1 < 0 || a2 > 2)
X a1 = 0;
X switch (a1) {
X case 0:
X***************
X*** 603,609
X }
X break;
X case 'A':
X! CursorUp (GotArg[0] ? a1 : 1);
X break;
X case 'B':
X CursorDown (GotArg[0] ? a1 : 1);
X
X--- 600,606 -----
X }
X break;
X case 'A':
X! CursorUp (curr->GotArg[0] ? a1 : 1);
X break;
X case 'B':
X CursorDown (curr->GotArg[0] ? a1 : 1);
X***************
X*** 606,612
X CursorUp (GotArg[0] ? a1 : 1);
X break;
X case 'B':
X! CursorDown (GotArg[0] ? a1 : 1);
X break;
X case 'C':
X CursorRight (GotArg[0] ? a1 : 1);
X
X--- 603,609 -----
X CursorUp (curr->GotArg[0] ? a1 : 1);
X break;
X case 'B':
X! CursorDown (curr->GotArg[0] ? a1 : 1);
X break;
X case 'C':
X CursorRight (curr->GotArg[0] ? a1 : 1);
X***************
X*** 609,615
X CursorDown (GotArg[0] ? a1 : 1);
X break;
X case 'C':
X! CursorRight (GotArg[0] ? a1 : 1);
X break;
X case 'D':
X CursorLeft (GotArg[0] ? a1 : 1);
X
X--- 606,612 -----
X CursorDown (curr->GotArg[0] ? a1 : 1);
X break;
X case 'C':
X! CursorRight (curr->GotArg[0] ? a1 : 1);
X break;
X case 'D':
X CursorLeft (curr->GotArg[0] ? a1 : 1);
X***************
X*** 612,618
X CursorRight (GotArg[0] ? a1 : 1);
X break;
X case 'D':
X! CursorLeft (GotArg[0] ? a1 : 1);
X break;
X case 'm':
X SelectRendition ();
X
X--- 609,615 -----
X CursorRight (curr->GotArg[0] ? a1 : 1);
X break;
X case 'D':
X! CursorLeft (curr->GotArg[0] ? a1 : 1);
X break;
X case 'm':
X SelectRendition ();
X***************
X*** 618,624
X SelectRendition ();
X break;
X case 'g':
X! if (!GotArg[0] || a1 == 0)
X curr->tabs[curr->x] = 0;
X else if (a1 == 3)
X bzero (curr->tabs, cols);
X
X--- 615,621 -----
X SelectRendition ();
X break;
X case 'g':
X! if (!curr->GotArg[0] || a1 == 0)
X curr->tabs[curr->x] = 0;
X else if (a1 == 3)
X bzero (curr->tabs, cols);
X***************
X*** 626,633
X case 'r':
X if (!CS)
X break;
X! if (!GotArg[0]) a1 = 1;
X! if (!GotArg[1]) a2 = rows;
X if (a1 < 1 || a2 > rows || a1 >= a2)
X break;
X curr->top = a1-1;
X
X--- 623,630 -----
X case 'r':
X if (!CS)
X break;
X! if (!curr->GotArg[0]) a1 = 1;
X! if (!curr->GotArg[1]) a2 = rows;
X if (a1 < 1 || a2 > rows || a1 >= a2)
X break;
X curr->top = a1-1;
X***************
X*** 643,649
X }
X break;
X case 'I':
X! if (!GotArg[0]) a1 = 1;
X while (a1--)
X ForwardTab ();
X break;
X
X--- 640,646 -----
X }
X break;
X case 'I':
X! if (!curr->GotArg[0]) a1 = 1;
X while (a1--)
X ForwardTab ();
X break;
X***************
X*** 648,654
X ForwardTab ();
X break;
X case 'Z':
X! if (!GotArg[0]) a1 = 1;
X while (a1--)
X BackwardTab ();
X break;
X
X--- 645,651 -----
X ForwardTab ();
X break;
X case 'Z':
X! if (!curr->GotArg[0]) a1 = 1;
X while (a1--)
X BackwardTab ();
X break;
X***************
X*** 653,659
X BackwardTab ();
X break;
X case 'L':
X! InsertLine (GotArg[0] ? a1 : 1);
X break;
X case 'M':
X DeleteLine (GotArg[0] ? a1 : 1);
X
X--- 650,656 -----
X BackwardTab ();
X break;
X case 'L':
X! InsertLine (curr->GotArg[0] ? a1 : 1);
X break;
X case 'M':
X DeleteLine (curr->GotArg[0] ? a1 : 1);
X***************
X*** 656,662
X InsertLine (GotArg[0] ? a1 : 1);
X break;
X case 'M':
X! DeleteLine (GotArg[0] ? a1 : 1);
X break;
X case 'P':
X DeleteChar (GotArg[0] ? a1 : 1);
X
X--- 653,659 -----
X InsertLine (curr->GotArg[0] ? a1 : 1);
X break;
X case 'M':
X! DeleteLine (curr->GotArg[0] ? a1 : 1);
X break;
X case 'P':
X DeleteChar (curr->GotArg[0] ? a1 : 1);
X***************
X*** 659,665
X DeleteLine (GotArg[0] ? a1 : 1);
X break;
X case 'P':
X! DeleteChar (GotArg[0] ? a1 : 1);
X break;
X case '@':
X InsertChar (GotArg[0] ? a1 : 1);
X
X--- 656,662 -----
X DeleteLine (curr->GotArg[0] ? a1 : 1);
X break;
X case 'P':
X! DeleteChar (curr->GotArg[0] ? a1 : 1);
X break;
X case '@':
X InsertChar (curr->GotArg[0] ? a1 : 1);
X***************
X*** 662,668
X DeleteChar (GotArg[0] ? a1 : 1);
X break;
X case '@':
X! InsertChar (GotArg[0] ? a1 : 1);
X break;
X case 'h':
X SetMode (1);
X
X--- 659,665 -----
X DeleteChar (curr->GotArg[0] ? a1 : 1);
X break;
X case '@':
X! InsertChar (curr->GotArg[0] ? a1 : 1);
X break;
X case 'h':
X SetMode (1);
X***************
X*** 675,681
X case '?':
X if (c != 'h' && c != 'l')
X break;
X! if (!GotArg[0])
X break;
X i = (c == 'h');
X if (a1 == 5) {
X
X--- 672,678 -----
X case '?':
X if (c != 'h' && c != 'l')
X break;
X! if (!curr->GotArg[0])
X break;
X i = (c == 'h');
X if (a1 == 5) {
X***************
X*** 1228,1235
X static SetMode (on) {
X register i;
X
X! for (i = 0; i < NumArgs; ++i) {
X! switch (args[i]) {
X case 4:
X curr->insert = on;
X InsertMode (on);
X
X--- 1225,1232 -----
X static SetMode (on) {
X register i;
X
X! for (i = 0; i < curr->NumArgs; ++i) {
X! switch (curr->args[i]) {
X case 4:
X curr->insert = on;
X InsertMode (on);
X***************
X*** 1241,1247
X static SelectRendition () {
X register i, old = GlobalAttr;
X
X! if (NumArgs == 0)
X SetRendition (0);
X else for (i = 0; i < NumArgs; ++i)
X SetRendition (args[i]);
X
X--- 1238,1244 -----
X static SelectRendition () {
X register i, old = GlobalAttr;
X
X! if (curr->NumArgs == 0)
X SetRendition (0);
X else for (i = 0; i < curr->NumArgs; ++i)
X SetRendition (curr->args[i]);
X***************
X*** 1243,1250
X
X if (NumArgs == 0)
X SetRendition (0);
X! else for (i = 0; i < NumArgs; ++i)
X! SetRendition (args[i]);
X NewRendition (old, GlobalAttr);
X }
X
X
X--- 1240,1247 -----
X
X if (curr->NumArgs == 0)
X SetRendition (0);
X! else for (i = 0; i < curr->NumArgs; ++i)
X! SetRendition (curr->args[i]);
X NewRendition (old, GlobalAttr);
X }
X
X*** screen.h.old Fri Dec 11 13:46:48 1987
X--- screen.h Fri Dec 11 13:48:21 1987
X***************
X*** 25,30
X };
X
X #define MAXSTR 128
X
X #define IOSIZE 80
X
X
X--- 25,31 -----
X };
X
X #define MAXSTR 128
X+ #define MAXARGS 64
X
X #define IOSIZE 80
X
X***************
X*** 36,41
X int outlen;
X char cmd[MAXSTR];
X char tty[MAXSTR];
X int slot;
X char **image;
X char **attr;
X
X--- 37,45 -----
X int outlen;
X char cmd[MAXSTR];
X char tty[MAXSTR];
X+ int args[MAXARGS];
X+ char GotArg[MAXARGS];
X+ int NumArgs;
X int slot;
X char **image;
X char **attr;
X*** screen.c.old Fri Dec 11 13:46:54 1987
X--- screen.c Fri Dec 11 14:01:52 1987
X***************
X*** 38,44
X #endif
X
X #define MAXWIN 10
X- #define MAXARGS 64
X #define MAXLINE 1024
X #define MSGWAIT 5
X
X
X--- 38,43 -----
X #endif
X
X #define MAXWIN 10
X #define MAXLINE 1024
X #define MSGWAIT 5
X
+ END-OF-FILE PATCH2
chmod 'u=rw,g=rw,o=' 'PATCH2'
echo ' -rw-rw---- 1 damon 12292 Dec 11 15:28 PATCH2 (as sent)'
echo -n ' '
/bin/ls -l PATCH2
exit 0
--
Damon Scaggs
ihnp4!upba!damon