Define UVECTOR and ATOM
[muddle-interpreter.git] / src / read.c
index dd12916ebb33a601af75008d8d11e804007ac175..b8570f3778f09fa13f134a1a2af088d00e1cce9e 100644 (file)
@@ -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");