1*3e12c5d1SDavid du Colombier #include <u.h> 2*3e12c5d1SDavid du Colombier #include <libc.h> 3*3e12c5d1SDavid du Colombier #include "cpp.h" 4*3e12c5d1SDavid du Colombier 5*3e12c5d1SDavid du Colombier Includelist includelist[NINCLUDE] = { 6*3e12c5d1SDavid du Colombier { 0, 1, "/usr/include" }, 7*3e12c5d1SDavid du Colombier }; 8*3e12c5d1SDavid du Colombier 9*3e12c5d1SDavid du Colombier void 10*3e12c5d1SDavid du Colombier doinclude(Tokenrow *trp) 11*3e12c5d1SDavid du Colombier { 12*3e12c5d1SDavid du Colombier char fname[256], iname[256]; 13*3e12c5d1SDavid du Colombier Includelist *ip; 14*3e12c5d1SDavid du Colombier int angled, len, fd, i; 15*3e12c5d1SDavid du Colombier 16*3e12c5d1SDavid du Colombier trp->tp += 1; 17*3e12c5d1SDavid du Colombier if (trp->tp>=trp->lp) 18*3e12c5d1SDavid du Colombier goto syntax; 19*3e12c5d1SDavid du Colombier if (trp->tp->type!=STRING && trp->tp->type!=LT) { 20*3e12c5d1SDavid du Colombier len = trp->tp - trp->bp; 21*3e12c5d1SDavid du Colombier expandrow(trp, "<include>"); 22*3e12c5d1SDavid du Colombier trp->tp = trp->bp+len; 23*3e12c5d1SDavid du Colombier } 24*3e12c5d1SDavid du Colombier if (trp->tp->type==STRING) { 25*3e12c5d1SDavid du Colombier len = trp->tp->len-2; 26*3e12c5d1SDavid du Colombier if (len > sizeof(fname) - 1) 27*3e12c5d1SDavid du Colombier len = sizeof(fname) - 1; 28*3e12c5d1SDavid du Colombier strncpy(fname, (char*)trp->tp->t+1, len); 29*3e12c5d1SDavid du Colombier angled = 0; 30*3e12c5d1SDavid du Colombier } else { 31*3e12c5d1SDavid du Colombier len = 0; 32*3e12c5d1SDavid du Colombier trp->tp++; 33*3e12c5d1SDavid du Colombier while (trp->tp->type!=GT) { 34*3e12c5d1SDavid du Colombier if (trp->tp>trp->lp || len+trp->tp->len+2 >= sizeof(fname)) 35*3e12c5d1SDavid du Colombier goto syntax; 36*3e12c5d1SDavid du Colombier strncpy(fname+len, (char*)trp->tp->t, trp->tp->len); 37*3e12c5d1SDavid du Colombier len += trp->tp->len; 38*3e12c5d1SDavid du Colombier trp->tp++; 39*3e12c5d1SDavid du Colombier } 40*3e12c5d1SDavid du Colombier angled = 1; 41*3e12c5d1SDavid du Colombier } 42*3e12c5d1SDavid du Colombier trp->tp += 2; 43*3e12c5d1SDavid du Colombier if (trp->tp < trp->lp || len==0) 44*3e12c5d1SDavid du Colombier goto syntax; 45*3e12c5d1SDavid du Colombier fname[len] = '\0'; 46*3e12c5d1SDavid du Colombier if (fname[0]=='/') { 47*3e12c5d1SDavid du Colombier fd = open(fname, 0); 48*3e12c5d1SDavid du Colombier strcpy(iname, fname); 49*3e12c5d1SDavid du Colombier } else for (fd=-1,i=NINCLUDE-1; i>=0; i--) { 50*3e12c5d1SDavid du Colombier ip = &includelist[i]; 51*3e12c5d1SDavid du Colombier if (ip->file==NULL || ip->deleted || (angled && ip->always==0)) 52*3e12c5d1SDavid du Colombier continue; 53*3e12c5d1SDavid du Colombier if (strlen(fname)+strlen(ip->file)+2 > sizeof(iname)) 54*3e12c5d1SDavid du Colombier continue; 55*3e12c5d1SDavid du Colombier strcpy(iname, ip->file); 56*3e12c5d1SDavid du Colombier strcat(iname, "/"); 57*3e12c5d1SDavid du Colombier strcat(iname, fname); 58*3e12c5d1SDavid du Colombier if ((fd = open(iname, 0)) >= 0) 59*3e12c5d1SDavid du Colombier break; 60*3e12c5d1SDavid du Colombier } 61*3e12c5d1SDavid du Colombier if (fd >= 0) { 62*3e12c5d1SDavid du Colombier if (++incdepth > 10) 63*3e12c5d1SDavid du Colombier error(FATAL, "#include too deeply nested"); 64*3e12c5d1SDavid du Colombier setsource((char*)newstring((uchar*)iname, strlen(iname), 0), fd, NULL); 65*3e12c5d1SDavid du Colombier genline(); 66*3e12c5d1SDavid du Colombier } else { 67*3e12c5d1SDavid du Colombier trp->tp = trp->bp+2; 68*3e12c5d1SDavid du Colombier error(ERROR, "Could not find include file %r", trp); 69*3e12c5d1SDavid du Colombier } 70*3e12c5d1SDavid du Colombier return; 71*3e12c5d1SDavid du Colombier syntax: 72*3e12c5d1SDavid du Colombier error(ERROR, "Syntax error in #include"); 73*3e12c5d1SDavid du Colombier return; 74*3e12c5d1SDavid du Colombier } 75*3e12c5d1SDavid du Colombier 76*3e12c5d1SDavid du Colombier /* 77*3e12c5d1SDavid du Colombier * Generate a line directive for cursource 78*3e12c5d1SDavid du Colombier */ 79*3e12c5d1SDavid du Colombier void 80*3e12c5d1SDavid du Colombier genline(void) 81*3e12c5d1SDavid du Colombier { 82*3e12c5d1SDavid du Colombier static Token ta = { UNCLASS, NULL, 0, 0 }; 83*3e12c5d1SDavid du Colombier static Tokenrow tr = { &ta, &ta, &ta+1, 1 }; 84*3e12c5d1SDavid du Colombier uchar *p; 85*3e12c5d1SDavid du Colombier 86*3e12c5d1SDavid du Colombier ta.t = p = (uchar*)outp; 87*3e12c5d1SDavid du Colombier strcpy((char*)p, "#line "); 88*3e12c5d1SDavid du Colombier p += sizeof("#line ")-1; 89*3e12c5d1SDavid du Colombier p = (uchar*)outnum((char*)p, cursource->line); 90*3e12c5d1SDavid du Colombier *p++ = ' '; *p++ = '"'; 91*3e12c5d1SDavid du Colombier strcpy((char*)p, cursource->filename); 92*3e12c5d1SDavid du Colombier p += strlen((char*)p); 93*3e12c5d1SDavid du Colombier *p++ = '"'; *p++ = '\n'; 94*3e12c5d1SDavid du Colombier ta.len = (char*)p-outp; 95*3e12c5d1SDavid du Colombier outp = (char*)p; 96*3e12c5d1SDavid du Colombier tr.tp = tr.bp; 97*3e12c5d1SDavid du Colombier puttokens(&tr); 98*3e12c5d1SDavid du Colombier } 99