All pastes #1289817 Raw Edit

Untitled

public text v1 · immutable
#1289817 ·published 2008-12-19 22:29 UTC
rendered paste body
#include <stdbool.h>
#include <stdio.h>

enum {
	State_Plain,
	State_OneSlash,
	State_Escaped,
	State_CXX_Comment,
	State_C_Comment,
	State_One_Star,
	State_Quoted,
	State_Quoted_Escaped,
	State_SingleQuoted,
	State_SingleQuoted_Escaped,
};

#define trans(x) do { \
	printf("Changing to %s\n", #x); \
	state = x; \
} while (false);

int main(void)
{
	unsigned int state = State_Plain;
	char c;

	while ((c = getchar()) != EOF) {
		switch (state) {
			case State_Plain:
				switch (c) {
					case '/':
						trans(State_OneSlash);
						break;
					case '\\':
						trans(State_Escaped);
						break;
					case '\"':
						trans(State_Quoted);
						break;
					case '\'':
						trans(State_SingleQuoted);
						break;
				}
				break;
			case State_OneSlash:
				switch (c) {
					case '/':
						trans(State_CXX_Comment);
						break;
					case '*':
						trans(State_C_Comment);
						break;
					default:
						trans(State_Plain);
						break;
				}
				break;
			case State_Escaped:
				trans(State_Plain);
				break;
			case State_CXX_Comment:
				switch (c) {
					case '\n':
						trans(State_Plain);
						break;
				}
				break;
			case State_C_Comment:
				switch (c) {
					case '*':
						trans(State_One_Star);
						break;
				}
				break;
			case State_One_Star:
				switch (c) {
					case '/':
						trans(State_Plain);
						break;
					default:
						trans(State_C_Comment);
						break;
				}
				break;
			case State_Quoted:
				switch (c) {
					case '\\':
						trans(State_Quoted_Escaped);
						break;
					case '\"':
						trans(State_Plain);
						break;
				}
				break;
			case State_Quoted_Escaped:
				trans(State_Plain);
				break;
			case State_SingleQuoted:
				switch (c) {
					case '\\':
						trans(State_SingleQuoted_Escaped);
						break;
					case '\'':
						trans(State_Plain);
						break;
				}
				break;
			case State_SingleQuoted_Escaped:
				state = State_SingleQuoted;
				break;
		}
	}
	return 0;
}