mirror of
https://github.com/mirror/tinycc.git
synced 2025-01-09 04:50:07 +08:00
113 lines
2.7 KiB
C
113 lines
2.7 KiB
C
|
#include <stdio.h>
|
||
|
#include <string.h>
|
||
|
|
||
|
int isid(int c)
|
||
|
{
|
||
|
return (c >= 'a' && c <= 'z')
|
||
|
|| (c >= 'A' && c <= 'Z')
|
||
|
|| (c >= '0' && c <= '9')
|
||
|
|| c == '_';
|
||
|
}
|
||
|
|
||
|
int isspc(int c)
|
||
|
{
|
||
|
return c == ' ' || c == '\t';
|
||
|
}
|
||
|
|
||
|
int main(int argc, char **argv)
|
||
|
{
|
||
|
char l[1000], *p, l2[1000], *q;
|
||
|
FILE *fp, *op;
|
||
|
int c, e, f;
|
||
|
|
||
|
if (argc < 3)
|
||
|
return 1;
|
||
|
|
||
|
fp = fopen(argv[1], "rb");
|
||
|
op = fopen(argv[2], "wb");
|
||
|
if (!fp || !op) {
|
||
|
fprintf(stderr, "c2str: file error\n");
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
for (;;) {
|
||
|
p = l;
|
||
|
append:
|
||
|
if (fgets(p, sizeof l - (p - l), fp)) {
|
||
|
p = strchr(p, 0);
|
||
|
while (p > l && p[-1] == '\n')
|
||
|
--p;
|
||
|
*p = 0;
|
||
|
} else if (p == l)
|
||
|
break;
|
||
|
if (p > l && p[-1] == '\\') {
|
||
|
--p;
|
||
|
goto append;
|
||
|
}
|
||
|
|
||
|
if (l[0] == 0)
|
||
|
continue;
|
||
|
p = l, q = l2, f = e = 0;
|
||
|
while (*p && isspc(*p))
|
||
|
++p, ++f;
|
||
|
|
||
|
if (f < 4) {
|
||
|
do {
|
||
|
static const char *sr[] = {
|
||
|
"__x86_64__", "TCC_TARGET_X86_64",
|
||
|
"_WIN64", "TCC_TARGET_PE",
|
||
|
"_WIN32", "TCC_TARGET_PE",
|
||
|
"__arm__", "TCC_TARGET_ARM",
|
||
|
"__aarch64__", "TCC_TARGET_ARM64",
|
||
|
"__riscv", "TCC_TARGET_RISCV64",
|
||
|
"__i386__", "TCC_TARGET_I386", 0 };
|
||
|
for (f = 0; sr[f]; f += 2) {
|
||
|
c = strlen(sr[f]);
|
||
|
if (0 == memcmp(p, sr[f], c)) {
|
||
|
p += c, ++f;
|
||
|
q = strchr(strcpy(q, sr[f]), 0);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
if (sr[f])
|
||
|
continue;
|
||
|
} while (!!(*q++ = *p++));
|
||
|
|
||
|
fprintf(op, "%s\n", l2);
|
||
|
|
||
|
} else if (*p == '/') {
|
||
|
strcpy(q, p);
|
||
|
fprintf(op, " %s\n", l2);
|
||
|
|
||
|
} else {
|
||
|
f = 0;
|
||
|
for (;;) {
|
||
|
c = *p++;
|
||
|
if (isspc(c)) {
|
||
|
if (q == l2 || isspc(q[-1]))
|
||
|
continue;
|
||
|
if ((f > 2 || e) || (q[-1] != ')' && *p != '(')) {
|
||
|
if (!isid(q[-1]) || !isid(*p))
|
||
|
continue;
|
||
|
}
|
||
|
}
|
||
|
if (c == '(')
|
||
|
++e, ++f;
|
||
|
if (c == ')')
|
||
|
--e, ++f;
|
||
|
if (c == '\\' || c == '\"')
|
||
|
*q++ = '\\';
|
||
|
*q++ = c;
|
||
|
if (c == 0)
|
||
|
break;
|
||
|
}
|
||
|
fprintf(op, " \"%s\\n\"\n", l2);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
fclose(fp);
|
||
|
fclose(op);
|
||
|
return 0;
|
||
|
}
|