diff mc-parse.c @ 166:9e55cc5551fb

*** empty log message ***
author kono
date Mon, 24 Nov 2003 13:09:14 +0900
parents 6409ff6bc219
children b1297c82e926
line wrap: on
line diff
--- a/mc-parse.c	Mon Nov 24 10:42:03 2003 +0900
+++ b/mc-parse.c	Mon Nov 24 13:09:14 2003 +0900
@@ -475,11 +475,11 @@
 	t = UNSIGNED;
 	if(getsym()==INT) getsym();
 	else if (sym==CHAR) { getsym(); t = UCHAR; }
-	else if (sym==SHORT) { getsym(); t = sym; }
-	else if (sym==LONGLONG) {getsym(); t = sym; }
+	else if (sym==SHORT) { getsym(); t = USHORT; }
+	else if (sym==LONGLONG) {getsym(); t = ULONGLONG; }
 	break;
     case SHORT:
-	t=INT;
+	t=SHORT;
 	if(getsym()==INT) getsym();
 	break;
     case LONG:
@@ -705,15 +705,21 @@
 int
 size(int t)
 {
-    if(t==CHAR) return 1;
-    if(t==VOID) return 0;
-    if(t==REGISTER) return size_of_int;
-    if(t==DREGISTER) return size_of_double;
-    if(t==FREGISTER) return size_of_float;
-    if(scalar(t)) return size_of_int;
-    if(t==FLOAT) return size_of_float;
-    if(t==DOUBLE) return size_of_double;
-    if(t==LONGLONG) return size_of_longlong;
+    if (t<0) {
+	if(t==CHAR) return 1;
+	if(t==UCHAR) return 1;
+	if(t==VOID) return 0;
+	if(t==SHORT) return size_of_short;
+	if(t==USHORT) return size_of_short;
+	if(t==REGISTER) return size_of_int;
+	if(t==DREGISTER) return size_of_double;
+	if(t==FREGISTER) return size_of_float;
+	if(scalar(t)) return size_of_int;
+	if(t==FLOAT) return size_of_float;
+	if(t==DOUBLE) return size_of_double;
+	if(t==LONGLONG) return size_of_longlong;
+	error(DCERR);
+    } 
     if(car(t)==STRUCT||car(t)==UNION) {
 	if(cadr(t)==-1) error(DCERR);
 	return(cadr(t));
@@ -724,6 +730,8 @@
 	return size_of_int;
     else if(car(t)==FUNCTION)
 	return size_of_int;
+    else if(car(t)==POINTER)
+	return size_of_int;
     else
 	error(DCERR);
     return 0;
@@ -1832,9 +1840,13 @@
     if(t==VOID)
 	error(TYERR);
     if(t==CHAR||t==UCHAR) {
-	e2=int_value(e2,type);
+	e2=(t==UCHAR)?unsigned_value(e2,type):int_value(e2,type);
 	if (!integral(type)) error(TYERR);
 	type= INT;return(list3(CASS,e1,e2));
+    } else if(t==SHORT||t==USHORT) {
+	e2=(t==USHORT)?unsigned_value(e2,type):int_value(e2,type);
+	if (!integral(type)) error(TYERR);
+	type= t;return(list3(SASS,e1,e2));
     } else if(t==DOUBLE) {
 	e2=double_value(e2,type);
 	type= t;return(list3(DASS,e1,e2));