Annotation of researchv9/jerq/sgs/compress/pass1.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  *     static char ID_frs[] = "@(#)pass1.c     1.5 4/6/84";
                      3:  */
                      4: 
                      5: /*  program to remove duplicate structures and unions */
                      6: /*  2 pass process;  1st pass makes comparisons     2nd pass compresses,
                      7:  *  reading complete object file and redirecting pointers    
                      8:  */
                      9: 
                     10: #include <stdio.h>
                     11: #include "sdp.h"
                     12: #include "sdp1.h"
                     13: #include <signal.h>
                     14: #include "filehdr.h"
                     15: #include "syms.h"
                     16: #include "storclass.h"
                     17: #include "ldfcn.h"
                     18: #include "tagitem.h"
                     19: 
                     20: #define YES    1
                     21: #define NO     0
                     22: #define HASHSIZE       521
                     23: #define nmcmp(a,b)     !strcmp((a),(b))
                     24: 
                     25: 
                     26:        static int      sdp_call = 0; /* indicate if sdpinit called */
                     27:        static char     sdpname[sizeof(TMPDIR)+20] = "";
                     28:        static char buf[sizeof(sdpname)*2 + 20 ];
                     29:        static int              call = 0;
                     30:        char            tagname[sizeof(TMPDIR)+20] = "";
                     31:        static char  buf2[sizeof(tagname) * 2 + 20];
                     32: 
                     33: /*     TAGITEM is a chain containing information needed in 
                     34:  *     comparing various tags.  there are as many tagitems as there
                     35:  *     are union and structure 
                     36:  */
                     37: ITEMID hashtab[HASHSIZE];
                     38: 
                     39: 
                     40: 
                     41: 
                     42:                ldclose(),
                     43:                ldfhread(),
                     44:                ldohseek(),
                     45:                ldtbread(),
                     46:                ldtbseek();
                     47: 
                     48: ITEMID         ti_head,
                     49:                ti_end;
                     50: TAGITEM                *p;
                     51: 
                     52: 
                     53: LDFILE  *input;
                     54: 
                     55: /*  variable representing total # of entries removed    */
                     56: 
                     57: 
                     58: long   delsum = 0;
                     59: int     sbrk();
                     60: #define        ulimit(a)       1000000L
                     61: long   szecnt = 0;
                     62: struct SPACE *TAGSPACE;
                     63: struct  ENVIRON *ENV;
                     64: struct  SPACE *SYMSPACE;
                     65: int     pagesize=512;  /* the size of a page for sdp  */
                     66: int     framsz=4096;    /* the size of a frame for sdp  */
                     67: long   reserved;       /* the size of core excluded from sdp */
                     68: long    allocated;      /* amount of core used for sdp */
                     69: int     framect;
                     70: 
                     71: char   *str_table;     /* all names are copied to here for storage */
                     72: char   *str_next;      /* next available location in str_table */
                     73: char   *str_top;       /* last location in str_table */
                     74: 
                     75: /*  main opens object file and reads header info   
                     76:  */
                     77: 
                     78: int
                     79: frstpass(argv)
                     80: 
                     81: char *argv;
                     82: {
                     83:        extern char     *malloc();
                     84:        extern char     *keep_name();
                     85:        SYMENT          symbuf;
                     86:        AUXENT          auxbuf;
                     87:        extern long     tag_sum;
                     88:        extern int      vflag;
                     89:        extern int      pflag;
                     90:        long            nthis, nnext;
                     91:        int             aux;
                     92: 
                     93:        ti_head = 0L;
                     94:        if ( (input = ldopen(argv, NULL)) == NULL) {
                     95:                fprintf(stderr, "unable to open %s \n",argv);
                     96:                return(NO);
                     97:        }
                     98:        if (!(ISCOFF(HEADER(input).f_magic))) {
                     99:                fprintf(stderr, "%s has incorrect magic number\n", argv);
                    100:                return(NO);
                    101:        }
                    102: 
                    103:        if ( ldtbseek(input) == FAILURE) {
                    104:                if ( pflag > 0)
                    105:                        fprintf(stderr, "could not find symbol table\n");
                    106:                return(FAILURE);
                    107:        }
                    108:        nnext = 0;
                    109:        /* call subroutine to initialize SDP for symtab and Tag      */
                    110:        allocated = ulimit(3) - sbrk(0);
                    111:        allocated = (allocated > 1048576) ? 1048576 : allocated;
                    112:        reserved = ((reserved = allocated/10) > 8192) ? reserved : 8192;
                    113:        framect =(allocated - reserved) / framsz;
                    114:        if (framect < 2)
                    115:                {
                    116:                fprintf(stderr,"Insufficient core for sdp\n");
                    117:                return(NO);
                    118:                }
                    119:        free(malloc((unsigned) framect*(unsigned) framsz));
                    120:        if ((ENV=sdp_house(framect,framsz,NULL)) == NULL)
                    121:                {
                    122:                return(NO);
                    123:                }
                    124:        if (syminit() && taginit() == NO)
                    125:                return(NO);
                    126:        /*
                    127:        * get initial string table set up
                    128:        */
                    129:        if (init_strings() == FAILURE)
                    130:                return (FAILURE);
                    131:        while( nnext < HEADER(input).f_nsyms) {
                    132:                nthis = nnext;
                    133:                if ( ldtbread(input, nthis, &symbuf) == FAILURE){
                    134:                        if ( vflag > 0)
                    135:                                fprintf(stderr,"cannot read symbol with index %d\n", nthis);
                    136:                        return(NO);
                    137:                }
                    138:                if ( symbuf.n_numaux == 0)
                    139:                        nnext = nthis + 1;
                    140:                else {
                    141:                        nnext = nthis + symbuf.n_numaux + 1;
                    142:                        for ( aux = 0; aux < symbuf.n_numaux; aux++)
                    143:                                if ( fread(&auxbuf, AUXESZ, 1, IOPTR(input)) < 1) { 
                    144:                                        if ( vflag > 0)
                    145:                                                fprintf(stderr, "unable to read auxiliary entry\n");
                    146:                                        return(NO);
                    147:                                }
                    148:                }
                    149: 
                    150:                /*  after reading an entry check to see if it is a tag   */
                    151:                if (symbuf.n_sclass== C_STRTAG || symbuf.n_sclass == C_UNTAG) {
                    152:                        if ( symbuf.n_numaux != 0)
                    153:                                nnext = auxbuf.x_sym.x_fcnary.x_fcn.x_endndx;
                    154: 
                    155:                        if ((symbuf.n_nptr = keep_name(input, &symbuf)) == NULL)
                    156:                                return (FAILURE);
                    157:                        /*  call subroutine to store all entries of tag       */
                    158:                        if ( tagstor(symbuf, auxbuf, nthis) == NO)
                    159:                                return(NO);
                    160:                        tag_sum++;
                    161:                }
                    162:        }       /*  end of while loop  */
                    163: 
                    164:        /* at end of loop all symbol table entries have been read and compared 
                    165:         */
                    166: 
                    167:        if ( nnext != HEADER(input).f_nsyms ) {
                    168:                if ( vflag > 0)
                    169:                        fprintf(stderr, "error in indexing symbol table\n");
                    170:                return(NO);
                    171:        }
                    172: 
                    173:        ldclose(input);
                    174: 
                    175:        return (SUCCESS);
                    176: }
                    177: 
                    178: /*eject*/
                    179: 
                    180: /*  function tagstor saves all tag entry info so comparison can be done */
                    181: 
                    182: int
                    183: tagstor(symbuf, auxbuf, nthis)
                    184: 
                    185: SYMENT         symbuf;
                    186: AUXENT         auxbuf;
                    187: long   nthis;
                    188: {
                    189: 
                    190:        extern long     tag_sum;
                    191:        extern int      vflag;
                    192: 
                    193:        extern ITEMID   compar();
                    194: 
                    195:        TAGITEM  *px, *p_comp;
                    196:        SYMENT          *storbuf;
                    197:        SYMENTRY         *symbl;
                    198:        ITEMID          id,
                    199:                        id2,
                    200:                        realval;
                    201:        long             last, ncur;
                    202:        SYMENTRY        *sym;
                    203:        AUXENT          *ax;
                    204:        int             hashval;
                    205:        int             aux_flag = 0;
                    206: 
                    207: 
                    208:        last = auxbuf.x_sym.x_fcnary.x_fcn.x_endndx;
                    209:        szecnt += (long)((last-nthis)*sizeof(SYMENT));
                    210:        id = sdp_allot(TAGSPACE, sizeof(TAGITEM));
                    211:         p = (TAGITEM *) sdp_use(TAGSPACE,id,RNLY);
                    212:        szecnt += (long)(sizeof(TAGITEM));
                    213:        p->oldloc = nthis;
                    214:        p->nentrys = (unsigned)((long)last - (long)nthis);
                    215:        p->tmpsym = (SYMENT *) calloc( p->nentrys, sizeof(SYMENT) );
                    216:        storbuf = p->tmpsym;
                    217: 
                    218: /*  initially ptr to next tagitem is NULL;  also, dupl. ptr. is NULL  */
                    219: 
                    220:        p->next_ti = 0L;
                    221:        p->p_realtag = 0L;
                    222:        p->newloc = 0;
                    223: 
                    224:        /*  ti_head = 1st data structure in chain        */
                    225:        if(ti_head == 0L){
                    226:                ti_head = id;
                    227:                ti_end = id;
                    228:        }
                    229:        else{
                    230: 
                    231:                /*  not the first tag found      */
                    232:                px = (TAGITEM *) sdp_use(TAGSPACE,ti_end,WRTN);
                    233: 
                    234:                /*    attach new tag to chain */
                    235: 
                    236:                px->next_ti = id;
                    237:                sdp_unuse(TAGSPACE,ti_end,WRTN);
                    238:                ti_end = id;
                    239:        }
                    240: 
                    241:        /*
                    242:         * In addition to ordered list, create hash table access
                    243:         * for speed
                    244:         */
                    245: 
                    246:        hashval = hash(symbuf.n_nptr);
                    247:        p->next_col = hashtab[hashval]; /* may be 0L */
                    248:        hashtab[hashval] = id;
                    249: 
                    250:        /*  copy tag into allocated area of symbol     */
                    251: 
                    252:        *(p->tmpsym) = symbuf;
                    253:        ++(p->tmpsym);
                    254:        *(AUXENT *)(p->tmpsym) = auxbuf;
                    255: 
                    256:        /*  proceed to read all members and .eos    */
                    257: 
                    258:        for ( ncur = nthis+symbuf.n_numaux+1; ncur < last; ncur++) {
                    259:                ++(p->tmpsym);
                    260:                if( ldtbread( input, ncur, &symbuf) == FAILURE) {
                    261:                        if ( vflag > 0)
                    262:                                fprintf(stderr, "unable to read symbol at index %ld\n", ncur);
                    263:                        return(NO);
                    264:                }
                    265:                /*
                    266:                * Check to see if this is an aux or not.  Only save the
                    267:                * name when it is not.  Assume that the first entry is a
                    268:                * non-aux entry and keep track from there.
                    269:                */
                    270:                if (aux_flag == 0)
                    271:                {
                    272:                        if ((symbuf.n_nptr = keep_name(input, &symbuf)) == NULL)
                    273:                                return (FAILURE);
                    274:                        aux_flag = symbuf.n_numaux;
                    275:                }
                    276:                else
                    277:                        aux_flag--;
                    278:                *(p->tmpsym) = symbuf;
                    279:        }
                    280: 
                    281:        p->tmpsym = storbuf;
                    282:        p_comp = p;
                    283: 
                    284:        /*  compare for duplicate tags    */
                    285: 
                    286:        p->newloc = p->oldloc - delsum;
                    287:        if(( realval = compar(p_comp)) != 0L) {
                    288:                cfree(storbuf);
                    289:                p->tmpsym = NULL;
                    290:                p->tagbuf = 0L;
                    291:                delsum = delsum + (p->nentrys) - 1;
                    292:                p->p_realtag = realval;
                    293:                sdp_unuse(TAGSPACE,id, RNLY);
                    294:                return(SUCCESS);
                    295:        }
                    296: 
                    297:        /*
                    298:         * store symbol table info permanently in SDP
                    299:         */
                    300: 
                    301:        p->tmpsym = storbuf;
                    302:        p->tagbuf = sdp_allot(SYMSPACE,sizeof(SYMENTRY));
                    303:        symbl = (SYMENTRY *) sdp_use(SYMSPACE,p->tagbuf,WRTN);
                    304:        symbl->symbuf = *(p->tmpsym);
                    305:        symbl->auxbuf = sdp_allot(SYMSPACE,sizeof(AUXENT));
                    306:        ax = (AUXENT *) sdp_use(SYMSPACE,symbl->auxbuf,WRTN);
                    307:        ++(p->tmpsym);
                    308:        *ax = *((AUXENT *)p->tmpsym);
                    309:        sdp_unuse(SYMSPACE,symbl->auxbuf, WRTN);
                    310:        id2 = p->tagbuf;
                    311:        for ( ncur = nthis+2; ncur < last; ncur++) {
                    312:                 symbl->nxtsym = sdp_allot(SYMSPACE,sizeof(SYMENTRY));
                    313:                sym = (SYMENTRY *) sdp_use(SYMSPACE,symbl->nxtsym,WRTN);
                    314:                sym->symbuf = *(++(p->tmpsym));
                    315:                if ( sym->symbuf.n_numaux != 0) {
                    316:                        ncur += (long) sym->symbuf.n_numaux;
                    317:                         sym->auxbuf = sdp_allot(SYMSPACE,sizeof(AUXENT));
                    318:                        ax = (AUXENT *) sdp_use(SYMSPACE,sym->auxbuf,WRTN);
                    319:                        *ax = *((AUXENT *) ++(p->tmpsym));
                    320:                        sdp_unuse(SYMSPACE,sym->auxbuf, WRTN);
                    321:                }
                    322:        sdp_unuse(SYMSPACE,id2, WRTN);
                    323:        id2 = symbl->nxtsym;
                    324:        symbl = sym;
                    325: }
                    326: 
                    327:        sdp_unuse(SYMSPACE,id2, WRTN);
                    328:        sdp_unuse(TAGSPACE,id, RNLY);
                    329:        cfree(storbuf);
                    330:        p->tmpsym = NULL;
                    331:        return(SUCCESS);
                    332: }
                    333: 
                    334: 
                    335: /*eject*/
                    336: 
                    337: /*  function to compare requires last tag read in and compares it against
                    338:  *  all others       
                    339:  */
                    340: 
                    341: ITEMID
                    342: compar(p_test)
                    343: TAGITEM *p_test;
                    344: {
                    345: TAGITEM  *p_real;
                    346: ITEMID tmpid;
                    347: 
                    348:        for ( tmpid = p_test->next_col; tmpid != 0L; tmpid = p_real->next_col) {
                    349:                p_real = (TAGITEM *) sdp_use(TAGSPACE,tmpid,RNLY);
                    350:                if( pair(p_real, p_test)==YES) {
                    351:                        sdp_unuse(TAGSPACE,tmpid, RNLY);
                    352:                        return(tmpid);
                    353:                } else {
                    354:                        sdp_unuse(TAGSPACE,tmpid, RNLY);
                    355:                        }
                    356:                }
                    357:        return(0L);
                    358: }
                    359: /*eject*/
                    360: /* the function pair, does actual comparison of 2 given data structures  */
                    361: 
                    362: 
                    363: int
                    364: pair(preal, ptest)
                    365: TAGITEM *preal, *ptest;
                    366: {
                    367: 
                    368:        SYMENTRY        *ptr1;
                    369:        SYMENT          *ptr2;
                    370:        AUXENT *aux1, *aux2;
                    371:        int     i,
                    372:                aux;
                    373: 
                    374:        ITEMID          id;
                    375: 
                    376: /* pair takes the elements of 2 different data structures and compares each
                    377:  * element.  if any element varies, the 2 are different and function returns
                    378:  * zero to calling routine.          */
                    379: /* if all elements are equal, the function returns one     */
                    380: 
                    381:        aux1 = aux2 = NULL;
                    382: 
                    383:        if( preal->nentrys != ptest->nentrys)
                    384:                return(NO);
                    385:        if( preal->p_realtag == ptest->p_realtag && preal->p_realtag != 0L)
                    386:                return(YES);
                    387:        if( preal->p_realtag != 0L || ptest->p_realtag != 0L)
                    388:                return(NO);
                    389: 
                    390:        id = preal->tagbuf;
                    391:        ptr1 = (SYMENTRY *)sdp_use(SYMSPACE,id,RNLY);
                    392:        ptr2 = ptest->tmpsym;
                    393: 
                    394:        /* ptr1 & ptr2 point to symbol table infor. stored.  Compare tagname  
                    395:         * and auxentry of each tag.                
                    396:         */
                    397: 
                    398:        if( nmcmp(ptr1->symbuf.n_nptr, ptr2->n_nptr) == NO)
                    399:                if( gen(ptr1->symbuf.n_nptr) == NO || gen(ptr2->n_nptr) == NO) 
                    400:                        goto failure;
                    401:        if( ptr1->symbuf.n_scnum != ptr2->n_scnum) 
                    402:                goto failure;
                    403:        if( ptr1->symbuf.n_value != ptr2->n_value) 
                    404:                goto failure;
                    405:        if( ptr1->symbuf.n_sclass != ptr2->n_sclass) 
                    406:                goto failure;
                    407:        if( ptr1->symbuf.n_type != ptr2->n_type) 
                    408:                goto failure;
                    409:        if( ptr1->symbuf.n_numaux != ptr2->n_numaux) 
                    410:                goto failure;
                    411:        /*  tag names matched, now test the aux. entry for respective tags     
                    412:         */
                    413:        if( ptr1->symbuf.n_numaux != 0) {
                    414:                aux1 = (AUXENT *) sdp_use(SYMSPACE,ptr1->auxbuf,RNLY);
                    415:                aux2 = (AUXENT *) ++(ptest->tmpsym);
                    416: 
                    417:                if (aux1->x_sym.x_misc.x_lnsz.x_size != aux2->x_sym.x_misc.x_lnsz.x_size)   
                    418:                        goto failure;
                    419:                sdp_unuse(SYMSPACE,ptr1->auxbuf, RNLY);
                    420:                aux1 = aux2 = NULL;
                    421:        }
                    422:        aux = ptr1->symbuf.n_numaux;
                    423: 
                    424:        sdp_unuse(SYMSPACE,id, RNLY);
                    425:        id = ptr1->nxtsym;
                    426:        ptr1 = (SYMENTRY *)sdp_use(SYMSPACE,id,RNLY);
                    427:        ptr2 = ++(ptest->tmpsym);
                    428: 
                    429:        for ( i=0; i < preal->nentrys - (aux + 3); i++) {
                    430:                if( memcom(ptr1, ptr2, ptest, preal) == NO)  
                    431:                        goto failure;
                    432:                if( ptr1->symbuf.n_numaux != 0) {
                    433:                        i += ptr1->symbuf.n_numaux;
                    434:                        ++(ptest->tmpsym);
                    435:                        }
                    436:                sdp_unuse(SYMSPACE,id, RNLY);
                    437:                id = ptr1->nxtsym;
                    438:                ptr1 = (SYMENTRY *)sdp_use(SYMSPACE,id,RNLY);
                    439:                ptr2 = ++(ptest->tmpsym);
                    440:        }
                    441: 
                    442:        /*  all members are equal; compare .eos and auxentry  */
                    443: 
                    444:        if( ptr1->symbuf.n_sclass != C_EOS && ptr2->n_sclass != C_EOS)   
                    445:                goto failure;
                    446:        if( ptr1->symbuf.n_value != ptr2->n_value)  
                    447:                goto failure;
                    448: 
                    449:        if( ptr1->symbuf.n_numaux != ptr2->n_numaux)  
                    450:                goto failure;
                    451: 
                    452:        if( ptr1->symbuf.n_numaux != 0) {
                    453:                for ( i = 0; i < ptr1->symbuf.n_numaux; i++) {
                    454:                        aux1 = (AUXENT *) sdp_use(SYMSPACE,ptr1->auxbuf,RNLY);
                    455:                        aux2 = (AUXENT *) ++(ptest->tmpsym);
                    456:                        if(aux1->x_sym.x_misc.x_lnsz.x_size != aux2->x_sym.x_misc.x_lnsz.x_size) 
                    457:                                goto failure;
                    458:                        sdp_unuse(SYMSPACE,ptr1->auxbuf, RNLY);
                    459:                        aux1 = aux2 = NULL;
                    460:                }
                    461:        }
                    462: 
                    463:        sdp_unuse(SYMSPACE,id, RNLY);
                    464:        return(YES);
                    465: 
                    466: failure:
                    467:        sdp_unuse(SYMSPACE,id, RNLY);
                    468:        if ( aux1 != NULL ) {
                    469:                sdp_unuse(SYMSPACE,ptr1->auxbuf, RNLY);
                    470:                }
                    471:        return(NO);
                    472: }
                    473: 
                    474: 
                    475: /*  memcom compares corresponding members of structures
                    476:  */
                    477: 
                    478: int
                    479: memcom(ptr1, ptr2, ptest, preal)
                    480: 
                    481: SYMENTRY *ptr1;
                    482: SYMENT  *ptr2;
                    483: TAGITEM *ptest, *preal;
                    484: {
                    485: 
                    486: AUXENT *aux1, *aux2;
                    487: 
                    488:        if(nmcmp(ptr1->symbuf.n_nptr, ptr2->n_nptr) == NO)
                    489:                return(NO);
                    490:        if(ptr1->symbuf.n_value != ptr2->n_value)
                    491:                return(NO);
                    492:        if(ptr1->symbuf.n_scnum != ptr2->n_scnum)
                    493:                return(NO);
                    494:        if(ptr1->symbuf.n_type != ptr2->n_type)
                    495:                return(NO);
                    496:        if(ptr1->symbuf.n_sclass != ptr2->n_sclass)
                    497:                return(NO);
                    498:        if(ptr1->symbuf.n_numaux != ptr2->n_numaux)
                    499:                return(NO);
                    500:        if (ptr1->symbuf.n_numaux != 0) {
                    501:                if(BTYPE(ptr1->symbuf.n_type) == T_STRUCT || BTYPE(ptr1->symbuf.n_type) == T_UNION || ISARY(ptr1->symbuf.n_type) ) {
                    502:                        aux1 = (AUXENT *) sdp_use(SYMSPACE,ptr1->auxbuf,RNLY);
                    503:                        aux2 = (AUXENT *) ++ptr2;
                    504:                        if(aux1->x_sym.x_misc.x_lnsz.x_size != aux2->x_sym.x_misc.x_lnsz.x_size)  {
                    505:                                sdp_unuse(SYMSPACE,ptr1->auxbuf, RNLY);
                    506:                                return(NO);
                    507:                                }
                    508:                        if ( auxcom(ptr1, aux1, aux2, ptest, preal)==NO){
                    509:                                sdp_unuse(SYMSPACE,ptr1->auxbuf, RNLY);
                    510:                                return(NO);
                    511:                        }
                    512:                        sdp_unuse(SYMSPACE,ptr1->auxbuf, RNLY);
                    513:                }
                    514:        }
                    515:        return(YES);
                    516: }
                    517: 
                    518: 
                    519: /*eject*/
                    520: /* gen checks to see if symbol name is compiler generated
                    521: */
                    522: 
                    523: 
                    524: int
                    525: gen(px)
                    526: 
                    527: char *px;
                    528: {
                    529: 
                    530: int pos = 1;
                    531: 
                    532:        if(*px != '.')
                    533:                return(0);
                    534:        px++;
                    535:        pos++;
                    536:        while(*px >= '0' && *px <= '9') {
                    537:                px++;
                    538:                pos++;
                    539:        }
                    540:        if(pos== 1 || pos > 5)
                    541:                return(0);
                    542:        if(*px != 'f' || *(px+1) != 'a' || *(px+2) != 'k' || *(px+3) != 'e')
                    543:                return(0);
                    544:        return(1);
                    545: }
                    546: 
                    547: 
                    548: /*eject*/
                    549: /* auxcom compares corresponding aux.entries for members being tested    */
                    550: 
                    551: auxcom(ptr1, aux1, aux2, ptest, preal)
                    552: 
                    553: SYMENTRY *ptr1;
                    554: AUXENT *aux1, *aux2;
                    555: TAGITEM *ptest, *preal;
                    556: {
                    557:        SYMENTRY *check1, *check2;
                    558:        SYMENT  *check2x;
                    559:        int     useid;
                    560:        ITEMID  axid,axid2, tmpid, tmpid2;
                    561: 
                    562:        useid = 0;
                    563: 
                    564:     if(BTYPE(ptr1->symbuf.n_type) == T_STRUCT || BTYPE(ptr1->symbuf.n_type) == T_UNION) {  
                    565:        if(aux1->x_sym.x_tagndx ==preal->oldloc && aux2->x_sym.x_tagndx == ptest->oldloc) 
                    566:                return(YES);
                    567:        if(aux1->x_sym.x_tagndx ==preal->oldloc)    {
                    568:                axid = preal->tagbuf;
                    569:                check1 = (SYMENTRY *)sdp_use(SYMSPACE,axid,WRTN);
                    570:        } else {
                    571:                axid = ti_head;
                    572:                 for (preal = (TAGITEM *)sdp_use(TAGSPACE,axid,WRTN); preal->next_ti != 0L; preal = (TAGITEM *)sdp_use(TAGSPACE,axid,WRTN)) {
                    573:                        if(preal->oldloc == aux1->x_sym.x_tagndx) {
                    574:                                if (preal->tagbuf == 0L)  {
                    575:                                        axid2 = preal->p_realtag;
                    576:                                        sdp_unuse(TAGSPACE,axid, WRTN);
                    577:                                        axid = axid2;
                    578:                                        preal = (TAGITEM *) sdp_use(TAGSPACE,axid,WRTN);
                    579:                                }
                    580:                                sdp_unuse (TAGSPACE,axid, WRTN);
                    581:                                axid = preal->tagbuf;
                    582:                                check1 = (SYMENTRY *)sdp_use(SYMSPACE,axid,WRTN);
                    583:                                break;
                    584:                        } else {
                    585:                                axid2 = preal->next_ti;
                    586:                                sdp_unuse (TAGSPACE,axid, WRTN);
                    587:                                axid = axid2;
                    588:                                }
                    589:                        }
                    590:                }
                    591:        /* At this point axid is locked and check1 points to something resonable         */
                    592:        if ( aux2->x_sym.x_tagndx == ptest->oldloc) {
                    593:                check2x = ptest->tmpsym;
                    594:        } else {
                    595:                useid = 1;
                    596:                tmpid = ti_head;
                    597:                for (ptest = (TAGITEM *)sdp_use(TAGSPACE,tmpid,WRTN); ptest->next_ti != 0L; ptest = (TAGITEM *)sdp_use(TAGSPACE,tmpid,WRTN)) {
                    598:                        if(ptest->oldloc == aux2->x_sym.x_tagndx) {
                    599:                                if(ptest->tagbuf == 0L) {
                    600:                                        tmpid2 = ptest->p_realtag;
                    601:                                        sdp_unuse(TAGSPACE,tmpid, WRTN);
                    602:                                        tmpid = tmpid2;
                    603:                                        ptest = (TAGITEM *) sdp_use(TAGSPACE,tmpid,WRTN);
                    604:                                        }
                    605:                        sdp_unuse (TAGSPACE,tmpid, WRTN);
                    606:                        tmpid  = ptest->tagbuf;
                    607:                        check2 = (SYMENTRY *)sdp_use(SYMSPACE,tmpid,WRTN);
                    608:                        break;
                    609:                        } else {
                    610:                                tmpid2 = ptest->next_ti;
                    611:                                sdp_unuse (TAGSPACE,tmpid, WRTN);
                    612:                                tmpid = tmpid2;
                    613:                                }
                    614:                }
                    615:        }
                    616:                if (useid) {
                    617:                        if( check1 == check2) {
                    618:        
                    619:                                sdp_unuse (SYMSPACE,axid, WRTN);
                    620:                                sdp_unuse(SYMSPACE,tmpid, WRTN);
                    621:                                return(YES);
                    622:                                }
                    623:                        if(nmcmp(check1->symbuf.n_nptr, check2->symbuf.n_nptr)==NO)
                    624:                                if(gen(check1->symbuf.n_nptr) == 0 && gen(check2->symbuf.n_nptr) == 0) {
                    625:                                        sdp_unuse(SYMSPACE,axid, WRTN);
                    626:                                        sdp_unuse(SYMSPACE,tmpid, WRTN);
                    627:                                        return(NO);
                    628:                                        }
                    629:                        if(check1->symbuf.n_value != check2->symbuf.n_value)  {
                    630:                                        sdp_unuse(SYMSPACE,axid, WRTN);
                    631:                                        sdp_unuse(SYMSPACE,tmpid, WRTN);
                    632:                                        return(NO);
                    633:                                }
                    634:                        if(check1->symbuf.n_type != check2->symbuf.n_type) {
                    635:                                        sdp_unuse(SYMSPACE,axid,WRTN);
                    636:                                        sdp_unuse(SYMSPACE,tmpid, WRTN);
                    637:                                return(NO);
                    638:                                }
                    639:                        if(check1->symbuf.n_sclass != check2->symbuf.n_sclass) {
                    640:                                        sdp_unuse(SYMSPACE,axid, WRTN);
                    641:                                        sdp_unuse(SYMSPACE,tmpid, WRTN);
                    642:                                return(NO);
                    643:                                }
                    644:        
                    645:                        if(check1->symbuf.n_numaux != check2->symbuf.n_numaux) {
                    646:                                        sdp_unuse(SYMSPACE,axid, WRTN);
                    647:                                        sdp_unuse(SYMSPACE,tmpid, WRTN);
                    648:                                return(NO);
                    649:                                }
                    650:                sdp_unuse(SYMSPACE,axid, WRTN);
                    651:                sdp_unuse(SYMSPACE,tmpid, WRTN);
                    652:                return(YES);
                    653:                }       /* if useid */
                    654: 
                    655:                /*
                    656:                 * comparing SDP with internal storage
                    657:                 */
                    658:                if(nmcmp(check1->symbuf.n_nptr, check2x->n_nptr)==NO)
                    659:                        if(gen(check1->symbuf.n_nptr) == 0 && gen(check2x->n_nptr) == 0) {
                    660:                                sdp_unuse(SYMSPACE,axid, WRTN);
                    661:                                return(NO);
                    662:                                }
                    663:                if(check1->symbuf.n_value != check2x->n_value)  {
                    664:                                sdp_unuse(SYMSPACE,axid, WRTN);
                    665:                                return(NO);
                    666:                        }
                    667:                if(check1->symbuf.n_type != check2x->n_type) {
                    668:                        sdp_unuse(SYMSPACE,axid,WRTN);
                    669:                        return(NO);
                    670:                        }
                    671:                if(check1->symbuf.n_sclass != check2x->n_sclass) {
                    672:                        sdp_unuse(SYMSPACE,axid, WRTN);
                    673:                        return(NO);
                    674:                        }
                    675: 
                    676:                if(check1->symbuf.n_numaux != check2x->n_numaux) {
                    677:                        sdp_unuse(SYMSPACE,axid, WRTN);
                    678:                        return(NO);
                    679:                        }
                    680:                sdp_unuse(SYMSPACE,axid, WRTN);
                    681:                return(YES);
                    682: 
                    683:     }  /* if BTYPE */
                    684:     return(YES);
                    685: }
                    686: 
                    687: int
                    688: syminit()
                    689: {
                    690:        extern int      sprintf();
                    691:        extern int      mktemp();
                    692:        extern int      fork();
                    693: 
                    694:        if (sdp_call==2) {
                    695:                fprintf(stderr,"Attemp to re-initialize SDP\n");
                    696:                return(NO);
                    697:                }
                    698:        sdp_call++;
                    699:        sprintf(sdpname, "%s/%s", TMPDIR, "symXXXX");
                    700:        mktemp(sdpname);
                    701:        if ((sdp_generate(sdpname,pagesize,NULL,0777)) == SDPERROR)
                    702:                        {
                    703:                        return(NO);
                    704:                        }
                    705: 
                    706:        if ((SYMSPACE = sdp_connect(sdpname,ENV,NULL,WRTN)) == NULL)
                    707:                {
                    708:                fprintf(stderr,"Failed to initialize SDP symbol space");
                    709:                return(NO);
                    710:                }
                    711:        else
                    712:                {
                    713:                sdp_call++;
                    714:                sdp_allot(SYMSPACE,4); /* so itemid never 0L */
                    715:                return(YES);
                    716:                }
                    717: }
                    718: 
                    719: 
                    720: int
                    721: symfini()
                    722: {
                    723: 
                    724: 
                    725: /*    Ignore BREAK, HANGUP and QUIT signals, to insure cleanup is finished
                    726:  */
                    727:        /*
                    728:        signal(SIGINT, SIG_IGN);
                    729:        signal(SIGQUIT, SIG_IGN);
                    730: 
                    731:        */
                    732:        if (sdp_call==2) {
                    733:                sdp_call--;
                    734:                if (sdp_disconnect(SYMSPACE) == SDPERROR)
                    735:                        {
                    736:                        fprintf(stderr,"Failed to close SDP");
                    737:                        return(NO);
                    738:                        }
                    739:                if (sdp_destroy(sdpname,NULL) == SDPERROR)
                    740:                        {
                    741:                        fprintf(stderr,"Failed to close SDP");
                    742:                        return(NO);
                    743:                        }
                    744:                }
                    745:        if (sdp_call != 1) {
                    746:                return(YES);
                    747:                }
                    748:        sdp_call--;
                    749: 
                    750: return(YES);
                    751: }
                    752: 
                    753: int
                    754: taginit()
                    755: {
                    756: 
                    757:        extern  int             sprintf(),
                    758:                                mktemp();
                    759:        
                    760: 
                    761:        if (call) {
                    762:                fprintf(stderr,"Attempt to re-init SDP for Tag");
                    763:                return(NO);
                    764:                }
                    765: 
                    766:        sprintf(tagname, "%s/%s", TMPDIR, "tgXXXX");
                    767:        mktemp(tagname);
                    768: 
                    769:        call++;
                    770: 
                    771:        if ((sdp_generate(tagname,pagesize,NULL,0777)) == SDPERROR)
                    772:                        {
                    773:                        return(NO);
                    774:                        }
                    775: 
                    776:        if ((TAGSPACE = sdp_connect(tagname,ENV,NULL,WRTN)) == NULL)
                    777:                {
                    778:                fprintf(stderr,"Failed to initialize SDP Tag space");
                    779:                return(NO);
                    780:                }
                    781:        else
                    782:                {
                    783:                sdp_allot(TAGSPACE,4); /* so that itemid never 0L */
                    784:                call++;
                    785:                return(YES);
                    786:                }
                    787: }
                    788: 
                    789: int
                    790: tagfini()
                    791: {
                    792: 
                    793:        /*
                    794:        signal(SIGINT, SIG_IGN);
                    795:        signal(SIGQUIT, SIG_IGN);
                    796:        */
                    797: 
                    798:        if (call==2) {
                    799:                call--;
                    800:                if (sdp_disconnect(TAGSPACE) == SDPERROR)
                    801:                        {
                    802:                        fprintf(stderr,"Failed to close SDP for tag");
                    803:                        return(NO);
                    804:                        }
                    805:                if (sdp_destroy(tagname,NULL) == SDPERROR)
                    806:                        {
                    807:                        fprintf(stderr,"Failed to close SDP for TAG");
                    808:                        return(NO);
                    809:                        }
                    810:                }
                    811: 
                    812:        if (call != 1)
                    813:                return(YES);
                    814:        call--;
                    815: return(YES);
                    816: }
                    817: hash(name)
                    818: register char *name;
                    819: {
                    820: 
                    821: /*
                    822:  * Compute hash value for a symbol name
                    823:  */
                    824: 
                    825:        register unsigned hashval;
                    826:        register int symlenth;
                    827:        int tmp;        /* VAX CC BUG KLUDGE */
                    828: 
                    829:        hashval = symlenth = 0;
                    830:        while( (*name != '\0')  &&  (symlenth < 8) ) {
                    831:                hashval = hashval*13 + *name++;
                    832:                symlenth++;
                    833:                }
                    834: 
                    835: /*
                    836:  * Because of a bug in the current VAX compiler, the following
                    837:  * line has temporarily been replaced by the KLUDGE following
                    838:  * this comment.  The define of abs() is also added above
                    839:  *
                    840:  *     return( (int) (hashval % HASHSIZE) );
                    841:  */
                    842: 
                    843:        tmp = (int) hashval;
                    844:        tmp = abs(tmp);
                    845:        return ( tmp % HASHSIZE );
                    846: }
                    847: 
                    848: int
                    849: init_strings()
                    850: {
                    851:        extern char *malloc();
                    852: 
                    853:        if ((str_table = malloc((unsigned)(BUFSIZ * 10))) == NULL)
                    854:        {
                    855:                fprintf(stderr, "Insufficient memory for string table\n");
                    856:                return (FAILURE);
                    857:        }
                    858:        str_next = str_table;
                    859:        str_top = str_table + BUFSIZ * 10;
                    860:        return (SUCCESS);
                    861: }
                    862: 
                    863: char *
                    864: keep_name(f, symptr)   /* place name into permanent string table */
                    865:        LDFILE *f;
                    866:        SYMENT *symptr;
                    867: {
                    868:        register char *p, *s;
                    869:        register int i, j;
                    870:        extern char *ldgetname();
                    871:        extern char *realloc();
                    872: 
                    873:        if ((p = ldgetname(f, symptr)) == NULL)
                    874:        {
                    875:                fprintf(stderr, "Name retrieval error\n");
                    876:                return (NULL);
                    877:        }
                    878:        i = strlen(p) + 1;
                    879:        if (str_next + i >= str_top)
                    880:        {
                    881:                str_top += BUFSIZ * 5;
                    882:                s = str_table;
                    883:                str_table = realloc(s, (unsigned)(str_top - s));
                    884:                if (str_table == NULL)
                    885:                {
                    886:                        fprintf(stderr,
                    887:                                "Insufficient memory to grow string table\n");
                    888:                        return (NULL);
                    889:                }
                    890:                j = str_table - s;
                    891:                str_next += j;
                    892:                str_top += j;
                    893:        }
                    894:        (void)strcpy(str_next, p);
                    895:        s = str_next;
                    896:        str_next += i;
                    897:        return (s);
                    898: }

unix.superglobalmegacorp.com

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