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