1 #include <stdio.h>
2 #include <stddef.h>
3 #include <stdlib.h>
4 #include <string.h>
5 #include <sys/stat.h>
6 #include "cpp.h"
7 
8 extern	int lcc_getopt(int, char *const *, const char *);
9 extern	char	*optarg, rcsid[];
10 extern	int	optind;
11 int	verbose;
12 int	Mflag;	/* only print active include files */
13 char	*objname; /* "src.$O: " */
14 int	Cplusplus = 1;
15 
16 void
setup(int argc,char ** argv)17 setup(int argc, char **argv)
18 {
19 	int c, fd, i;
20 	char *fp, *dp;
21 	Tokenrow tr;
22 	extern void setup_kwtab(void);
23 	uchar *includeDirs[ NINCLUDE ] = { 0 };
24 	int   numIncludeDirs = 0;
25 
26 	setup_kwtab();
27 	while ((c = lcc_getopt(argc, argv, "MNOVv+I:D:U:F:lg")) != -1)
28 		switch (c) {
29 		case 'N':
30 			for (i=0; i<NINCLUDE; i++)
31 				if (includelist[i].always==1)
32 					includelist[i].deleted = 1;
33 			break;
34 		case 'I':
35 			includeDirs[ numIncludeDirs++ ] = newstring( (uchar *)optarg, strlen( optarg ), 0 );
36 			break;
37 		case 'D':
38 		case 'U':
39 			setsource("<cmdarg>", -1, optarg);
40 			maketokenrow(3, &tr);
41 			gettokens(&tr, 1);
42 			doadefine(&tr, c);
43 			unsetsource();
44 			break;
45 		case 'M':
46 			Mflag++;
47 			break;
48 		case 'v':
49 			fprintf(stderr, "%s %s\n", argv[0], rcsid);
50 			break;
51 		case 'V':
52 			verbose++;
53 			break;
54 		case '+':
55 			Cplusplus++;
56 			break;
57 		default:
58 			break;
59 		}
60 	dp = ".";
61 	fp = "<stdin>";
62 	fd = 0;
63 	if (optind<argc) {
64 		dp = basepath( argv[optind] );
65 		fp = (char*)newstring((uchar*)argv[optind], strlen(argv[optind]), 0);
66 		if ((fd = open(fp, 0)) <= 0)
67 			error(FATAL, "Can't open input file %s", fp);
68 	}
69 	if (optind+1<argc) {
70 		int fdo;
71 #ifdef WIN32
72 		fdo = creat(argv[optind+1], _S_IREAD | _S_IWRITE);
73 #else
74 		fdo = creat(argv[optind+1], 0666);
75 #endif
76 		if (fdo<0)
77 			error(FATAL, "Can't open output file %s", argv[optind+1]);
78 		dup2(fdo, 1);
79 	}
80 	if(Mflag)
81 		setobjname(fp);
82 	includelist[NINCLUDE-1].always = 0;
83 	includelist[NINCLUDE-1].file = dp;
84 
85 	for( i = 0; i < numIncludeDirs; i++ )
86 		appendDirToIncludeList( (char *)includeDirs[ i ] );
87 
88 	setsource(fp, fd, NULL);
89 }
90 
91 
basepath(char * fname)92 char *basepath( char *fname )
93 {
94 	char *dp = ".";
95 	char *p;
96 	if ((p = strrchr(fname, '/')) != NULL) {
97 		int dlen = p - fname;
98 		dp = (char*)newstring((uchar*)fname, dlen+1, 0);
99 		dp[dlen] = '\0';
100 	}
101 
102 	return dp;
103 }
104 
105 /* memmove is defined here because some vendors don't provide it at
106    all and others do a terrible job (like calling malloc) */
107 // -- ouch, that hurts -- ln
108 /* always use the system memmove() on Mac OS X. --ryan. */
109 #if !defined(__APPLE__) && !defined(_MSC_VER)
110 #ifdef memmove
111 #undef memmove
112 #endif
113 void *
memmove(void * dp,const void * sp,size_t n)114 memmove(void *dp, const void *sp, size_t n)
115 {
116 	unsigned char *cdp, *csp;
117 
118 	if (n<=0)
119 		return dp;
120 	cdp = dp;
121 	csp = (unsigned char *)sp;
122 	if (cdp < csp) {
123 		do {
124 			*cdp++ = *csp++;
125 		} while (--n);
126 	} else {
127 		cdp += n;
128 		csp += n;
129 		do {
130 			*--cdp = *--csp;
131 		} while (--n);
132 	}
133 	return dp;
134 }
135 #endif
136