13b56890dSDavid du Colombier#define VARMAC 0x80 27dd7cddfSDavid du Colombier 37dd7cddfSDavid du Colombierlong 47dd7cddfSDavid du Colombiergetnsn(void) 57dd7cddfSDavid du Colombier{ 67dd7cddfSDavid du Colombier long n; 77dd7cddfSDavid du Colombier int c; 87dd7cddfSDavid du Colombier 97dd7cddfSDavid du Colombier c = getnsc(); 107dd7cddfSDavid du Colombier if(c < '0' || c > '9') 117dd7cddfSDavid du Colombier return -1; 127dd7cddfSDavid du Colombier n = 0; 137dd7cddfSDavid du Colombier while(c >= '0' && c <= '9') { 147dd7cddfSDavid du Colombier n = n*10 + c-'0'; 157dd7cddfSDavid du Colombier c = getc(); 167dd7cddfSDavid du Colombier } 177dd7cddfSDavid du Colombier unget(c); 187dd7cddfSDavid du Colombier return n; 197dd7cddfSDavid du Colombier} 207dd7cddfSDavid du Colombier 21*40d01547SDavid du Colombierstatic void 22*40d01547SDavid du Colombiernextsym(int c) 233e12c5d1SDavid du Colombier{ 24*40d01547SDavid du Colombier int c1; 253e12c5d1SDavid du Colombier char *cp; 263e12c5d1SDavid du Colombier 273e12c5d1SDavid du Colombier for(cp = symb;;) { 28*40d01547SDavid du Colombier if(c >= Runeself) { 29*40d01547SDavid du Colombier for(c1=0;;) { 30*40d01547SDavid du Colombier if(cp <= symb+NSYMB-UTFmax) 31*40d01547SDavid du Colombier cp[c1++] = c; 32*40d01547SDavid du Colombier if(fullrune(cp, c1)) 33*40d01547SDavid du Colombier break; 34*40d01547SDavid du Colombier c = getc(); 35*40d01547SDavid du Colombier } 36*40d01547SDavid du Colombier cp += c1; 37*40d01547SDavid du Colombier }else 38*40d01547SDavid du Colombier if(cp <= symb+NSYMB-UTFmax) 393e12c5d1SDavid du Colombier *cp++ = c; 403e12c5d1SDavid du Colombier c = getc(); 41*40d01547SDavid du Colombier if(c >= Runeself || isalnum(c) || c == '_') 423e12c5d1SDavid du Colombier continue; 433e12c5d1SDavid du Colombier unget(c); 443e12c5d1SDavid du Colombier break; 453e12c5d1SDavid du Colombier } 463e12c5d1SDavid du Colombier *cp = 0; 47*40d01547SDavid du Colombier if(cp > symb+NSYMB-UTFmax) 483e12c5d1SDavid du Colombier yyerror("symbol too large: %s", symb); 49*40d01547SDavid du Colombier} 50*40d01547SDavid du Colombier 51*40d01547SDavid du ColombierSym* 52*40d01547SDavid du Colombiergetsym(void) 53*40d01547SDavid du Colombier{ 54*40d01547SDavid du Colombier int c; 55*40d01547SDavid du Colombier 56*40d01547SDavid du Colombier c = getnsc(); 57*40d01547SDavid du Colombier if(c < Runeself && !isalpha(c) && c != '_') { 58*40d01547SDavid du Colombier unget(c); 59*40d01547SDavid du Colombier return S; 60*40d01547SDavid du Colombier } 61*40d01547SDavid du Colombier nextsym(c); 623e12c5d1SDavid du Colombier return lookup(); 633e12c5d1SDavid du Colombier} 643e12c5d1SDavid du Colombier 653b56890dSDavid du ColombierSym* 663b56890dSDavid du Colombiergetsymdots(int *dots) 673b56890dSDavid du Colombier{ 683b56890dSDavid du Colombier int c; 693b56890dSDavid du Colombier Sym *s; 703b56890dSDavid du Colombier 713b56890dSDavid du Colombier s = getsym(); 723b56890dSDavid du Colombier if(s != S) 733b56890dSDavid du Colombier return s; 743b56890dSDavid du Colombier 753b56890dSDavid du Colombier c = getnsc(); 763b56890dSDavid du Colombier if(c != '.'){ 773b56890dSDavid du Colombier unget(c); 783b56890dSDavid du Colombier return S; 793b56890dSDavid du Colombier } 803b56890dSDavid du Colombier if(getc() != '.' || getc() != '.') 813b56890dSDavid du Colombier yyerror("bad dots in macro"); 823b56890dSDavid du Colombier *dots = 1; 833b56890dSDavid du Colombier return slookup("__VA_ARGS__"); 843b56890dSDavid du Colombier} 853b56890dSDavid du Colombier 86219b2ee8SDavid du Colombierint 87219b2ee8SDavid du Colombiergetcom(void) 88219b2ee8SDavid du Colombier{ 89219b2ee8SDavid du Colombier int c; 90219b2ee8SDavid du Colombier 91219b2ee8SDavid du Colombier for(;;) { 92219b2ee8SDavid du Colombier c = getnsc(); 93219b2ee8SDavid du Colombier if(c != '/') 94219b2ee8SDavid du Colombier break; 95219b2ee8SDavid du Colombier c = getc(); 967dd7cddfSDavid du Colombier if(c == '/') { 977dd7cddfSDavid du Colombier while(c != '\n') 987dd7cddfSDavid du Colombier c = getc(); 997dd7cddfSDavid du Colombier break; 1007dd7cddfSDavid du Colombier } 101219b2ee8SDavid du Colombier if(c != '*') 102219b2ee8SDavid du Colombier break; 103219b2ee8SDavid du Colombier c = getc(); 104219b2ee8SDavid du Colombier for(;;) { 105219b2ee8SDavid du Colombier if(c == '*') { 106219b2ee8SDavid du Colombier c = getc(); 107219b2ee8SDavid du Colombier if(c != '/') 108219b2ee8SDavid du Colombier continue; 109219b2ee8SDavid du Colombier c = getc(); 110219b2ee8SDavid du Colombier break; 111219b2ee8SDavid du Colombier } 112219b2ee8SDavid du Colombier if(c == '\n') { 113219b2ee8SDavid du Colombier yyerror("comment across newline"); 114219b2ee8SDavid du Colombier break; 115219b2ee8SDavid du Colombier } 116219b2ee8SDavid du Colombier c = getc(); 117219b2ee8SDavid du Colombier } 118219b2ee8SDavid du Colombier if(c == '\n') 119219b2ee8SDavid du Colombier break; 120219b2ee8SDavid du Colombier } 121219b2ee8SDavid du Colombier return c; 122219b2ee8SDavid du Colombier} 123219b2ee8SDavid du Colombier 1243e12c5d1SDavid du Colombiervoid 1253e12c5d1SDavid du Colombierdodefine(char *cp) 1263e12c5d1SDavid du Colombier{ 1273e12c5d1SDavid du Colombier Sym *s; 1283e12c5d1SDavid du Colombier char *p; 1293e12c5d1SDavid du Colombier long l; 1303e12c5d1SDavid du Colombier 1313e12c5d1SDavid du Colombier strcpy(symb, cp); 1323e12c5d1SDavid du Colombier p = strchr(symb, '='); 1333e12c5d1SDavid du Colombier if(p) { 1343e12c5d1SDavid du Colombier *p++ = 0; 1353e12c5d1SDavid du Colombier s = lookup(); 1363e12c5d1SDavid du Colombier l = strlen(p) + 2; /* +1 null, +1 nargs */ 1373e12c5d1SDavid du Colombier while(l & 3) 1383e12c5d1SDavid du Colombier l++; 1393e12c5d1SDavid du Colombier while(nhunk < l) 1403e12c5d1SDavid du Colombier gethunk(); 1413e12c5d1SDavid du Colombier *hunk = 0; 1423e12c5d1SDavid du Colombier strcpy(hunk+1, p); 1433e12c5d1SDavid du Colombier s->macro = hunk; 1443e12c5d1SDavid du Colombier hunk += l; 1453e12c5d1SDavid du Colombier nhunk -= l; 1463e12c5d1SDavid du Colombier } else { 1473e12c5d1SDavid du Colombier s = lookup(); 1483e12c5d1SDavid du Colombier s->macro = "\0001"; /* \000 is nargs */ 1493e12c5d1SDavid du Colombier } 150219b2ee8SDavid du Colombier if(debug['m']) 151219b2ee8SDavid du Colombier print("#define (-D) %s %s\n", s->name, s->macro+1); 1523e12c5d1SDavid du Colombier} 1533e12c5d1SDavid du Colombier 1543e12c5d1SDavid du Colombierstruct 1553e12c5d1SDavid du Colombier{ 1563e12c5d1SDavid du Colombier char *macname; 1573e12c5d1SDavid du Colombier void (*macf)(void); 1583e12c5d1SDavid du Colombier} mactab[] = 1593e12c5d1SDavid du Colombier{ 1603e12c5d1SDavid du Colombier "ifdef", 0, /* macif(0) */ 1613e12c5d1SDavid du Colombier "ifndef", 0, /* macif(1) */ 1623e12c5d1SDavid du Colombier "else", 0, /* macif(2) */ 1633e12c5d1SDavid du Colombier 1643e12c5d1SDavid du Colombier "line", maclin, 1653e12c5d1SDavid du Colombier "define", macdef, 1663e12c5d1SDavid du Colombier "include", macinc, 1673e12c5d1SDavid du Colombier "undef", macund, 1683e12c5d1SDavid du Colombier 1693e12c5d1SDavid du Colombier "pragma", macprag, 1703e12c5d1SDavid du Colombier "endif", macend, 1713e12c5d1SDavid du Colombier 0 1723e12c5d1SDavid du Colombier}; 1733e12c5d1SDavid du Colombier 1743e12c5d1SDavid du Colombiervoid 1753e12c5d1SDavid du Colombierdomacro(void) 1763e12c5d1SDavid du Colombier{ 1773e12c5d1SDavid du Colombier int i; 1783e12c5d1SDavid du Colombier Sym *s; 1793e12c5d1SDavid du Colombier 1803e12c5d1SDavid du Colombier s = getsym(); 1813e12c5d1SDavid du Colombier if(s == S) 1823e12c5d1SDavid du Colombier s = slookup("endif"); 1833e12c5d1SDavid du Colombier for(i=0; mactab[i].macname; i++) 1843e12c5d1SDavid du Colombier if(strcmp(s->name, mactab[i].macname) == 0) { 1853e12c5d1SDavid du Colombier if(mactab[i].macf) 1863e12c5d1SDavid du Colombier (*mactab[i].macf)(); 1873e12c5d1SDavid du Colombier else 1883e12c5d1SDavid du Colombier macif(i); 1893e12c5d1SDavid du Colombier return; 1903e12c5d1SDavid du Colombier } 1913e12c5d1SDavid du Colombier yyerror("unknown #: %s", s->name); 1923e12c5d1SDavid du Colombier macend(); 1933e12c5d1SDavid du Colombier} 1943e12c5d1SDavid du Colombier 1953e12c5d1SDavid du Colombiervoid 1963e12c5d1SDavid du Colombiermacund(void) 1973e12c5d1SDavid du Colombier{ 1983e12c5d1SDavid du Colombier Sym *s; 1993e12c5d1SDavid du Colombier 2003e12c5d1SDavid du Colombier s = getsym(); 2013e12c5d1SDavid du Colombier macend(); 2023e12c5d1SDavid du Colombier if(s == S) { 2033e12c5d1SDavid du Colombier yyerror("syntax in #undef"); 2043e12c5d1SDavid du Colombier return; 2053e12c5d1SDavid du Colombier } 2063e12c5d1SDavid du Colombier s->macro = 0; 2073e12c5d1SDavid du Colombier} 2083e12c5d1SDavid du Colombier 2093e12c5d1SDavid du Colombier#define NARG 25 2103e12c5d1SDavid du Colombiervoid 2113e12c5d1SDavid du Colombiermacdef(void) 2123e12c5d1SDavid du Colombier{ 2133e12c5d1SDavid du Colombier Sym *s, *a; 214*40d01547SDavid du Colombier char *args[NARG], *base; 2153b56890dSDavid du Colombier int n, i, c, len, dots; 216feebb65bSDavid du Colombier int ischr; 2173e12c5d1SDavid du Colombier 2183e12c5d1SDavid du Colombier s = getsym(); 2193e12c5d1SDavid du Colombier if(s == S) 2203e12c5d1SDavid du Colombier goto bad; 2213e12c5d1SDavid du Colombier if(s->macro) 2223e12c5d1SDavid du Colombier yyerror("macro redefined: %s", s->name); 2233e12c5d1SDavid du Colombier c = getc(); 2243e12c5d1SDavid du Colombier n = -1; 2253b56890dSDavid du Colombier dots = 0; 2263e12c5d1SDavid du Colombier if(c == '(') { 2273e12c5d1SDavid du Colombier n++; 2283e12c5d1SDavid du Colombier c = getnsc(); 2293e12c5d1SDavid du Colombier if(c != ')') { 2303e12c5d1SDavid du Colombier unget(c); 2313e12c5d1SDavid du Colombier for(;;) { 2323b56890dSDavid du Colombier a = getsymdots(&dots); 2333e12c5d1SDavid du Colombier if(a == S) 2343e12c5d1SDavid du Colombier goto bad; 2353e12c5d1SDavid du Colombier if(n >= NARG) { 2363e12c5d1SDavid du Colombier yyerror("too many arguments in #define: %s", s->name); 2373e12c5d1SDavid du Colombier goto bad; 2383e12c5d1SDavid du Colombier } 2393e12c5d1SDavid du Colombier args[n++] = a->name; 2403e12c5d1SDavid du Colombier c = getnsc(); 2413e12c5d1SDavid du Colombier if(c == ')') 2423e12c5d1SDavid du Colombier break; 2433b56890dSDavid du Colombier if(c != ',' || dots) 2443e12c5d1SDavid du Colombier goto bad; 2453e12c5d1SDavid du Colombier } 2463e12c5d1SDavid du Colombier } 2473e12c5d1SDavid du Colombier c = getc(); 2483e12c5d1SDavid du Colombier } 2493e12c5d1SDavid du Colombier if(isspace(c)) 2503e12c5d1SDavid du Colombier if(c != '\n') 2513e12c5d1SDavid du Colombier c = getnsc(); 2523e12c5d1SDavid du Colombier base = hunk; 2533e12c5d1SDavid du Colombier len = 1; 254feebb65bSDavid du Colombier ischr = 0; 2553e12c5d1SDavid du Colombier for(;;) { 256*40d01547SDavid du Colombier if(c >= Runeself || isalpha(c) || c == '_') { 257*40d01547SDavid du Colombier nextsym(c); 2583e12c5d1SDavid du Colombier c = getc(); 2593e12c5d1SDavid du Colombier for(i=0; i<n; i++) 2603e12c5d1SDavid du Colombier if(strcmp(symb, args[i]) == 0) 2613e12c5d1SDavid du Colombier break; 2623e12c5d1SDavid du Colombier if(i >= n) { 2633e12c5d1SDavid du Colombier i = strlen(symb); 2647dd7cddfSDavid du Colombier base = allocn(base, len, i); 2653e12c5d1SDavid du Colombier memcpy(base+len, symb, i); 2663e12c5d1SDavid du Colombier len += i; 2673e12c5d1SDavid du Colombier continue; 2683e12c5d1SDavid du Colombier } 2697dd7cddfSDavid du Colombier base = allocn(base, len, 2); 2703e12c5d1SDavid du Colombier base[len++] = '#'; 2713e12c5d1SDavid du Colombier base[len++] = 'a' + i; 2723e12c5d1SDavid du Colombier continue; 2733e12c5d1SDavid du Colombier } 274feebb65bSDavid du Colombier if(ischr){ 275feebb65bSDavid du Colombier if(c == '\\'){ 276feebb65bSDavid du Colombier base = allocn(base, len, 1); 277feebb65bSDavid du Colombier base[len++] = c; 278feebb65bSDavid du Colombier c = getc(); 279feebb65bSDavid du Colombier }else if(c == ischr) 280feebb65bSDavid du Colombier ischr = 0; 281feebb65bSDavid du Colombier }else{ 282feebb65bSDavid du Colombier if(c == '"' || c == '\''){ 283feebb65bSDavid du Colombier base = allocn(base, len, 1); 284feebb65bSDavid du Colombier base[len++] = c; 285feebb65bSDavid du Colombier ischr = c; 286feebb65bSDavid du Colombier c = getc(); 287feebb65bSDavid du Colombier continue; 288feebb65bSDavid du Colombier } 2893e12c5d1SDavid du Colombier if(c == '/') { 2903e12c5d1SDavid du Colombier c = getc(); 291705edaf8SDavid du Colombier if(c == '/'){ 292705edaf8SDavid du Colombier c = getc(); 293705edaf8SDavid du Colombier for(;;) { 294705edaf8SDavid du Colombier if(c == '\n') 295705edaf8SDavid du Colombier break; 296705edaf8SDavid du Colombier c = getc(); 297705edaf8SDavid du Colombier } 2983e12c5d1SDavid du Colombier continue; 2993e12c5d1SDavid du Colombier } 300705edaf8SDavid du Colombier if(c == '*'){ 3013e12c5d1SDavid du Colombier c = getc(); 3023e12c5d1SDavid du Colombier for(;;) { 3033e12c5d1SDavid du Colombier if(c == '*') { 3043e12c5d1SDavid du Colombier c = getc(); 3053e12c5d1SDavid du Colombier if(c != '/') 3063e12c5d1SDavid du Colombier continue; 3073e12c5d1SDavid du Colombier c = getc(); 3083e12c5d1SDavid du Colombier break; 3093e12c5d1SDavid du Colombier } 310*40d01547SDavid du Colombier if(0 && c == '\n') { 3113e12c5d1SDavid du Colombier yyerror("comment and newline in define: %s", s->name); 3123e12c5d1SDavid du Colombier break; 3133e12c5d1SDavid du Colombier } 3143e12c5d1SDavid du Colombier c = getc(); 3153e12c5d1SDavid du Colombier } 3163e12c5d1SDavid du Colombier continue; 3173e12c5d1SDavid du Colombier } 318705edaf8SDavid du Colombier base = allocn(base, len, 1); 319705edaf8SDavid du Colombier base[len++] = '/'; 320705edaf8SDavid du Colombier continue; 321705edaf8SDavid du Colombier } 322feebb65bSDavid du Colombier } 3233e12c5d1SDavid du Colombier if(c == '\\') { 3243e12c5d1SDavid du Colombier c = getc(); 3253e12c5d1SDavid du Colombier if(c == '\n') { 3263e12c5d1SDavid du Colombier c = getc(); 3273e12c5d1SDavid du Colombier continue; 3283e12c5d1SDavid du Colombier } 329375daca8SDavid du Colombier else if(c == '\r') { 330375daca8SDavid du Colombier c = getc(); 331375daca8SDavid du Colombier if(c == '\n') { 332375daca8SDavid du Colombier c = getc(); 333375daca8SDavid du Colombier continue; 334375daca8SDavid du Colombier } 335375daca8SDavid du Colombier } 3367dd7cddfSDavid du Colombier base = allocn(base, len, 1); 3373e12c5d1SDavid du Colombier base[len++] = '\\'; 3383e12c5d1SDavid du Colombier continue; 3393e12c5d1SDavid du Colombier } 3403e12c5d1SDavid du Colombier if(c == '\n') 3413e12c5d1SDavid du Colombier break; 3423e12c5d1SDavid du Colombier if(c == '#') 3433e12c5d1SDavid du Colombier if(n > 0) { 3447dd7cddfSDavid du Colombier base = allocn(base, len, 1); 3453e12c5d1SDavid du Colombier base[len++] = c; 3463e12c5d1SDavid du Colombier } 3477dd7cddfSDavid du Colombier base = allocn(base, len, 1); 3483e12c5d1SDavid du Colombier base[len++] = c; 3493e12c5d1SDavid du Colombier c = ((--fi.c < 0)? filbuf(): (*fi.p++ & 0xff)); 3503e12c5d1SDavid du Colombier if(c == '\n') 3513e12c5d1SDavid du Colombier lineno++; 3523e12c5d1SDavid du Colombier if(c == -1) { 3533e12c5d1SDavid du Colombier yyerror("eof in a macro: %s", s->name); 3543e12c5d1SDavid du Colombier break; 3553e12c5d1SDavid du Colombier } 3563e12c5d1SDavid du Colombier } 3573e12c5d1SDavid du Colombier do { 3587dd7cddfSDavid du Colombier base = allocn(base, len, 1); 3593e12c5d1SDavid du Colombier base[len++] = 0; 3603e12c5d1SDavid du Colombier } while(len & 3); 3613e12c5d1SDavid du Colombier 3623e12c5d1SDavid du Colombier *base = n+1; 3633b56890dSDavid du Colombier if(dots) 3643b56890dSDavid du Colombier *base |= VARMAC; 3653e12c5d1SDavid du Colombier s->macro = base; 3663e12c5d1SDavid du Colombier if(debug['m']) 3673e12c5d1SDavid du Colombier print("#define %s %s\n", s->name, s->macro+1); 3683e12c5d1SDavid du Colombier return; 3693e12c5d1SDavid du Colombier 3703e12c5d1SDavid du Colombierbad: 3713e12c5d1SDavid du Colombier if(s == S) 3723e12c5d1SDavid du Colombier yyerror("syntax in #define"); 3733e12c5d1SDavid du Colombier else 3743e12c5d1SDavid du Colombier yyerror("syntax in #define: %s", s->name); 3753e12c5d1SDavid du Colombier macend(); 3763e12c5d1SDavid du Colombier} 3773e12c5d1SDavid du Colombier 3783e12c5d1SDavid du Colombiervoid 3793e12c5d1SDavid du Colombiermacexpand(Sym *s, char *b) 3803e12c5d1SDavid du Colombier{ 3813e12c5d1SDavid du Colombier char buf[2000]; 3823e12c5d1SDavid du Colombier int n, l, c, nargs; 3833b56890dSDavid du Colombier char *arg[NARG], *cp, *ob, *ecp, dots; 3843e12c5d1SDavid du Colombier 3853e12c5d1SDavid du Colombier ob = b; 3863b56890dSDavid du Colombier if(*s->macro == 0) { 3873e12c5d1SDavid du Colombier strcpy(b, s->macro+1); 3883e12c5d1SDavid du Colombier if(debug['m']) 3893e12c5d1SDavid du Colombier print("#expand %s %s\n", s->name, ob); 3903e12c5d1SDavid du Colombier return; 3913e12c5d1SDavid du Colombier } 3923b56890dSDavid du Colombier 3933b56890dSDavid du Colombier nargs = (char)(*s->macro & ~VARMAC) - 1; 3943b56890dSDavid du Colombier dots = *s->macro & VARMAC; 3953b56890dSDavid du Colombier 3963e12c5d1SDavid du Colombier c = getnsc(); 3973e12c5d1SDavid du Colombier if(c != '(') 3983e12c5d1SDavid du Colombier goto bad; 3993e12c5d1SDavid du Colombier n = 0; 4003e12c5d1SDavid du Colombier c = getc(); 4013e12c5d1SDavid du Colombier if(c != ')') { 4023e12c5d1SDavid du Colombier unget(c); 4033e12c5d1SDavid du Colombier l = 0; 4043e12c5d1SDavid du Colombier cp = buf; 405*40d01547SDavid du Colombier ecp = cp + sizeof(buf)-UTFmax; 4063e12c5d1SDavid du Colombier arg[n++] = cp; 4073e12c5d1SDavid du Colombier for(;;) { 4083e12c5d1SDavid du Colombier if(cp >= ecp) 4093e12c5d1SDavid du Colombier goto toobig; 4103e12c5d1SDavid du Colombier c = getc(); 4113e12c5d1SDavid du Colombier if(c == '"') 4123e12c5d1SDavid du Colombier for(;;) { 4133e12c5d1SDavid du Colombier if(cp >= ecp) 4143e12c5d1SDavid du Colombier goto toobig; 4153e12c5d1SDavid du Colombier *cp++ = c; 4163e12c5d1SDavid du Colombier c = getc(); 4173e12c5d1SDavid du Colombier if(c == '\\') { 4183e12c5d1SDavid du Colombier *cp++ = c; 4193e12c5d1SDavid du Colombier c = getc(); 4203e12c5d1SDavid du Colombier continue; 4213e12c5d1SDavid du Colombier } 4223e12c5d1SDavid du Colombier if(c == '\n') 4233e12c5d1SDavid du Colombier goto bad; 4243e12c5d1SDavid du Colombier if(c == '"') 4253e12c5d1SDavid du Colombier break; 4263e12c5d1SDavid du Colombier } 4273e12c5d1SDavid du Colombier if(c == '\'') 4283e12c5d1SDavid du Colombier for(;;) { 4293e12c5d1SDavid du Colombier if(cp >= ecp) 4303e12c5d1SDavid du Colombier goto toobig; 4313e12c5d1SDavid du Colombier *cp++ = c; 4323e12c5d1SDavid du Colombier c = getc(); 4333e12c5d1SDavid du Colombier if(c == '\\') { 4343e12c5d1SDavid du Colombier *cp++ = c; 4353e12c5d1SDavid du Colombier c = getc(); 4363e12c5d1SDavid du Colombier continue; 4373e12c5d1SDavid du Colombier } 4383e12c5d1SDavid du Colombier if(c == '\n') 4393e12c5d1SDavid du Colombier goto bad; 4403e12c5d1SDavid du Colombier if(c == '\'') 4413e12c5d1SDavid du Colombier break; 4423e12c5d1SDavid du Colombier } 4435d459b5aSDavid du Colombier if(c == '/') { 4445d459b5aSDavid du Colombier c = getc(); 4455d459b5aSDavid du Colombier switch(c) { 4465d459b5aSDavid du Colombier case '*': 4475d459b5aSDavid du Colombier for(;;) { 4485d459b5aSDavid du Colombier c = getc(); 4495d459b5aSDavid du Colombier if(c == '*') { 4505d459b5aSDavid du Colombier c = getc(); 4515d459b5aSDavid du Colombier if(c == '/') 4525d459b5aSDavid du Colombier break; 4535d459b5aSDavid du Colombier } 4545d459b5aSDavid du Colombier } 4555d459b5aSDavid du Colombier *cp++ = ' '; 4565d459b5aSDavid du Colombier continue; 4575d459b5aSDavid du Colombier case '/': 4585d459b5aSDavid du Colombier while((c = getc()) != '\n') 4595d459b5aSDavid du Colombier ; 4605d459b5aSDavid du Colombier break; 4615d459b5aSDavid du Colombier default: 4625d459b5aSDavid du Colombier unget(c); 4635d459b5aSDavid du Colombier c = '/'; 4645d459b5aSDavid du Colombier } 4655d459b5aSDavid du Colombier } 4663e12c5d1SDavid du Colombier if(l == 0) { 4673e12c5d1SDavid du Colombier if(c == ',') { 4683b56890dSDavid du Colombier if(n == nargs && dots) { 4693b56890dSDavid du Colombier *cp++ = ','; 4703b56890dSDavid du Colombier continue; 4713b56890dSDavid du Colombier } 4723e12c5d1SDavid du Colombier *cp++ = 0; 4733e12c5d1SDavid du Colombier arg[n++] = cp; 4743e12c5d1SDavid du Colombier if(n > nargs) 4753e12c5d1SDavid du Colombier break; 4763e12c5d1SDavid du Colombier continue; 4773e12c5d1SDavid du Colombier } 4783e12c5d1SDavid du Colombier if(c == ')') 4793e12c5d1SDavid du Colombier break; 4803e12c5d1SDavid du Colombier } 4813e12c5d1SDavid du Colombier if(c == '\n') 4823e12c5d1SDavid du Colombier c = ' '; 4833e12c5d1SDavid du Colombier *cp++ = c; 4843e12c5d1SDavid du Colombier if(c == '(') 4853e12c5d1SDavid du Colombier l++; 4863e12c5d1SDavid du Colombier if(c == ')') 4873e12c5d1SDavid du Colombier l--; 4883e12c5d1SDavid du Colombier } 4893e12c5d1SDavid du Colombier *cp = 0; 4903e12c5d1SDavid du Colombier } 4913e12c5d1SDavid du Colombier if(n != nargs) { 4923e12c5d1SDavid du Colombier yyerror("argument mismatch expanding: %s", s->name); 4933e12c5d1SDavid du Colombier *b = 0; 4943e12c5d1SDavid du Colombier return; 4953e12c5d1SDavid du Colombier } 4963e12c5d1SDavid du Colombier cp = s->macro+1; 4973e12c5d1SDavid du Colombier for(;;) { 4983e12c5d1SDavid du Colombier c = *cp++; 499b85a8364SDavid du Colombier if(c == '\n') 500b85a8364SDavid du Colombier c = ' '; 5013e12c5d1SDavid du Colombier if(c != '#') { 5023e12c5d1SDavid du Colombier *b++ = c; 5033e12c5d1SDavid du Colombier if(c == 0) 5043e12c5d1SDavid du Colombier break; 5053e12c5d1SDavid du Colombier continue; 5063e12c5d1SDavid du Colombier } 5073e12c5d1SDavid du Colombier c = *cp++; 5083e12c5d1SDavid du Colombier if(c == 0) 5093e12c5d1SDavid du Colombier goto bad; 5103e12c5d1SDavid du Colombier if(c == '#') { 5113e12c5d1SDavid du Colombier *b++ = c; 5123e12c5d1SDavid du Colombier continue; 5133e12c5d1SDavid du Colombier } 5143e12c5d1SDavid du Colombier c -= 'a'; 5153e12c5d1SDavid du Colombier if(c < 0 || c >= n) 5163e12c5d1SDavid du Colombier continue; 5173e12c5d1SDavid du Colombier strcpy(b, arg[c]); 5183e12c5d1SDavid du Colombier b += strlen(arg[c]); 5193e12c5d1SDavid du Colombier } 5203e12c5d1SDavid du Colombier *b = 0; 5213e12c5d1SDavid du Colombier if(debug['m']) 5223e12c5d1SDavid du Colombier print("#expand %s %s\n", s->name, ob); 5233e12c5d1SDavid du Colombier return; 5243e12c5d1SDavid du Colombier 5253e12c5d1SDavid du Colombierbad: 5263e12c5d1SDavid du Colombier yyerror("syntax in macro expansion: %s", s->name); 5273e12c5d1SDavid du Colombier *b = 0; 5283e12c5d1SDavid du Colombier return; 5293e12c5d1SDavid du Colombier 5303e12c5d1SDavid du Colombiertoobig: 5313e12c5d1SDavid du Colombier yyerror("too much text in macro expansion: %s", s->name); 5323e12c5d1SDavid du Colombier *b = 0; 5333e12c5d1SDavid du Colombier} 5343e12c5d1SDavid du Colombier 5353e12c5d1SDavid du Colombiervoid 5363e12c5d1SDavid du Colombiermacinc(void) 5373e12c5d1SDavid du Colombier{ 5383e12c5d1SDavid du Colombier int c0, c, i, f; 5393e12c5d1SDavid du Colombier char str[STRINGSZ], *hp; 5403e12c5d1SDavid du Colombier 5413e12c5d1SDavid du Colombier c0 = getnsc(); 5423e12c5d1SDavid du Colombier if(c0 != '"') { 5433e12c5d1SDavid du Colombier c = c0; 5443e12c5d1SDavid du Colombier if(c0 != '<') 5453e12c5d1SDavid du Colombier goto bad; 5463e12c5d1SDavid du Colombier c0 = '>'; 5473e12c5d1SDavid du Colombier } 5483e12c5d1SDavid du Colombier for(hp = str;;) { 5493e12c5d1SDavid du Colombier c = getc(); 5503e12c5d1SDavid du Colombier if(c == c0) 5513e12c5d1SDavid du Colombier break; 5523e12c5d1SDavid du Colombier if(c == '\n') 5533e12c5d1SDavid du Colombier goto bad; 5543e12c5d1SDavid du Colombier *hp++ = c; 5553e12c5d1SDavid du Colombier } 5563e12c5d1SDavid du Colombier *hp = 0; 557219b2ee8SDavid du Colombier 558219b2ee8SDavid du Colombier c = getcom(); 5593e12c5d1SDavid du Colombier if(c != '\n') 5603e12c5d1SDavid du Colombier goto bad; 561219b2ee8SDavid du Colombier 5623e12c5d1SDavid du Colombier f = -1; 5633e12c5d1SDavid du Colombier for(i=0; i<ninclude; i++) { 5643e12c5d1SDavid du Colombier if(i == 0 && c0 == '>') 5653e12c5d1SDavid du Colombier continue; 5663e12c5d1SDavid du Colombier strcpy(symb, include[i]); 5673e12c5d1SDavid du Colombier strcat(symb, "/"); 5683e12c5d1SDavid du Colombier if(strcmp(symb, "./") == 0) 5693e12c5d1SDavid du Colombier symb[0] = 0; 5703e12c5d1SDavid du Colombier strcat(symb, str); 5713e12c5d1SDavid du Colombier f = open(symb, 0); 5723e12c5d1SDavid du Colombier if(f >= 0) 5733e12c5d1SDavid du Colombier break; 5743e12c5d1SDavid du Colombier } 5753e12c5d1SDavid du Colombier if(f < 0) 5763e12c5d1SDavid du Colombier strcpy(symb, str); 5773e12c5d1SDavid du Colombier c = strlen(symb) + 1; 5783e12c5d1SDavid du Colombier while(c & 3) 5793e12c5d1SDavid du Colombier c++; 5803e12c5d1SDavid du Colombier while(nhunk < c) 5813e12c5d1SDavid du Colombier gethunk(); 5823e12c5d1SDavid du Colombier hp = hunk; 5833e12c5d1SDavid du Colombier memcpy(hunk, symb, c); 5843e12c5d1SDavid du Colombier nhunk -= c; 5853e12c5d1SDavid du Colombier hunk += c; 5863e12c5d1SDavid du Colombier newio(); 5873e12c5d1SDavid du Colombier pushio(); 5883e12c5d1SDavid du Colombier newfile(hp, f); 5893e12c5d1SDavid du Colombier return; 5903e12c5d1SDavid du Colombier 5913e12c5d1SDavid du Colombierbad: 5923e12c5d1SDavid du Colombier unget(c); 5933e12c5d1SDavid du Colombier yyerror("syntax in #include"); 5943e12c5d1SDavid du Colombier macend(); 5953e12c5d1SDavid du Colombier} 5963e12c5d1SDavid du Colombier 5973e12c5d1SDavid du Colombiervoid 5983e12c5d1SDavid du Colombiermaclin(void) 5993e12c5d1SDavid du Colombier{ 6003e12c5d1SDavid du Colombier char *cp; 6013e12c5d1SDavid du Colombier int c; 6023e12c5d1SDavid du Colombier long n; 6033e12c5d1SDavid du Colombier 6047dd7cddfSDavid du Colombier n = getnsn(); 6053e12c5d1SDavid du Colombier c = getc(); 6067dd7cddfSDavid du Colombier if(n < 0) 6077dd7cddfSDavid du Colombier goto bad; 6087dd7cddfSDavid du Colombier 6093e12c5d1SDavid du Colombier for(;;) { 6103e12c5d1SDavid du Colombier if(c == ' ' || c == '\t') { 6113e12c5d1SDavid du Colombier c = getc(); 6123e12c5d1SDavid du Colombier continue; 6133e12c5d1SDavid du Colombier } 6143e12c5d1SDavid du Colombier if(c == '"') 6153e12c5d1SDavid du Colombier break; 6163e12c5d1SDavid du Colombier if(c == '\n') { 6173e12c5d1SDavid du Colombier strcpy(symb, "<noname>"); 6183e12c5d1SDavid du Colombier goto nn; 6193e12c5d1SDavid du Colombier } 6203e12c5d1SDavid du Colombier goto bad; 6213e12c5d1SDavid du Colombier } 6223e12c5d1SDavid du Colombier cp = symb; 6233e12c5d1SDavid du Colombier for(;;) { 6243e12c5d1SDavid du Colombier c = getc(); 6253e12c5d1SDavid du Colombier if(c == '"') 6263e12c5d1SDavid du Colombier break; 6273e12c5d1SDavid du Colombier *cp++ = c; 6283e12c5d1SDavid du Colombier } 6293e12c5d1SDavid du Colombier *cp = 0; 630219b2ee8SDavid du Colombier c = getcom(); 6313e12c5d1SDavid du Colombier if(c != '\n') 6323e12c5d1SDavid du Colombier goto bad; 6333e12c5d1SDavid du Colombier 6343e12c5d1SDavid du Colombiernn: 6353e12c5d1SDavid du Colombier c = strlen(symb) + 1; 6363e12c5d1SDavid du Colombier while(c & 3) 6373e12c5d1SDavid du Colombier c++; 6383e12c5d1SDavid du Colombier while(nhunk < c) 6393e12c5d1SDavid du Colombier gethunk(); 6403e12c5d1SDavid du Colombier cp = hunk; 6413e12c5d1SDavid du Colombier memcpy(hunk, symb, c); 6423e12c5d1SDavid du Colombier nhunk -= c; 6433e12c5d1SDavid du Colombier hunk += c; 6443e12c5d1SDavid du Colombier linehist(cp, n); 6453e12c5d1SDavid du Colombier return; 6463e12c5d1SDavid du Colombier 6473e12c5d1SDavid du Colombierbad: 6483e12c5d1SDavid du Colombier unget(c); 6493e12c5d1SDavid du Colombier yyerror("syntax in #line"); 6503e12c5d1SDavid du Colombier macend(); 6513e12c5d1SDavid du Colombier} 6523e12c5d1SDavid du Colombier 6533e12c5d1SDavid du Colombiervoid 6543e12c5d1SDavid du Colombiermacif(int f) 6553e12c5d1SDavid du Colombier{ 6563e12c5d1SDavid du Colombier int c, l, bol; 6573e12c5d1SDavid du Colombier Sym *s; 6583e12c5d1SDavid du Colombier 6593e12c5d1SDavid du Colombier if(f == 2) 6603e12c5d1SDavid du Colombier goto skip; 6613e12c5d1SDavid du Colombier s = getsym(); 662219b2ee8SDavid du Colombier if(s == S) 663219b2ee8SDavid du Colombier goto bad; 664219b2ee8SDavid du Colombier if(getcom() != '\n') 6653e12c5d1SDavid du Colombier goto bad; 6663e12c5d1SDavid du Colombier if((s->macro != 0) ^ f) 6673e12c5d1SDavid du Colombier return; 6683e12c5d1SDavid du Colombier 6693e12c5d1SDavid du Colombierskip: 6703e12c5d1SDavid du Colombier bol = 1; 6713e12c5d1SDavid du Colombier l = 0; 6723e12c5d1SDavid du Colombier for(;;) { 6733e12c5d1SDavid du Colombier c = getc(); 6743e12c5d1SDavid du Colombier if(c != '#') { 6753e12c5d1SDavid du Colombier if(!isspace(c)) 6763e12c5d1SDavid du Colombier bol = 0; 6773e12c5d1SDavid du Colombier if(c == '\n') 6783e12c5d1SDavid du Colombier bol = 1; 6793e12c5d1SDavid du Colombier continue; 6803e12c5d1SDavid du Colombier } 6813e12c5d1SDavid du Colombier if(!bol) 6823e12c5d1SDavid du Colombier continue; 6833e12c5d1SDavid du Colombier s = getsym(); 6843e12c5d1SDavid du Colombier if(s == S) 6853e12c5d1SDavid du Colombier continue; 6863e12c5d1SDavid du Colombier if(strcmp(s->name, "endif") == 0) { 6873e12c5d1SDavid du Colombier if(l) { 6883e12c5d1SDavid du Colombier l--; 6893e12c5d1SDavid du Colombier continue; 6903e12c5d1SDavid du Colombier } 6913e12c5d1SDavid du Colombier macend(); 6923e12c5d1SDavid du Colombier return; 6933e12c5d1SDavid du Colombier } 6943e12c5d1SDavid du Colombier if(strcmp(s->name, "ifdef") == 0 || strcmp(s->name, "ifndef") == 0) { 6953e12c5d1SDavid du Colombier l++; 6963e12c5d1SDavid du Colombier continue; 6973e12c5d1SDavid du Colombier } 6983e12c5d1SDavid du Colombier if(l == 0 && f != 2 && strcmp(s->name, "else") == 0) { 6993e12c5d1SDavid du Colombier macend(); 7003e12c5d1SDavid du Colombier return; 7013e12c5d1SDavid du Colombier } 7023e12c5d1SDavid du Colombier } 7033e12c5d1SDavid du Colombier 7043e12c5d1SDavid du Colombierbad: 7053e12c5d1SDavid du Colombier yyerror("syntax in #if(n)def"); 7063e12c5d1SDavid du Colombier macend(); 7073e12c5d1SDavid du Colombier} 7083e12c5d1SDavid du Colombier 7093e12c5d1SDavid du Colombiervoid 7103e12c5d1SDavid du Colombiermacprag(void) 7113e12c5d1SDavid du Colombier{ 7123e12c5d1SDavid du Colombier Sym *s; 7133e12c5d1SDavid du Colombier int c0, c; 7143e12c5d1SDavid du Colombier char *hp; 7153e12c5d1SDavid du Colombier Hist *h; 7163e12c5d1SDavid du Colombier 7173e12c5d1SDavid du Colombier s = getsym(); 7187dd7cddfSDavid du Colombier 7197dd7cddfSDavid du Colombier if(s && strcmp(s->name, "lib") == 0) 7207dd7cddfSDavid du Colombier goto praglib; 7219847521cSDavid du Colombier if(s && strcmp(s->name, "pack") == 0) { 7229847521cSDavid du Colombier pragpack(); 7237dd7cddfSDavid du Colombier return; 7247dd7cddfSDavid du Colombier } 7257dd7cddfSDavid du Colombier if(s && strcmp(s->name, "fpround") == 0) { 7267dd7cddfSDavid du Colombier pragfpround(); 7277dd7cddfSDavid du Colombier return; 7287dd7cddfSDavid du Colombier } 729e288d156SDavid du Colombier if(s && strcmp(s->name, "profile") == 0) { 730e288d156SDavid du Colombier pragprofile(); 731e288d156SDavid du Colombier return; 732e288d156SDavid du Colombier } 7337dd7cddfSDavid du Colombier if(s && strcmp(s->name, "varargck") == 0) { 7347dd7cddfSDavid du Colombier pragvararg(); 7353e12c5d1SDavid du Colombier return; 7363e12c5d1SDavid du Colombier } 737375daca8SDavid du Colombier if(s && strcmp(s->name, "incomplete") == 0) { 738375daca8SDavid du Colombier pragincomplete(); 739375daca8SDavid du Colombier return; 740375daca8SDavid du Colombier } 7417dd7cddfSDavid du Colombier while(getnsc() != '\n') 7427dd7cddfSDavid du Colombier ; 7437dd7cddfSDavid du Colombier return; 7447dd7cddfSDavid du Colombier 7457dd7cddfSDavid du Colombierpraglib: 7463e12c5d1SDavid du Colombier c0 = getnsc(); 7473e12c5d1SDavid du Colombier if(c0 != '"') { 7483e12c5d1SDavid du Colombier c = c0; 7493e12c5d1SDavid du Colombier if(c0 != '<') 7503e12c5d1SDavid du Colombier goto bad; 7513e12c5d1SDavid du Colombier c0 = '>'; 7523e12c5d1SDavid du Colombier } 7533e12c5d1SDavid du Colombier for(hp = symb;;) { 7543e12c5d1SDavid du Colombier c = getc(); 7553e12c5d1SDavid du Colombier if(c == c0) 7563e12c5d1SDavid du Colombier break; 7573e12c5d1SDavid du Colombier if(c == '\n') 7583e12c5d1SDavid du Colombier goto bad; 7593e12c5d1SDavid du Colombier *hp++ = c; 7603e12c5d1SDavid du Colombier } 7613e12c5d1SDavid du Colombier *hp = 0; 762219b2ee8SDavid du Colombier c = getcom(); 7633e12c5d1SDavid du Colombier if(c != '\n') 7643e12c5d1SDavid du Colombier goto bad; 7653e12c5d1SDavid du Colombier 7663e12c5d1SDavid du Colombier /* 7673e12c5d1SDavid du Colombier * put pragma-line in as a funny history 7683e12c5d1SDavid du Colombier */ 7693e12c5d1SDavid du Colombier c = strlen(symb) + 1; 7703e12c5d1SDavid du Colombier while(c & 3) 7713e12c5d1SDavid du Colombier c++; 7723e12c5d1SDavid du Colombier while(nhunk < c) 7733e12c5d1SDavid du Colombier gethunk(); 7743e12c5d1SDavid du Colombier hp = hunk; 7753e12c5d1SDavid du Colombier memcpy(hunk, symb, c); 7763e12c5d1SDavid du Colombier nhunk -= c; 7773e12c5d1SDavid du Colombier hunk += c; 7783e12c5d1SDavid du Colombier 7797dd7cddfSDavid du Colombier h = alloc(sizeof(Hist)); 7803e12c5d1SDavid du Colombier h->name = hp; 7813e12c5d1SDavid du Colombier h->line = lineno; 7823e12c5d1SDavid du Colombier h->offset = -1; 7833e12c5d1SDavid du Colombier h->link = H; 7843e12c5d1SDavid du Colombier if(ehist == H) { 7853e12c5d1SDavid du Colombier hist = h; 7863e12c5d1SDavid du Colombier ehist = h; 7873e12c5d1SDavid du Colombier return; 7883e12c5d1SDavid du Colombier } 7893e12c5d1SDavid du Colombier ehist->link = h; 7903e12c5d1SDavid du Colombier ehist = h; 7913e12c5d1SDavid du Colombier return; 7923e12c5d1SDavid du Colombier 7933e12c5d1SDavid du Colombierbad: 7943e12c5d1SDavid du Colombier unget(c); 7953e12c5d1SDavid du Colombier yyerror("syntax in #pragma lib"); 7963e12c5d1SDavid du Colombier macend(); 7973e12c5d1SDavid du Colombier} 7983e12c5d1SDavid du Colombier 7993e12c5d1SDavid du Colombiervoid 8003e12c5d1SDavid du Colombiermacend(void) 8013e12c5d1SDavid du Colombier{ 8023e12c5d1SDavid du Colombier int c; 8033e12c5d1SDavid du Colombier 8043e12c5d1SDavid du Colombier for(;;) { 8053e12c5d1SDavid du Colombier c = getnsc(); 8063e12c5d1SDavid du Colombier if(c < 0 || c == '\n') 8073e12c5d1SDavid du Colombier return; 8083e12c5d1SDavid du Colombier } 8093e12c5d1SDavid du Colombier} 8103e12c5d1SDavid du Colombier 8113e12c5d1SDavid du Colombiervoid 8123e12c5d1SDavid du Colombierlinehist(char *f, int offset) 8133e12c5d1SDavid du Colombier{ 8143e12c5d1SDavid du Colombier Hist *h; 8153e12c5d1SDavid du Colombier 8163e12c5d1SDavid du Colombier /* 8173e12c5d1SDavid du Colombier * overwrite the last #line directive if 8183e12c5d1SDavid du Colombier * no alloc has happened since the last one 8193e12c5d1SDavid du Colombier */ 8203e12c5d1SDavid du Colombier if(newflag == 0 && ehist != H && offset != 0 && ehist->offset != 0) 8213e12c5d1SDavid du Colombier if(f && ehist->name && strcmp(f, ehist->name) == 0) { 8223e12c5d1SDavid du Colombier ehist->line = lineno; 8233e12c5d1SDavid du Colombier ehist->offset = offset; 8243e12c5d1SDavid du Colombier return; 8253e12c5d1SDavid du Colombier } 826219b2ee8SDavid du Colombier 827219b2ee8SDavid du Colombier if(debug['f']) 828219b2ee8SDavid du Colombier if(f) { 829219b2ee8SDavid du Colombier if(offset) 8307dd7cddfSDavid du Colombier print("%4ld: %s (#line %d)\n", lineno, f, offset); 831219b2ee8SDavid du Colombier else 8327dd7cddfSDavid du Colombier print("%4ld: %s\n", lineno, f); 833219b2ee8SDavid du Colombier } else 8347dd7cddfSDavid du Colombier print("%4ld: <pop>\n", lineno); 8353e12c5d1SDavid du Colombier newflag = 0; 8363e12c5d1SDavid du Colombier 8377dd7cddfSDavid du Colombier h = alloc(sizeof(Hist)); 8383e12c5d1SDavid du Colombier h->name = f; 8393e12c5d1SDavid du Colombier h->line = lineno; 8403e12c5d1SDavid du Colombier h->offset = offset; 8413e12c5d1SDavid du Colombier h->link = H; 8423e12c5d1SDavid du Colombier if(ehist == H) { 8433e12c5d1SDavid du Colombier hist = h; 8443e12c5d1SDavid du Colombier ehist = h; 8453e12c5d1SDavid du Colombier return; 8463e12c5d1SDavid du Colombier } 8473e12c5d1SDavid du Colombier ehist->link = h; 8483e12c5d1SDavid du Colombier ehist = h; 8493e12c5d1SDavid du Colombier} 8503e12c5d1SDavid du Colombier 8513e12c5d1SDavid du Colombiervoid 8523e12c5d1SDavid du Colombiergethunk(void) 8533e12c5d1SDavid du Colombier{ 8543e12c5d1SDavid du Colombier char *h; 8553e12c5d1SDavid du Colombier long nh; 8563e12c5d1SDavid du Colombier 8573e12c5d1SDavid du Colombier nh = NHUNK; 8583e12c5d1SDavid du Colombier if(thunk >= 10L*NHUNK) 8593e12c5d1SDavid du Colombier nh = 10L*NHUNK; 8607dd7cddfSDavid du Colombier h = (char*)mysbrk(nh); 8613e12c5d1SDavid du Colombier if(h == (char*)-1) { 8623e12c5d1SDavid du Colombier yyerror("out of memory"); 8633e12c5d1SDavid du Colombier errorexit(); 8643e12c5d1SDavid du Colombier } 8653e12c5d1SDavid du Colombier hunk = h; 8663e12c5d1SDavid du Colombier nhunk = nh; 8673e12c5d1SDavid du Colombier thunk += nh; 8683e12c5d1SDavid du Colombier} 869