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