/* cdetac.c by TOYODA Eizi - LGPLv3 */ #include #include #include #include #include "cdetac.h" struct message_t * ms_new(const char *ahl, const char *mimj, size_t nelems) { struct message_t *ms; size_t i; ms = calloc(sizeof(struct message_t), 1); if (ms == NULL) { goto err1; } StringCopy(ms->ms_ahl, ahl, 22); StringCopy(ms->ms_mimj, mimj, 6); ms->ms_ndes = nelems; ms->ms_des = calloc(sizeof(struct dataelem_t), ms->ms_ndes); if (ms->ms_des == NULL) { goto err2; } if (StringEq(ms->ms_mimj, "AAXX")) { ms->ms_handler = ms_surf; ms->ms_state = MSS_YYGGi; } else { ms->ms_handler = ms_default; } return ms; err2: free(ms); err1: return NULL; } void ms_print(struct message_t *ms, FILE *fp) { size_t i; fprintf(fp, "AHL: %s\n", ms->ms_ahl); fprintf(fp, "MiMj: %s\n", ms->ms_mimj); fprintf(fp, "ID: %s\n", ms->ms_id); for (i = 0; i < ms->ms_ndes; i++) { if (ms->ms_des[i].de_name[0] == 0) { continue; } if (ms->ms_des[i].de_val == LONG_MIN) { fprintf(fp, "%s%s: /\n", ms->ms_des[i].de_name, ms->ms_des[i].de_lev); } else { fprintf(fp, "%s%s: %ld\n", ms->ms_des[i].de_name, ms->ms_des[i].de_lev, ms->ms_des[i].de_val); } } fprintf(fp, "\n"); } void ms_del(struct message_t *ms) { free(ms->ms_des); free(ms); } struct message_t * ms_flush(struct message_t *ms) { if (ms == NULL) { return NULL; } ms_print(ms, stdout); ms_del(ms); return NULL; } int dispatch( enum TokenType tt, const char *token, enum TokenType tt2, const char *token2) { static struct message_t *ms = NULL; /* strlen("TTAAii CCCC YYGGgg") = 18 */ /* strlen("TTAAii CCCC YYGGgg BBB") = 22 */ static char yyahl[22 + 1] = ""; /* "CLIMAT" is the longest */ static char yymimj[6 + 1] = ""; switch (tt) { case TTAHL: StringCopy(yyahl, token, 22); break; case TTEQ: ms = ms_flush(ms); if (strncmp(yymimj, "TT", 2) == 0) { yymimj[0] = '\0'; } break; case TTEOT: ms = ms_flush(ms); yymimj[0] = yyahl[0] = '\0'; break; case TTMIMJ: StringCopy(yymimj, token, 6); if (*yyahl) { ms = ms_new(yyahl, yymimj, 5000); if (ms == NULL) { perror(yyahl); return 1; } } break; default: if (ms) { ms->ms_handler(ms, tt, token, tt2, token2); } break; } } int ms_default(struct message_t *ms, enum TokenType tt, const char *token, enum TokenType tt2, const char *token2) { if (ms->ms_cdes >= ms->ms_ndes) { return; } ms->ms_des[ms->ms_cdes].de_name[0] = '!'; StringCopy(ms->ms_des[ms->ms_cdes].de_name + 1, token, 6); ms->ms_cdes++; } static char **yyargv; int yywrap(void) { for (;;) { if (*yyargv == NULL) { return 1; } yyin = fopen(*yyargv, "r"); yyargv++; if (yyin) { break; } perror(yyargv[-1]); } return 0; } int main(int argc, char **argv) { enum TokenType tt, tt2; char prevtoken[15 + 1]; int argi = 1; while (argv[argi] && (argv[argi][0] == '-')) { argi++; } yyargv = argv + argi; if (*yyargv) { if (yywrap()) { return 1; } } tt = TTERR; while (tt2 = yylex()) { if (tt != TTERR) { dispatch(tt, prevtoken, tt2, yytext); } tt = tt2; StringCopy(prevtoken, yytext, 15); } dispatch(tt, prevtoken, TTERR, ""); return 0; }