shithub: scc

Download patch

ref: c3a32e330fb2a8c13ce51f2dfad8a7853fa6b381
parent: 0f97dac102bbf0d0ba8688fd031c2150cdd33266
author: Roberto E. Vargas Caballero <[email protected]>
date: Sat Jun 30 08:31:20 EDT 2012

Joined op and btype fields in types

This allow us a more orthogonal functions, because in this way we can deal
in the same way an operator and a basic type, and it is easier check when a
struct type is a basic type or a derived type.

--- a/symbol.h
+++ b/symbol.h
@@ -18,10 +18,6 @@
 #define T_VOID    (&tvoid)
 #define T_BOOL    (&tbool)
 
-#define ARY		1
-#define PTR		2
-#define FTN		3
-
 enum namespace {
 	NS_IDEN,
 	NS_KEYWORD,
@@ -45,7 +41,7 @@
 };
 
 struct type {
-	unsigned op    : 5;
+	unsigned char op;
 	struct type *base;
 	struct type *ary;		      /* array */
 	struct type *ptr;		      /* pointer */
@@ -55,9 +51,6 @@
 	struct type *rstr;		      /* restricted */
 
 	union  {
-		struct {
-			unsigned btype : 4;
-		};
 		size_t nelem;		      /* size of array */
 	};
 };
--- a/tokens.h
+++ b/tokens.h
@@ -9,7 +9,7 @@
 enum tokens {
 	/* types */
 	INT = 1, CHAR, FLOAT, LONG, LLONG, SHORT, VOID, DOUBLE,
-	LDOUBLE, STRUCT, UNION, ENUM, UTYPE, BOOL,
+	LDOUBLE, STRUCT, UNION, ENUM, UTYPE, BOOL, ARY, PTR, FTN,
 	/* storage specifier */
 	TYPEDEF, EXTERN, STATIC, AUTO, REGISTER,
 	/* type qualifier */
--- a/types.c
+++ b/types.c
@@ -7,16 +7,16 @@
 #include "tokens.h"
 #include "symbol.h"
 
-struct type tschar = {.btype = CHAR};
-struct type tshort = {.btype = SHORT};
-struct type tint = {.btype = INT};
-struct type tfloat = {.btype = FLOAT};
-struct type tdouble = {.btype = DOUBLE};
-struct type tldouble = {.btype = LDOUBLE};
-struct type tlong = {.btype = LONG};
-struct type tllong = {.btype = LLONG};
-struct type tvoid = {.btype = VOID};
-struct type tbool = {.btype = BOOL};
+struct type tschar = {.op = CHAR};
+struct type tshort = {.op = SHORT};
+struct type tint = {.op = INT};
+struct type tfloat = {.op = FLOAT};
+struct type tdouble = {.op = DOUBLE};
+struct type tldouble = {.op = LDOUBLE};
+struct type tlong = {.op = LONG};
+struct type tllong = {.op = LLONG};
+struct type tvoid = {.op = VOID};
+struct type tbool = {.op = BOOL};
 
 static unsigned char stack[NR_DECLARATORS];
 static unsigned char *stackp = stack;
@@ -196,50 +196,27 @@
 
 void ptype(register struct type *t)
 {
+	static const char *strings[] = {
+		[ARY] =      "array of ",
+		[PTR] =      "pointer to ",
+		[FTN] =      "function that returns ",
+		[VOLATILE] = "volatile ",
+		[RESTRICT] = "restrict ",
+		[CONST] =    "const ",
+		[INT] =      "int ",
+		[CHAR] =     "char ",
+		[FLOAT] =    "float ",
+		[LONG] =     "long ",
+		[LLONG] =    "long long ",
+		[SHORT] =    "short ",
+		[VOID] =     "void ",
+		[DOUBLE] =   "double ",
+		[LDOUBLE] =  "long double "
+	};
 	assert(t);
 
-	for (; t; t = t->base) {
-		switch (t->op) {
-		case ARY:
-			fputs("array of ", stdout);
-			break;
-		case PTR:
-			fputs("pointer to ", stdout);
-			break;
-		case FTN:
-			fputs("function that returns ", stdout);
-			break;
-		case VOLATILE:
-			fputs("volatile ", stdout);
-			break;
-			break;
-		case RESTRICT:
-			fputs("restrict ", stdout);
-			break;
-		case CONST:
-			fputs("const ", stdout);
-			break;
-		default: {
-				static char *type, *sign;
-
-				/* sign = (t->sign) ? "signed" : "unsigned"; */
-				switch (t->btype) {
-				case INT:     type = "int";	    break;
-				case CHAR:    type = "char";	    break;
-				case FLOAT:   type = "float";       break;
-				case LONG:    type = "long";	    break;
-				case LLONG:   type = "long long";   break;
-				case SHORT:   type = "short";       break;
-				case VOID:    type = "void";	    break;
-				case DOUBLE:  type = "double";      break;
-				case LDOUBLE: type = "long double"; break;
-				default:
-					abort();
-				}
-				printf("%s", type);
-		}
-		}
-	}
+	for (; t; t = t->base)
+		fputs(strings[t->op], stdout);
 	putchar('\n');
 }