#include #include #include #include char var_eof[2] = {-1, 0}; char var_eol[2] = {10, 0}; char var_quote[2] = {34, 0}; char var_false[1] = {0}; char var_true[2] = {'1', 0}; char * eq(char * a, char * b) { return (strcmp(a, b) == 0) ? var_true : var_false; } char * lt(char * a, char * b) { return (strcmp(a, b) < 0) ? var_true : var_false; } char * not(char * a) { return (strcmp(a, var_true) != 0) ? var_true : var_false; } char * addstringchar(char * str, char * chr) { int str_len = strlen(str); assert(strlen(chr) == 1); char * res = malloc((str_len + 2) * sizeof(char)); strcpy(res, str); res[str_len + 0] = chr[0]; res[str_len + 1] = 0; return res; } char * emit(char * str) { fputs(str, stdout); return 0; } char * trace(char * var_name, char * var_value) { const char * env_trace = getenv("TRACE"); if( !env_trace ) return 0; fputs(var_name, stderr); fputs("=", stderr); fputs(var_value, stderr); fputs(var_eol, stderr); return 0; } int LINE = 1; char * peek() { char * res = malloc(2*sizeof(char)); res[0] = getc(stdin); res[1] = 0; ungetc(res[0], stdin); return res; } void skip() { char c = getc(stdin); if( c == 10 ) LINE += 1; } void skipchar(char * chr) { assert(strlen(chr) == 1); char * act = peek(); assert(strlen(act) == 1); if( chr[0] == act[0] ) {skip(); return;}; fprintf(stderr, "Expected '%c' on line %d but saw '%c' instead\n", chr[0], LINE, act[0]); exit(1); } char * fileget(char * var_path) { FILE * file_ptr; int file_size; char * res; file_ptr = fopen(var_path, "r"); if( NULL == file_ptr ) { fprintf(stderr, "Could not load file %s", var_path); exit(1); } fseek(file_ptr, 0, SEEK_END); file_size = ftell(file_ptr); fseek(file_ptr, 0, SEEK_SET); res = malloc(file_size * sizeof(char)); fread(res, sizeof(char), file_size, file_ptr); fclose(file_ptr); return res; }