bored...
[tinycc.git] / conftest.c
blobe8e1220a2fbfbcd352a1e9635d1c529fa592107f
1 /* ----------------------------------------------------------------------- */
2 #if C2STR
4 /* with -D C2STR: convert tccdefs.h to C-strings */
6 #include <stdio.h>
7 #include <string.h>
9 /* replace native host macros by compile-time versions */
10 const char *platform_macros[] = {
11 "__i386__", "TCC_TARGET_I386",
12 "__x86_64__", "TCC_TARGET_X86_64",
13 "_WIN32", "TCC_TARGET_PE",
14 "__arm__", "TCC_TARGET_ARM",
15 "__ARM_EABI__", "TCC_ARM_EABI",
16 "__aarch64__", "TCC_TARGET_ARM64",
17 "__riscv", "TCC_TARGET_RISCV64",
18 "__APPLE__", "TCC_TARGET_MACHO",
19 "__FreeBSD__", "TARGETOS_FreeBSD",
20 "__FreeBSD_kernel__", "TARGETOS_FreeBSD_kernel",
21 "__OpenBSD__", "TARGETOS_OpenBSD",
22 "__NetBSD__", "TARGETOS_NetBSD",
23 "__linux__", "TARGETOS_Linux",
24 "__SIZEOF_POINTER__", "PTR_SIZE",
25 "__SIZEOF_LONG__", "LONG_SIZE",
29 int isid(int c)
31 return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')
32 || (c >= '0' && c <= '9') || c == '_';
35 int isspc(int c)
37 return (unsigned char)c <= ' ' && c != 0;
40 int main(int argc, char **argv)
42 char l[1000], l2[1000], *p, *q, *p0;
43 FILE *fp, *op;
44 int c, e, f, s, cmt, cmt_n;
45 const char *r;
47 if (argc < 3)
48 return 1;
50 fp = fopen(argv[1], "rb");
51 op = fopen(argv[2], "wb");
52 if (!fp || !op) {
53 fprintf(stderr, "c2str: file error\n");
54 return 1;
57 cmt = cmt_n = 0;
58 for (;;) {
59 p = l;
60 append:
61 if (fgets(p, sizeof l - (p - l), fp)) {
62 p = strchr(p, 0);
63 while (p > l && isspc(p[-1]))
64 --p;
65 *p = 0;
66 } else if (p == l)
67 break;
69 /* check for continuation */
70 if (p > l && p[-1] == '\\') {
71 p[-1] = ' ';
72 goto append;
75 /* count & skip leading spaces */
76 p = l, q = l2, f = 0;
77 while (*p && isspc(*p))
78 ++p, ++f;
80 /* handle comments */
81 if (p[0] == '/' && cmt == 0) {
82 if (p[1] == '*')
83 cmt = 2;
84 if (p[1] == '/')
85 cmt = 1;
87 if (cmt) {
88 fprintf(op, "%s", l);
89 if (++cmt_n == 1)
90 fprintf(op, " (converted, do not edit this file)");
91 fprintf(op, "\n");
92 if (cmt == 1)
93 cmt = 0;
94 if (cmt == 2) {
95 p = strchr(l, 0);
96 if (p >= l + 2 && p[-1] == '/' && p[-2] == '*')
97 cmt = 0;
99 continue;
102 if (f < 4) {
103 do {
104 /* replace machine/os macros by compile-time counterparts */
105 for (e = f = 0; (r = platform_macros[f]); f += 2) {
106 c = strlen(r);
107 /* remove 'defined' */
108 //e = memcmp(p, "defined ", 8) ? 0 : 8;
109 if (0 == memcmp(p + e, r, c)) {
110 p += e + c;
111 q = strchr(strcpy(q, platform_macros[f + 1]), 0);
112 break;
116 if (r)
117 continue;
118 } while (!!(*q++ = *p++));
119 /* output as is */
120 fprintf(op, "%s\n", l2);
121 continue;
123 } else {
124 s = e = f = 0, p0 = p;
125 for (;;) {
126 c = *p++;
128 if (isspc(c)) {
129 s = 1;
130 continue;
132 if (c == '/' && (p[0] == '/' || p[0] == '*'))
133 c = 0; /* trailing comment detected */
134 else if (s && q > l2
135 && ((isid(q[-1]) && isid(c))
136 // keep space after macro name
137 || (q >= l2 + 2
138 && l2[0] == '#'
139 && l2[1] == 'd'
140 && f < 2 && !e
142 *q++ = ' ', ++f;
143 s = 0;
145 if (c == '(')
146 ++e;
147 if (c == ')')
148 --e;
149 if (c == '\\' || c == '\"')
150 *q++ = '\\';
151 *q++ = c;
152 if (c == 0)
153 break;
154 p0 = p;
156 /* output with quotes */
157 fprintf(op, " \"%s\\n\"%s\n", l2, p0);
161 fclose(fp);
162 fclose(op);
163 return 0;
166 /* ----------------------------------------------------------------------- */
167 #elif 1
169 /* get some information from the host compiler for configure */
171 #include <stdio.h>
173 #if defined(_WIN32)
174 #include <fcntl.h>
175 #endif
177 /* Define architecture */
178 #if defined(__i386__) || defined _M_IX86
179 # define TRIPLET_ARCH "i386"
180 #elif defined(__x86_64__) || defined _M_AMD64
181 # define TRIPLET_ARCH "x86_64"
182 #elif defined(__arm__)
183 # define TRIPLET_ARCH "arm"
184 #elif defined(__aarch64__)
185 # define TRIPLET_ARCH "aarch64"
186 #elif defined(__riscv) && defined(__LP64__)
187 # define TRIPLET_ARCH "riscv64"
188 #else
189 # define TRIPLET_ARCH "unknown"
190 #endif
192 /* Define OS */
193 #if defined (__linux__)
194 # define TRIPLET_OS "linux"
195 #elif defined (__FreeBSD__) || defined (__FreeBSD_kernel__)
196 # define TRIPLET_OS "kfreebsd"
197 #elif defined(__NetBSD__)
198 # define TRIPLET_OS "netbsd"
199 #elif defined(__OpenBSD__)
200 # define TRIPLET_OS "openbsd"
201 #elif defined(_WIN32)
202 # define TRIPLET_OS "win32"
203 #elif defined(__APPLE__)
204 # define TRIPLET_OS "darwin"
205 #elif !defined (__GNU__)
206 # define TRIPLET_OS "unknown"
207 #endif
209 /* Define calling convention and ABI */
210 #if defined (__ARM_EABI__)
211 # if defined (__ARM_PCS_VFP)
212 # define TRIPLET_ABI "gnueabihf"
213 # else
214 # define TRIPLET_ABI "gnueabi"
215 # endif
216 #else
217 # define TRIPLET_ABI "gnu"
218 #endif
220 #if defined _WIN32
221 # define TRIPLET TRIPLET_ARCH "-" TRIPLET_OS
222 #elif defined __GNU__
223 # define TRIPLET TRIPLET_ARCH "-" TRIPLET_ABI
224 #else
225 # define TRIPLET TRIPLET_ARCH "-" TRIPLET_OS "-" TRIPLET_ABI
226 #endif
228 #if defined(_WIN32)
229 int _CRT_glob = 0;
230 #endif
232 int main(int argc, char *argv[])
234 #if defined(_WIN32)
235 _setmode(_fileno(stdout), _O_BINARY); /* don't translate \n to \r\n */
236 #endif
237 switch(argc == 2 ? argv[1][0] : 0) {
238 case 'b'://igendian
240 volatile unsigned foo = 0x01234567;
241 puts(*(unsigned char*)&foo == 0x67 ? "no" : "yes");
242 break;
244 #if defined(__clang__)
245 case 'm'://inor
246 printf("%d\n", __clang_minor__);
247 break;
248 case 'v'://ersion
249 printf("%d\n", __clang_major__);
250 break;
251 #elif defined(__TINYC__)
252 case 'v'://ersion
253 puts("0");
254 break;
255 case 'm'://inor
256 printf("%d\n", __TINYC__);
257 break;
258 #elif defined(_MSC_VER)
259 case 'v'://ersion
260 puts("0");
261 break;
262 case 'm'://inor
263 printf("%d\n", _MSC_VER);
264 break;
265 #elif defined(__GNUC__) && defined(__GNUC_MINOR__)
266 /* GNU comes last as other compilers may add 'GNU' compatibility */
267 case 'm'://inor
268 printf("%d\n", __GNUC_MINOR__);
269 break;
270 case 'v'://ersion
271 printf("%d\n", __GNUC__);
272 break;
273 #else
274 case 'm'://inor
275 case 'v'://ersion
276 puts("0");
277 break;
278 #endif
279 case 't'://riplet
280 puts(TRIPLET);
281 break;
282 case 'c'://ompiler
283 #if defined(__clang__)
284 puts("clang");
285 #elif defined(__TINYC__)
286 puts("tcc");
287 #elif defined(_MSC_VER)
288 puts("msvc");
289 #elif defined(__GNUC__)
290 puts("gcc");
291 #else
292 puts("unknown");
293 #endif
294 break;
295 default:
296 break;
298 return 0;
301 /* ----------------------------------------------------------------------- */
302 #endif