Annotation of 43BSD/contrib/xns/compiler/constantcode.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char RCSid[] = "$Header: constantcode.c,v 2.0 85/11/21 07:21:32 jqj Exp $";
                      3: #endif
                      4: 
                      5: /* $Log:       constantcode.c,v $
                      6:  * Revision 2.0  85/11/21  07:21:32  jqj
                      7:  * 4.3BSD standard release
                      8:  * 
                      9:  * Revision 1.4  85/05/23  06:19:32  jqj
                     10:  * *** empty log message ***
                     11:  * 
                     12:  * Revision 1.4  85/05/23  06:19:32  jqj
                     13:  * Public Beta-test version, released 24 May 1985
                     14:  * 
                     15:  * Revision 1.3  85/03/26  06:09:41  jqj
                     16:  * Revised public alpha-test version, released 26 March 1985
                     17:  * 
                     18:  * Revision 1.2  85/03/11  16:38:56  jqj
                     19:  * Public alpha-test version, released 11 March 1985
                     20:  * 
                     21:  * Revision 1.1  85/02/15  13:55:18  jqj
                     22:  * Initial revision
                     23:  * 
                     24:  */
                     25: 
                     26: /*
                     27:  * Generate code for constant declarations.
                     28:  */
                     29: 
                     30: #include "compiler.h"
                     31: 
                     32: /*
                     33:  * Generate code for constant declarations
                     34:  */
                     35: define_constant(name, typtr, value)
                     36:        struct object *name;
                     37:        struct type *typtr;
                     38:        struct constant *value;
                     39: {
                     40:        char *fullname;
                     41: 
                     42:        name->o_class = O_CONSTANT;
                     43:        name->o_constant = value;
                     44:        fullname = make_full_name( name->o_module,
                     45:                                name->o_modversion, name_of(name));
                     46:        /*
                     47:         * Check for simple case of Foo: TypeBaz = Mumble;
                     48:         * where Mumble is another constant.  In this case,
                     49:         * just use the existing declaration
                     50:         */
                     51:        if (value->cn_name != NULL) {
                     52:                if (!recursive_flag) {
                     53:                        fprintf(header,"#define %s %s\n",
                     54:                                fullname, value->cn_name);
                     55:                        /* open scope */
                     56:                        fprintf(header1,"#define %s %s\n",
                     57:                                name_of(name), value->cn_name);
                     58:                }
                     59:                return;
                     60:        }
                     61:        /*
                     62:         * We have to generate some code for this one.  We'll generate
                     63:         * the declaration in the header file of a static variable
                     64:         * initialized to the appropriate values.
                     65:         */
                     66:        value->cn_name = fullname;
                     67:        if (recursive_flag)
                     68:                return;         /* it's already been expanded elsewhere */
                     69:        /* open scope */
                     70:        fprintf(header1,"#define %s %s\n", name_of(name), fullname);
                     71:        /* make sure the type is defined */
                     72:        if (typename(typtr) == NULL) {
                     73:                /* create an anonymous (not in symboltable) type and subtypes */
                     74:                char * typenam;
                     75:                typenam = gensym("T_cn");
                     76:                code_type(typenam, typtr);
                     77:                typename(typtr) = typenam;
                     78:                }
                     79:        /* depending on the type, generate appropriate initializer */
                     80:        switch (typtr->type_constr) {
                     81:        case C_PROCEDURE:
                     82:                define_procedure_constant(name, typtr, value);
                     83:                break;
                     84:        case C_ERROR:
                     85:                define_error_constant(name, typtr, value);
                     86:                break;
                     87:        case C_NUMERIC:
                     88:        case C_BOOLEAN:
                     89:        case C_STRING:
                     90:        case C_ENUMERATION:
                     91:                /* these are simple, since they can't include sequences */
                     92:                fprintf(header, "\nstatic %s %s = {%s};\n",
                     93:                        typename(typtr), value->cn_name, value->cn_value);
                     94:                break;
                     95:        default:
                     96:                /* the general case */
                     97:                scan_for_sequences(typtr, value);       /* kludge */
                     98:                fprintf(header, "\nstatic %s %s = ",
                     99:                                typename(typtr), value->cn_name);
                    100:                code_constant(typtr, value);
                    101:                fprintf(header,";\n");
                    102:                break;
                    103:        }
                    104:        return;
                    105: }
                    106: 
                    107: 
                    108: /*
                    109:  * Generate client and server code for error constants
                    110:  */
                    111: define_error_constant(symbol,typtr,value)
                    112:        struct object *symbol;
                    113:        struct type *typtr;
                    114:        struct constant *value;
                    115: {
                    116:        char *errvalue;
                    117: 
                    118:        if (recursive_flag)
                    119:                return;         /* can't happen */
                    120:        if (typtr->type_constr != C_ERROR)
                    121:                error(FATAL, "internal error (define_error_constant): not an error");
                    122:        if (value->cn_constr != C_NUMERIC) {
                    123:                error(ERROR,"Values of ERRORs must be numeric");
                    124:                errvalue = "-1";
                    125:        }
                    126:        else
                    127:                errvalue = value->cn_value;
                    128:        fprintf(header,"\n#define %s (ERROR_OFFSET+%s)\n\
                    129: #define %sArgs %s\n",
                    130:                        value->cn_name, errvalue,
                    131:                        value->cn_name, typename(typtr));
                    132:        fprintf(header1,"#define %sArgs %sArgs\n",
                    133:                        symbol->o_name, value->cn_name);
                    134:        value->cn_constr = C_ERROR;
                    135:        /* put this error in the constant's data structure */
                    136:        /* also store this error on the global list */
                    137:        if (typtr->type_list == NIL) {
                    138:                value->cn_list = cons((list) errvalue, NIL);
                    139:                Errors = cons( cons((list) value, NIL), Errors);
                    140:        }
                    141:        else {
                    142:                value->cn_list = cons((list) errvalue, (list) typtr);
                    143:                Errors = cons( cons((list) value, (list) typtr), Errors);
                    144:        }
                    145: }
                    146: 
                    147: /*
                    148:  * recursively generate the code for a constant
                    149:  */
                    150: code_constant(typtr, value)
                    151:        struct type *typtr;
                    152:        struct constant *value;
                    153: {
                    154:        switch (typtr->type_constr) {
                    155:        case C_NUMERIC:
                    156:        case C_BOOLEAN:
                    157:        case C_STRING:
                    158:        case C_ENUMERATION:
                    159:                if (value == (struct constant*) 0)
                    160:                  fprintf(header, "0");
                    161:                else
                    162:                  fprintf(header, "%s", value->cn_value);
                    163:                break;
                    164:        case C_ARRAY:
                    165:                code_array_constant(typtr,value);
                    166:                break;
                    167:        case C_SEQUENCE:
                    168:                code_sequence_constant(typtr,value);
                    169:                break;
                    170:        case C_RECORD:
                    171:                code_record_constant(typtr,value);
                    172:                break;
                    173:        case C_CHOICE:
                    174:                code_choice_constant(typtr,value);
                    175:                break;
                    176:        case C_ERROR:
                    177:                error(ERROR,"Error constants may not be part of a structure");
                    178:                break;
                    179:        case C_PROCEDURE:
                    180:                error(ERROR,"Procedures may not be part of a structure");
                    181:        }
                    182: }
                    183: 
                    184: /*
                    185:  * Given the name of a record field and a record constant, return
                    186:  * the corresponding component of the record constant.
                    187:  */
                    188: static struct constant *
                    189: findcomponent(name,recvalue)
                    190:        char *name;
                    191:        struct constant *recvalue;
                    192: {
                    193:        list p;
                    194: 
                    195:        if (recvalue->cn_constr != C_RECORD)
                    196:                error(FATAL,"internal error (findcomponent): constant is of type %d",
                    197:                        recvalue->cn_constr);
                    198:        for (p = recvalue->cn_list; p != NIL; p = cdr(p))
                    199:                if (streq((char *) caar(p), name))
                    200:                        return((struct constant *) cdar(p));
                    201:        return((struct constant *) 0);
                    202: }
                    203: 
                    204: 
                    205: /*
                    206:  * kludge since PCC doesn't like initializations of the form
                    207:  *   struct {int length; Seqtype *sequence} seq = {3,{1,2,3}};
                    208:  * instead, use:
                    209:  *   Seqtype anonymous[3] = {1,2,3};
                    210:  *   struct {int length; Seqtype *sequence} seq = {3,anonymous};
                    211:  * We have to generate the sequence value before we walk the constant.
                    212:  */
                    213: scan_for_sequences(typtr, value)
                    214:        struct type *typtr;
                    215:        struct constant *value;
                    216: {
                    217:        list p;
                    218: 
                    219:        switch (typtr->type_constr) {
                    220:        case C_ARRAY:
                    221:                for (p = value->cn_list; p != NIL; p = cdr(p))
                    222:                        scan_for_sequences(typtr->type_basetype, 
                    223:                                           (struct constant *) car(p));
                    224:                break;
                    225:        case C_RECORD:
                    226:                scan_record_for_sequences(typtr, value);
                    227:                break;
                    228:        case C_CHOICE:
                    229:                scan_choice_for_sequences(typtr, value);
                    230:                break;
                    231:        case C_SEQUENCE:
                    232:                for (p = value->cn_list; p != NIL; p = cdr(p))
                    233:                        scan_for_sequences(typtr->type_basetype, 
                    234:                                           (struct constant *) car(p));
                    235:                value->cn_seqvalname = gensym("S_v");
                    236:                fprintf(header,"\nstatic %s %s[%d] = {\n\t",
                    237:                        typename(typtr->type_basetype), value->cn_seqvalname,
                    238:                        length(value->cn_list));
                    239:                for (p = value->cn_list ; p != NIL ; p = cdr(p)) {
                    240:                        code_constant(typtr->type_basetype,
                    241:                                      (struct constant *) car(p));
                    242:                        if (cdr(p) != NIL)
                    243:                                fprintf(header,",\n\t");
                    244:                }
                    245:                fprintf(header,"\n};\n");
                    246:                break;
                    247:        default:        /* other types don't have embedded sequences */
                    248:                break;
                    249:        }
                    250: }
                    251: 
                    252: scan_record_for_sequences(typtr, value)
                    253:        struct type *typtr;
                    254:        struct constant *value;
                    255: {
                    256:        list p, q;
                    257:        struct constant *component;
                    258: 
                    259:        for (p = typtr->type_list; p != NIL; p = cdr(p)) {
                    260:                q = car(p);
                    261:                component = findcomponent((char *) caar(q),value);
                    262:                if (component != (struct constant *) 0)
                    263:                        scan_for_sequences((struct type *) cdr(q), component);
                    264:        }
                    265: }
                    266: 
                    267: /*ARGSUSED*/
                    268: scan_choice_for_sequences(typtr, value)
                    269:        struct type *typtr;
                    270:        struct constant *value;
                    271: {
                    272:        /* constants of type CHOICE are not implemented */
                    273: }
                    274: 
                    275: 
                    276: code_array_constant(typtr, value)
                    277:        struct type *typtr;
                    278:        struct constant *value;
                    279: {
                    280:        list p;
                    281:        int i;
                    282: 
                    283:        if (value == (struct constant *) 0) {
                    284:                fprintf(header,"{0");
                    285:                for (i = 1; i < typtr->type_size; i++)
                    286:                  fprintf(header,",0");
                    287:                fprintf(header,"}");
                    288:                return;
                    289:        }
                    290:        if (typtr->type_size != length(value->cn_list))
                    291:                error(WARNING,"wrong number of constant elements specified for array");
                    292:        fprintf(header,"\n\t{");
                    293:        for (p = value->cn_list; p != NIL; p = cdr(p)) {
                    294:                code_constant(typtr->type_basetype,(struct constant *) car(p));
                    295:                if (cdr(p) != NIL)
                    296:                        fprintf(header,",");
                    297:        }
                    298:        fprintf(header,"}");
                    299: }
                    300: 
                    301: code_choice_constant(typtr, value)
                    302:        struct type *typtr;
                    303:        struct constant *value;
                    304: {
                    305:        list p,q;
                    306:        struct type *bt;
                    307:        char *desigval;
                    308:        struct object *name;
                    309: 
                    310:        if (value == (struct constant *)0)
                    311:          desigval = "?";       /* caar(typtr->type_designator->type_list); */
                    312:        else
                    313:          desigval = (char *) car(value->cn_list);
                    314:        fprintf(header,"\n\t{ %s", desigval);
                    315:        /* find the corresponding arm of the choice */
                    316:        bt = TNIL;
                    317:        for (p = typtr->type_candidates; bt==TNIL && p!=NIL; p = cdr(p)) {
                    318:                for (q = caar(p); bt==TNIL && q!=NIL; q = cdr(q)) {
                    319:                        name = (struct object *) caar(q);
                    320:                        if (streq(name->o_enum->en_name,desigval))
                    321:                                bt = (struct type *) cdar(p);
                    322:                }
                    323:        }
                    324:        if (bt == TNIL)
                    325:                error(WARNING,"CHOICE designator %s is invalid here",desigval);
                    326:        else if (bt != NilRecord_type)
                    327:                error(WARNING,"Constants of type CHOICE are not supported");
                    328: 
                    329:        fprintf(header,"\n\t}");
                    330: }
                    331: 
                    332: code_sequence_constant(typtr, value)
                    333:        struct type *typtr;
                    334:        struct constant *value;
                    335: {
                    336:        list p;
                    337:        int l;
                    338: 
                    339:        if (value == (struct constant *)0 ||
                    340:            (p = value->cn_list) == NIL) {
                    341:                fprintf(header,"{0, 0}");
                    342:                return;
                    343:        }
                    344:        l = length(p);
                    345:        if (typtr->type_size < l)
                    346:                error(WARNING,"too many constant elements specified for sequence");
                    347:        fprintf(header,"{%d, %s}",l,value->cn_seqvalname);
                    348: }
                    349: 
                    350: code_record_constant(typtr, value)
                    351:        struct type *typtr;
                    352:        struct constant *value;
                    353: {
                    354:        list p, q;
                    355:        struct constant *component;
                    356: 
                    357:        fprintf(header,"{");
                    358:        for (p = typtr->type_list; p != NIL; p = cdr(p)) {
                    359:                q = car(p);
                    360:                if (value == (struct constant *) 0)
                    361:                  component = value;
                    362:                else
                    363:                  component = findcomponent((char *) caar(q), value);
                    364:                code_constant((struct type *) cdr(q), component);
                    365:                if (cdr(p) != NIL)
                    366:                        fprintf(header,",");
                    367:        }
                    368:        fprintf(header,"\n\t}");
                    369: }
                    370: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.