xref: /AOO41X/main/soltools/cpp/_unix.c (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
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