/* cbuoy.c by TOYODA Eizi, 2014 - licensed GPLv3 */ #include #include #include #include "cdetac.h" int ms_buoy(struct message_t *ms, enum TokenType tt, const char *token, enum TokenType tt2, const char *token2) { ms_default(ms, tt, token, tt2, token2); switch (tt) { case TTEQ: if (ms->ms_state == MSS_EQ) { fprintf(stdout, "# duplicated TTEQ\n"); } else { long qc = ms_get(ms, "Qc", ""); long la, lo; if ((qc == 3) || (qc == 5)) { la = ms_get(ms, "5La", ""); if (la != LONG_MIN) { ms_set(ms, "5La", NULL, -la); } } if ((qc == 5) || (qc == 7)) { lo = ms_get(ms, "6Lo", ""); if (lo != LONG_MIN) { ms_set(ms, "6Lo", NULL, -lo); } } if (ms_get(ms, "iw", "") > 2) { long ff = ms_get(ms, "2f", ""); ms_set(ms, "2f", NULL, knot_to_mps(ff)); } else { long ff = ms_get(ms, "2f", ""); if (ff != LONG_MIN) { ff *= 10; } ms_set(ms, "2f", NULL, ff); } } ms->ms_state = MSS_EQ; goto endfunc; } /* preemptive token */ if (StringEq(token, "555")) { ms->ms_state = MSS_Buoy5; goto endfunc; } else if (StringEq(token, "444") || StringEq(token, "444//")) { ms->ms_state = MSS_Buoy4; goto endfunc; } /* state by position */ switch (ms->ms_state) { case MSS_DD: StringCopy(ms->ms_id, token, 8); ms->ms_state = MSS_YYMMJ; goto endfunc; break; case MSS_YYMMJ: ms_set(ms, "2Y", NULL, tac_atoi(token, 0, 2)); ms_set(ms, "2M", NULL, tac_atoi(token, 2, 2)); ms_set(ms, "J", NULL, tac_atoi(token, 4, 1)); ms->ms_state = MSS_GGggi; goto endfunc; break; case MSS_GGggi: ms_set(ms, "2G", NULL, tac_atoi(token, 0, 2)); ms_set(ms, "2g", NULL, tac_atoi(token, 2, 2)); ms_set(ms, "iw", NULL, tac_atoi(token, 4, 1)); ms->ms_state = MSS_QLLLLLa; goto endfunc; break; case MSS_QLLLLLa: ms_set(ms, "Qc", NULL, tac_atoi(token, 0, 1)); ms_set(ms, "5La", NULL, tac_atoi(token, 1, 5)); ms->ms_state = MSS_LLLLLL; goto endfunc; break; case MSS_LLLLLL: ms_set(ms, "6Lo", NULL, tac_atoi(token, 0, 6)); ms->ms_state = MSS_6QQQ; goto endfunc; break; case MSS_6QQQ: if (string_match(token, "6[0-9/][0-9/][0-9/]/")) { ms_set(ms, "Ql", NULL, tac_atoi(token, 1, 1)); ms_set(ms, "Qt", NULL, tac_atoi(token, 2, 1)); ms_set(ms, "Qa", NULL, tac_atoi(token, 3, 1)); goto endfunc; } else { ms->ms_state = MSS_Buoy1; } break; } /* section leader */ if (string_match(token, "111[0-9/][0-9/]")) { ms_set(ms, "Qd/1", NULL, tac_atoi(token, 3, 1)); ms_set(ms, "Qx/1", NULL, tac_atoi(token, 4, 1)); ms->ms_state = MSS_Buoy1; goto endfunc; } else if (string_match(token, "222[0-9/][0-9/]")) { ms_set(ms, "Qd/2", NULL, tac_atoi(token, 3, 1)); ms_set(ms, "Qx/2", NULL, tac_atoi(token, 4, 1)); ms->ms_state = MSS_Buoy2; goto endfunc; } else if (string_match(token, "333[0-9/][0-9/]")) { ms_set(ms, "Qd1", NULL, tac_atoi(token, 3, 1)); ms_set(ms, "Qd2", NULL, tac_atoi(token, 4, 1)); ms->ms_state = MSS_Buoy3; goto endfunc; } /* main state-dependent parser */ switch (ms->ms_state) { case MSS_Buoy1: if (token[0] == '0') { ms_set(ms, "2d", NULL, tac_atoi(token, 1, 2)); ms_set(ms, "2f", NULL, tac_atoi(token, 3, 2)); } else if (token[0] == '1') { ms_set(ms, "3T", NULL, tac_atosi(token, token[1], 2, 3)); } else if (string_match(token, "29%")) { ms_set(ms, "3U", NULL, tac_atoi(token, 2, 3)); } else if (token[0] == '2') { ms_set(ms, "3Td", NULL, tac_atosi(token, token[1], 2, 3)); } else if (token[0] == '3') { long v = tac_atoi(token, 1, 4); if ((v >= 0L) && (v < 800L)) { v += 10000L; } else if ((v >= 800L) && (v < 900L)) { v += 9000L; } ms_set(ms, "4P0", NULL, v); } else if (string_match(token, "4[09/]%")) { long v = tac_atoi(token, 1, 4); if ((v >= 0L) && (v < 800L)) { v += 10000L; } else if ((v >= 800L) && (v < 900L)) { v += 9000L; } ms_set(ms, "4P", NULL, v); } else if (token[0] == '5') { long ppp = tac_atoi(token, 2, 3); ms_set(ms, "a", NULL, tac_atoi(token, 1, 1)); if (string_match(token, "5[5-8]%") && (ppp != LONG_MIN)) { ppp = -ppp; } ms_set(ms, "3p", NULL, ppp); } else if (StringEq(token, "/////")) { /* ignore */; } else { fprintf(stdout, "# unrecognised (%s) in Buoy1\n", token); } break; /* case MSS_Buoy1 */ case MSS_Buoy2: if (string_match(token, "0[01/]%")) { ms_set(ms, "3Tw", NULL, tac_atosi(token, token[1], 2, 3)); } else if (token[0] == '1') { ms_set(ms, "2Pwa", NULL, tac_atoi(token, 1, 2)); ms_set(ms, "2Hwa", NULL, tac_atoi(token, 3, 2)); } else if (string_match(token, "20[0-9/][0-9/][0-9/]")) { ms_set(ms, "3Pwa", NULL, tac_atoi(token, 2, 3)); } else if (string_match(token, "21[0-9/][0-9/][0-9/]")) { ms_set(ms, "3Hwa", NULL, tac_atoi(token, 2, 3)); } else { fprintf(stdout, "# unrecognised (%s) in Buoy2\n", token); } break; case MSS_Buoy3: if (string_match(token, "8887[0-9/]")) { ms_set(ms, "k2", NULL, tac_atoi(token, 4, 1)); ms->ms_z[0] = '\0'; ms->ms_state = MSS_Buoy3TS; } else if (string_match(token, "66[0-9/]9[0-9/]")) { ms->ms_z[0] = '\0'; ms_set(ms, "k6", NULL, tac_atoi(token, 2, 1)); ms_set(ms, "k3", NULL, tac_atoi(token, 4, 1)); ms->ms_state = MSS_Buoy3dc1; } else { fprintf(stdout, "# unrecognised (%s) in Buoy3\n", token); } break; case MSS_Buoy3TS: if (token[0] == '2') { StringCopy(ms->ms_z, token, 5); ms->ms_z[0] = 'z'; } else if (token[0] == '3') { ms_set(ms, "T0", ms->ms_z, tac_atoi(token, 1, 4)); } else if (token[0] == '4') { ms_set(ms, "S0", ms->ms_z, tac_atoi(token, 1, 4)); } else { fprintf(stdout, "# unrecognised (%s) in Buoy3TS\n", token); } break; case MSS_Buoy3dc1: if (token[0] == '2') { StringCopy(ms->ms_z, token, 5); ms->ms_z[0] = 'z'; ms->ms_state = MSS_Buoy3dc2; } else { fprintf(stdout, "# unrecognised (%s) in Buoy3dc1\n", token); } break; case MSS_Buoy3dc2: ms_set(ms, "d0", ms->ms_z, tac_atoi(token, 0, 2)); ms_set(ms, "c0", ms->ms_z, tac_atoi(token, 2, 3)); ms->ms_state = MSS_Buoy3dc1; break; case MSS_Buoy4: if (token[0] == '1') { ms_set(ms, "QP", ms->ms_z, tac_atoi(token, 1, 1)); ms_set(ms, "Q2", ms->ms_z, tac_atoi(token, 2, 1)); ms_set(ms, "QTW", ms->ms_z, tac_atoi(token, 3, 1)); ms_set(ms, "Q4", ms->ms_z, tac_atoi(token, 4, 1)); } else if (token[0] == '2') { long ql; ms_set(ms, "QN", ms->ms_z, tac_atoi(token, 1, 1)); ms_set(ms, "QL", ms->ms_z, ql = tac_atoi(token, 2, 1)); ms_set(ms, "QA", ms->ms_z, tac_atoi(token, 3, 1)); ms_set(ms, "QZ", ms->ms_z, tac_atoi(token, 4, 1)); if (ql == 1) { ms->ms_state = MSS_Buoy4_YYMMJ; } else if (ql == 2) { ms->ms_state = MSS_Buoy4_Qc5La; } else { fprintf(stdout, "# unrecognised QL(%s) in Buoy4\n", token); } } else if (token[0] == '3') { ms_set(ms, "4Zh", ms->ms_z, tac_atoi(token, 1, 4)); } else if (token[0] == '4') { ms_set(ms, "4Zc", ms->ms_z, tac_atoi(token, 1, 4)); } else if (token[0] == '5') { ms_set(ms, "2Bt", ms->ms_z, tac_atoi(token, 1, 2)); ms_set(ms, "2Xt", ms->ms_z, tac_atoi(token, 3, 2)); } else if (token[0] == '6') { ms_set(ms, "3Ah", ms->ms_z, tac_atoi(token, 1, 3)); ms_set(ms, "An", ms->ms_z, tac_atoi(token, 4, 1)); } else if (token[0] == '7') { ms_set(ms, "2VB", ms->ms_z, tac_atoi(token, 1, 2)); ms_set(ms, "2dB", ms->ms_z, tac_atoi(token, 3, 2)); } else if (token[0] == '8') { ms_set(ms, "4Vi", ms->ms_z, tac_atoi(token, 1, 4)); } else if (token[0] == '9') { ms_set(ms, "3Zd", ms->ms_z, tac_atoi(token, 2, 3)); } else { fprintf(stdout, "# unrecognised (%s) in Buoy4\n", token); } break; case MSS_Buoy4_YYMMJ: ms_set(ms, "2Y/4", NULL, tac_atoi(token, 0, 2)); ms_set(ms, "2M/4", NULL, tac_atoi(token, 2, 2)); ms_set(ms, "J/4", NULL, tac_atoi(token, 4, 1)); ms->ms_state = MSS_Buoy4_GGgg_; break; case MSS_Buoy4_GGgg_: ms_set(ms, "2G/4", NULL, tac_atoi(token, 0, 2)); ms_set(ms, "2g/4", NULL, tac_atoi(token, 2, 2)); ms->ms_state = MSS_Buoy4; break; case MSS_Buoy4_Qc5La: ms_set(ms, "Qc", NULL, tac_atoi(token, 0, 1)); ms_set(ms, "5La", NULL, tac_atoi(token, 1, 5)); ms->ms_state = MSS_Buoy4_6Lo; break; case MSS_Buoy4_6Lo: ms_set(ms, "6Lo", NULL, tac_atoi(token, 0, 6)); ms->ms_state = MSS_Buoy4; break; } endfunc: return 0; }