From b3b72a77b98635e56ebbd82092ca9b23ee4bb1dd Mon Sep 17 00:00:00 2001 From: katherine Date: Thu, 11 Jul 2019 04:54:04 -0700 Subject: implement result_type gen --- src/gen.c | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) (limited to 'src/gen.c') diff --git a/src/gen.c b/src/gen.c index ff93dd5..67c1716 100644 --- a/src/gen.c +++ b/src/gen.c @@ -652,6 +652,96 @@ static inline void sub_hashtype(FILE *f, struct parse_result_s *pr, ); } +static inline void sub_result_struct(FILE *f, struct parse_result_s *pr, + struct analyse_result_s *ar) +{ + struct parse_var_s *vcur, *vtmp; + struct parse_deftype_s *dtp; + + fprintf(f, + "struct confconf_result_%s {\n" + " enum confconf_result_type result_type;\n" + " size_t end_col;\n" + " size_t end_line;\n" + " size_t end_byte;\n" + " char *end_tok;\n", + (opt_suffix_str() ? opt_suffix_str() : pr->suffix) + ); + + HASH_ITER(hh, pr->vars, vcur, vtmp) { + switch (vcur->type) { + case PARSE_TYPE_BOOL: + fprintf(f, " bool "); + break; + case PARSE_TYPE_STRING: + fprintf(f, " char *"); + break; + case PARSE_TYPE_ID: + fprintf(f, " char *"); + break; + case PARSE_TYPE_INT: + fprintf(f, " int "); + break; + case PARSE_TYPE_INTL: + fprintf(f, " long int "); + break; + case PARSE_TYPE_INTLL: + fprintf(f, " long long int "); + break; + case PARSE_TYPE_UINT: + fprintf(f, " unsigned "); + break; + case PARSE_TYPE_UINTL: + fprintf(f, " long unsigned "); + break; + case PARSE_TYPE_UINTLL: + fprintf(f, " long long unsigned "); + break; + case PARSE_TYPE_FLOAT: + fprintf(f, " float "); + break; + case PARSE_TYPE_DOUBLE: + fprintf(f, " double "); + break; + case PARSE_TYPE_DOUBLEL: + fprintf(f, " long double "); + break; + + case PARSE_TYPE_DEFTYPE: + HASH_FIND_STR(pr->deftypes, vcur->deftype_name, dtp); + assert(dtp != NULL); + fprintf(f, + " %s confconf_type_%s_%s ", + (dtp->type == PARSE_DEFTYPE_ENUM ? "enum" : "struct"), + dtp->name, + (opt_suffix_str() ? opt_suffix_str() : pr->suffix) + ); + break; + + default: + if (vcur->type >= PARSE_TYPE_HASH_BOOL) { + assert(vcur->type <= PARSE_TYPE_HASH_DEFTYPE); + fprintf(f, + " struct confconf_hash_%s ", + (opt_suffix_str() ? opt_suffix_str() : pr->suffix) + ); + } else if (vcur->type >= PARSE_TYPE_ARRAY_BOOL) { + fprintf(f, + " struct confconf_array_%s ", + (opt_suffix_str() ? opt_suffix_str() : pr->suffix) + ); + } else { + assert(0); + } + break; + } + + fprintf(f, "val_%s;\n", vcur->name); + } + + fprintf(f, "};\n\n"); +} + static inline void sub_body(FILE *f, struct parse_result_s *pr, struct analyse_result_s *ar) { @@ -692,6 +782,8 @@ void gen(FILE *f, struct parse_result_s *pr, struct analyse_result_s *ar) if (ar->uses_hash) sub_hashtype(f, pr, ar); + sub_result_struct(f, pr, ar); + sub_body(f, pr, ar); fprintf(f, "#endif\n"); -- cgit v1.2.3