13e12c5d1SDavid du Colombier #include <u.h> 23e12c5d1SDavid du Colombier #include <libc.h> 33e12c5d1SDavid du Colombier #include "cpp.h" 43e12c5d1SDavid du Colombier 53e12c5d1SDavid du Colombier Includelist includelist[NINCLUDE] = { 63e12c5d1SDavid du Colombier { 0, 1, "/usr/include" }, 73e12c5d1SDavid du Colombier }; 83e12c5d1SDavid du Colombier 9*bd389b36SDavid du Colombier char *objname; 10*bd389b36SDavid du Colombier 113e12c5d1SDavid du Colombier void 123e12c5d1SDavid du Colombier doinclude(Tokenrow *trp) 133e12c5d1SDavid du Colombier { 143e12c5d1SDavid du Colombier char fname[256], iname[256]; 153e12c5d1SDavid du Colombier Includelist *ip; 163e12c5d1SDavid du Colombier int angled, len, fd, i; 173e12c5d1SDavid du Colombier 183e12c5d1SDavid du Colombier trp->tp += 1; 193e12c5d1SDavid du Colombier if (trp->tp>=trp->lp) 203e12c5d1SDavid du Colombier goto syntax; 213e12c5d1SDavid du Colombier if (trp->tp->type!=STRING && trp->tp->type!=LT) { 223e12c5d1SDavid du Colombier len = trp->tp - trp->bp; 233e12c5d1SDavid du Colombier expandrow(trp, "<include>"); 243e12c5d1SDavid du Colombier trp->tp = trp->bp+len; 253e12c5d1SDavid du Colombier } 263e12c5d1SDavid du Colombier if (trp->tp->type==STRING) { 273e12c5d1SDavid du Colombier len = trp->tp->len-2; 283e12c5d1SDavid du Colombier if (len > sizeof(fname) - 1) 293e12c5d1SDavid du Colombier len = sizeof(fname) - 1; 303e12c5d1SDavid du Colombier strncpy(fname, (char*)trp->tp->t+1, len); 313e12c5d1SDavid du Colombier angled = 0; 323e12c5d1SDavid du Colombier } else { 333e12c5d1SDavid du Colombier len = 0; 343e12c5d1SDavid du Colombier trp->tp++; 353e12c5d1SDavid du Colombier while (trp->tp->type!=GT) { 363e12c5d1SDavid du Colombier if (trp->tp>trp->lp || len+trp->tp->len+2 >= sizeof(fname)) 373e12c5d1SDavid du Colombier goto syntax; 383e12c5d1SDavid du Colombier strncpy(fname+len, (char*)trp->tp->t, trp->tp->len); 393e12c5d1SDavid du Colombier len += trp->tp->len; 403e12c5d1SDavid du Colombier trp->tp++; 413e12c5d1SDavid du Colombier } 423e12c5d1SDavid du Colombier angled = 1; 433e12c5d1SDavid du Colombier } 443e12c5d1SDavid du Colombier trp->tp += 2; 453e12c5d1SDavid du Colombier if (trp->tp < trp->lp || len==0) 463e12c5d1SDavid du Colombier goto syntax; 473e12c5d1SDavid du Colombier fname[len] = '\0'; 483e12c5d1SDavid du Colombier if (fname[0]=='/') { 493e12c5d1SDavid du Colombier fd = open(fname, 0); 503e12c5d1SDavid du Colombier strcpy(iname, fname); 513e12c5d1SDavid du Colombier } else for (fd=-1,i=NINCLUDE-1; i>=0; i--) { 523e12c5d1SDavid du Colombier ip = &includelist[i]; 533e12c5d1SDavid du Colombier if (ip->file==NULL || ip->deleted || (angled && ip->always==0)) 543e12c5d1SDavid du Colombier continue; 553e12c5d1SDavid du Colombier if (strlen(fname)+strlen(ip->file)+2 > sizeof(iname)) 563e12c5d1SDavid du Colombier continue; 573e12c5d1SDavid du Colombier strcpy(iname, ip->file); 583e12c5d1SDavid du Colombier strcat(iname, "/"); 593e12c5d1SDavid du Colombier strcat(iname, fname); 603e12c5d1SDavid du Colombier if ((fd = open(iname, 0)) >= 0) 613e12c5d1SDavid du Colombier break; 623e12c5d1SDavid du Colombier } 63*bd389b36SDavid du Colombier if ( Mflag>1 || !angled&&Mflag==1 ) { 64*bd389b36SDavid du Colombier write(1,objname,strlen(objname)); 65*bd389b36SDavid du Colombier write(1,iname,strlen(iname)); 66*bd389b36SDavid du Colombier write(1,"\n",1); 67*bd389b36SDavid du Colombier } 683e12c5d1SDavid du Colombier if (fd >= 0) { 693e12c5d1SDavid du Colombier if (++incdepth > 10) 703e12c5d1SDavid du Colombier error(FATAL, "#include too deeply nested"); 713e12c5d1SDavid du Colombier setsource((char*)newstring((uchar*)iname, strlen(iname), 0), fd, NULL); 723e12c5d1SDavid du Colombier genline(); 733e12c5d1SDavid du Colombier } else { 743e12c5d1SDavid du Colombier trp->tp = trp->bp+2; 753e12c5d1SDavid du Colombier error(ERROR, "Could not find include file %r", trp); 763e12c5d1SDavid du Colombier } 773e12c5d1SDavid du Colombier return; 783e12c5d1SDavid du Colombier syntax: 793e12c5d1SDavid du Colombier error(ERROR, "Syntax error in #include"); 803e12c5d1SDavid du Colombier return; 813e12c5d1SDavid du Colombier } 823e12c5d1SDavid du Colombier 833e12c5d1SDavid du Colombier /* 843e12c5d1SDavid du Colombier * Generate a line directive for cursource 853e12c5d1SDavid du Colombier */ 863e12c5d1SDavid du Colombier void 873e12c5d1SDavid du Colombier genline(void) 883e12c5d1SDavid du Colombier { 893e12c5d1SDavid du Colombier static Token ta = { UNCLASS, NULL, 0, 0 }; 903e12c5d1SDavid du Colombier static Tokenrow tr = { &ta, &ta, &ta+1, 1 }; 913e12c5d1SDavid du Colombier uchar *p; 923e12c5d1SDavid du Colombier 933e12c5d1SDavid du Colombier ta.t = p = (uchar*)outp; 943e12c5d1SDavid du Colombier strcpy((char*)p, "#line "); 953e12c5d1SDavid du Colombier p += sizeof("#line ")-1; 963e12c5d1SDavid du Colombier p = (uchar*)outnum((char*)p, cursource->line); 973e12c5d1SDavid du Colombier *p++ = ' '; *p++ = '"'; 983e12c5d1SDavid du Colombier strcpy((char*)p, cursource->filename); 993e12c5d1SDavid du Colombier p += strlen((char*)p); 1003e12c5d1SDavid du Colombier *p++ = '"'; *p++ = '\n'; 1013e12c5d1SDavid du Colombier ta.len = (char*)p-outp; 1023e12c5d1SDavid du Colombier outp = (char*)p; 1033e12c5d1SDavid du Colombier tr.tp = tr.bp; 1043e12c5d1SDavid du Colombier puttokens(&tr); 1053e12c5d1SDavid du Colombier } 106*bd389b36SDavid du Colombier 107*bd389b36SDavid du Colombier void 108*bd389b36SDavid du Colombier setobjname(char *f) 109*bd389b36SDavid du Colombier { 110*bd389b36SDavid du Colombier int n = strlen(f); 111*bd389b36SDavid du Colombier objname = (char*)domalloc(n+5); 112*bd389b36SDavid du Colombier strcpy(objname,f); 113*bd389b36SDavid du Colombier if(objname[n-2]=='.'){ 114*bd389b36SDavid du Colombier strcpy(objname+n-1,"$O: "); 115*bd389b36SDavid du Colombier }else{ 116*bd389b36SDavid du Colombier strcpy(objname+n,"$O: "); 117*bd389b36SDavid du Colombier } 118*bd389b36SDavid du Colombier } 119