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