stevesu@copper.UUCP (Steve Summit) (07/28/86)
My only problem in writing code that's portable back to the pdp11 is that I like to declare things as "short int" and the pdp11 compilers that I have access to want just "short." I finally got around to doing something about it. This may well be fixed in more modern versions of Ritchie's compiler, (including 2.9 or 2.10; I haven't checked), but the fix is so simple it can't hurt to post it. The problem is that the compiler turns the keyword "short" into the internal token INT at lexical analysis time. "short int" therefore looks like "int int", an obvious type clash. The solution is to tokenize "short" as SHORT so that the case can be detected. This new "type" SHORT is just a placeholder; after type analysis it is turned back into an INT, since that's what the rest of the compiler expects. The changes affect three files: the #definition of the type token SHORT in c0.h, the keyword table in c00.c, and the type analysis in c03.c. Context diffs follow. Steve Summit tektronix!copper!stevesu *** /tmp/,RCSt1022392 Sun Jul 27 14:31:50 1986 --- c0.h Sun Jul 27 14:28:48 1986 *************** *** 320,323 #define DOUBLE 3 #define STRUCT 4 #define LONG 6 #define UNSIGN 7 --- 320,324 ----- #define DOUBLE 3 #define STRUCT 4 + #define SHORT 5 /* adjusted later to int */ #define LONG 6 #define UNSIGN 7 *** /tmp/,RCSt1022392 Sun Jul 27 14:32:01 1986 --- c00.c Sun Jul 27 13:45:13 1986 *************** *** 30,34 "unsigned", UNSIGN, "union", UNION, ! "short", INT, "auto", AUTO, "extern", EXTERN, --- 30,34 ----- "unsigned", UNSIGN, "union", UNION, ! "short", SHORT, "auto", AUTO, "extern", EXTERN, *** /tmp/,RCSt1022392 Sun Jul 27 14:31:55 1986 --- c03.c Sun Jul 27 13:50:21 1986 *************** *** 94,99 case STRUCT: tptr->hstrp = strdec(ismos, cval); cval = STRUCT; case INT: case CHAR: case FLOAT: --- 94,102 ----- case STRUCT: tptr->hstrp = strdec(ismos, cval); cval = STRUCT; + case SHORT: + if(tkw == INT) + break; /* ignore "short" in "int short" */ case INT: case CHAR: case FLOAT: *************** *** 99,105 case FLOAT: case DOUBLE: types: ! if (tkw>=0) error("Type clash"); tkw = cval; break; --- 102,108 ----- case FLOAT: case DOUBLE: types: ! if (tkw>=0 && (tkw != SHORT || cval != INT)) error("Type clash"); tkw = cval; break; *************** *** 108,114 peeksym = o; if (isadecl==0) return(0); ! if (tkw<0) tkw = INT; if (skw==0) skw = blklev==0? DEFXTRN: AUTO; --- 111,117 ----- peeksym = o; if (isadecl==0) return(0); ! if (tkw<0 || tkw==SHORT) /* bug: allows "long short" */ tkw = INT; if (skw==0) skw = blklev==0? DEFXTRN: AUTO;