1*cdf0e10cSrcweir #include <stdio.h> 2*cdf0e10cSrcweir #include <stddef.h> 3*cdf0e10cSrcweir #include <stdlib.h> 4*cdf0e10cSrcweir #include <string.h> 5*cdf0e10cSrcweir #include <ctype.h> 6*cdf0e10cSrcweir #include <fcntl.h> 7*cdf0e10cSrcweir #if (defined(_WIN32) || defined(_MSDOS) || defined(__IBMC__)) 8*cdf0e10cSrcweir #include <io.h> 9*cdf0e10cSrcweir #else 10*cdf0e10cSrcweir #include <unistd.h> 11*cdf0e10cSrcweir #endif 12*cdf0e10cSrcweir 13*cdf0e10cSrcweir #include "cpp.h" 14*cdf0e10cSrcweir 15*cdf0e10cSrcweir #if defined MACOSX || !defined HAVE_GETOPT 16*cdf0e10cSrcweir extern int stgetopt(int, char *const *, const char *); 17*cdf0e10cSrcweir extern char *optarg; 18*cdf0e10cSrcweir extern int optind; 19*cdf0e10cSrcweir #else 20*cdf0e10cSrcweir #include <getopt.h> 21*cdf0e10cSrcweir #endif 22*cdf0e10cSrcweir 23*cdf0e10cSrcweir extern char rcsid[]; 24*cdf0e10cSrcweir 25*cdf0e10cSrcweir int Pflag = 0; /* print no line information */ 26*cdf0e10cSrcweir int Iflag = 0; /* print includes */ 27*cdf0e10cSrcweir int Mflag = 0; /* print macor expansion */ 28*cdf0e10cSrcweir int Aflag = 0; /* translate character sets */ 29*cdf0e10cSrcweir int Xflag = 0; /* print pragma for include/import */ 30*cdf0e10cSrcweir int Vflag = 0; /* verbose flag */ 31*cdf0e10cSrcweir int Cflag = 0; /* do not remove any comments */ 32*cdf0e10cSrcweir int Dflag = 0; /* add parameter check to delete op */ 33*cdf0e10cSrcweir int Cplusplus = 0; 34*cdf0e10cSrcweir 35*cdf0e10cSrcweir extern void setup_kwtab(void); 36*cdf0e10cSrcweir 37*cdf0e10cSrcweir void 38*cdf0e10cSrcweir setup(int argc, char **argv) 39*cdf0e10cSrcweir { 40*cdf0e10cSrcweir int c, fd, i, n; 41*cdf0e10cSrcweir char *fp, *dp; 42*cdf0e10cSrcweir Tokenrow tr; 43*cdf0e10cSrcweir 44*cdf0e10cSrcweir setup_kwtab(); 45*cdf0e10cSrcweir #if defined MACOSX || !defined HAVE_GETOPT 46*cdf0e10cSrcweir while ((c = stgetopt(argc, argv, "NOPV:I:D:U:F:A:X:u:l:+")) != -1) 47*cdf0e10cSrcweir #else 48*cdf0e10cSrcweir while ((c = getopt(argc, argv, "NOPV:I:D:U:F:A:X:u:l:+")) != -1) 49*cdf0e10cSrcweir #endif 50*cdf0e10cSrcweir switch (c) 51*cdf0e10cSrcweir { 52*cdf0e10cSrcweir case 'N': 53*cdf0e10cSrcweir for (i = 0; i < NINCLUDE; i++) 54*cdf0e10cSrcweir if (includelist[i].always == 1) 55*cdf0e10cSrcweir includelist[i].deleted = 1; 56*cdf0e10cSrcweir break; 57*cdf0e10cSrcweir 58*cdf0e10cSrcweir case 'I': 59*cdf0e10cSrcweir for (i = NINCLUDE - 2; i >= 0; i--) 60*cdf0e10cSrcweir { 61*cdf0e10cSrcweir if (includelist[i].file == NULL) 62*cdf0e10cSrcweir { 63*cdf0e10cSrcweir includelist[i].always = 1; 64*cdf0e10cSrcweir includelist[i].file = optarg; 65*cdf0e10cSrcweir break; 66*cdf0e10cSrcweir } 67*cdf0e10cSrcweir } 68*cdf0e10cSrcweir if (i < 0) 69*cdf0e10cSrcweir error(FATAL, "Too many -I directives"); 70*cdf0e10cSrcweir break; 71*cdf0e10cSrcweir 72*cdf0e10cSrcweir case 'D': 73*cdf0e10cSrcweir case 'U': 74*cdf0e10cSrcweir case 'A': 75*cdf0e10cSrcweir setsource("<cmdarg>", -1, -1, optarg, 0); 76*cdf0e10cSrcweir maketokenrow(3, &tr); 77*cdf0e10cSrcweir gettokens(&tr, 1); 78*cdf0e10cSrcweir doadefine(&tr, c); 79*cdf0e10cSrcweir unsetsource(); 80*cdf0e10cSrcweir break; 81*cdf0e10cSrcweir 82*cdf0e10cSrcweir case 'P': /* Lineinfo */ 83*cdf0e10cSrcweir Pflag++; 84*cdf0e10cSrcweir break; 85*cdf0e10cSrcweir 86*cdf0e10cSrcweir case 'V': 87*cdf0e10cSrcweir for (n = 0; (c = optarg[n]) != '\0'; n++) 88*cdf0e10cSrcweir switch (c) 89*cdf0e10cSrcweir { 90*cdf0e10cSrcweir case 'i': 91*cdf0e10cSrcweir Iflag++; 92*cdf0e10cSrcweir break; 93*cdf0e10cSrcweir 94*cdf0e10cSrcweir case 'm': 95*cdf0e10cSrcweir Mflag = 1; 96*cdf0e10cSrcweir break; 97*cdf0e10cSrcweir 98*cdf0e10cSrcweir case 'x': 99*cdf0e10cSrcweir Mflag = 2; 100*cdf0e10cSrcweir break; 101*cdf0e10cSrcweir 102*cdf0e10cSrcweir case 't': 103*cdf0e10cSrcweir Vflag++; 104*cdf0e10cSrcweir break; 105*cdf0e10cSrcweir 106*cdf0e10cSrcweir case 'v': 107*cdf0e10cSrcweir fprintf(stderr, "%s %s\n", argv[0], rcsid); 108*cdf0e10cSrcweir break; 109*cdf0e10cSrcweir 110*cdf0e10cSrcweir default: 111*cdf0e10cSrcweir error(WARNING, "Unknown verbose option %c", c); 112*cdf0e10cSrcweir } 113*cdf0e10cSrcweir break; 114*cdf0e10cSrcweir 115*cdf0e10cSrcweir case 'X': 116*cdf0e10cSrcweir for (n = 0; (c = optarg[n]) != '\0'; n++) 117*cdf0e10cSrcweir switch (c) 118*cdf0e10cSrcweir { 119*cdf0e10cSrcweir case 'a': 120*cdf0e10cSrcweir Aflag++; 121*cdf0e10cSrcweir break; 122*cdf0e10cSrcweir 123*cdf0e10cSrcweir case 'i': 124*cdf0e10cSrcweir Xflag++; 125*cdf0e10cSrcweir break; 126*cdf0e10cSrcweir 127*cdf0e10cSrcweir case 'c': 128*cdf0e10cSrcweir Cflag++; 129*cdf0e10cSrcweir break; 130*cdf0e10cSrcweir 131*cdf0e10cSrcweir case 'd': 132*cdf0e10cSrcweir Dflag++; 133*cdf0e10cSrcweir break; 134*cdf0e10cSrcweir 135*cdf0e10cSrcweir case 'w': 136*cdf0e10cSrcweir dp = &optarg[n + 1]; 137*cdf0e10cSrcweir n += strlen(dp); 138*cdf0e10cSrcweir while (isspace(*dp)) dp++; 139*cdf0e10cSrcweir 140*cdf0e10cSrcweir for (i = NINCLUDE - 1; i >= 0; i--) 141*cdf0e10cSrcweir { 142*cdf0e10cSrcweir if (wraplist[i].file == NULL) 143*cdf0e10cSrcweir { 144*cdf0e10cSrcweir wraplist[i].file = dp; 145*cdf0e10cSrcweir break; 146*cdf0e10cSrcweir } 147*cdf0e10cSrcweir } 148*cdf0e10cSrcweir if (i < 0) 149*cdf0e10cSrcweir error(WARNING, "Too many -Xw directives"); 150*cdf0e10cSrcweir break; 151*cdf0e10cSrcweir 152*cdf0e10cSrcweir default: 153*cdf0e10cSrcweir error(WARNING, "Unknown extension option %c", c); 154*cdf0e10cSrcweir } 155*cdf0e10cSrcweir break; 156*cdf0e10cSrcweir 157*cdf0e10cSrcweir case '+': 158*cdf0e10cSrcweir Cplusplus++; 159*cdf0e10cSrcweir break; 160*cdf0e10cSrcweir 161*cdf0e10cSrcweir case 'u': /* -undef fuer GCC (dummy) */ 162*cdf0e10cSrcweir case 'l': /* -lang-c++ fuer GCC (dummy) */ 163*cdf0e10cSrcweir break; 164*cdf0e10cSrcweir 165*cdf0e10cSrcweir default: 166*cdf0e10cSrcweir break; 167*cdf0e10cSrcweir } 168*cdf0e10cSrcweir dp = "."; 169*cdf0e10cSrcweir fp = "<stdin>"; 170*cdf0e10cSrcweir fd = 0; 171*cdf0e10cSrcweir if (optind < argc) 172*cdf0e10cSrcweir { 173*cdf0e10cSrcweir if ((fp = strrchr(argv[optind], '/')) != NULL) 174*cdf0e10cSrcweir { 175*cdf0e10cSrcweir int len = fp - argv[optind]; 176*cdf0e10cSrcweir 177*cdf0e10cSrcweir dp = (char *) newstring((uchar *) argv[optind], len + 1, 0); 178*cdf0e10cSrcweir dp[len] = '\0'; 179*cdf0e10cSrcweir } 180*cdf0e10cSrcweir fp = (char *) newstring((uchar *) argv[optind], strlen(argv[optind]), 0); 181*cdf0e10cSrcweir if ((fd = open(fp, O_RDONLY)) <= 0) 182*cdf0e10cSrcweir error(FATAL, "Can't open input file %s", fp); 183*cdf0e10cSrcweir } 184*cdf0e10cSrcweir 185*cdf0e10cSrcweir if (optind + 1 < argc) 186*cdf0e10cSrcweir { 187*cdf0e10cSrcweir int fdo = creat(argv[optind + 1], 0666); 188*cdf0e10cSrcweir 189*cdf0e10cSrcweir if (fdo < 0) 190*cdf0e10cSrcweir error(FATAL, "Can't open output file %s", argv[optind + 1]); 191*cdf0e10cSrcweir 192*cdf0e10cSrcweir dup2(fdo, 1); 193*cdf0e10cSrcweir } 194*cdf0e10cSrcweir includelist[NINCLUDE - 1].always = 0; 195*cdf0e10cSrcweir includelist[NINCLUDE - 1].file = dp; 196*cdf0e10cSrcweir setsource(fp, -1, fd, NULL, 0); 197*cdf0e10cSrcweir } 198*cdf0e10cSrcweir 199*cdf0e10cSrcweir 200*cdf0e10cSrcweir /* memmove is defined here because some vendors don't provide it at 201*cdf0e10cSrcweir all and others do a terrible job (like calling malloc) */ 202*cdf0e10cSrcweir 203*cdf0e10cSrcweir #if !defined(__IBMC__) && !defined(_WIN32) && !defined(__GLIBC__) 204*cdf0e10cSrcweir 205*cdf0e10cSrcweir void * 206*cdf0e10cSrcweir memmove(void *dp, const void *sp, size_t n) 207*cdf0e10cSrcweir { 208*cdf0e10cSrcweir unsigned char *cdp, *csp; 209*cdf0e10cSrcweir 210*cdf0e10cSrcweir if (n <= 0) 211*cdf0e10cSrcweir return 0; 212*cdf0e10cSrcweir cdp = dp; 213*cdf0e10cSrcweir csp = (unsigned char *) sp; 214*cdf0e10cSrcweir if (cdp < csp) 215*cdf0e10cSrcweir { 216*cdf0e10cSrcweir do 217*cdf0e10cSrcweir { 218*cdf0e10cSrcweir *cdp++ = *csp++; 219*cdf0e10cSrcweir } while (--n); 220*cdf0e10cSrcweir } 221*cdf0e10cSrcweir else 222*cdf0e10cSrcweir { 223*cdf0e10cSrcweir cdp += n; 224*cdf0e10cSrcweir csp += n; 225*cdf0e10cSrcweir do 226*cdf0e10cSrcweir { 227*cdf0e10cSrcweir *--cdp = *--csp; 228*cdf0e10cSrcweir } while (--n); 229*cdf0e10cSrcweir } 230*cdf0e10cSrcweir return 0; 231*cdf0e10cSrcweir } 232*cdf0e10cSrcweir 233*cdf0e10cSrcweir #endif 234*cdf0e10cSrcweir 235