summaryrefslogtreecommitdiff
path: root/src/runtime/c/pgf/reader.c
diff options
context:
space:
mode:
authorkr.angelov <kr.angelov@gmail.com>2012-01-24 14:47:11 +0000
committerkr.angelov <kr.angelov@gmail.com>2012-01-24 14:47:11 +0000
commit58de345f99f31e7c92e8ad61e4a2a226b0a3273a (patch)
treeae680ca408ae90df6ab05ce6ae39c4d7fd27da84 /src/runtime/c/pgf/reader.c
parentacc4f352af0e4c347fa3a583f33eb88c75f19600 (diff)
libpgf: few fixes to make the loading of grammars with def rules possible
Diffstat (limited to 'src/runtime/c/pgf/reader.c')
-rw-r--r--src/runtime/c/pgf/reader.c31
1 files changed, 27 insertions, 4 deletions
diff --git a/src/runtime/c/pgf/reader.c b/src/runtime/c/pgf/reader.c
index be9e33d80..909e28e3f 100644
--- a/src/runtime/c/pgf/reader.c
+++ b/src/runtime/c/pgf/reader.c
@@ -516,7 +516,7 @@ pgf_read_to_GuSeq(GuType* type, PgfReader* rdr, void* to)
}
static void
-pgf_read_to_maybe_seq(GuType* type, PgfReader* rdr, void* to)
+pgf_read_to_PgfEquationsM(GuType* type, PgfReader* rdr, void* to)
{
GuSeq* sto = to;
uint8_t tag = pgf_read_u8(rdr);
@@ -525,9 +525,32 @@ pgf_read_to_maybe_seq(GuType* type, PgfReader* rdr, void* to)
case 0:
*sto = gu_null_seq;
break;
- case 1:
- pgf_read_to_GuSeq(type, rdr, to);
+ case 1: {
+ GuLength length = pgf_read_len(rdr);
+ gu_return_on_exn(rdr->err, );
+
+ GuSeq seq = gu_new_seq(PgfEquation*, length, rdr->opool);
+ PgfEquation** data = gu_seq_data(seq);
+ for (size_t i = 0; i < length; i++) {
+ GuLength n_patts = pgf_read_len(rdr);
+ gu_return_on_exn(rdr->err, );
+
+ PgfEquation *equ =
+ gu_malloc(rdr->opool,
+ sizeof(PgfEquation)+sizeof(PgfPatt)*n_patts);
+ equ->n_patts = n_patts;
+ for (int j = 0; j < n_patts; j++) {
+ pgf_read_to(rdr, gu_type(PgfPatt), &equ->patts[j]);
+ gu_return_on_exn(rdr->err, );
+ }
+ pgf_read_to(rdr, gu_type(PgfExpr), &equ->body);
+ gu_return_on_exn(rdr->err, );
+
+ data[i] = equ;
+ }
+ *sto = seq;
break;
+ }
default:
gu_raise_i(rdr->err, PgfReadTagExn,
.type = type, .tag = tag);
@@ -775,7 +798,7 @@ pgf_read_to_table = GU_TYPETABLE(
PGF_READ_TO(GuString),
PGF_READ_TO(double),
PGF_READ_TO(pointer),
- PGF_READ_TO_FN(PgfEquationsM, pgf_read_to_maybe_seq),
+ PGF_READ_TO(PgfEquationsM),
PGF_READ_TO(GuSeq),
PGF_READ_TO(PgfCCatId),
PGF_READ_TO(PgfCCat),