shithub: mc

Download patch

ref: af410eb53e3a4e3d134e480c8e669c5bbcca8eaa
parent: e773fcec6b88e367ac70c2e528d0a52ee0ddf85a
author: Ori Bernstein <ori@eigenstate.org>
date: Wed Nov 9 03:38:12 EST 2011

Start type formatting code.

    Also, improve dumping.

--- a/parse/dump.c
+++ b/parse/dump.c
@@ -21,6 +21,7 @@
 static void dumpsym(Sym *s, FILE *fd, int depth)
 {
     int i;
+    char buf[1024];
 
     indent(fd, depth);
     fprintf(fd, "Sym ");
@@ -29,7 +30,7 @@
         if (i != s->name->name.nparts - 1)
             fprintf(fd, ".");
     }
-    fprintf(fd, " : TYPE\n");
+    fprintf(fd, " : %s\n", tyfmt(buf, 1024, s->type));
 }
 
 static void dumpnode(Node *n, FILE *fd, int depth)
--- a/parse/parse.h
+++ b/parse/parse.h
@@ -186,6 +186,9 @@
 Type *mktyunion(int line, Node **decls, size_t ndecls);
 Type *mktyenum(int line, Node **decls, size_t ndecls);
 
+char *tyfmt(char *buf, size_t len, Type *t);
+char *tystr(Type *t);
+
 void tlappend(Type ***tl, int *len, Type *t);
 
 /* tree creation */
--- a/parse/type.c
+++ b/parse/type.c
@@ -155,3 +155,74 @@
     (*tl)[*len] = t;
     (*len)++;
 }
+
+int tybfmt(char *buf, size_t len, Type *t)
+{
+    size_t n;
+    char *p;
+
+    n = 0;
+    p = buf;
+    switch (t->type) {
+        case Tybad:     n += snprintf(p, len - n, "BAD");       break;
+        case Tyvoid:    n += snprintf(p, len - n, "void");      break;
+        case Tybool:    n += snprintf(p, len - n, "bool");      break;
+        case Tychar:    n += snprintf(p, len - n, "char");      break;
+        case Tyint8:    n += snprintf(p, len - n, "int8");      break;
+        case Tyint16:   n += snprintf(p, len - n, "int16");     break;
+        case Tyint:     n += snprintf(p, len - n, "int");       break;
+        case Tyint32:   n += snprintf(p, len - n, "int32");     break;
+        case Tyint64:   n += snprintf(p, len - n, "int64");     break;
+        case Tylong:    n += snprintf(p, len - n, "long");      break;
+        case Tybyte:    n += snprintf(p, len - n, "byte");      break;
+        case Tyuint8:   n += snprintf(p, len - n, "uint8");     break;
+        case Tyuint16:  n += snprintf(p, len - n, "uint16");    break;
+        case Tyuint:    n += snprintf(p, len - n, "uint");      break;
+        case Tyuint32:  n += snprintf(p, len - n, "uint32");    break;
+        case Tyuint64:  n += snprintf(p, len - n, "uint64");    break;
+        case Tyulong:   n += snprintf(p, len - n, "ulong");     break;
+        case Tyfloat32: n += snprintf(p, len - n, "float32");   break;
+        case Tyfloat64: n += snprintf(p, len - n, "float64");   break;
+        case Tyvalist:  n += snprintf(p, len - n, "...");       break;
+
+        case Typtr:     
+            n += tybfmt(p, len - n, t->pbase);
+            n += snprintf(p, len - n, "*");
+            break;
+        case Tyslice:
+            n += tybfmt(p, len - n, t->sbase);
+            p = &buf[n];
+            n += snprintf(p, len - n, "[,]");
+            break;
+        case Tyarray:
+            n += tybfmt(p, len - n, t->abase);
+            p = &buf[n];
+            n += snprintf(p, len - n, "[LEN]");
+            break;
+        case Tyfunc:
+        case Tytuple:
+        case Tyvar:
+        case Typaram:
+        case Tyname:
+        case Tystruct:
+        case Tyunion:
+        case Tyenum:
+            snprintf(p, len - n, "TYPE ?");
+            break;
+    }
+
+    return n;
+}
+
+char *tyfmt(char *buf, size_t len, Type *t)
+{
+    tyfmt(buf, len, t);
+    return buf;
+}
+
+char *tystr(Type *t)
+{
+    char buf[1024];
+    tyfmt(buf, 1024, t);
+    return strdup(buf);
+}