X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=src%2Fread.c;h=b8570f3778f09fa13f134a1a2af088d00e1cce9e;hb=58a5ffdfec139a0c9d399f603b77a764ae8607f7;hp=dd12916ebb33a601af75008d8d11e804007ac175;hpb=dc5745e090dab30f3aa606f3c2ab0b566046e4b9;p=muddle-interpreter.git diff --git a/src/read.c b/src/read.c index dd12916..b8570f3 100644 --- a/src/read.c +++ b/src/read.c @@ -114,7 +114,7 @@ static uint32_t obj_get_fix32(const object *o) { */ static int -read_num (const char *p, reader_stack *st) +read_num (const char *p, reader_stack * st) { int i = 0; // Use an unsigned intermediate to simplify overflow checks. @@ -151,7 +151,7 @@ read_num (const char *p, reader_stack *st) if (p[0] != '-') { if (x <= INT32_MAX) - (--(st->pos))->fix32 = new_fix32 ((int32_t)x); + (--(st->pos))->fix32 = new_fix32 ((int32_t) x); else if (x <= INT64_MAX) (--(st->pos))->fix64 = new_fix64 (x); else @@ -159,24 +159,24 @@ read_num (const char *p, reader_stack *st) } else { - if (-x >= (uint64_t)INT32_MIN) - (--(st->pos))->fix32 = new_fix32 (0 - (int32_t)x); - else if (-x >= (uint64_t)INT64_MIN) - (--(st->pos))->fix64 = new_fix64 (0 - (int64_t)x); + if (-x >= (uint64_t) INT32_MIN) + (--(st->pos))->fix32 = new_fix32 (0 - (int32_t) x); + else if (-x >= (uint64_t) INT64_MIN) + (--(st->pos))->fix64 = new_fix64 (0 - (int64_t) x); else goto read_float; } st->framelen++; return i; - read_float: - assert(0 && "unimplemented: promote num to float"); +read_float: + assert (0 && "unimplemented: promote num to float"); return i; } // stack[0..len]: objs in current list // stack[len]: parent len const char * -read_token (const char *p, reader_stack *st) +read_token (const char *p, reader_stack * st) { p += count_whitespace (p); switch (p[0]) @@ -206,7 +206,10 @@ read_token (const char *p, reader_stack *st) } *--(st->pos) = (object) { - .fix32.type = type,.fix32.rest = 0,.fix32.val = st->framelen,}; + .fix32.type = type,.fix32.rest = 0,.fix32.val = (fix32_val) + { + .n = st->framelen} + ,}; st->framelen = 0; break; } @@ -231,11 +234,10 @@ read_token (const char *p, reader_stack *st) // pop frame, push new LIST st->pos += st->framelen; assert (st->pos->type == type); - st->framelen = st->pos->fix32.val + 1; + st->framelen = st->pos->fix32.val.n + 1; // overwrite the frame marker with the collection it became - st->pos->list = (list_object) - { - .type = type,.rest = 0,.head = o}; + st->pos->list = new_list (o); + st->pos->list.type = type; break; } case ']': @@ -247,7 +249,7 @@ read_token (const char *p, reader_stack *st) uint32_t len = st->framelen; st->pos += st->framelen; assert (st->pos->type == EVALTYPE_VECTOR); - st->framelen = st->pos->fix32.val + 1; + st->framelen = st->pos->fix32.val.n + 1; st->pos->vector = new_vector (h, len); break; } @@ -257,7 +259,13 @@ read_token (const char *p, reader_stack *st) if (n) return p + n; - // TODO: try read pname + n = count_pname (p); + if (n > 0) + { + (--(st->pos))->atom = new_atom (0); + st->framelen++; + return p + n; + } fprintf (stderr, "read unimplemented for char: '%c'\n", *p); assert (0 && "read unimplemented for char");