shithub: scc

Download patch

ref: 7cce9dc9462e67e8ebfd5a507b49707f3a1e1013
parent: ebe3eda8ec61484d26bdbb754431a19ecdaa32b4
author: Roberto E. Vargas Caballero <[email protected]>
date: Wed Mar 12 07:24:21 EDT 2014

Move ctype from types to decl

--- a/decl.c
+++ b/decl.c
@@ -72,6 +72,113 @@
 error:	error(err, yytext);
 }
 
+struct ctype *
+ctype(struct ctype *tp, unsigned char tok)
+{
+	register unsigned char type;
+	static char *err;
+
+	type = tp->type;
+
+
+	switch (tok) {
+	case VOID: case BOOL: case STRUCT: case UNION: case ENUM: case BITFLD:
+		if (type)
+			goto two_or_more;;
+		type = tok;
+		if (tp->c_signed || tp->c_unsigned)
+			goto invalid_sign;
+		break;
+	case CHAR:
+		if (type)
+			goto two_or_more;
+		type = CHAR;
+		break;
+	case SHORT:
+		if (type && type != INT)
+			goto two_or_more;
+		type = SHORT;
+		break;
+	case INT:
+		switch (type) {
+		case 0:       type = INT;       break;
+		case SHORT:   type = SHORT;     break;
+		case LONG:    type = LONG;      break;
+		default:      goto two_or_more;
+		}
+		break;
+	case LONG:
+		switch (type) {
+		case 0:
+		case INT:     type = LONG;      break;
+		case LONG:    type = LLONG;     break;
+		case DOUBLE:  type = LDOUBLE;   break;
+		case LLONG:
+		case LDOUBLE:  error("too much long");
+		}
+		break;
+	case FLOAT:
+		if (type)
+			goto two_or_more;
+		type = FLOAT;
+		if (tp->c_signed || tp->c_unsigned)
+			goto invalid_sign;
+		break;
+	case DOUBLE:
+		if (type)
+			goto two_or_more;
+		if (!type)
+			type = DOUBLE;
+		else if (type == LONG)
+			type = LDOUBLE;
+		if (tp->c_signed || tp->c_unsigned)
+			goto invalid_sign;
+		break;
+	case UNSIGNED:
+		if (tp->c_unsigned)
+			goto duplicated;
+		if (tp->c_signed)
+			goto both_sign;
+		tp->c_unsigned = 1;
+		goto check_sign;
+	case SIGNED:
+		if (tp->c_signed)
+			goto duplicated;
+		if (tp->c_unsigned)
+			goto both_sign;
+		tp->c_signed = 1;
+
+check_sign:	switch (type) {
+		case VOID: case BOOL: case FLOAT: case DOUBLE: case LDOUBLE:
+			goto invalid_sign;
+		}
+		break;
+	case TYPENAME:
+		assert(!type);
+		if (tp->c_signed || tp->c_unsigned)
+			goto invalid_sign;
+		type = TYPEDEF;
+		break;
+	default:
+		assert(0);
+	}
+	tp->type = type;
+	return tp;
+
+both_sign:
+	err = "both 'signed' and 'unsigned' in declaration specifiers";
+	goto error;
+duplicated:
+	err = "duplicated '%s'";
+	goto error;
+invalid_sign:
+	err = "invalid sign modifier";
+	goto error;
+two_or_more:
+	err = "two or more basic types";
+error:	error(err, yytext);
+}
+
 static void structdcl(register struct ctype *tp);
 static void enumdcl(struct ctype *base);
 
--- a/types.c
+++ b/types.c
@@ -83,112 +83,7 @@
 	return new;
 }
 
-struct ctype *
-ctype(struct ctype *tp, unsigned char tok)
-{
-	register unsigned char type;
-	static char *err;
 
-	type = tp->type;
-
-
-	switch (tok) {
-	case VOID: case BOOL: case STRUCT: case UNION: case ENUM: case BITFLD:
-		if (type)
-			goto two_or_more;;
-		type = tok;
-		if (tp->c_signed || tp->c_unsigned)
-			goto invalid_sign;
-		break;
-	case CHAR:
-		if (type)
-			goto two_or_more;
-		type = CHAR;
-		break;
-	case SHORT:
-		if (type && type != INT)
-			goto two_or_more;
-		type = SHORT;
-		break;
-	case INT:
-		switch (type) {
-		case 0:       type = INT;       break;
-		case SHORT:   type = SHORT;     break;
-		case LONG:    type = LONG;      break;
-		default:      goto two_or_more;
-		}
-		break;
-	case LONG:
-		switch (type) {
-		case 0:
-		case INT:     type = LONG;      break;
-		case LONG:    type = LLONG;     break;
-		case DOUBLE:  type = LDOUBLE;   break;
-		case LLONG:
-		case LDOUBLE:  error("too much long");
-		}
-		break;
-	case FLOAT:
-		if (type)
-			goto two_or_more;
-		type = FLOAT;
-		if (tp->c_signed || tp->c_unsigned)
-			goto invalid_sign;
-		break;
-	case DOUBLE:
-		if (type)
-			goto two_or_more;
-		if (!type)
-			type = DOUBLE;
-		else if (type == LONG)
-			type = LDOUBLE;
-		if (tp->c_signed || tp->c_unsigned)
-			goto invalid_sign;
-		break;
-	case UNSIGNED:
-		if (tp->c_unsigned)
-			goto duplicated;
-		if (tp->c_signed)
-			goto both_sign;
-		tp->c_unsigned = 1;
-		goto check_sign;
-	case SIGNED:
-		if (tp->c_signed)
-			goto duplicated;
-		if (tp->c_unsigned)
-			goto both_sign;
-		tp->c_signed = 1;
-
-check_sign:	switch (type) {
-		case VOID: case BOOL: case FLOAT: case DOUBLE: case LDOUBLE:
-			goto invalid_sign;
-		}
-		break;
-	case TYPENAME:
-		assert(!type);
-		if (tp->c_signed || tp->c_unsigned)
-			goto invalid_sign;
-		type = TYPEDEF;
-		break;
-	default:
-		assert(0);
-	}
-	tp->type = type;
-	return tp;
-
-both_sign:
-	err = "both 'signed' and 'unsigned' in declaration specifiers";
-	goto error;
-duplicated:
-	err = "duplicated '%s'";
-	goto error;
-invalid_sign:
-	err = "invalid sign modifier";
-	goto error;
-two_or_more:
-	err = "two or more basic types";
-error:	error(err, yytext);
-}
 
 #ifndef NDEBUG
 #include <stdio.h>