xref: /AOO41X/main/soltools/cpp/_include.c (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1*cdf0e10cSrcweir #if (defined(_WIN32) || defined(_MSDOS) || defined(__IBMC__))
2*cdf0e10cSrcweir #	include <io.h>
3*cdf0e10cSrcweir #else
4*cdf0e10cSrcweir #	include <unistd.h>
5*cdf0e10cSrcweir #endif
6*cdf0e10cSrcweir 
7*cdf0e10cSrcweir #ifdef _MSC_VER
8*cdf0e10cSrcweir #	define _POSIX_
9*cdf0e10cSrcweir #endif
10*cdf0e10cSrcweir #include <stdio.h>
11*cdf0e10cSrcweir #include <stdlib.h>
12*cdf0e10cSrcweir #include <string.h>
13*cdf0e10cSrcweir #include <fcntl.h>
14*cdf0e10cSrcweir 
15*cdf0e10cSrcweir 
16*cdf0e10cSrcweir #ifdef __hpux
17*cdf0e10cSrcweir #	define _HPUX_SOURCE
18*cdf0e10cSrcweir #endif
19*cdf0e10cSrcweir #if defined(__IBMC__) || defined(__EMX__)
20*cdf0e10cSrcweir #	include <fcntl.h>
21*cdf0e10cSrcweir #   define PATH_MAX _MAX_PATH
22*cdf0e10cSrcweir #endif
23*cdf0e10cSrcweir #include <limits.h>
24*cdf0e10cSrcweir 
25*cdf0e10cSrcweir #include "cpp.h"
26*cdf0e10cSrcweir 
27*cdf0e10cSrcweir Includelist includelist[NINCLUDE];
28*cdf0e10cSrcweir Wraplist wraplist[NINCLUDE];
29*cdf0e10cSrcweir 
30*cdf0e10cSrcweir void
31*cdf0e10cSrcweir     doinclude(Tokenrow * trp, int depth, int import)
32*cdf0e10cSrcweir {
33*cdf0e10cSrcweir     char fname[PATH_MAX], iname[PATH_MAX];
34*cdf0e10cSrcweir     Includelist *ip;
35*cdf0e10cSrcweir     int angled, fd, i;
36*cdf0e10cSrcweir     size_t len;
37*cdf0e10cSrcweir 
38*cdf0e10cSrcweir     trp->tp += 1;
39*cdf0e10cSrcweir     if (trp->tp >= trp->lp)
40*cdf0e10cSrcweir         goto syntax;
41*cdf0e10cSrcweir     if (trp->tp->type != STRING && trp->tp->type != LT)
42*cdf0e10cSrcweir     {
43*cdf0e10cSrcweir         len = trp->tp - trp->bp;
44*cdf0e10cSrcweir         expandrow(trp, "<include>");
45*cdf0e10cSrcweir         trp->tp = trp->bp + len;
46*cdf0e10cSrcweir     }
47*cdf0e10cSrcweir     if (trp->tp->type == STRING)
48*cdf0e10cSrcweir     {
49*cdf0e10cSrcweir         len = trp->tp->len - 2;
50*cdf0e10cSrcweir         if (len > sizeof(fname) - 1)
51*cdf0e10cSrcweir             len = sizeof(fname) - 1;
52*cdf0e10cSrcweir         strncpy(fname, (char *) trp->tp->t + 1, len);
53*cdf0e10cSrcweir         angled = 0;
54*cdf0e10cSrcweir     }
55*cdf0e10cSrcweir     else
56*cdf0e10cSrcweir 	{
57*cdf0e10cSrcweir         if (trp->tp->type == LT)
58*cdf0e10cSrcweir         {
59*cdf0e10cSrcweir             len = 0;
60*cdf0e10cSrcweir             trp->tp++;
61*cdf0e10cSrcweir             while (trp->tp->type != GT)
62*cdf0e10cSrcweir             {
63*cdf0e10cSrcweir                 if (trp->tp > trp->lp || len + trp->tp->len + 2 >= sizeof(fname))
64*cdf0e10cSrcweir                     goto syntax;
65*cdf0e10cSrcweir                 strncpy(fname + len, (char *) trp->tp->t, trp->tp->len);
66*cdf0e10cSrcweir                 len += trp->tp->len;
67*cdf0e10cSrcweir                 trp->tp++;
68*cdf0e10cSrcweir             }
69*cdf0e10cSrcweir             angled = 1;
70*cdf0e10cSrcweir         }
71*cdf0e10cSrcweir         else
72*cdf0e10cSrcweir             goto syntax;
73*cdf0e10cSrcweir 	}
74*cdf0e10cSrcweir     trp->tp += 2;
75*cdf0e10cSrcweir     if (trp->tp < trp->lp || len == 0)
76*cdf0e10cSrcweir         goto syntax;
77*cdf0e10cSrcweir     fname[len] = '\0';
78*cdf0e10cSrcweir     if (fname[0] == '/')
79*cdf0e10cSrcweir     {
80*cdf0e10cSrcweir         fd = open(fname, O_RDONLY);
81*cdf0e10cSrcweir         strcpy(iname, fname);
82*cdf0e10cSrcweir 	}
83*cdf0e10cSrcweir     else
84*cdf0e10cSrcweir 	{
85*cdf0e10cSrcweir         for (fd = -1, i = (depth < 0) ? (NINCLUDE - 1) : (depth - 1); i >= 0; i--)
86*cdf0e10cSrcweir         {
87*cdf0e10cSrcweir             ip = &includelist[i];
88*cdf0e10cSrcweir             if (ip->file == NULL || ip->deleted || (angled && ip->always == 0))
89*cdf0e10cSrcweir                 continue;
90*cdf0e10cSrcweir             if (strlen(fname) + strlen(ip->file) + 2 > sizeof(iname))
91*cdf0e10cSrcweir                 continue;
92*cdf0e10cSrcweir             strcpy(iname, ip->file);
93*cdf0e10cSrcweir             strcat(iname, "/");
94*cdf0e10cSrcweir             strcat(iname, fname);
95*cdf0e10cSrcweir             if ((fd = open(iname, O_RDONLY)) >= 0)
96*cdf0e10cSrcweir                 break;
97*cdf0e10cSrcweir         }
98*cdf0e10cSrcweir 	}
99*cdf0e10cSrcweir 
100*cdf0e10cSrcweir     if (fd >= 0)
101*cdf0e10cSrcweir     {
102*cdf0e10cSrcweir         if (++incdepth > NINC )
103*cdf0e10cSrcweir             error(FATAL, "#%s too deeply nested", import ? "import" : "include");
104*cdf0e10cSrcweir 		if (Xflag)
105*cdf0e10cSrcweir 			genimport(fname, angled, iname, import);
106*cdf0e10cSrcweir  		if (Iflag)
107*cdf0e10cSrcweir 			error(INFO, "Open %s file [%s]", import ? "import" : "include", iname );
108*cdf0e10cSrcweir 
109*cdf0e10cSrcweir         for (i = NINCLUDE - 1; i >= 0; i--)
110*cdf0e10cSrcweir         {
111*cdf0e10cSrcweir             if ((wraplist[i].file != NULL) &&
112*cdf0e10cSrcweir 			    (strncmp(wraplist[i].file, iname, strlen(wraplist[i].file)) == 0))
113*cdf0e10cSrcweir 				break;
114*cdf0e10cSrcweir 		}
115*cdf0e10cSrcweir 
116*cdf0e10cSrcweir         setsource((char *) newstring((uchar *) iname, strlen(iname), 0), i, fd, NULL, (i >= 0) ? 1 : 0);
117*cdf0e10cSrcweir 
118*cdf0e10cSrcweir         if (!Pflag)
119*cdf0e10cSrcweir             genline();
120*cdf0e10cSrcweir     }
121*cdf0e10cSrcweir     else
122*cdf0e10cSrcweir     {
123*cdf0e10cSrcweir         trp->tp = trp->bp + 2;
124*cdf0e10cSrcweir         error(ERROR, "Could not find %s file %r", import ? "import" : "include", trp);
125*cdf0e10cSrcweir     }
126*cdf0e10cSrcweir     return;
127*cdf0e10cSrcweir syntax:
128*cdf0e10cSrcweir     error(ERROR, "Syntax error in #%s", import ? "import" : "include");
129*cdf0e10cSrcweir     return;
130*cdf0e10cSrcweir }
131*cdf0e10cSrcweir 
132*cdf0e10cSrcweir /*
133*cdf0e10cSrcweir  * Generate a line directive for cursource
134*cdf0e10cSrcweir  */
135*cdf0e10cSrcweir void
136*cdf0e10cSrcweir     genline(void)
137*cdf0e10cSrcweir {
138*cdf0e10cSrcweir     static Token ta = {UNCLASS, 0, 0, 0, NULL, 0};
139*cdf0e10cSrcweir     static Tokenrow tr = {&ta, &ta, &ta + 1, 1};
140*cdf0e10cSrcweir     uchar *p;
141*cdf0e10cSrcweir 
142*cdf0e10cSrcweir     ta.t = p = (uchar *) outptr;
143*cdf0e10cSrcweir     strcpy((char *) p, "#line ");
144*cdf0e10cSrcweir     p += sizeof("#line ") - 1;
145*cdf0e10cSrcweir     p = (uchar *) outnum((char *) p, cursource->line);
146*cdf0e10cSrcweir     *p++ = ' ';
147*cdf0e10cSrcweir     *p++ = '"';
148*cdf0e10cSrcweir     if (cursource->filename[0] != '/' && wd[0])
149*cdf0e10cSrcweir     {
150*cdf0e10cSrcweir         strcpy((char *) p, wd);
151*cdf0e10cSrcweir         p += strlen(wd);
152*cdf0e10cSrcweir         *p++ = '/';
153*cdf0e10cSrcweir     }
154*cdf0e10cSrcweir     strcpy((char *) p, cursource->filename);
155*cdf0e10cSrcweir     p += strlen((char *) p);
156*cdf0e10cSrcweir     *p++ = '"';
157*cdf0e10cSrcweir     *p++ = '\n';
158*cdf0e10cSrcweir     ta.len = (char *) p - outptr;
159*cdf0e10cSrcweir     outptr = (char *) p;
160*cdf0e10cSrcweir     tr.tp = tr.bp;
161*cdf0e10cSrcweir     puttokens(&tr);
162*cdf0e10cSrcweir }
163*cdf0e10cSrcweir 
164*cdf0e10cSrcweir /*
165*cdf0e10cSrcweir  * Generate a pragma import/include directive
166*cdf0e10cSrcweir  */
167*cdf0e10cSrcweir void
168*cdf0e10cSrcweir     genimport(char *fname, int angled, char *iname, int import)
169*cdf0e10cSrcweir {
170*cdf0e10cSrcweir     static Token ta = {UNCLASS, 0, 0, 0, NULL, 0};
171*cdf0e10cSrcweir     static Tokenrow tr = {&ta, &ta, &ta + 1, 1};
172*cdf0e10cSrcweir     uchar *p;
173*cdf0e10cSrcweir 
174*cdf0e10cSrcweir     ta.t = p = (uchar *) outptr;
175*cdf0e10cSrcweir 
176*cdf0e10cSrcweir 	if (import)
177*cdf0e10cSrcweir 		strcpy((char *) p, "#pragma import");
178*cdf0e10cSrcweir 	else
179*cdf0e10cSrcweir 		strcpy((char *) p, "#pragma include");
180*cdf0e10cSrcweir 
181*cdf0e10cSrcweir 	p += strlen((char *) p);
182*cdf0e10cSrcweir 
183*cdf0e10cSrcweir 	*p++ = '(';
184*cdf0e10cSrcweir 
185*cdf0e10cSrcweir     *p++ = angled ? '<' : '"';
186*cdf0e10cSrcweir 	strcpy((char *) p, fname);
187*cdf0e10cSrcweir 	p += strlen(fname);
188*cdf0e10cSrcweir     *p++ = angled ? '>' : '"';
189*cdf0e10cSrcweir 
190*cdf0e10cSrcweir 	*p++ = ',';
191*cdf0e10cSrcweir 
192*cdf0e10cSrcweir 	*p++ = '"';
193*cdf0e10cSrcweir 	strcpy((char *) p, iname);
194*cdf0e10cSrcweir 	p += strlen(iname);
195*cdf0e10cSrcweir 	*p++ = '"';
196*cdf0e10cSrcweir 
197*cdf0e10cSrcweir 	*p++ = ')';
198*cdf0e10cSrcweir     *p++ = '\n';
199*cdf0e10cSrcweir 
200*cdf0e10cSrcweir     ta.len = (char *) p - outptr;
201*cdf0e10cSrcweir     outptr = (char *) p;
202*cdf0e10cSrcweir     tr.tp = tr.bp;
203*cdf0e10cSrcweir     puttokens(&tr);
204*cdf0e10cSrcweir }
205*cdf0e10cSrcweir 
206*cdf0e10cSrcweir /*
207*cdf0e10cSrcweir  * Generate a extern C directive
208*cdf0e10cSrcweir  */
209*cdf0e10cSrcweir void
210*cdf0e10cSrcweir     genwrap(int end)
211*cdf0e10cSrcweir {
212*cdf0e10cSrcweir     static Token ta = {UNCLASS, 0, 0, 0, NULL, 0};
213*cdf0e10cSrcweir     static Tokenrow tr = {&ta, &ta, &ta + 1, 1};
214*cdf0e10cSrcweir     uchar *p;
215*cdf0e10cSrcweir 
216*cdf0e10cSrcweir 	if (Cplusplus)
217*cdf0e10cSrcweir 	{
218*cdf0e10cSrcweir 		ta.t = p = (uchar *) outptr;
219*cdf0e10cSrcweir 
220*cdf0e10cSrcweir 		if (! end)
221*cdf0e10cSrcweir 			strcpy((char *) p, "extern \"C\" {");
222*cdf0e10cSrcweir 		else
223*cdf0e10cSrcweir 			strcpy((char *) p, "}");
224*cdf0e10cSrcweir 
225*cdf0e10cSrcweir 		p += strlen((char *) p);
226*cdf0e10cSrcweir 
227*cdf0e10cSrcweir 		*p++ = '\n';
228*cdf0e10cSrcweir 
229*cdf0e10cSrcweir 		ta.len = (char *) p - outptr;
230*cdf0e10cSrcweir 		outptr = (char *) p;
231*cdf0e10cSrcweir 		tr.tp = tr.bp;
232*cdf0e10cSrcweir 		puttokens(&tr);
233*cdf0e10cSrcweir 	}
234*cdf0e10cSrcweir }
235*cdf0e10cSrcweir 
236