index 15dc00eeddc920cebd7a3133ca83d66dad27087b..e9ed428eac236f3753adbd043b9a9e9d299ea407 100644 (file)
    #include <string.h>
    #include <inttypes.h>
    #include <unistd.h>
+    #include "tic.h"
    int yylex();
    int yylex_destroy();
 static char fdelim;
 static int mask_allzeros;
-enum f_type { F_STRING, F_INT, F_HEX };
-
-struct tic_field {
-    enum f_type type;
-    char *label;
-    char *horodate;
-    union {
-        char *s;
-        int i;
-    } data;
-};
-
-struct tic_field *make_field(enum f_type type, char *label, char *horodate, char *data)
+void make_field(struct tic_field *field, enum f_type type, char *label, char *horodate, char *data)
 {
-    struct tic_field *field;
-
-    field = malloc(sizeof(*field));
    if (!field)
-        return NULL;
+        return;
    field->label = label;
    field->horodate = horodate;
@@ -68,8 +54,6 @@ struct tic_field *make_field(enum f_type type, char *label, char *horodate, char 
        default:
            break;
    }
-
-    return field;
 }
 void print_field(struct tic_field *field)
        default:
            break;
    }
-    free(field);
 }
 %}
 %union {
    char *text;
-    struct tic_field *field;
+    struct tic_field field;
 }
 %verbose
@@ -133,7 +116,7 @@ void free_field(struct tic_field *field) 
 %type <field> field_horodate field_nodate field
 %destructor { free($$); } <text>
-%destructor { free_field($$); } <field>
+%destructor { free_field(&$$); } <field>
 %destructor { } <>
 %%
 dataset:
    FIELD_START field FIELD_OK
        {
-            if (!2ドル) YYABORT;    // OOM
            if (hooked) {
-                print_field(2ドル);
+                print_field(&2ドル);
                fdelim = ',';
            }
-            free_field(2ドル);
+            free_field(&2ドル);
        }
-    | FIELD_START field FIELD_KO  { if (!2ドル) YYABORT; fprintf(stderr, "dataset invalid checksum\n"); free_field(2ドル); }
+    | FIELD_START field FIELD_KO  { fprintf(stderr, "dataset invalid checksum\n"); free_field(&2ドル); }
    | FIELD_START error FIELD_OK  { fprintf(stderr, "unrecognized dataset\n"); yyerrok; }
 ;
 ;
 field_horodate:
-    etiquette_str_horodate TOK_SEP TOK_HDATE TOK_SEP TOK_SEP    { $$ = make_field(F_STRING, 1,ドル 3,ドル NULL); }
-    | etiquette_str_horodate TOK_SEP TOK_HDATE TOK_SEP TOK_DATA TOK_SEP   { $$ = make_field(F_STRING, 1,ドル 3,ドル 5ドル); }
-    | etiquette_int_horodate TOK_SEP TOK_HDATE TOK_SEP TOK_DATA TOK_SEP   { $$ = make_field(F_INT, 1,ドル 3,ドル 5ドル); }
+    etiquette_str_horodate TOK_SEP TOK_HDATE TOK_SEP TOK_SEP    { make_field(&$,ドル F_STRING, 1,ドル 3,ドル NULL); }
+    | etiquette_str_horodate TOK_SEP TOK_HDATE TOK_SEP TOK_DATA TOK_SEP   { make_field(&$,ドル F_STRING, 1,ドル 3,ドル 5ドル); }
+    | etiquette_int_horodate TOK_SEP TOK_HDATE TOK_SEP TOK_DATA TOK_SEP   { make_field(&$,ドル F_INT, 1,ドル 3,ドル 5ドル); }
 ;
 field_nodate:
-    etiquette_str_nodate TOK_SEP TOK_DATA TOK_SEP  { $$ = make_field(F_STRING, 1,ドル NULL, 3ドル); }
-    | etiquette_int_nodate TOK_SEP TOK_DATA TOK_SEP { $$ = make_field(F_INT, 1,ドル NULL, 3ドル); }
-    | etiquette_hex_nodate TOK_SEP TOK_DATA TOK_SEP { $$ = make_field(F_HEX, 1,ドル NULL, 3ドル); }
+    etiquette_str_nodate TOK_SEP TOK_DATA TOK_SEP  { make_field(&$,ドル F_STRING, 1,ドル NULL, 3ドル); }
+    | etiquette_int_nodate TOK_SEP TOK_DATA TOK_SEP { make_field(&$,ドル F_INT, 1,ドル NULL, 3ドル); }
+    | etiquette_hex_nodate TOK_SEP TOK_DATA TOK_SEP { make_field(&$,ドル F_HEX, 1,ドル NULL, 3ドル); }
 ;
 etiquette_str_horodate: