xref: /plan9/sys/src/cmd/cpp/include.c (revision bd389b369d90320ffee8121f40c4c30619f88097)
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