kendall@talcott.UUCP (Sam Kendall) (05/02/85)
Index: lib/cpp/cpp.c 4.2BSD Description: #line directives to the C preprocessor are passed through to the compiler proper, but they should also be remembered by the preprocessor. Currently the preprocessor remembers the file name that #line gives, but not the line number. This can confuse error messages and dbx(1) about line numbers, particularly on files produced by preprocessors such as yacc(1). (This problem is fixed in SysV; V7 cpp's remember neither the line number nor the filename.) There are two other, much less serious problems with "cpp.c". First, it is missing external function declarations; and second, one part of code performs a pointer subtraction with the right operand sometimes null; this is not legal C, although the code happens to work on most machines. Repeat-By: Type to the shell $ /lib/cpp #line 999 "wombat.c" __LINE__ __FILE__ The cpp's last line in response will be 2 "wombat.c" But it should be 999 "wombat.c" Fix: There are three changes to "cpp.c". The first adds external function declarations; the second makes #line reset the line number; and the third fixes the piece of code the does a pointer subtraction with a null right operand. *** old/cpp.c Thu Apr 11 12:47:18 1985 --- cpp.c Thu Apr 11 12:55:12 1985 *************** *** 10,15 # include "stdio.h" # include "ctype.h" /* C command /* written by John F. Reiser /* July/August 1978 --- 10,17 ----- # include "stdio.h" # include "ctype.h" + extern char *calloc(), *strcat(), *strcpy(), *rindex(); + /* C command /* written by John F. Reiser /* July/August 1978 *************** *** 760,765 cp = outp + 1; while (isspace(*cp) && cp < inp) cp++; while (isdigit(*cp) && cp < inp) cp++; while (*cp != '"' && cp < inp) --- 762,768 ----- cp = outp + 1; while (isspace(*cp) && cp < inp) cp++; + lineno[ifno] = atoi(cp); /* reset __LINE__ */ while (isdigit(*cp) && cp < inp) cp++; while (*cp != '"' && cp < inp) *************** *** 891,897 int nlines = 0; if (0==(vp=sp->value)) return(p); ! if ((p-macforw)<=macdam) { if (++maclvl>symsiz && !rflag) { pperror("%s: macro recursion",sp->name); return(p); } --- 894,900 ----- int nlines = 0; if (0==(vp=sp->value)) return(p); ! if (macforw!=NULL && (p-macforw)<=macdam) { if (++maclvl>symsiz && !rflag) { pperror("%s: macro recursion",sp->name); return(p); }