13e12c5d1SDavid du Colombier/* 23e12c5d1SDavid du Colombier * common code for all the assemblers 33e12c5d1SDavid du Colombier */ 43e12c5d1SDavid du Colombier 5e288d156SDavid du Colombiervoid 69847521cSDavid du Colombierpragpack(void) 7e288d156SDavid du Colombier{ 8e288d156SDavid du Colombier while(getnsc() != '\n') 9e288d156SDavid du Colombier ; 10e288d156SDavid du Colombier} 11e288d156SDavid du Colombier 12e288d156SDavid du Colombiervoid 13e288d156SDavid du Colombierpragvararg(void) 14e288d156SDavid du Colombier{ 15e288d156SDavid du Colombier while(getnsc() != '\n') 16e288d156SDavid du Colombier ; 17e288d156SDavid du Colombier} 18e288d156SDavid du Colombier 19e288d156SDavid du Colombiervoid 20e288d156SDavid du Colombierpragfpround(void) 21e288d156SDavid du Colombier{ 22e288d156SDavid du Colombier while(getnsc() != '\n') 23e288d156SDavid du Colombier ; 24e288d156SDavid du Colombier} 25e288d156SDavid du Colombier 26e288d156SDavid du Colombiervoid 27e288d156SDavid du Colombierpragprofile(void) 28e288d156SDavid du Colombier{ 29e288d156SDavid du Colombier while(getnsc() != '\n') 30e288d156SDavid du Colombier ; 31e288d156SDavid du Colombier} 32e288d156SDavid du Colombier 33375daca8SDavid du Colombiervoid 34375daca8SDavid du Colombierpragincomplete(void) 35375daca8SDavid du Colombier{ 36375daca8SDavid du Colombier while(getnsc() != '\n') 37375daca8SDavid du Colombier ; 38375daca8SDavid du Colombier} 39375daca8SDavid du Colombier 407dd7cddfSDavid du Colombier/* 417dd7cddfSDavid du Colombier * real allocs 427dd7cddfSDavid du Colombier */ 437dd7cddfSDavid du Colombiervoid* 447dd7cddfSDavid du Colombieralloc(long n) 457dd7cddfSDavid du Colombier{ 467dd7cddfSDavid du Colombier void *p; 477dd7cddfSDavid du Colombier 484de34a7eSDavid du Colombier while((uintptr)hunk & MAXALIGN) { 497dd7cddfSDavid du Colombier hunk++; 507dd7cddfSDavid du Colombier nhunk--; 517dd7cddfSDavid du Colombier } 527dd7cddfSDavid du Colombier while(nhunk < n) 537dd7cddfSDavid du Colombier gethunk(); 547dd7cddfSDavid du Colombier p = hunk; 557dd7cddfSDavid du Colombier nhunk -= n; 567dd7cddfSDavid du Colombier hunk += n; 577dd7cddfSDavid du Colombier return p; 587dd7cddfSDavid du Colombier} 597dd7cddfSDavid du Colombier 607dd7cddfSDavid du Colombiervoid* 617dd7cddfSDavid du Colombierallocn(void *p, long on, long n) 627dd7cddfSDavid du Colombier{ 637dd7cddfSDavid du Colombier void *q; 647dd7cddfSDavid du Colombier 657dd7cddfSDavid du Colombier q = (uchar*)p + on; 667dd7cddfSDavid du Colombier if(q != hunk || nhunk < n) { 677dd7cddfSDavid du Colombier while(nhunk < on+n) 687dd7cddfSDavid du Colombier gethunk(); 697dd7cddfSDavid du Colombier memmove(hunk, p, on); 707dd7cddfSDavid du Colombier p = hunk; 717dd7cddfSDavid du Colombier hunk += on; 727dd7cddfSDavid du Colombier nhunk -= on; 737dd7cddfSDavid du Colombier } 747dd7cddfSDavid du Colombier hunk += n; 757dd7cddfSDavid du Colombier nhunk -= n; 767dd7cddfSDavid du Colombier return p; 777dd7cddfSDavid du Colombier} 787dd7cddfSDavid du Colombier 797dd7cddfSDavid du Colombiervoid 807dd7cddfSDavid du Colombiersetinclude(char *p) 817dd7cddfSDavid du Colombier{ 827dd7cddfSDavid du Colombier int i; 837dd7cddfSDavid du Colombier 847dd7cddfSDavid du Colombier if(p == 0) 857dd7cddfSDavid du Colombier return; 867dd7cddfSDavid du Colombier for(i=1; i < ninclude; i++) 877dd7cddfSDavid du Colombier if(strcmp(p, include[i]) == 0) 887dd7cddfSDavid du Colombier return; 897dd7cddfSDavid du Colombier 907dd7cddfSDavid du Colombier if(ninclude >= nelem(include)) { 917dd7cddfSDavid du Colombier yyerror("ninclude too small %d", nelem(include)); 927dd7cddfSDavid du Colombier exits("ninclude"); 937dd7cddfSDavid du Colombier } 947dd7cddfSDavid du Colombier include[ninclude++] = p; 957dd7cddfSDavid du Colombier} 967dd7cddfSDavid du Colombier 973e12c5d1SDavid du Colombiervoid 983e12c5d1SDavid du Colombiererrorexit(void) 993e12c5d1SDavid du Colombier{ 1003e12c5d1SDavid du Colombier 1013e12c5d1SDavid du Colombier if(outfile) 1023e12c5d1SDavid du Colombier remove(outfile); 1033e12c5d1SDavid du Colombier exits("error"); 1043e12c5d1SDavid du Colombier} 1053e12c5d1SDavid du Colombier 1063e12c5d1SDavid du Colombiervoid 1073e12c5d1SDavid du Colombierpushio(void) 1083e12c5d1SDavid du Colombier{ 1093e12c5d1SDavid du Colombier Io *i; 1103e12c5d1SDavid du Colombier 1113e12c5d1SDavid du Colombier i = iostack; 1123e12c5d1SDavid du Colombier if(i == I) { 1133e12c5d1SDavid du Colombier yyerror("botch in pushio"); 1143e12c5d1SDavid du Colombier errorexit(); 1153e12c5d1SDavid du Colombier } 1163e12c5d1SDavid du Colombier i->p = fi.p; 1173e12c5d1SDavid du Colombier i->c = fi.c; 1183e12c5d1SDavid du Colombier} 1193e12c5d1SDavid du Colombier 1203e12c5d1SDavid du Colombiervoid 1213e12c5d1SDavid du Colombiernewio(void) 1223e12c5d1SDavid du Colombier{ 1233e12c5d1SDavid du Colombier Io *i; 124375daca8SDavid du Colombier static int pushdepth = 0; 1253e12c5d1SDavid du Colombier 1263e12c5d1SDavid du Colombier i = iofree; 1273e12c5d1SDavid du Colombier if(i == I) { 1283e12c5d1SDavid du Colombier pushdepth++; 1293e12c5d1SDavid du Colombier if(pushdepth > 1000) { 1303e12c5d1SDavid du Colombier yyerror("macro/io expansion too deep"); 1313e12c5d1SDavid du Colombier errorexit(); 1323e12c5d1SDavid du Colombier } 1337dd7cddfSDavid du Colombier i = alloc(sizeof(*i)); 1343e12c5d1SDavid du Colombier } else 1353e12c5d1SDavid du Colombier iofree = i->link; 1363e12c5d1SDavid du Colombier i->c = 0; 1373e12c5d1SDavid du Colombier i->f = -1; 1383e12c5d1SDavid du Colombier ionext = i; 1393e12c5d1SDavid du Colombier} 1403e12c5d1SDavid du Colombier 1413e12c5d1SDavid du Colombiervoid 1423e12c5d1SDavid du Colombiernewfile(char *s, int f) 1433e12c5d1SDavid du Colombier{ 1443e12c5d1SDavid du Colombier Io *i; 1453e12c5d1SDavid du Colombier 1463e12c5d1SDavid du Colombier i = ionext; 1473e12c5d1SDavid du Colombier i->link = iostack; 1483e12c5d1SDavid du Colombier iostack = i; 1493e12c5d1SDavid du Colombier i->f = f; 1503e12c5d1SDavid du Colombier if(f < 0) 1513e12c5d1SDavid du Colombier i->f = open(s, 0); 1523e12c5d1SDavid du Colombier if(i->f < 0) { 1537dd7cddfSDavid du Colombier yyerror("%ca: %r: %s", thechar, s); 1543e12c5d1SDavid du Colombier errorexit(); 1553e12c5d1SDavid du Colombier } 1563e12c5d1SDavid du Colombier fi.c = 0; 1573e12c5d1SDavid du Colombier linehist(s, 0); 1583e12c5d1SDavid du Colombier} 1593e12c5d1SDavid du Colombier 1603e12c5d1SDavid du ColombierSym* 1613e12c5d1SDavid du Colombierslookup(char *s) 1623e12c5d1SDavid du Colombier{ 1633e12c5d1SDavid du Colombier 1643e12c5d1SDavid du Colombier strcpy(symb, s); 1653e12c5d1SDavid du Colombier return lookup(); 1663e12c5d1SDavid du Colombier} 1673e12c5d1SDavid du Colombier 1683e12c5d1SDavid du ColombierSym* 1693e12c5d1SDavid du Colombierlookup(void) 1703e12c5d1SDavid du Colombier{ 1713e12c5d1SDavid du Colombier Sym *s; 172219b2ee8SDavid du Colombier long h; 173219b2ee8SDavid du Colombier char *p; 174219b2ee8SDavid du Colombier int c, l; 1753e12c5d1SDavid du Colombier 1763e12c5d1SDavid du Colombier h = 0; 177219b2ee8SDavid du Colombier for(p=symb; c = *p; p++) 178219b2ee8SDavid du Colombier h = h+h+h + c; 179219b2ee8SDavid du Colombier l = (p - symb) + 1; 1803e12c5d1SDavid du Colombier if(h < 0) 1813e12c5d1SDavid du Colombier h = ~h; 1823e12c5d1SDavid du Colombier h %= NHASH; 183219b2ee8SDavid du Colombier c = symb[0]; 1843e12c5d1SDavid du Colombier for(s = hash[h]; s != S; s = s->link) { 185219b2ee8SDavid du Colombier if(s->name[0] != c) 1863e12c5d1SDavid du Colombier continue; 187219b2ee8SDavid du Colombier if(memcmp(s->name, symb, l) == 0) 1883e12c5d1SDavid du Colombier return s; 1893e12c5d1SDavid du Colombier } 1907dd7cddfSDavid du Colombier s = alloc(sizeof(*s)); 1917dd7cddfSDavid du Colombier s->name = alloc(l); 192219b2ee8SDavid du Colombier memmove(s->name, symb, l); 193219b2ee8SDavid du Colombier 1943e12c5d1SDavid du Colombier s->link = hash[h]; 1953e12c5d1SDavid du Colombier hash[h] = s; 1963e12c5d1SDavid du Colombier syminit(s); 1973e12c5d1SDavid du Colombier return s; 1983e12c5d1SDavid du Colombier} 1993e12c5d1SDavid du Colombier 2003e12c5d1SDavid du Colombierlong 2013e12c5d1SDavid du Colombieryylex(void) 2023e12c5d1SDavid du Colombier{ 2033e12c5d1SDavid du Colombier int c, c1; 2043e12c5d1SDavid du Colombier char *cp; 2053e12c5d1SDavid du Colombier Sym *s; 2063e12c5d1SDavid du Colombier 2073e12c5d1SDavid du Colombier c = peekc; 2083e12c5d1SDavid du Colombier if(c != IGN) { 2093e12c5d1SDavid du Colombier peekc = IGN; 2103e12c5d1SDavid du Colombier goto l1; 2113e12c5d1SDavid du Colombier } 2123e12c5d1SDavid du Colombierl0: 2133e12c5d1SDavid du Colombier c = GETC(); 2143e12c5d1SDavid du Colombier 2153e12c5d1SDavid du Colombierl1: 2163e12c5d1SDavid du Colombier if(c == EOF) { 2173e12c5d1SDavid du Colombier peekc = EOF; 2183e12c5d1SDavid du Colombier return -1; 2193e12c5d1SDavid du Colombier } 2203e12c5d1SDavid du Colombier if(isspace(c)) { 2213e12c5d1SDavid du Colombier if(c == '\n') { 2223e12c5d1SDavid du Colombier lineno++; 2233e12c5d1SDavid du Colombier return ';'; 2243e12c5d1SDavid du Colombier } 2253e12c5d1SDavid du Colombier goto l0; 2263e12c5d1SDavid du Colombier } 2273e12c5d1SDavid du Colombier if(isalpha(c)) 2283e12c5d1SDavid du Colombier goto talph; 2293e12c5d1SDavid du Colombier if(isdigit(c)) 2303e12c5d1SDavid du Colombier goto tnum; 2313e12c5d1SDavid du Colombier switch(c) 2323e12c5d1SDavid du Colombier { 2333e12c5d1SDavid du Colombier case '\n': 2343e12c5d1SDavid du Colombier lineno++; 2353e12c5d1SDavid du Colombier return ';'; 2363e12c5d1SDavid du Colombier 2373e12c5d1SDavid du Colombier case '#': 2383e12c5d1SDavid du Colombier domacro(); 2393e12c5d1SDavid du Colombier goto l0; 2403e12c5d1SDavid du Colombier 2413e12c5d1SDavid du Colombier case '.': 2423e12c5d1SDavid du Colombier c = GETC(); 2433e12c5d1SDavid du Colombier if(isalpha(c)) { 2443e12c5d1SDavid du Colombier cp = symb; 2453e12c5d1SDavid du Colombier *cp++ = '.'; 2463e12c5d1SDavid du Colombier goto aloop; 2473e12c5d1SDavid du Colombier } 2483e12c5d1SDavid du Colombier if(isdigit(c)) { 2493e12c5d1SDavid du Colombier cp = symb; 2503e12c5d1SDavid du Colombier *cp++ = '.'; 2513e12c5d1SDavid du Colombier goto casedot; 2523e12c5d1SDavid du Colombier } 2533e12c5d1SDavid du Colombier peekc = c; 2543e12c5d1SDavid du Colombier return '.'; 2553e12c5d1SDavid du Colombier 2563e12c5d1SDavid du Colombier talph: 2573e12c5d1SDavid du Colombier case '_': 2583e12c5d1SDavid du Colombier case '@': 2593e12c5d1SDavid du Colombier cp = symb; 2603e12c5d1SDavid du Colombier 2613e12c5d1SDavid du Colombier aloop: 2623e12c5d1SDavid du Colombier *cp++ = c; 2633e12c5d1SDavid du Colombier c = GETC(); 2647dd7cddfSDavid du Colombier if(isalpha(c) || isdigit(c) || c == '_' || c == '$') 2653e12c5d1SDavid du Colombier goto aloop; 2663e12c5d1SDavid du Colombier *cp = 0; 2673e12c5d1SDavid du Colombier peekc = c; 2683e12c5d1SDavid du Colombier s = lookup(); 2693e12c5d1SDavid du Colombier if(s->macro) { 2703e12c5d1SDavid du Colombier newio(); 2713e12c5d1SDavid du Colombier cp = ionext->b; 2723e12c5d1SDavid du Colombier macexpand(s, cp); 2733e12c5d1SDavid du Colombier pushio(); 2743e12c5d1SDavid du Colombier ionext->link = iostack; 2753e12c5d1SDavid du Colombier iostack = ionext; 2763e12c5d1SDavid du Colombier fi.p = cp; 2773e12c5d1SDavid du Colombier fi.c = strlen(cp); 2783e12c5d1SDavid du Colombier if(peekc != IGN) { 2793e12c5d1SDavid du Colombier cp[fi.c++] = peekc; 2803e12c5d1SDavid du Colombier cp[fi.c] = 0; 2813e12c5d1SDavid du Colombier peekc = IGN; 2823e12c5d1SDavid du Colombier } 2833e12c5d1SDavid du Colombier goto l0; 2843e12c5d1SDavid du Colombier } 2853e12c5d1SDavid du Colombier if(s->type == 0) 2863e12c5d1SDavid du Colombier s->type = LNAME; 2873e12c5d1SDavid du Colombier if(s->type == LNAME || 2883e12c5d1SDavid du Colombier s->type == LVAR || 2893e12c5d1SDavid du Colombier s->type == LLAB) { 2903e12c5d1SDavid du Colombier yylval.sym = s; 2913e12c5d1SDavid du Colombier return s->type; 2923e12c5d1SDavid du Colombier } 2933e12c5d1SDavid du Colombier yylval.lval = s->value; 2943e12c5d1SDavid du Colombier return s->type; 2953e12c5d1SDavid du Colombier 2963e12c5d1SDavid du Colombier tnum: 2973e12c5d1SDavid du Colombier cp = symb; 2983e12c5d1SDavid du Colombier if(c != '0') 2993e12c5d1SDavid du Colombier goto dc; 3003e12c5d1SDavid du Colombier *cp++ = c; 3013e12c5d1SDavid du Colombier c = GETC(); 3023e12c5d1SDavid du Colombier c1 = 3; 3033e12c5d1SDavid du Colombier if(c == 'x' || c == 'X') { 3043e12c5d1SDavid du Colombier c1 = 4; 3053e12c5d1SDavid du Colombier c = GETC(); 3063e12c5d1SDavid du Colombier } else 3073e12c5d1SDavid du Colombier if(c < '0' || c > '7') 3083e12c5d1SDavid du Colombier goto dc; 3093e12c5d1SDavid du Colombier yylval.lval = 0; 3103e12c5d1SDavid du Colombier for(;;) { 3113e12c5d1SDavid du Colombier if(c >= '0' && c <= '9') { 3123e12c5d1SDavid du Colombier if(c > '7' && c1 == 3) 3133e12c5d1SDavid du Colombier break; 3143e12c5d1SDavid du Colombier yylval.lval <<= c1; 3153e12c5d1SDavid du Colombier yylval.lval += c - '0'; 3163e12c5d1SDavid du Colombier c = GETC(); 3173e12c5d1SDavid du Colombier continue; 3183e12c5d1SDavid du Colombier } 3193e12c5d1SDavid du Colombier if(c1 == 3) 3203e12c5d1SDavid du Colombier break; 3213e12c5d1SDavid du Colombier if(c >= 'A' && c <= 'F') 3223e12c5d1SDavid du Colombier c += 'a' - 'A'; 3233e12c5d1SDavid du Colombier if(c >= 'a' && c <= 'f') { 3243e12c5d1SDavid du Colombier yylval.lval <<= c1; 3253e12c5d1SDavid du Colombier yylval.lval += c - 'a' + 10; 3263e12c5d1SDavid du Colombier c = GETC(); 3273e12c5d1SDavid du Colombier continue; 3283e12c5d1SDavid du Colombier } 3293e12c5d1SDavid du Colombier break; 3303e12c5d1SDavid du Colombier } 3313e12c5d1SDavid du Colombier goto ncu; 3323e12c5d1SDavid du Colombier 3333e12c5d1SDavid du Colombier dc: 3343e12c5d1SDavid du Colombier for(;;) { 3353e12c5d1SDavid du Colombier if(!isdigit(c)) 3363e12c5d1SDavid du Colombier break; 3373e12c5d1SDavid du Colombier *cp++ = c; 3383e12c5d1SDavid du Colombier c = GETC(); 3393e12c5d1SDavid du Colombier } 3403e12c5d1SDavid du Colombier if(c == '.') 3413e12c5d1SDavid du Colombier goto casedot; 3423e12c5d1SDavid du Colombier if(c == 'e' || c == 'E') 3433e12c5d1SDavid du Colombier goto casee; 3443e12c5d1SDavid du Colombier *cp = 0; 34524c25b93SDavid du Colombier if(sizeof(yylval.lval) == sizeof(vlong)) 34624c25b93SDavid du Colombier yylval.lval = strtoll(symb, nil, 10); 34724c25b93SDavid du Colombier else 34824c25b93SDavid du Colombier yylval.lval = strtol(symb, nil, 10); 3493e12c5d1SDavid du Colombier 3503e12c5d1SDavid du Colombier ncu: 35124c25b93SDavid du Colombier while(c == 'U' || c == 'u' || c == 'l' || c == 'L') 35224c25b93SDavid du Colombier c = GETC(); 3533e12c5d1SDavid du Colombier peekc = c; 3543e12c5d1SDavid du Colombier return LCONST; 3553e12c5d1SDavid du Colombier 3563e12c5d1SDavid du Colombier casedot: 3573e12c5d1SDavid du Colombier for(;;) { 3583e12c5d1SDavid du Colombier *cp++ = c; 3593e12c5d1SDavid du Colombier c = GETC(); 3603e12c5d1SDavid du Colombier if(!isdigit(c)) 3613e12c5d1SDavid du Colombier break; 3623e12c5d1SDavid du Colombier } 3633e12c5d1SDavid du Colombier if(c == 'e' || c == 'E') 3643e12c5d1SDavid du Colombier goto casee; 3653e12c5d1SDavid du Colombier goto caseout; 3663e12c5d1SDavid du Colombier 3673e12c5d1SDavid du Colombier casee: 3683e12c5d1SDavid du Colombier *cp++ = 'e'; 3693e12c5d1SDavid du Colombier c = GETC(); 3703e12c5d1SDavid du Colombier if(c == '+' || c == '-') { 3713e12c5d1SDavid du Colombier *cp++ = c; 3723e12c5d1SDavid du Colombier c = GETC(); 3733e12c5d1SDavid du Colombier } 3743e12c5d1SDavid du Colombier while(isdigit(c)) { 3753e12c5d1SDavid du Colombier *cp++ = c; 3763e12c5d1SDavid du Colombier c = GETC(); 3773e12c5d1SDavid du Colombier } 3783e12c5d1SDavid du Colombier 3793e12c5d1SDavid du Colombier caseout: 3803e12c5d1SDavid du Colombier *cp = 0; 3813e12c5d1SDavid du Colombier peekc = c; 3823e12c5d1SDavid du Colombier if(FPCHIP) { 3833e12c5d1SDavid du Colombier yylval.dval = atof(symb); 3843e12c5d1SDavid du Colombier return LFCONST; 3853e12c5d1SDavid du Colombier } 3863e12c5d1SDavid du Colombier yyerror("assembler cannot interpret fp constants"); 3873e12c5d1SDavid du Colombier yylval.lval = 1L; 3883e12c5d1SDavid du Colombier return LCONST; 3893e12c5d1SDavid du Colombier 3903e12c5d1SDavid du Colombier case '"': 3913e12c5d1SDavid du Colombier memcpy(yylval.sval, nullgen.sval, sizeof(yylval.sval)); 3923e12c5d1SDavid du Colombier cp = yylval.sval; 3933e12c5d1SDavid du Colombier c1 = 0; 3943e12c5d1SDavid du Colombier for(;;) { 3953e12c5d1SDavid du Colombier c = escchar('"'); 3963e12c5d1SDavid du Colombier if(c == EOF) 3973e12c5d1SDavid du Colombier break; 3983e12c5d1SDavid du Colombier if(c1 < sizeof(yylval.sval)) 3993e12c5d1SDavid du Colombier *cp++ = c; 4003e12c5d1SDavid du Colombier c1++; 4013e12c5d1SDavid du Colombier } 4023e12c5d1SDavid du Colombier if(c1 > sizeof(yylval.sval)) 4033e12c5d1SDavid du Colombier yyerror("string constant too long"); 4043e12c5d1SDavid du Colombier return LSCONST; 4053e12c5d1SDavid du Colombier 4063e12c5d1SDavid du Colombier case '\'': 4073e12c5d1SDavid du Colombier c = escchar('\''); 4083e12c5d1SDavid du Colombier if(c == EOF) 4093e12c5d1SDavid du Colombier c = '\''; 4103e12c5d1SDavid du Colombier if(escchar('\'') != EOF) 4113e12c5d1SDavid du Colombier yyerror("missing '"); 4123e12c5d1SDavid du Colombier yylval.lval = c; 4133e12c5d1SDavid du Colombier return LCONST; 4143e12c5d1SDavid du Colombier 4153e12c5d1SDavid du Colombier case '/': 4163e12c5d1SDavid du Colombier c1 = GETC(); 4177dd7cddfSDavid du Colombier if(c1 == '/') { 4187dd7cddfSDavid du Colombier for(;;) { 4197dd7cddfSDavid du Colombier c = GETC(); 420*183e6fd7SDavid du Colombier if(c == '\n') 421*183e6fd7SDavid du Colombier goto l1; 4227dd7cddfSDavid du Colombier if(c == EOF) { 4237dd7cddfSDavid du Colombier yyerror("eof in comment"); 4247dd7cddfSDavid du Colombier errorexit(); 4257dd7cddfSDavid du Colombier } 4267dd7cddfSDavid du Colombier } 4277dd7cddfSDavid du Colombier } 4283e12c5d1SDavid du Colombier if(c1 == '*') { 4293e12c5d1SDavid du Colombier for(;;) { 4303e12c5d1SDavid du Colombier c = GETC(); 4313e12c5d1SDavid du Colombier while(c == '*') { 4323e12c5d1SDavid du Colombier c = GETC(); 4333e12c5d1SDavid du Colombier if(c == '/') 4343e12c5d1SDavid du Colombier goto l0; 4353e12c5d1SDavid du Colombier } 4363e12c5d1SDavid du Colombier if(c == EOF) { 4373e12c5d1SDavid du Colombier yyerror("eof in comment"); 4383e12c5d1SDavid du Colombier errorexit(); 4393e12c5d1SDavid du Colombier } 4403e12c5d1SDavid du Colombier if(c == '\n') 4413e12c5d1SDavid du Colombier lineno++; 4423e12c5d1SDavid du Colombier } 4433e12c5d1SDavid du Colombier } 4443e12c5d1SDavid du Colombier break; 4453e12c5d1SDavid du Colombier 4463e12c5d1SDavid du Colombier default: 4473e12c5d1SDavid du Colombier return c; 4483e12c5d1SDavid du Colombier } 4493e12c5d1SDavid du Colombier peekc = c1; 4503e12c5d1SDavid du Colombier return c; 4513e12c5d1SDavid du Colombier} 4523e12c5d1SDavid du Colombier 4533e12c5d1SDavid du Colombierint 4543e12c5d1SDavid du Colombiergetc(void) 4553e12c5d1SDavid du Colombier{ 4563e12c5d1SDavid du Colombier int c; 4573e12c5d1SDavid du Colombier 4583e12c5d1SDavid du Colombier c = peekc; 4593e12c5d1SDavid du Colombier if(c != IGN) { 4603e12c5d1SDavid du Colombier peekc = IGN; 4613e12c5d1SDavid du Colombier return c; 4623e12c5d1SDavid du Colombier } 4633e12c5d1SDavid du Colombier c = GETC(); 4643e12c5d1SDavid du Colombier if(c == '\n') 4653e12c5d1SDavid du Colombier lineno++; 4663e12c5d1SDavid du Colombier if(c == EOF) { 4673e12c5d1SDavid du Colombier yyerror("End of file"); 4683e12c5d1SDavid du Colombier errorexit(); 4693e12c5d1SDavid du Colombier } 4703e12c5d1SDavid du Colombier return c; 4713e12c5d1SDavid du Colombier} 4723e12c5d1SDavid du Colombier 4733e12c5d1SDavid du Colombierint 4743e12c5d1SDavid du Colombiergetnsc(void) 4753e12c5d1SDavid du Colombier{ 4763e12c5d1SDavid du Colombier int c; 4773e12c5d1SDavid du Colombier 4783e12c5d1SDavid du Colombier for(;;) { 4793e12c5d1SDavid du Colombier c = getc(); 4803e12c5d1SDavid du Colombier if(!isspace(c) || c == '\n') 4813e12c5d1SDavid du Colombier return c; 4823e12c5d1SDavid du Colombier } 4833e12c5d1SDavid du Colombier} 4843e12c5d1SDavid du Colombier 4853e12c5d1SDavid du Colombiervoid 4863e12c5d1SDavid du Colombierunget(int c) 4873e12c5d1SDavid du Colombier{ 4883e12c5d1SDavid du Colombier 4893e12c5d1SDavid du Colombier peekc = c; 4903e12c5d1SDavid du Colombier if(c == '\n') 4913e12c5d1SDavid du Colombier lineno--; 4923e12c5d1SDavid du Colombier} 4933e12c5d1SDavid du Colombier 4943e12c5d1SDavid du Colombierint 4953e12c5d1SDavid du Colombierescchar(int e) 4963e12c5d1SDavid du Colombier{ 4973e12c5d1SDavid du Colombier int c, l; 4983e12c5d1SDavid du Colombier 4993e12c5d1SDavid du Colombierloop: 5003e12c5d1SDavid du Colombier c = getc(); 5013e12c5d1SDavid du Colombier if(c == '\n') { 5023e12c5d1SDavid du Colombier yyerror("newline in string"); 5033e12c5d1SDavid du Colombier return EOF; 5043e12c5d1SDavid du Colombier } 5053e12c5d1SDavid du Colombier if(c != '\\') { 5063e12c5d1SDavid du Colombier if(c == e) 5073e12c5d1SDavid du Colombier return EOF; 5083e12c5d1SDavid du Colombier return c; 5093e12c5d1SDavid du Colombier } 5103e12c5d1SDavid du Colombier c = getc(); 5113e12c5d1SDavid du Colombier if(c >= '0' && c <= '7') { 5123e12c5d1SDavid du Colombier l = c - '0'; 5133e12c5d1SDavid du Colombier c = getc(); 5143e12c5d1SDavid du Colombier if(c >= '0' && c <= '7') { 5153e12c5d1SDavid du Colombier l = l*8 + c-'0'; 5163e12c5d1SDavid du Colombier c = getc(); 5173e12c5d1SDavid du Colombier if(c >= '0' && c <= '7') { 5183e12c5d1SDavid du Colombier l = l*8 + c-'0'; 5193e12c5d1SDavid du Colombier return l; 5203e12c5d1SDavid du Colombier } 5213e12c5d1SDavid du Colombier } 5223e12c5d1SDavid du Colombier peekc = c; 5233e12c5d1SDavid du Colombier return l; 5243e12c5d1SDavid du Colombier } 5253e12c5d1SDavid du Colombier switch(c) 5263e12c5d1SDavid du Colombier { 5273e12c5d1SDavid du Colombier case '\n': goto loop; 5283e12c5d1SDavid du Colombier case 'n': return '\n'; 5293e12c5d1SDavid du Colombier case 't': return '\t'; 5303e12c5d1SDavid du Colombier case 'b': return '\b'; 5313e12c5d1SDavid du Colombier case 'r': return '\r'; 5323e12c5d1SDavid du Colombier case 'f': return '\f'; 5333e12c5d1SDavid du Colombier case 'a': return 0x07; 5343e12c5d1SDavid du Colombier case 'v': return 0x0b; 5353e12c5d1SDavid du Colombier case 'z': return 0x00; 5363e12c5d1SDavid du Colombier } 5373e12c5d1SDavid du Colombier return c; 5383e12c5d1SDavid du Colombier} 5393e12c5d1SDavid du Colombier 5403e12c5d1SDavid du Colombiervoid 5413e12c5d1SDavid du Colombierpinit(char *f) 5423e12c5d1SDavid du Colombier{ 5433e12c5d1SDavid du Colombier int i; 5443e12c5d1SDavid du Colombier Sym *s; 5453e12c5d1SDavid du Colombier 5463e12c5d1SDavid du Colombier lineno = 1; 5473e12c5d1SDavid du Colombier newio(); 5483e12c5d1SDavid du Colombier newfile(f, -1); 5493e12c5d1SDavid du Colombier pc = 0; 5503e12c5d1SDavid du Colombier peekc = IGN; 5513e12c5d1SDavid du Colombier sym = 1; 5523e12c5d1SDavid du Colombier for(i=0; i<NSYM; i++) { 5533e12c5d1SDavid du Colombier h[i].type = 0; 5543e12c5d1SDavid du Colombier h[i].sym = S; 5553e12c5d1SDavid du Colombier } 5563e12c5d1SDavid du Colombier for(i=0; i<NHASH; i++) 5573e12c5d1SDavid du Colombier for(s = hash[i]; s != S; s = s->link) 5583e12c5d1SDavid du Colombier s->macro = 0; 5593e12c5d1SDavid du Colombier} 5603e12c5d1SDavid du Colombier 5613e12c5d1SDavid du Colombierint 5623e12c5d1SDavid du Colombierfilbuf(void) 5633e12c5d1SDavid du Colombier{ 5643e12c5d1SDavid du Colombier Io *i; 5653e12c5d1SDavid du Colombier 5663e12c5d1SDavid du Colombierloop: 5673e12c5d1SDavid du Colombier i = iostack; 5683e12c5d1SDavid du Colombier if(i == I) 5693e12c5d1SDavid du Colombier return EOF; 5703e12c5d1SDavid du Colombier if(i->f < 0) 5713e12c5d1SDavid du Colombier goto pop; 5723e12c5d1SDavid du Colombier fi.c = read(i->f, i->b, BUFSIZ) - 1; 5733e12c5d1SDavid du Colombier if(fi.c < 0) { 5743e12c5d1SDavid du Colombier close(i->f); 5753e12c5d1SDavid du Colombier linehist(0, 0); 5763e12c5d1SDavid du Colombier goto pop; 5773e12c5d1SDavid du Colombier } 5783e12c5d1SDavid du Colombier fi.p = i->b + 1; 5793e12c5d1SDavid du Colombier return i->b[0]; 5803e12c5d1SDavid du Colombier 5813e12c5d1SDavid du Colombierpop: 5823e12c5d1SDavid du Colombier iostack = i->link; 5833e12c5d1SDavid du Colombier i->link = iofree; 5843e12c5d1SDavid du Colombier iofree = i; 5853e12c5d1SDavid du Colombier i = iostack; 5863e12c5d1SDavid du Colombier if(i == I) 5873e12c5d1SDavid du Colombier return EOF; 5883e12c5d1SDavid du Colombier fi.p = i->p; 5893e12c5d1SDavid du Colombier fi.c = i->c; 5903e12c5d1SDavid du Colombier if(--fi.c < 0) 5913e12c5d1SDavid du Colombier goto loop; 5923e12c5d1SDavid du Colombier return *fi.p++; 5933e12c5d1SDavid du Colombier} 5943e12c5d1SDavid du Colombier 5953e12c5d1SDavid du Colombiervoid 5963e12c5d1SDavid du Colombieryyerror(char *a, ...) 5973e12c5d1SDavid du Colombier{ 5983e12c5d1SDavid du Colombier char buf[200]; 5997dd7cddfSDavid du Colombier va_list arg; 6003e12c5d1SDavid du Colombier 6013e12c5d1SDavid du Colombier /* 6023e12c5d1SDavid du Colombier * hack to intercept message from yaccpar 6033e12c5d1SDavid du Colombier */ 6043e12c5d1SDavid du Colombier if(strcmp(a, "syntax error") == 0) { 6053e12c5d1SDavid du Colombier yyerror("syntax error, last name: %s", symb); 6063e12c5d1SDavid du Colombier return; 6073e12c5d1SDavid du Colombier } 6083e12c5d1SDavid du Colombier prfile(lineno); 6097dd7cddfSDavid du Colombier va_start(arg, a); 6109a747e4fSDavid du Colombier vseprint(buf, buf+sizeof(buf), a, arg); 6117dd7cddfSDavid du Colombier va_end(arg); 6123e12c5d1SDavid du Colombier print("%s\n", buf); 6133e12c5d1SDavid du Colombier nerrors++; 6143e12c5d1SDavid du Colombier if(nerrors > 10) { 6153e12c5d1SDavid du Colombier print("too many errors\n"); 6163e12c5d1SDavid du Colombier errorexit(); 6173e12c5d1SDavid du Colombier } 6183e12c5d1SDavid du Colombier} 6193e12c5d1SDavid du Colombier 6203e12c5d1SDavid du Colombiervoid 6213e12c5d1SDavid du Colombierprfile(long l) 6223e12c5d1SDavid du Colombier{ 6233e12c5d1SDavid du Colombier int i, n; 6243e12c5d1SDavid du Colombier Hist a[HISTSZ], *h; 6253e12c5d1SDavid du Colombier long d; 6263e12c5d1SDavid du Colombier 6273e12c5d1SDavid du Colombier n = 0; 6283e12c5d1SDavid du Colombier for(h = hist; h != H; h = h->link) { 6293e12c5d1SDavid du Colombier if(l < h->line) 6303e12c5d1SDavid du Colombier break; 6313e12c5d1SDavid du Colombier if(h->name) { 6323e12c5d1SDavid du Colombier if(h->offset == 0) { 6333e12c5d1SDavid du Colombier if(n >= 0 && n < HISTSZ) 6343e12c5d1SDavid du Colombier a[n] = *h; 6353e12c5d1SDavid du Colombier n++; 6363e12c5d1SDavid du Colombier continue; 6373e12c5d1SDavid du Colombier } 6383e12c5d1SDavid du Colombier if(n > 0 && n < HISTSZ) 6393e12c5d1SDavid du Colombier if(a[n-1].offset == 0) { 6403e12c5d1SDavid du Colombier a[n] = *h; 6413e12c5d1SDavid du Colombier n++; 6423e12c5d1SDavid du Colombier } else 6433e12c5d1SDavid du Colombier a[n-1] = *h; 6443e12c5d1SDavid du Colombier continue; 6453e12c5d1SDavid du Colombier } 6463e12c5d1SDavid du Colombier n--; 6473e12c5d1SDavid du Colombier if(n >= 0 && n < HISTSZ) { 6483e12c5d1SDavid du Colombier d = h->line - a[n].line; 6493e12c5d1SDavid du Colombier for(i=0; i<n; i++) 6503e12c5d1SDavid du Colombier a[i].line += d; 6513e12c5d1SDavid du Colombier } 6523e12c5d1SDavid du Colombier } 6533e12c5d1SDavid du Colombier if(n > HISTSZ) 6543e12c5d1SDavid du Colombier n = HISTSZ; 6553e12c5d1SDavid du Colombier for(i=0; i<n; i++) 6567dd7cddfSDavid du Colombier print("%s:%ld ", a[i].name, (long)(l-a[i].line+a[i].offset+1)); 6573e12c5d1SDavid du Colombier} 6583e12c5d1SDavid du Colombier 6593e12c5d1SDavid du Colombiervoid 6603e12c5d1SDavid du Colombierieeedtod(Ieee *ieee, double native) 6613e12c5d1SDavid du Colombier{ 6623e12c5d1SDavid du Colombier double fr, ho, f; 6633e12c5d1SDavid du Colombier int exp; 6643e12c5d1SDavid du Colombier 6653e12c5d1SDavid du Colombier if(native < 0) { 6663e12c5d1SDavid du Colombier ieeedtod(ieee, -native); 6673e12c5d1SDavid du Colombier ieee->h |= 0x80000000L; 6683e12c5d1SDavid du Colombier return; 6693e12c5d1SDavid du Colombier } 6703e12c5d1SDavid du Colombier if(native == 0) { 6713e12c5d1SDavid du Colombier ieee->l = 0; 6723e12c5d1SDavid du Colombier ieee->h = 0; 6733e12c5d1SDavid du Colombier return; 6743e12c5d1SDavid du Colombier } 6753e12c5d1SDavid du Colombier fr = frexp(native, &exp); 6763e12c5d1SDavid du Colombier f = 2097152L; /* shouldnt use fp constants here */ 6773e12c5d1SDavid du Colombier fr = modf(fr*f, &ho); 6783e12c5d1SDavid du Colombier ieee->h = ho; 6793e12c5d1SDavid du Colombier ieee->h &= 0xfffffL; 6803e12c5d1SDavid du Colombier ieee->h |= (exp+1022L) << 20; 6813e12c5d1SDavid du Colombier f = 65536L; 6823e12c5d1SDavid du Colombier fr = modf(fr*f, &ho); 6833e12c5d1SDavid du Colombier ieee->l = ho; 6843e12c5d1SDavid du Colombier ieee->l <<= 16; 6853e12c5d1SDavid du Colombier ieee->l |= (long)(fr*f); 6863e12c5d1SDavid du Colombier} 687