From: Thibaut VARÈNE Date: 2021年8月13日 14:21:09 +0000 (+0200) Subject: fix error handling/recovery X-Git-Tag: v1.0~37 X-Git-Url: http://vcs.slashdirt.org/git/?a=commitdiff_plain;h=df05e049e1d33f4783f5213239abf3088c7dc171;p=sw%2Ftic2json.git fix error handling/recovery Improve error reporting too. Error messages are sent to stderr, so stdout still carries a valid JSON stream. --- diff --git a/tic.l b/tic.l index 971e61c..c2eeafc 100644 --- a/tic.l +++ b/tic.l @@ -158,7 +158,7 @@ PPOINTE { crc_calc(); yylval.text = strdup(yytext); return ET_PPOINTE; } {HORODATE} { crc_calc(); yylval.text = strdup(yytext); return TOK_HDATE; } {DATAC}+ { crc_calc(); yylval.text = strdup(yytext); return TOK_DATA; } -. { printf("spurious character %c\n", *yytext); return 0; } +. { fprintf(stderr, "spurious character 0x%02hhx\n", *yytext); /* ignore */ } <> { yyterminate(); } %% diff --git a/tic.y b/tic.y index 3654f78..fa2fc06 100644 --- a/tic.y +++ b/tic.y @@ -6,6 +6,14 @@ // License: GPLv2 - http://www.gnu.org/licenses/gpl-2.0.html // +/* + * Outputs as JSON a list of frames which contains a list of fields. + * Fields are { "label": "xxx", "data": "xxx", horodate: "xxx" } with horodate optional and data possibly empty. + * Data errors can result in some/all fields being omitted in the output frame. + * Output JSON is guaranteed to always be valid. + * This parser complies with Enedis-NOI-CPT_54E.pdf version 3. + */ + %{ #include #include @@ -90,7 +98,11 @@ frame: if (!hooked) { hooked=1; printf("[\n["); } else { fdelim=' '; printf ("],\n["); } } - | error TOK_ETX { hooked=0; } + | error TOK_ETX + { + if (hooked) { fdelim=' '; printf ("],\n["); } + fprintf(stderr, "frame error\n"); + } ; datasets: @@ -111,9 +123,9 @@ dataset: } free_field(2ドル); } - | FIELD_START field FIELD_KO { if (!2ドル) YYABORT; printf("invalid checksum\n"); free_field(2ドル); } - | FIELD_START error FIELD_OK - | FIELD_START error FIELD_KO + | FIELD_START field FIELD_KO { if (!2ドル) YYABORT; fprintf(stderr, "dataset invalid checksum\n"); free_field(2ドル); } + | error FIELD_OK { fprintf(stderr, "dataset error with valid checksum\n"); } + | error FIELD_KO { fprintf(stderr, "dataset error with invalid checksum\n"); } ; field: field_horodate

AltStyle によって変換されたページ (->オリジナル) /