/* csurf.c by TOYODA Eizi, 2014 - licensed LGPLv3 */ #include #include #include #include "cdetac.h" long tac_atoi(const char *ary, size_t width) { long r = 0; size_t ofs; for (ofs = 0; ofs < width; ofs++) { if ((ary[ofs] >= '0') && (ary[ofs] <= '9')) { r *= 10; r += (ary[ofs] - '0'); } else { return LONG_MIN; } } return r; } unsigned long strhash(const char *name) { unsigned long r = 0x12345678; int i; for (i = 0; name[i]; i++) { r += ((unsigned char *)name)[i] * i; } return r; } int ms_findname(struct message_t *ms, const char *name, int setp) { int i, is; is = (strhash(name) % ms->ms_ndes); for (i = is; i < ms->ms_ndes; i++) { if (setp && ms->ms_des[i].de_name[0] == '\0') { StringCopy(ms->ms_des[i].de_name, name, 7); return i; } else if (strncmp(ms->ms_des[i].de_name, name, 7)) { return i; } } for (i = 0; i < is; i++) { if (setp && ms->ms_des[i].de_name[0] == '\0') { StringCopy(ms->ms_des[i].de_name, name, 7); return i; } else if (strncmp(ms->ms_des[i].de_name, name, 7)) { return i; } } return -1; } int ms_set(struct message_t *ms, const char *name, const char *lev, long val) { int i; i = ms_findname(ms, name, 1); if (i == -1) { return -1; } StringCopy(ms->ms_des[i].de_lev, lev, 7); ms->ms_des[i].de_val = val; return 0; } int ms_surf(struct message_t *ms, enum TokenType tt, const char *token, enum TokenType tt2, const char *token2) { /* state by position */ switch (ms->ms_state) { case MSS_YYGGi: ms_set(ms, "2Y", NULL, tac_atoi(token, 2)); ms_set(ms, "2G", NULL, tac_atoi(token + 2, 2)); ms_set(ms, "iw", NULL, tac_atoi(token + 4, 1)); if (StringEq(ms->ms_mimj, "AAXX")) { ms->ms_state = MSS_IIiii; } else { ms->ms_state = MSS_99LLL; } break; case MSS_IIiii: StringCopy(ms->ms_id, token, 8); ms->ms_state = MSS_iihVV; break; case MSS_iihVV: ms_set(ms, "iR", NULL, tac_atoi(token, 1)); ms_set(ms, "ix", NULL, tac_atoi(token+1, 1)); ms_set(ms, "h", NULL, tac_atoi(token+2, 1)); ms_set(ms, "2V", NULL, tac_atoi(token+3, 2)); ms->ms_state = MSS_Nddff; break; default: break; } }