summaryrefslogtreecommitdiff
path: root/src/runtime/c/pgf/linearize.c
diff options
context:
space:
mode:
authorkr.angelov <kr.angelov@gmail.com>2012-03-07 16:39:29 +0000
committerkr.angelov <kr.angelov@gmail.com>2012-03-07 16:39:29 +0000
commited5de8335bb1d984918702abff70aadc4d554539 (patch)
tree7e61957d0b103da4409bf39ba55bbe42efc772d2 /src/runtime/c/pgf/linearize.c
parent96493c274ba1a02d52f4739f4c222f2b2cbdee54 (diff)
libpgf: implementation for built in literal categories
Diffstat (limited to 'src/runtime/c/pgf/linearize.c')
-rw-r--r--src/runtime/c/pgf/linearize.c59
1 files changed, 57 insertions, 2 deletions
diff --git a/src/runtime/c/pgf/linearize.c b/src/runtime/c/pgf/linearize.c
index 08e182d50..15b7ba3cc 100644
--- a/src/runtime/c/pgf/linearize.c
+++ b/src/runtime/c/pgf/linearize.c
@@ -338,6 +338,29 @@ finish:
return ret;
}
+PgfCCat*
+pgf_literal_cat(PgfLzn* lzn, PgfLiteral lit)
+{
+ int fid;
+
+ switch (gu_variant_tag(lit)) {
+ case PGF_LITERAL_STR:
+ fid = -1;
+ break;
+ case PGF_LITERAL_INT:
+ fid = -2;
+ break;
+ case PGF_LITERAL_FLT:
+ fid = -3;
+ break;
+ default:
+ gu_impossible();
+ return NULL;
+ }
+
+ return gu_map_get(lzn->concr->ccats, &fid, PgfCCat*);
+}
+
static PgfCCat*
pgf_lzn_infer(PgfLzn* lzn, PgfExpr expr, GuPool* pool, PgfCncTree* ctree_out)
{
@@ -357,7 +380,7 @@ pgf_lzn_infer(PgfLzn* lzn, PgfExpr expr, GuPool* pool, PgfCncTree* ctree_out)
PgfCncTreeLit,
.lit = elit->lit);
}
- ret = pgf_literal_cat(elit->lit);
+ ret = pgf_literal_cat(lzn, elit->lit);
}
default:
// XXX: should we do something here?
@@ -523,8 +546,40 @@ pgf_file_lzn_symbol_tokens(PgfLinFuncs** funcs, PgfTokens toks)
}
}
+static void
+pgf_file_lzn_expr_literal(PgfLinFuncs** funcs, PgfLiteral lit)
+{
+ PgfSimpleLin* flin = gu_container(funcs, PgfSimpleLin, funcs);
+ if (!gu_ok(flin->err)) {
+ return;
+ }
+
+ GuVariantInfo i = gu_variant_open(lit);
+ switch (i.tag) {
+ case PGF_LITERAL_STR: {
+ PgfLiteralStr* lstr = i.data;
+ gu_string_write(lstr->val, flin->wtr, flin->err);
+ gu_putc(' ', flin->wtr, flin->err);
+ break;
+ }
+ case PGF_LITERAL_INT: {
+ PgfLiteralInt* lint = i.data;
+ gu_printf(flin->wtr, flin->err, "%d ", lint->val);
+ break;
+ }
+ case PGF_LITERAL_FLT: {
+ PgfLiteralFlt* lflt = i.data;
+ gu_printf(flin->wtr, flin->err, "%lf ", lflt->val);
+ break;
+ }
+ default:
+ gu_impossible();
+ }
+}
+
static PgfLinFuncs pgf_file_lin_funcs = {
- .symbol_tokens = pgf_file_lzn_symbol_tokens
+ .symbol_tokens = pgf_file_lzn_symbol_tokens,
+ .expr_literal = pgf_file_lzn_expr_literal
};
void