some changes to make smaller
authorceriel <none@none>
Thu, 21 May 1987 09:37:28 +0000 (09:37 +0000)
committerceriel <none@none>
Thu, 21 May 1987 09:37:28 +0000 (09:37 +0000)
lang/m2/comp/cstoper.c
lang/m2/comp/desig.c
lang/m2/comp/enter.c
lang/m2/comp/main.c
lang/m2/comp/options.c
lang/m2/comp/tmpvar.C

index 97b2b36..a02cb38 100644 (file)
@@ -332,27 +332,29 @@ cstset(expp)
                        }
                        expp->nd_class = Value;
                        expp->nd_symb = INTEGER;
-                       if (expp->nd_left->nd_set) {
-                               free((char *) expp->nd_left->nd_set);
-                       }
-                       if (expp->nd_right->nd_set) {
-                               free((char *) expp->nd_right->nd_set);
-                       }
-                       FreeNode(expp->nd_left);
-                       FreeNode(expp->nd_right);
-                       expp->nd_left = expp->nd_right = 0;
+                       freesets(expp);
                        return;
                default:
                        crash("(cstset)");
                }
-               if (expp->nd_right->nd_set) {
-                       free((char *) expp->nd_right->nd_set);
-               }
-               if (expp->nd_left->nd_set) {
-                       free((char *) expp->nd_left->nd_set);
-               }
+               freesets(expp);
                expp->nd_class = Set;
                expp->nd_set = resultset;
+               return;
+       }
+       FreeNode(expp->nd_left);
+       FreeNode(expp->nd_right);
+       expp->nd_left = expp->nd_right = 0;
+}
+
+freesets(expp)
+       register struct node *expp;
+{
+       if (expp->nd_right->nd_set) {
+               free((char *) expp->nd_right->nd_set);
+       }
+       if (expp->nd_left->nd_set) {
+               free((char *) expp->nd_left->nd_set);
        }
        FreeNode(expp->nd_left);
        FreeNode(expp->nd_right);
index 63da024..4d1635a 100644 (file)
 extern int     proclevel;
 struct desig   InitDesig = {DSG_INIT, 0, 0};
 
+int    C_ste_dnam(), C_sde_dnam(), C_loe_dnam(), C_lde_dnam();
+int    C_stl(), C_sdl(), C_lol(), C_ldl();
+
+#define WRD    0
+#define DWRD   1
+#define LD     0
+#define STR    1
+
+static int (*lcl_ld_and_str[2][2])() = {
+{ C_lol, C_stl },
+{ C_ldl, C_sdl }
+};
+
+static int (*ext_ld_and_str[2][2])() = {
+{ C_loe_dnam, C_ste_dnam },
+{ C_lde_dnam, C_sde_dnam }
+};
+
+int
+DoLoadOrStore(ds, size, LoadOrStoreFlag)
+       register struct desig *ds;
+{
+       int sz;
+
+       if (ds->dsg_offset % word_size != 0) return 0;
+
+       if (size == word_size) sz = WRD;
+       else if (size == dword_size) sz = DWRD;
+       else return 0;
+
+       if (ds->dsg_name) {
+               (*(ext_ld_and_str[sz][LoadOrStoreFlag]))(ds->dsg_name, ds->dsg_offset);
+       }
+       else {
+               (*(lcl_ld_and_str[sz][LoadOrStoreFlag]))(ds->dsg_offset);
+       }
+       return 1;
+}
+
 STATIC int
 properly(ds, size, al)
        register struct desig *ds;
@@ -73,23 +112,7 @@ CodeValue(ds, size, al)
                break;
 
        case DSG_FIXED:
-               if (ds->dsg_offset % word_size == 0) {  
-                       if (size == word_size) {
-                               if (ds->dsg_name) {
-                                       C_loe_dnam(ds->dsg_name,ds->dsg_offset);
-                               }
-                               else    C_lol(ds->dsg_offset);
-                               break;
-                       }
-       
-                       if (size == dword_size) {
-                               if (ds->dsg_name) {
-                                       C_lde_dnam(ds->dsg_name,ds->dsg_offset);
-                               }
-                               else    C_ldl(ds->dsg_offset);
-                               break;
-                       }
-               }
+               if (DoLoadOrStore(ds, size, LD)) break;
                /* Fall through */
        case DSG_PLOADED:
        case DSG_PFIXED:
@@ -138,23 +161,7 @@ CodeStore(ds, size, al)
        save = *ds;
        switch(ds->dsg_kind) {
        case DSG_FIXED:
-               if (ds->dsg_offset % word_size == 0) {
-                       if (size == word_size) {
-                               if (ds->dsg_name) {
-                                       C_ste_dnam(ds->dsg_name,ds->dsg_offset);
-                               }
-                               else    C_stl(ds->dsg_offset);
-                               break;
-                       }
-
-                       if (size == dword_size) {
-                               if (ds->dsg_name) {
-                                       C_sde_dnam(ds->dsg_name,ds->dsg_offset);
-                               }
-                               else    C_sdl(ds->dsg_offset);
-                               break;
-                       }
-               }
+               if (DoLoadOrStore(ds, size, STR)) break;
                /* Fall through */
        case DSG_PLOADED:
        case DSG_PFIXED:
@@ -343,11 +350,7 @@ CodeAddress(ds)
                break;
                
        case DSG_PFIXED:
-               if (ds->dsg_name) {
-                       C_loe_dnam(ds->dsg_name,ds->dsg_offset);
-                       break;
-               }
-               C_lol(ds->dsg_offset);
+               DoLoadOrStore(ds, word_size, LD);
                break;
 
        case DSG_INDEXED:
index 019eadc..1e3326a 100644 (file)
@@ -43,6 +43,17 @@ Enter(name, kind, type, pnam)
        return df;
 }
 
+EnterType(name, type)
+       char *name;
+       struct type *type;
+{
+       /*      Enter a type definition for "name"  and type
+               "type" in the Current Scope.
+       */
+
+       Enter(name, D_TYPE, type, 0);
+}
+
 EnterEnumList(Idlist, type)
        struct node *Idlist;
        register struct type *type;
index 9019d63..0c76c65 100644 (file)
@@ -148,49 +148,58 @@ LexScan()
 }
 #endif
 
