lwall@sdcrdcf.UUCP (Larry Wall) (12/01/84)
System: rn version 4.1 Bug #: 24 Priority: MEDIUM Subject: rn won't work with terminfo -lcurses Index: term.c Prereq: 4.1 From: ptsfa!dsp Description: The terminfo tgetstr() routine in -lcurses doesn't quite act like 4.xBSD documentation says. Namely, it doesn't leave the string at the address passed as the second argument. This breaks rn. Repeat-By: Compile up rn with -lcurses. If you don't get any terminal capabilities, you have the problem. Fix: From rn, say "| patch -d DIR", where DIR is your rn source directory. Outside of rn, say "cd DIR; patch <thisarticle". If you don't have the patch program, apply the following by hand, or get patch. *************** *** 1,4 ! /* $Header: term.c,v 4.1 84/09/24 12:10:42 lwall Exp $ * * $Log: term.c,v $ * Revision 4.1 84/09/24 12:10:42 lwall --- 1,4 ----- ! /* $Header: term.c,v 4.1.1.2 84/11/30 16:32:38 lwall Exp $ * * $Log: term.c,v $ * Revision 4.1.1.2 84/11/30 16:32:38 lwall *************** *** 1,6 /* $Header: term.c,v 4.1 84/09/24 12:10:42 lwall Exp $ * * $Log: term.c,v $ * Revision 4.1 84/09/24 12:10:42 lwall * Real baseline. * --- 1,12 ----- /* $Header: term.c,v 4.1.1.2 84/11/30 16:32:38 lwall Exp $ * * $Log: term.c,v $ + * Revision 4.1.1.2 84/11/30 16:32:38 lwall + * Now uses tgetstr() compatibly with both termlib and terminfo. + * + * Revision 4.1.1.1 84/09/25 13:26:55 lwall + * Branch for sdcrdcf changes. + * * Revision 4.1 84/09/24 12:10:42 lwall * Real baseline. * *************** *** 35,40 char KILLCH; /* line delete character */ char tcarea[TCSIZE]; /* area for "compiled" termcap strings */ /* terminal initialization */ void --- 41,51 ----- char KILLCH; /* line delete character */ char tcarea[TCSIZE]; /* area for "compiled" termcap strings */ + /* guarantee capability pointer != Nullch */ + /* (I believe terminfo will ignore the &tmpaddr argument.) */ + + #define Tgetstr(key) ((tmpstr = tgetstr(key,&tmpaddr)) ? tmpstr : nullstr) + /* terminal initialization */ void *************** *** 41,47 term_init(tcbuf) char *tcbuf; /* temp area for "uncompiled" termcap entry */ { ! char *tmpaddr; int status; #ifndef read_tty --- 52,61 ----- term_init(tcbuf) char *tcbuf; /* temp area for "uncompiled" termcap entry */ { ! char *tmpaddr; /* must not be register */ ! register char *tmpstr; ! char *tgetstr(); ! char *s; int status; #ifndef read_tty *************** *** 79,90 finalize(1); } tmpaddr = tcarea; /* set up strange tgetstr pointer */ ! tgetstr("pc",&tmpaddr); /* get pad character */ ! PC = *tcarea; /* get it where tputs wants it */ ! if (!tgetflag("bs")) { /* is backspace not used? */ ! BC = tmpaddr; /* find out what is */ ! tgetstr("bc",&tmpaddr); ! } else BC = "\010"; /* make a backspace handy */ UP = tmpaddr; /* move up a line */ --- 93,102 ----- finalize(1); } tmpaddr = tcarea; /* set up strange tgetstr pointer */ ! s = Tgetstr("pc"); /* get pad character */ ! PC = *s; /* get it where tputs wants it */ ! if (!tgetflag("bs")) /* is backspace not used? */ ! BC = Tgetstr("bc"); /* find out what is */ else BC = "\b"; /* make a backspace handy */ UP = Tgetstr("up"); /* move up a line */ *************** *** 86,94 tgetstr("bc",&tmpaddr); } else ! BC = "\010"; /* make a backspace handy */ ! UP = tmpaddr; /* move up a line */ ! tgetstr("up",&tmpaddr); if (!*UP) /* no UP string? */ marking = 0; /* disable any marking */ if (muck_up_clear) /* this is for weird HPs */ --- 98,105 ----- if (!tgetflag("bs")) /* is backspace not used? */ BC = Tgetstr("bc"); /* find out what is */ else ! BC = "\b"; /* make a backspace handy */ ! UP = Tgetstr("up"); /* move up a line */ if (!*UP) /* no UP string? */ marking = 0; /* disable any marking */ if (muck_up_clear) /* this is for weird HPs */ *************** *** 93,108 marking = 0; /* disable any marking */ if (muck_up_clear) /* this is for weird HPs */ CL = "\n\n\n\n"; ! else { ! CL = tmpaddr; /* get clear string */ ! tgetstr("cl",&tmpaddr); ! } ! CE = tmpaddr; /* clear to end of line string */ ! tgetstr("ce",&tmpaddr); ! SO = tmpaddr; /* begin standout */ ! tgetstr("so",&tmpaddr); ! SE = tmpaddr; /* end standout */ ! tgetstr("se",&tmpaddr); if ((SG = tgetnum("sg"))<0) SG = 0; /* blanks left by SG, SE */ US = tmpaddr; /* start underline */ --- 104,114 ----- marking = 0; /* disable any marking */ if (muck_up_clear) /* this is for weird HPs */ CL = "\n\n\n\n"; ! else ! CL = Tgetstr("cl"); /* get clear string */ ! CE = Tgetstr("ce"); /* clear to end of line string */ ! SO = Tgetstr("so"); /* begin standout */ ! SE = Tgetstr("se"); /* end standout */ if ((SG = tgetnum("sg"))<0) SG = 0; /* blanks left by SG, SE */ US = Tgetstr("us"); /* start underline */ *************** *** 105,114 tgetstr("se",&tmpaddr); if ((SG = tgetnum("sg"))<0) SG = 0; /* blanks left by SG, SE */ ! US = tmpaddr; /* start underline */ ! tgetstr("us",&tmpaddr); ! UE = tmpaddr; /* end underline */ ! tgetstr("ue",&tmpaddr); if ((UG = tgetnum("ug"))<0) UG = 0; /* blanks left by US, UE */ if (*US) --- 111,118 ----- SE = Tgetstr("se"); /* end standout */ if ((SG = tgetnum("sg"))<0) SG = 0; /* blanks left by SG, SE */ ! US = Tgetstr("us"); /* start underline */ ! UE = Tgetstr("ue"); /* end underline */ if ((UG = tgetnum("ug"))<0) UG = 0; /* blanks left by US, UE */ if (*US) *************** *** 113,122 UG = 0; /* blanks left by US, UE */ if (*US) UC = nullstr; /* UC must not be NULL */ ! else { ! UC = tmpaddr; /* underline a character */ ! tgetstr("uc",&tmpaddr); ! } if (!*US && !*UC) { /* no underline mode? */ US = SO; /* substitute standout mode */ UE = SE; --- 117,124 ----- UG = 0; /* blanks left by US, UE */ if (*US) UC = nullstr; /* UC must not be NULL */ ! else ! UC = Tgetstr("uc"); /* underline a character */ if (!*US && !*UC) { /* no underline mode? */ US = SO; /* substitute standout mode */ UE = SE;