xref: /AOO41X/main/soltools/cpp/_unix.c (revision 7ce203730a656307c389f82ee60505af35570552)
1*7ce20373SAndrew Rist /**************************************************************
2*7ce20373SAndrew Rist  *
3*7ce20373SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*7ce20373SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*7ce20373SAndrew Rist  * distributed with this work for additional information
6*7ce20373SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*7ce20373SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*7ce20373SAndrew Rist  * "License"); you may not use this file except in compliance
9*7ce20373SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*7ce20373SAndrew Rist  *
11*7ce20373SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*7ce20373SAndrew Rist  *
13*7ce20373SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*7ce20373SAndrew Rist  * software distributed under the License is distributed on an
15*7ce20373SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*7ce20373SAndrew Rist  * KIND, either express or implied.  See the License for the
17*7ce20373SAndrew Rist  * specific language governing permissions and limitations
18*7ce20373SAndrew Rist  * under the License.
19*7ce20373SAndrew Rist  *
20*7ce20373SAndrew Rist  *************************************************************/
21*7ce20373SAndrew 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 
224cdf0e10cSrcweir #if !defined(__IBMC__) && !defined(_WIN32) && !defined(__GLIBC__)
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