static void process(const char *name) { char *cp; int c; int incomm = 0; int ret; printf("extern char\txstr[];\n"); for (;;) { if (fgets(linebuf, sizeof linebuf, stdin) == NULL) { if (ferror(stdin)) err(3, "%s", name); break; } if (linebuf[0] == '#') { if (linebuf[1] == ' ' && isdigit(linebuf[2])) printf("#line%s", &linebuf[1]); else printf("%s", linebuf); continue; } for (cp = linebuf; (c = *cp++);) switch (c) { case '"': if (incomm) goto def; if ((ret = (int) yankstr(&cp)) == -1) goto out; printf("(&xstr[%d])", ret); break; case '\'': if (incomm) goto def; putchar(c); if (*cp) putchar(*cp++); break; case '/': if (incomm || *cp != '*') goto def; incomm = 1; cp++; printf("/*"); continue; case '*': if (incomm && *cp == '/') { incomm = 0; cp++; printf("*/"); continue; } goto def; def: default: putchar(c); break; } } out: if (ferror(stdout)) warn("x.c"), onintr(0); }
static void process(const char *name) { char *cp; int c; int incomm = 0; int inasm = 0; int asmparnest = 0; int ret; printf("extern char\t%s[];\n", array); for (;;) { if (fgets(linebuf, sizeof linebuf, stdin) == NULL) { if (ferror(stdin)) err(1, "Error reading `%s'", name); break; } if (linebuf[0] == '#') { printf("%s", linebuf); continue; } for (cp = linebuf; (c = *cp++);) switch (c) { case '"': if (incomm || inasm) goto def; if ((ret = (int) yankstr(&cp)) == -1) goto out; printf("(&%s[%d])", array, ret); break; case '\'': if (incomm || inasm) goto def; putchar(c); if (*cp) putchar(*cp++); break; case '/': if (incomm || *cp != '*') goto def; incomm = 1; cp++; printf("/*"); continue; case '*': if (incomm && *cp == '/') { incomm = 0; cp++; printf("*/"); continue; } goto def; case '(': if (!incomm && inasm) asmparnest++; goto def; case ')': if (!incomm && inasm && !--asmparnest) inasm = 0; goto def; case '_': if (incomm || inasm) goto def; if (!strncmp(cp, "_asm", 4)) { cp += 4; printf("__asm"); if (!strncmp(cp, "__", 2)) { cp += 2; printf("__"); } if (isalnum((unsigned char)*cp) || *cp == '_') goto def; asmparnest = 0; inasm = 1; } else goto def; break; def: default: putchar(c); break; } } out: if (ferror(stdout)) { warn("Error reading `%s'", "x.c"); onintr(1); } }