+static struct stdproc {
+       char *st_nam;
+       int  st_con;
+} stdproc[] = {
+       { "ABS",        S_ABS },
+       { "CAP",        S_CAP },
+       { "CHR",        S_CHR },
+       { "FLOAT",      S_FLOAT },
+       { "HIGH",       S_HIGH },
+       { "HALT",       S_HALT },
+       { "EXCL",       S_EXCL },
+       { "DEC",        S_DEC },
+       { "INC",        S_INC },
+       { "VAL",        S_VAL },
+       { "NEW",        S_NEW },
+       { "DISPOSE",    S_DISPOSE },
+       { "TRUNC",      S_TRUNC },
+       { "SIZE",       S_SIZE },
+       { "ORD",        S_ORD },
+       { "ODD",        S_ODD },
+       { "MAX",        S_MAX },
+       { "MIN",        S_MIN },
+       { "INCL",       S_INCL },
+       { 0,            0 }
+};
+
+extern struct def *Enter();
+
 AddStandards()
 {
        register struct def *df;
-       extern struct def *Enter();
+       register struct stdproc *p;
        static struct node nilnode = { 0, 0, Value, 0, { INTEGER, 0}};
 
-       Enter("ABS", D_PROCEDURE, std_type, S_ABS);
-       Enter("CAP", D_PROCEDURE, std_type, S_CAP);
-       Enter("CHR", D_PROCEDURE, std_type, S_CHR);
-       Enter("FLOAT", D_PROCEDURE, std_type, S_FLOAT);
-       Enter("HIGH", D_PROCEDURE, std_type, S_HIGH);
-       Enter("HALT", D_PROCEDURE, std_type, S_HALT);
-       Enter("EXCL", D_PROCEDURE, std_type, S_EXCL);
-       Enter("DEC", D_PROCEDURE, std_type, S_DEC);
-       Enter("INC", D_PROCEDURE, std_type, S_INC);
-       Enter("VAL", D_PROCEDURE, std_type, S_VAL);
-       Enter("NEW", D_PROCEDURE, std_type, S_NEW);
-       Enter("DISPOSE", D_PROCEDURE, std_type, S_DISPOSE);
-       Enter("TRUNC", D_PROCEDURE, std_type, S_TRUNC);
-       Enter("SIZE", D_PROCEDURE, std_type, S_SIZE);
-       Enter("ORD", D_PROCEDURE, std_type, S_ORD);
-       Enter("ODD", D_PROCEDURE, std_type, S_ODD);
-       Enter("MAX", D_PROCEDURE, std_type, S_MAX);
-       Enter("MIN", D_PROCEDURE, std_type, S_MIN);
-       Enter("INCL", D_PROCEDURE, std_type, S_INCL);
-
-       Enter("CHAR", D_TYPE, char_type, 0);
-       Enter("INTEGER", D_TYPE, int_type, 0);
-       Enter("LONGINT", D_TYPE, longint_type, 0);
-       Enter("REAL", D_TYPE, real_type, 0);
-       Enter("LONGREAL", D_TYPE, longreal_type, 0);
-       Enter("BOOLEAN", D_TYPE, bool_type, 0);
-       Enter("CARDINAL", D_TYPE, card_type, 0);
+       for (p = stdproc; p->st_nam != 0; p++) {
+               Enter(p->st_nam, D_PROCEDURE, std_type, p->st_con);
+       }
+
+       EnterType("CHAR", char_type);
+       EnterType("INTEGER", int_type);
+       EnterType("LONGINT", longint_type);
+       EnterType("REAL", real_type);
+       EnterType("LONGREAL", longreal_type);
+       EnterType("BOOLEAN", bool_type);
+       EnterType("CARDINAL", card_type);
        df = Enter("NIL", D_CONST, address_type, 0);
        df->con_const = &nilnode;
        nilnode.nd_INT = 0;
        nilnode.nd_type = address_type;
 
-       Enter("PROC",
-                    D_TYPE,
-                    construct_type(T_PROCEDURE, NULLTYPE),
-                    0);
-       df = Enter("BITSET", D_TYPE, bitset_type, 0);
+       EnterType("PROC", construct_type(T_PROCEDURE, NULLTYPE));
+       EnterType("BITSET", bitset_type);
        df = Enter("TRUE", D_ENUM, bool_type, 0);
        df->enm_val = 1;
        df->enm_next = Enter("FALSE", D_ENUM, bool_type, 0);
@@ -206,9 +215,9 @@ do_SYSTEM()
        static char systemtext[] = SYSTEMTEXT;
 
        open_scope(CLOSEDSCOPE);
-       Enter("WORD", D_TYPE, word_type, 0);
-       Enter("BYTE", D_TYPE, byte_type, 0);
-       Enter("ADDRESS", D_TYPE, address_type, 0);
+       EnterType("WORD", word_type);
+       EnterType("BYTE", byte_type);
+       EnterType("ADDRESS",address_type);
        Enter("ADR", D_PROCEDURE, std_type, S_ADR);
        Enter("TSIZE", D_PROCEDURE, std_type, S_TSIZE);
        if (!InsertText(systemtext, sizeof(systemtext) - 1)) {
index 1742061..57e710f 100644 (file)
@@ -141,12 +141,14 @@ DoOption(text)
 
        case 'V' :      /* set object sizes and alignment requirements  */
        {
-               arith size;
-               int align;
+               register arith size;
+               register int align;
                char c;
                char *t;
 
                while (c = *text++)     {
+                       char *strindex();
+
                        t = text;
                        size = txt2int(&t);
                        align = 0;
@@ -155,44 +157,60 @@ DoOption(text)
                                align = txt2int(&t);
                                text = t;
                        }
-                       switch (c)      {
+                       if (! strindex("wislfdpS", c)) {
+                               error("-V: bad type indicator %c\n", c);
+                       }
+                       if (size != 0) switch (c)       {
 
                        case 'w':       /* word         */
-                               if (size != (arith)0) {
-                                       word_size = size;
-                                       dword_size = 2 * size;
-                               }
-                               if (align != 0) word_align = align;
+                               word_size = size;
+                               dword_size = 2 * size;
                                break;
                        case 'i':       /* int          */
-                               if (size != (arith)0) int_size = size;
-                               if (align != 0) int_align = align;
+                               int_size = size;
                                break;
                        case 's':       /* short (subranges) */
-                               if (size != 0) short_size = size;
-                               if (align != 0) short_align = align;
+                               short_size = size;
                                break;
                        case 'l':       /* longint      */
-                               if (size != (arith)0) long_size = size;
-                               if (align != 0) long_align = align;
+                               long_size = size;
                                break;
                        case 'f':       /* real         */
-                               if (size != (arith)0) float_size = size;
-                               if (align != 0) float_align = align;
+                               float_size = size;
                                break;
                        case 'd':       /* longreal     */
-                               if (size != (arith)0) double_size = size;
-                               if (align != 0) double_align = align;
+                               double_size = size;
                                break;
                        case 'p':       /* pointer      */
-                               if (size != (arith)0) pointer_size = size;
-                               if (align != 0) pointer_align = align;
+                               pointer_size = size;
+                               break;
+                       }
+                       if (align != 0) switch (c)      {
+
+                       case 'w':       /* word         */
+                               word_align = align;
+                               break;
+                       case 'i':       /* int          */
+                               int_align = align;
+                               break;
+                       case 's':       /* short (subranges) */
+                               short_align = align;
+                               break;
+                       case 'l':       /* longint      */
+                               long_align = align;
+                               break;
+                       case 'f':       /* real         */
+                               float_align = align;
+                               break;
+                       case 'd':       /* longreal     */
+                               double_align = align;
+                               break;
+                       case 'p':       /* pointer      */
+                               pointer_align = align;
                                break;
                        case 'S':       /* initial record alignment     */
-                               if (align != (arith)0) struct_align = align;
+                               struct_align = align;
                                break;
-                       default:
-                               error("-V: bad type indicator %c\n", c);
                        }
                }
                break;
index 009a749..74f5915 100644 (file)
@@ -59,64 +59,61 @@ TmpSpace(sz, al)
        return sc->sc_off;
 }
 
-arith
-NewInt()
+STATIC arith
+NewTmp(plist, sz, al, regtype)
+       struct tmpvar **plist;
+       arith sz;
 {
        register arith offset;
        register struct tmpvar *tmp;
 
-       if (!TmpInts) {
-               offset = TmpSpace(int_size, int_align);
-               if (! options['n']) C_ms_reg(offset, int_size, reg_any, 0);
+       if (!*plist) {
+               offset = TmpSpace(sz, al);
+               if (! options['n']) C_ms_reg(offset, sz, regtype, 0);
        }
        else {
-               tmp = TmpInts;
+               tmp = *plist;
                offset = tmp->t_offset;
-               TmpInts = tmp->next;
+               *plist = tmp->next;
                free_tmpvar(tmp);
        }
        return offset;
 }
 
 arith
-NewPtr()
+NewInt()
 {
-       register arith offset;
-       register struct tmpvar *tmp;
+       return NewTmp(&TmpInts, int_size, int_align, reg_any);
+}
 
-       if (!TmpPtrs) {
-               offset = TmpSpace(pointer_size, pointer_align);
-               if (! options['n']) C_ms_reg(offset, pointer_size, reg_pointer, 0);
-       }
-       else {
-               tmp = TmpPtrs;
-               offset = tmp->t_offset;
-               TmpPtrs = tmp->next;
-               free_tmpvar(tmp);
-       }
-       return offset;
+arith
+NewPtr()
+{
+       return NewTmp(&TmpPtrs, pointer_size, pointer_align, reg_pointer);
 }
 
-FreeInt(off)
+STATIC
+FreeTmp(plist, off)
+       struct tmpvar **plist;
        arith off;
 {
-       register struct tmpvar *tmp;
+       register struct tmpvar *tmp = new_tmpvar();
 
-       tmp = new_tmpvar();
-       tmp->next = TmpInts;
+       tmp->next = *plist;
        tmp->t_offset = off;
-       TmpInts = tmp;
+       *plist = tmp;
 }
 
-FreePtr(off)
+FreeInt(off)
        arith off;
 {
-       register struct tmpvar *tmp;
+       FreeTmp(&TmpInts, off);
+}
 
-       tmp = new_tmpvar();
-       tmp->next = TmpPtrs;
-       tmp->t_offset = off;
-       TmpPtrs = tmp;
+FreePtr(off)
+       arith off;
+{
+       FreeTmp(&TmpPtrs, off);
 }
 
 TmpClose()