Remove the limit of 20 -I and 50 -D args imposed by fixed length tables. This was plenty for sensible Plan 9 software but tragically inadequate to build some imported packages. One table wasn't even checked for overflow, so too many -D args could cause the compiler to crash silently. Reference: /n/sources/patch/applied/cc-maxinclude Date: Fri Jul 5 19:07:51 CES 2013 Signed-off-by: miller@hamnavoe.com --- /sys/src/cmd/cc/cc.h Fri Jul 5 19:03:43 2013 +++ /sys/src/cmd/cc/cc.h Fri Jul 5 19:03:40 2013 @@ -440,7 +440,7 @@ EXTERN Sym* hash[NHASH]; EXTERN int hasdoubled; EXTERN char* hunk; -EXTERN char* include[20]; +EXTERN char** include; EXTERN Io* iofree; EXTERN Io* ionext; EXTERN Io* iostack; @@ -451,6 +451,7 @@ EXTERN Type* lasttype; EXTERN long lineno; EXTERN long nearln; +EXTERN int maxinclude; EXTERN int nerrors; EXTERN int newflag; EXTERN long nhunk; --- /sys/src/cmd/cc/lex.c Fri Jul 5 19:03:49 2013 +++ /sys/src/cmd/cc/lex.c Fri Jul 5 19:03:45 2013 @@ -36,8 +36,8 @@ void main(int argc, char *argv[]) { - char *defs[50], *p; - int nproc, nout, status, i, c, ndef; + char **defs, **np, *p; + int nproc, nout, status, i, c, ndef, maxdef; memset(debug, 0, sizeof(debug)); tinit(); @@ -47,9 +47,11 @@ profileflg = 1; /* #pragma can turn it off */ tufield = simplet((1L<etype) | BUNSIGNED); + maxdef = 0; ndef = 0; outfile = 0; - include[ninclude++] = "."; + defs = nil; + setinclude("."); ARGBEGIN { default: c = ARGC(); @@ -73,6 +75,13 @@ case 'D': p = ARGF(); if(p) { + if(ndef >= maxdef){ + maxdef += 50; + np = alloc(maxdef * sizeof *np); + if(defs != nil) + memmove(np, defs, (maxdef - 50) * sizeof *np); + defs = np; + } defs[ndef++] = p; dodefine(p); } @@ -153,7 +162,7 @@ compile(char *file, char **defs, int ndef) { char ofile[400], incfile[20]; - char *p, *av[100], opt[256]; + char *p, **av, opt[256]; int i, c, fd[2]; static int first = 1; @@ -241,6 +250,7 @@ close(fd[0]); mydup(fd[1], 1); close(fd[1]); + av = alloc((3 + ndef + ninclude + 2) * sizeof *av); av[0] = CPP; i = 1; if(debug['.']) @@ -1522,23 +1532,26 @@ setinclude(char *p) { int i; - char *e; + char *e, **np; while(*p != 0) { e = strchr(p, ' '); if(e != 0) *e = '\0'; - for(i=1; i < ninclude; i++) + for(i=0; i < ninclude; i++) if(strcmp(p, include[i]) == 0) break; - if(i >= ninclude) + if(i >= ninclude){ + if(i >= maxinclude){ + maxinclude += 20; + np = alloc(maxinclude * sizeof *np); + if(include != nil) + memmove(np, include, (maxinclude - 20) * sizeof *np); + include = np; + } include[ninclude++] = p; - - if(ninclude > nelem(include)) { - diag(Z, "ninclude too small %d", nelem(include)); - exits("ninclude"); } if(e == 0)