Annotation of researchv8dc/cmd/cyntax/cem/read.c, revision 1.1.1.1

1.1       root        1: #include       <errno.h>
                      2: #include       "cem.h"
                      3: #define        STD_OBJ 1
                      4: #include       "stdobj.h"
                      5: 
                      6: /*
                      7:  *     Read and load an object file.
                      8:  */
                      9: static void
                     10: read_obj(s, fd)
                     11: register char  *s;
                     12: register int   fd;
                     13: {
                     14:        register int    i;
                     15:        register long   sz;
                     16:        header          obj_header;
                     17:        static char     cmd[]   = CMD;
                     18:        static char     mac[]   = MAC;
                     19:        extern void     enter_types();
                     20:        extern void     enter_vars();
                     21:        extern void     install_strings();
                     22: 
                     23:        switch (read(fd, (char *)&obj_header, sizeof (header)))
                     24:        {
                     25:        case SYSERROR:
                     26:                fprintf(stderr, "%s: could not read ", my_name);
                     27:                fflush(stderr);
                     28:                perror(s);
                     29:                exit(1);
                     30: 
                     31:        case sizeof (header):
                     32:                break;
                     33: 
                     34:        default:
                     35:                fprintf(stderr, "%s: %s is not an object module\n", my_name, s);
                     36:                exit(1);
                     37:        }
                     38: 
                     39:        if (strncmp(obj_header.hd_cmd, cmd, CMD_SZ) != 0)
                     40:        {
                     41:                fprintf(stderr, "%s: %s is not an object module\n", my_name, s);
                     42:                exit(1);
                     43:        }
                     44: 
                     45:        if (strncmp(obj_header.hd_mac, mac, MAC_SZ) != 0)
                     46:        {
                     47:                fprintf(stderr, "%s: version mismatch for %s (recompile)\n", my_name, s);
                     48:                exit(1);
                     49:        }
                     50: 
                     51:        if (obj_header.hd_type_size == 0)
                     52:        {
                     53:                fprintf(stderr, "%s: %s has compilation errors\n", my_name, s);
                     54:                exit(1);
                     55:        }
                     56: 
                     57:        sz = obj_header.hd_str_off + obj_header.hd_str_size - sizeof (header);
                     58:        data_base = salloc(sz);
                     59:        str_base = data_base + obj_header.hd_str_off - sizeof (header) - 1;
                     60: 
                     61:        if ((i = read(fd, data_base, (int)sz)) != sz)
                     62:        {
                     63:                if (i == SYSERROR)
                     64:                {
                     65:                        fprintf(stderr, "%s: could not read ", my_name);
                     66:                        fflush(stderr);
                     67:                        perror(s);
                     68:                }
                     69:                else
                     70:                        fprintf(stderr, "%s: %s is too small\n", my_name, s);
                     71: 
                     72:                exit(1);
                     73:        }
                     74: 
                     75: #if    DEBUG
                     76:        if (debug)
                     77:        {
                     78:                register char   *id;
                     79:                register long   l0;
                     80:                register long   l1;
                     81:                register long   l2;
                     82: 
                     83:                data_ptr = data_base;
                     84:                data_end = data_base + obj_header.hd_str_off - sizeof (header);
                     85:                type_index = 1;
                     86:                var_index = 1;
                     87:                str_num = 0;
                     88: 
                     89:                while (data_ptr < data_end)
                     90:                {
                     91:                        i = getd();
                     92: 
                     93:                        switch (obj_item(i))
                     94:                        {
                     95:                        case i_data:
                     96:                                l0 = getv();
                     97:                                l1 = getv();
                     98:                                printf("data: var %ld (%s:%ld)\n", l0, &str_base[l1], getv());
                     99: 
                    100:                                loop
                    101:                                {
                    102:                                        i = getd();
                    103: 
                    104:                                        switch (obj_item(i))
                    105:                                        {
                    106:                                        case d_addr:
                    107:                                                printf("\taddr var %ld for %ld\n", get4(), obj_id(i));
                    108:                                                continue;
                    109: 
                    110:                                        case d_bytes:
                    111:                                                if (obj_id(i) == 0)
                    112:                                                        l0 = getv();
                    113:                                                else
                    114:                                                        l0 = obj_id(i);
                    115: 
                    116:                                                printf("\tbytes %ld\n", l0);
                    117:                                                data_ptr += l0;
                    118:                                                continue;
                    119: 
                    120:                                        case d_end:
                    121:                                                printf("\tend\n");
                    122:                                                break;
                    123: 
                    124:                                        case d_istring:
                    125:                                                if (obj_id(i) == 0)
                    126:                                                        l0 = getv();
                    127:                                                else
                    128:                                                        l0 = obj_id(i);
                    129: 
                    130:                                                data_ptr += l0;
                    131:                                                printf("\tstring %ld, length %ld\n", str_num++, l0);
                    132:                                                continue;
                    133: 
                    134:                                        case d_irstring:
                    135:                                                if (obj_id(i) == 0)
                    136:                                                        l0 = getv();
                    137:                                                else
                    138:                                                        l0 = obj_id(i);
                    139: 
                    140:                                                data_ptr += l0;
                    141:                                                printf("\tstring %ld + %ld, length %ld\n", str_num++, get4(), l0);
                    142:                                                continue;
                    143: 
                    144:                                        case d_space:
                    145:                                                printf("\tspace %ld\n", obj_id(i) == 0 ? getv() : obj_id(i));
                    146:                                                continue;
                    147: 
                    148:                                        case d_string:
                    149:                                                printf("\tstring %ld\n", getv());
                    150:                                                continue;
                    151: 
                    152:                                        case d_reloc:
                    153:                                                l0 = getv();
                    154:                                                printf("\treloc var %ld + %ld for %ld\n", l0, get4(), obj_id(i));
                    155:                                                continue;
                    156: 
                    157:                                        case d_rstring:
                    158:                                                l0 = getv();
                    159:                                                printf("\tstring %ld + %ld\n", l0, get4());
                    160:                                                continue;
                    161: 
                    162:                                        default:
                    163:                                                fprintf(stderr, "%s: unknown data id %d\n", my_name, i);
                    164:                                                exit(1);
                    165:                                        }
                    166: 
                    167:                                        break;
                    168:                                }
                    169: 
                    170:                                break;
                    171: 
                    172:                        case i_lib:
                    173:                                printf("lib: %s\n", &str_base[getv()]);
                    174:                                break;
                    175: 
                    176:                        case i_src:
                    177:                                printf("src: %s\n", &str_base[getv()]);
                    178:                                break;
                    179: 
                    180:                        case i_string:
                    181:                                if (obj_id(i) == 0)
                    182:                                        l0 = getv();
                    183:                                else
                    184:                                        l0 = obj_id(i);
                    185: 
                    186:                                printf("string %ld, length %ld\n", str_num++, l0);
                    187:                                data_ptr += l0;
                    188:                                break;
                    189: 
                    190:                        case i_type:
                    191:                                printf("type ");
                    192: 
                    193:                                switch (obj_id(i))
                    194:                                {
                    195:                                case t_arrayof:
                    196:                                        l0 = getv();
                    197:                                        l1 = getv();
                    198:                                        printf("%ld: array %ld of %ld\n", type_index++, l0, l1);
                    199:                                        break;
                    200: 
                    201:                                case t_basetype:
                    202:                                        printf("%ld: ", type_index++);
                    203:                                        print_basetype(getd() & 0xFF);
                    204:                                        printf("\n");
                    205:                                        break;
                    206: 
                    207:                                case t_bitfield:
                    208:                                        l0 = getv();
                    209:                                        l1 = getv();
                    210:                                        printf("%ld: bitfield %ld of %ld\n", type_index++, l0, l1);
                    211:                                        break;
                    212: 
                    213:                                case t_dimless:
                    214:                                        printf("%ld: array [] of %ld\n", type_index++, getv());
                    215:                                        break;
                    216: 
                    217:                                case t_elaboration:
                    218:                                        l0 = getv();
                    219:                                        l1 = getv();
                    220:                                        printf("elab %ld: (%s:%ld) ", l0, &str_base[l1], getv());
                    221:                                        
                    222:                                        switch (i = obj_id(getd()))
                    223:                                        {
                    224:                                        case t_enum:
                    225:                                                printf("enum\n");
                    226:                                                l0 = getv();
                    227:                                                goto elab_enum;
                    228: 
                    229:                                        case t_structof:
                    230:                                                printf("struct\n");
                    231:                                                l0 = getv();
                    232: 
                    233:                                                do
                    234:                                                {
                    235:                                                        l1 = getv();
                    236:                                                        printf("\t%s = %ld @ %ld\n", &str_base[l0], l1, getv());
                    237:                                                        l0 = getv();
                    238:                                                }
                    239:                                                while (l0 != 0);
                    240: 
                    241:                                                printf("\t(%ld)\n", getv());
                    242:                                                break;
                    243: 
                    244:                                        case t_unionof:
                    245:                                                printf("union\n");
                    246:                                                l0 = getv();
                    247: 
                    248:                                                do
                    249:                                                {
                    250:                                                        l1 = getv();
                    251:                                                        printf("\t%s = %ld\n", &str_base[l0], l1);
                    252:                                                        l0 = getv();
                    253:                                                }
                    254:                                                while (l0 != 0);
                    255: 
                    256:                                                printf("\t(%ld)\n", getv());
                    257:                                                break;
                    258: 
                    259:                                        default:
                    260:                                                fprintf(stderr, "%s: unknown elaboration id %d\n", my_name, i);
                    261:                                                exit(1);
                    262:                                        }
                    263: 
                    264:                                        break;
                    265: 
                    266:                                case t_enum:
                    267:                                        printf("%ld: ", type_index++);
                    268: 
                    269:                                        if ((l0 = getv()) == 0)
                    270:                                                id = "<anon>";
                    271:                                        else
                    272:                                                id = &str_base[l0];
                    273: 
                    274:                                        l0 = getv();
                    275:                                        l1 = getv();
                    276: 
                    277:                                        printf("enum %s (%s:%ld)\n", id, &str_base[l0], l1);
                    278: 
                    279:                                        if ((l0 = getv()) == 0)
                    280:                                        {
                    281:                                                printf("\tforward\n");
                    282:                                                break;
                    283:                                        }
                    284: 
                    285:                                elab_enum:
                    286:                                        do
                    287:                                        {
                    288:                                                l1 = getu();
                    289:                                                printf("\t%s = %ld\n", &str_base[l0], l1);
                    290:                                                l0 = getv();
                    291:                                        }
                    292:                                        while (l0 != 0);
                    293: 
                    294:                                        l0 = getu();
                    295:                                        l1 = getu();
                    296: 
                    297:                                        printf("\t(%ld, %ld)\n", l0, l1);
                    298:                                        break;
                    299: 
                    300:                                case t_ftnreturning:
                    301:                                        printf("%ld: function returning %ld\n", type_index++, getv());
                    302:                                        break;
                    303: 
                    304:                                case t_ptrto:
                    305:                                        printf("%ld: pointer to %ld\n", type_index++, getv());
                    306:                                        break;
                    307: 
                    308:                                case t_structof:
                    309:                                        printf("%ld: ", type_index++);
                    310: 
                    311:                                        if ((l0 = getv()) == 0)
                    312:                                                id = "<anon>";
                    313:                                        else
                    314:                                                id = &str_base[l0];
                    315: 
                    316:                                        l0 = getv();
                    317:                                        l1 = getv();
                    318: 
                    319:                                        printf("struct %s (%s:%ld)\n", id, &str_base[l0], l1);
                    320:                                        break;
                    321: 
                    322:                                case t_unionof:
                    323:                                        printf("%ld: ", type_index++);
                    324: 
                    325:                                        if ((l0 = getv()) == 0)
                    326:                                                id = "<anon>";
                    327:                                        else
                    328:                                                id = &str_base[l0];
                    329: 
                    330:                                        l0 = getv();
                    331:                                        l1 = getv();
                    332: 
                    333:                                        printf("union %s (%s:%ld)\n", id, &str_base[l0], l1);
                    334:                                        break;
                    335: 
                    336:                                default:
                    337:                                        fprintf(stderr, "%s: unknown type id %d\n", my_name, obj_id(i));
                    338:                                        exit(1);
                    339:                                }
                    340: 
                    341:                                break;
                    342: 
                    343:                        case i_var:
                    344:                                printf("var ");
                    345: 
                    346:                                switch (obj_id(i))
                    347:                                {
                    348:                                case v_arglist:
                    349:                                        l0 = getv();
                    350:                                        l1 = getv();
                    351:                                        printf("arglist: %ld (%s:%ld)\n", l0, &str_base[l1], getv());
                    352: 
                    353:                                        while ((l0 = getv()) != 0)
                    354:                                        {
                    355:                                                l1 = getv();
                    356:                                                l2 = getv();
                    357:                                                printf("\t%ld: %s type %ld (%s:%ld)\n", var_index++, &str_base[l0], l1, &str_base[l2], getv());
                    358:                                        }
                    359: 
                    360:                                        break;
                    361: 
                    362:                                case v_array_size:
                    363:                                        l0 = getv();
                    364:                                        printf("array %ld new type %ld\n", l0, getv());
                    365:                                        break;
                    366: 
                    367:                                case v_auto:
                    368:                                        id = "auto";
                    369:                                        goto get_var;
                    370: 
                    371:                                case v_block_static:
                    372:                                        id = "block static";
                    373:                                        goto get_var;
                    374: 
                    375:                                case v_call:
                    376:                                        l0 = getv();
                    377:                                        l1 = getv();
                    378:                                        printf("call: var %ld (%s:%ld)\n", l0, &str_base[l1], getv());
                    379: 
                    380:                                        while ((l0 = getv()) != 0)
                    381:                                                printf("\ttype %ld\n", l0);
                    382: 
                    383:                                        break;
                    384: 
                    385:                                case v_global:
                    386:                                        id = "global";
                    387:                                        goto get_var;
                    388: 
                    389:                                case v_implicit_function:
                    390:                                        id = "implicit()";
                    391:                                        goto get_var;
                    392: 
                    393:                                case v_static:
                    394:                                        id = "static";
                    395:                                        goto get_var;
                    396: 
                    397:                                get_var:
                    398:                                        l0 = getv();
                    399:                                        l1 = getv();
                    400:                                        l2 = getv();
                    401:                                        printf("%ld: %s %s type %ld (%s:%ld)\n", var_index++, id, &str_base[l0], l1, &str_base[l2], getv());
                    402:                                        break;
                    403: 
                    404:                                case v_varargs:
                    405:                                        l0 = getv();
                    406:                                        printf("%ld: varargs %ld\n", l0, getv());
                    407:                                        break;
                    408: 
                    409:                                default:
                    410:                                        fprintf(stderr, "%s: unknown var id %d\n", my_name, obj_id(i));
                    411:                                        exit(1);
                    412:                                }
                    413: 
                    414:                                break;
                    415: 
                    416:                        default:
                    417:                                fprintf(stderr, "%s: unknown obj_item %d\n", my_name, obj_item(i));
                    418:                                exit(1);
                    419:                        }
                    420:                }
                    421: 
                    422:                fflush(stdout);
                    423:        }
                    424: #endif DEBUG
                    425: 
                    426:        file_errors = 0;
                    427:        install_strings(str_base + 1, obj_header.hd_str_size);
                    428: 
                    429:        type_index = 1;
                    430:        data_ptr = data_base;
                    431:        data_end = data_base + obj_header.hd_str_off - sizeof (header);
                    432:        enter_types(obj_header.hd_type_size);
                    433: 
                    434:        str_num = 0;
                    435:        var_index = 1;
                    436:        data_ptr = data_base;
                    437:        data_end = data_base + obj_header.hd_str_off - sizeof (header);
                    438:        enter_vars(obj_header.hd_var_size);
                    439: 
                    440:        free((char *)str_trans);
                    441:        free((char *)type_trans);
                    442:        free((char *)var_trans);
                    443:        free(data_base);
                    444:        src_file = NULL;
                    445: 
                    446:        if (file_errors)
                    447:                fflush(stdout);
                    448: }
                    449: 
                    450: /*
                    451:  *     Open a library and load it.
                    452:  */
                    453: void
                    454: load_lib(l)
                    455: char   *l;
                    456: {
                    457:        register int    fd;
                    458:        register char   *s;
                    459:        extern int      errno;
                    460:        extern char     *strcat();
                    461:        extern char     *strcpy();
                    462: 
                    463:        s = salloc(strlen(LIB_PATH) + strlen(l) + 1L);
                    464:        (void)strcat(strcpy(s, LIB_PATH), l);
                    465: 
                    466:        if ((fd = open(s, 0)) == SYSERROR)
                    467:        {
                    468:                if (errno == ENOENT)
                    469:                        fprintf(stderr, "%s: no library '-l%s'\n", my_name, l);
                    470:                else
                    471:                {
                    472:                        fprintf(stderr, "%s: could not open ", my_name);
                    473:                        fflush(stderr);
                    474:                        perror(s);
                    475:                }
                    476: 
                    477:                exit(1);
                    478:        }
                    479: 
                    480:        read_obj(s, fd);
                    481:        free(s);
                    482:        (void)close(fd);
                    483: }
                    484: 
                    485: /*
                    486:  *     Open an object file and load it.
                    487:  */
                    488: void
                    489: load_obj(s)
                    490: register char  *s;
                    491: {
                    492:        register int    fd;
                    493: 
                    494:        if ((fd = open(s, 0)) == SYSERROR)
                    495:        {
                    496:                fprintf(stderr, "%s: could not open ", my_name);
                    497:                fflush(stderr);
                    498:                perror(s);
                    499:                exit(1);
                    500:        }
                    501: 
                    502:        read_obj(s, fd);
                    503:        (void)close(fd);
                    504: }

unix.superglobalmegacorp.com

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