Exemplo n.º 1
0
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);
}
Exemplo n.º 2
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);
	}
}