diff options
| author | kr.angelov <kr.angelov@gmail.com> | 2013-10-04 12:04:39 +0000 |
|---|---|---|
| committer | kr.angelov <kr.angelov@gmail.com> | 2013-10-04 12:04:39 +0000 |
| commit | e8335806afc45e31157937b880ff39b75c14a2cd (patch) | |
| tree | 5e3233cfdf934ff350f66d755bde759512ef5f20 /src/runtime/c/pgf/reader.c | |
| parent | 27091048ce8276cc542e909588695d273e95b087 (diff) | |
GuString is now an ordinary C string - it makes live easier. In addition PgfSymbolKS, PgfExprFun and PgfLiteralStr now keep their strings as embedded flexible arrays. The latest change gives us the same compactness as the old representation but it is a lot easier to use.
Diffstat (limited to 'src/runtime/c/pgf/reader.c')
| -rw-r--r-- | src/runtime/c/pgf/reader.c | 93 |
1 files changed, 61 insertions, 32 deletions
diff --git a/src/runtime/c/pgf/reader.c b/src/runtime/c/pgf/reader.c index ebc5050e4..9f08662e3 100644 --- a/src/runtime/c/pgf/reader.c +++ b/src/runtime/c/pgf/reader.c @@ -13,7 +13,7 @@ #include <gu/exn.h> #include <gu/utf8.h> #include <math.h> -#include <stdio.h> +#include <stdlib.h> // // PgfReader @@ -116,11 +116,21 @@ pgf_read_literal(PgfReader* rdr) uint8_t tag = pgf_read_tag(rdr); switch (tag) { case PGF_LITERAL_STR: { + GuLength len = pgf_read_len(rdr); + uint8_t* buf = alloca(len*6+1); + uint8_t* p = buf; + for (size_t i = 0; i < len; i++) { + gu_in_utf8_buf(&p, rdr->in, rdr->err); + gu_return_on_exn(rdr->err, gu_null_variant); + } + *p++ = 0; + PgfLiteralStr *lit_str = - gu_new_variant(PGF_LITERAL_STR, - PgfLiteralStr, - &lit, rdr->opool); - lit_str->val = pgf_read_string(rdr); + gu_new_flex_variant(PGF_LITERAL_STR, + PgfLiteralStr, + val, p-buf, + &lit, rdr->opool); + strcpy((char*) lit_str->val, (char*) buf); break; } case PGF_LITERAL_INT: { @@ -160,7 +170,7 @@ pgf_read_flags(PgfReader* rdr) PgfLiteral value = pgf_read_literal(rdr); gu_return_on_exn(rdr->err, NULL); - gu_map_put(flags, &name, PgfLiteral, value); + gu_map_put(flags, name, PgfLiteral, value); } return flags; @@ -224,11 +234,16 @@ pgf_read_expr_(PgfReader* rdr) break; } case PGF_EXPR_FUN: { + size_t len = pgf_read_len(rdr); + PgfExprFun *efun = - gu_new_variant(PGF_EXPR_FUN, - PgfExprFun, - &expr, rdr->opool); - efun->fun = pgf_read_cid(rdr, rdr->opool); + gu_new_flex_variant(PGF_EXPR_FUN, + PgfExprFun, + fun, len+1, + &expr, rdr->opool); + gu_in_bytes(rdr->in, (uint8_t*)efun->fun, len, rdr->err); + efun->fun[len] = 0; + gu_return_on_exn(rdr->err, gu_null_variant); break; } @@ -403,7 +418,17 @@ pgf_read_absfun(PgfReader* rdr) { PgfAbsFun* absfun = gu_new(PgfAbsFun, rdr->opool); - absfun->name = pgf_read_cid(rdr, rdr->opool); + size_t len = pgf_read_len(rdr); + + PgfExprFun *efun = + gu_new_flex_variant(PGF_EXPR_FUN, + PgfExprFun, + fun, len+1, + &absfun->ep.expr, rdr->opool); + gu_in_bytes(rdr->in, (uint8_t*)efun->fun, len, rdr->err); + efun->fun[len] = 0; + absfun->name = efun->fun; + gu_return_on_exn(rdr->err, NULL); absfun->type = pgf_read_type_(rdr); @@ -449,12 +474,6 @@ pgf_read_absfun(PgfReader* rdr) absfun->ep.prob = - log(gu_in_f64be(rdr->in, rdr->err)); - PgfExprFun* expr_fun = - gu_new_variant(PGF_EXPR_FUN, - PgfExprFun, - &absfun->ep.expr, rdr->opool); - expr_fun->fun = absfun->name; - return absfun; } @@ -474,7 +493,7 @@ pgf_read_absfuns(PgfReader* rdr) PgfAbsFun* absfun = pgf_read_absfun(rdr); gu_return_on_exn(rdr->err, NULL); - gu_map_put(absfuns, &absfun->name, PgfAbsFun*, absfun); + gu_map_put(absfuns, absfun->name, PgfAbsFun*, absfun); } return absfuns; @@ -514,7 +533,8 @@ pgf_read_abscat(PgfReader* rdr, PgfAbstr* abstr, PgfCIdMap* abscats) gu_return_on_exn(rdr->err, NULL); PgfAbsFun* absfun = - gu_map_get(abstr->funs, &name, PgfAbsFun*); + gu_map_get(abstr->funs, name, PgfAbsFun*); + assert(absfun != NULL); gu_buf_push(functions, PgfAbsFun*, absfun); } @@ -539,7 +559,7 @@ pgf_read_abscats(PgfReader* rdr, PgfAbstr* abstr) PgfAbsCat* abscat = pgf_read_abscat(rdr, abstr, abscats); gu_return_on_exn(rdr->err, NULL); - gu_map_put(abscats, &abscat->name, PgfAbsCat*, abscat); + gu_map_put(abscats, abscat->name, PgfAbsCat*, abscat); } return abscats; @@ -567,7 +587,7 @@ pgf_read_printnames(PgfReader* rdr) GuMapType* map_type = (GuMapType*) GU_TYPE_LIT(GuStringMap, _, gu_type(GuString), - &gu_empty_string); + &""); PgfCIdMap* printnames = gu_map_type_make(map_type, rdr->opool); size_t len = pgf_read_len(rdr); @@ -580,7 +600,7 @@ pgf_read_printnames(PgfReader* rdr) GuString printname = pgf_read_string(rdr); gu_return_on_exn(rdr->err, NULL); - gu_map_put(printnames, &name, GuString, printname); + gu_map_put(printnames, name, GuString, printname); } return printnames; @@ -654,12 +674,21 @@ pgf_read_symbol(PgfReader* rdr) break; } case PGF_SYMBOL_KS: { + GuLength len = pgf_read_len(rdr); + uint8_t* buf = alloca(len*6+1); + uint8_t* p = buf; + for (size_t i = 0; i < len; i++) { + gu_in_utf8_buf(&p, rdr->in, rdr->err); + gu_return_on_exn(rdr->err, gu_null_variant); + } + *p++ = 0; + PgfSymbolKS *sym_ks = - gu_new_variant(PGF_SYMBOL_KS, - PgfSymbolKS, - &sym, rdr->opool); - sym_ks->token = pgf_read_string(rdr); - gu_return_on_exn(rdr->err, gu_null_variant); + gu_new_flex_variant(PGF_SYMBOL_KS, + PgfSymbolKS, + token, p-buf, + &sym, rdr->opool); + strcpy((char*) sym_ks->token, (char*) buf); break; } case PGF_SYMBOL_KP: { @@ -747,7 +776,7 @@ pgf_read_cncfun(PgfReader* rdr, PgfAbstr* abstr, PgfConcr* concr, int funid) gu_return_on_exn(rdr->err, NULL); PgfAbsFun* absfun = - gu_map_get(abstr->funs, &name, PgfAbsFun*); + gu_map_get(abstr->funs, name, PgfAbsFun*); PgfCncFun* cncfun = gu_new_flex(rdr->opool, PgfCncFun, lins, len); cncfun->absfun = absfun; @@ -956,7 +985,7 @@ pgf_read_cnccat(PgfReader* rdr, PgfAbstr* abstr, PgfConcr* concr, PgfCId name) gu_malloc(rdr->opool, sizeof(PgfCncCat)+n_lins*sizeof(GuString)); cnccat->abscat = - gu_map_get(abstr->cats, &name, PgfAbsCat*); + gu_map_get(abstr->cats, name, PgfAbsCat*); gu_assert(cnccat->abscat != NULL); int len = last + 1 - first; @@ -1011,7 +1040,7 @@ pgf_read_cnccats(PgfReader* rdr, PgfAbstr* abstr, PgfConcr* concr) pgf_read_cnccat(rdr, abstr, concr, name); gu_return_on_exn(rdr->err, NULL); - gu_map_put(cnccats, &name, PgfCncCat*, cnccat); + gu_map_put(cnccats, name, PgfCncCat*, cnccat); } return cnccats; @@ -1100,7 +1129,7 @@ pgf_read_concrete(PgfReader* rdr, PgfAbstr* abstr) pgf_read_cid(rdr, rdr->opool); gu_return_on_exn(rdr->err, NULL); - concr->cflags = + concr->cflags = pgf_read_flags(rdr); gu_return_on_exn(rdr->err, NULL); @@ -1150,7 +1179,7 @@ pgf_read_concretes(PgfReader* rdr, PgfAbstr* abstr) PgfConcr* concr = pgf_read_concrete(rdr, abstr); gu_return_on_exn(rdr->err, NULL); - gu_map_put(concretes, &concr->name, PgfConcr*, concr); + gu_map_put(concretes, concr->name, PgfConcr*, concr); } return concretes; |
