int main(int argc, const char *argv[]) { #ifdef DB fp = fopen("input.txt", "r"); #endif int i; int ch; while ((ch = getchar()) != EOF) { /* expr end with var not operator, * add '+' to make them pairs */ expr[0] = '+'; expr[1] = (char)ch; /* start from idx 2 */ for (i = 2; (ch = getchar()) != '\n'; i++) { expr[i] = (char)ch; } expr[i] = '\0'; p = expr + 1; /* skip to the adding '+' */ printf("Expression: %s\n", p); alpha_init(); inc_dec_2_spc(); p = expr; total = 0; expression(); printf(" value = %d\n", total); for (i = 0; i < 26; i++) { if (alpha[i].used) { printf(" %c = %d\n", i + 0x61, alpha[i].val + alpha[i].inc_dec); } } } return 0; }
int get_alpha_size(int alpha) { if (alpha_tables == NULL) if (!alpha_init(-1)) return -1; if (alpha < 1 || alpha >= table_size) { fprintf(stderr, "Error: The program is using an invalid alphabet.\n"); return -1; } if (alpha_tables[alpha].init_flag == UNINITIALIZED) if (!alpha_init(alpha)) return -1; if (alpha_tables[alpha].init_flag == UNUSED) { fprintf(stderr, "Error: The program is using an invalid alphabet.\n"); return -1; } return alpha_tables[alpha].alpha_size; }
char rawmapchar(int alpha, char ch) { if (alpha_tables == NULL) if (!alpha_init(-1)) return -1; if (alpha < 1 || alpha >= table_size) { fprintf(stderr, "Error: The program is using an invalid alphabet.\n"); return -1; } if (alpha_tables[alpha].init_flag == UNINITIALIZED) if (!alpha_init(alpha)) return -1; if (alpha_tables[alpha].init_flag == UNUSED) { fprintf(stderr, "Error: The program is using an invalid alphabet.\n"); return -1; } return alpha_tables[alpha].rawmap[(int) ch]; }
int add_alphabet(char *characters) { int i, j, alpha; char *s; ALPHABET *tptr; if (alpha_tables == NULL) if (!alpha_init(-1)) return -1; for (alpha=1; alpha < table_size; alpha++) if (alpha_tables[alpha].init_flag == UNUSED) break; if (alpha == table_size) { table_size += table_size; if ((alpha_tables = realloc(alpha_tables, table_size * sizeof(ALPHABET))) == NULL) { fprintf(stderr, "Ran out of memory. Cannot create new alphabet.\n"); return -1; } for (i=alpha; i < table_size; i++) alpha_tables[i].init_flag = UNUSED; } tptr = &alpha_tables[alpha]; for (i=0; i < 128; i++) { tptr->rawmap[i] = 0; tptr->map[i] = -1; } for (s=characters; *s; s++) tptr->rawmap[(int) *s] = *s; for (i=0,j=0; i < 128; i++) if (tptr->rawmap[i] != '\0') tptr->map[i] = (char) j++; tptr->alpha_size = j; tptr->init_flag = INITIALIZED; return alpha; }