Annotation of researchv9/jerq/sgs/compress/pass2.c, revision 1.1

1.1     ! root        1: /*
        !             2:  *     static char ID_sec[] = "@(#) pass2.c: 1.3 3/5/83";
        !             3: */
        !             4: 
        !             5: #define BSIZE 256
        !             6: 
        !             7: #include <stdio.h>
        !             8: #include "filehdr.h"
        !             9: #include "syms.h"
        !            10: #include "scnhdr.h"
        !            11: #include "linenum.h"
        !            12: #include "reloc.h"
        !            13: #include "ldfcn.h"
        !            14: #include "tagitem.h"
        !            15: 
        !            16: /*  pass 2 of the compress utility compresses the symbol table and updates
        !            17:     all pointers into the symbol table  */
        !            18: 
        !            19:  extern LDFILE *oldfile;
        !            20:  extern FILE *compress;
        !            21: extern int     copy();
        !            22: 
        !            23: struct table{
        !            24:        long    oldlcn;
        !            25:        long    newlcn;
        !            26:        long    real_loc;
        !            27: };
        !            28: 
        !            29: 
        !            30: secpass(argv, argv2)
        !            31: 
        !            32: char *argv;
        !            33: char *argv2;
        !            34: {
        !            35: 
        !            36:        extern long     delsum, tag_sum;
        !            37:        extern int      vflag, pflag;
        !            38:        extern long     szecnt;
        !            39:        extern struct table *tbl_head;
        !            40:        long            newindx();
        !            41:        long            proln();
        !            42:        long            prorel();
        !            43:        SCNHDR          scptr;
        !            44:        FILHDR          fhead;
        !            45:        extern LDFILE   *ldopen();
        !            46: 
        !            47:        long            indx;
        !            48:        long            start;
        !            49:        long            datasze;
        !            50:        int             sumrel;
        !            51:        int             sumln;
        !            52:        int             totsec;
        !            53:        long            frstrel;
        !            54:        long            frstln;
        !            55:        long            onsyms;
        !            56:        int             i;
        !            57: 
        !            58: 
        !            59: #ifdef FLEXNAMES
        !            60:        reinit_strings();
        !            61: #endif
        !            62:        sumrel = sumln = 0;
        !            63:        indx = 0;
        !            64:        frstrel = frstln = 0;
        !            65: 
        !            66:        /* open files for reading and writing   */
        !            67: 
        !            68:        if ((oldfile=ldopen(argv, NULL)) == NULL) {
        !            69:                fprintf(stderr, "unable to open %s \n", argv);
        !            70:                return(ERROR);
        !            71:        }
        !            72: 
        !            73:        if ( (compress = fopen(argv2, "w")) == NULL) {
        !            74:                fprintf(stderr, "unable to create %s\n",argv2);
        !            75:                return(ERROR);
        !            76:        }
        !            77: 
        !            78: 
        !            79:        /*  read and modify header information     */
        !            80:        if ( ldfhread(oldfile, &fhead) == FAILURE) {
        !            81:                if ( vflag > 0)
        !            82:                        fprintf(stderr, "unable to read header\n");
        !            83:                return(FAILURE);
        !            84:        }
        !            85:        start = HEADER(oldfile).f_symptr;
        !            86:        onsyms = HEADER(oldfile).f_nsyms;
        !            87:        fhead.f_nsyms = HEADER(oldfile).f_nsyms - delsum;
        !            88:        totsec = HEADER(oldfile).f_nscns;
        !            89:        indx += FILHSZ;
        !            90: 
        !            91:        /*  copy adjusted header to compress file last   */
        !            92: 
        !            93:        if ( fseek(compress, (long)FILHSZ, 0) != 0) {
        !            94:                if ( vflag > 0)
        !            95:                        fprintf(stderr,"seek past filheader failed\n");
        !            96:                return(FAILURE);
        !            97:        }
        !            98: 
        !            99:        /*  if there is an optional header   copy to compress  */
        !           100: 
        !           101:        if ( ldohseek(oldfile) == SUCCESS) {
        !           102:                if (copy((long)HEADER(oldfile).f_opthdr) != SUCCESS) {
        !           103:                        if ( vflag > 0)
        !           104:                                fprintf(stderr, "ERROR; unable to copy opt header\n");
        !           105:                        return(FAILURE);
        !           106:                }
        !           107:        }
        !           108: 
        !           109:        indx += HEADER(oldfile).f_opthdr;
        !           110: 
        !           111:        /*  read section header information    */
        !           112: 
        !           113:        for( i=0; i<totsec; i++) {
        !           114:                if (fread(&scptr, SCNHSZ, 1, IOPTR(oldfile)) != 1) {
        !           115:                        if ( vflag > 0)
        !           116:                                fprintf(stderr, "read on scnheader failed\n");
        !           117:                        return(FAILURE);
        !           118:                }
        !           119: 
        !           120:                /*  save value for index of first reloc and line sections   */
        !           121: 
        !           122:                if (i==0 || frstrel == 0)
        !           123:                        frstrel = scptr.s_relptr;
        !           124:                if (i == 0 || frstln == 0)
        !           125:                        frstln = scptr.s_lnnoptr;
        !           126:                sumrel += scptr.s_nreloc;
        !           127:                sumln += scptr.s_nlnno;
        !           128: 
        !           129:        /*  copy section information to compress file   */
        !           130: 
        !           131:                if ( fwrite(&scptr, SCNHSZ, 1, compress) != 1) {
        !           132:                        if( vflag > 0) 
        !           133:                                fprintf(stderr, "write on scnheader failed\n");
        !           134:                        return(FAILURE);
        !           135:                }
        !           136:                indx += SCNHSZ;
        !           137:        }
        !           138: 
        !           139: 
        !           140:        /*  read raw data for all sections and copy to compress   */
        !           141: 
        !           142:        if ( sumrel !=0)
        !           143:                datasze = frstrel - indx;
        !           144:        else
        !           145:                if (sumln !=0)
        !           146:                        datasze = frstln - indx;
        !           147:        else
        !           148:                datasze = start - indx;
        !           149:        if ( datasze != 0)
        !           150:                if (copy((long)datasze) != SUCCESS) {
        !           151:                        if ( vflag > 0)
        !           152:                                fprintf(stderr, "ERROR; unable to copy raw data\n");
        !           153:                        return(FAILURE);
        !           154:                        }
        !           155:        indx += datasze;
        !           156: 
        !           157:        /*  if header flag not set, update relocation section  */
        !           158: 
        !           159:        if ( !(HEADER(oldfile).f_flags & F_RELFLG) && sumrel != 0)
        !           160:                if (( indx = prorel(indx, frstrel, sumrel)) == FAILURE) {
        !           161:                        if ( vflag > 0)
        !           162:                                fprintf(stderr, "indx at prorel wrong\n");
        !           163:                        return(FAILURE);
        !           164:                }
        !           165: 
        !           166:        /* update linenumber section if flag not set    */
        !           167: 
        !           168:        if ( !(HEADER(oldfile).f_flags & F_LNNO) && sumln != 0L)
        !           169:                if ((indx = proln(indx, frstln, sumln)) == FAILURE) {
        !           170:                        if ( vflag > 0)
        !           171:                                fprintf(stderr, "indx at proln wrong\n");
        !           172:                        return(FAILURE);
        !           173:                }
        !           174: 
        !           175:        /*  call function to modify symbol table  */
        !           176: 
        !           177:        if (prosym(indx, onsyms, start) == FAILURE) {
        !           178:                if ( vflag > 0)
        !           179:                        fprintf(stderr, "prosym returns failure\n");
        !           180:                return(FAILURE);
        !           181:        }
        !           182: 
        !           183:        if ( fseek(compress, 0L, 0) != 0)
        !           184:                if ( vflag > 0)
        !           185:                        fprintf(stderr, "seek to start of object file failed");
        !           186:        if (fwrite(&fhead, FILHSZ, 1, compress) != 1) {
        !           187:                if ( vflag > 0)
        !           188:                        fprintf(stderr, "writing fileheader failed\n");
        !           189:                return(FAILURE);
        !           190:        }
        !           191:        if ( pflag > 0)
        !           192:                printf("compression reduces symbol table %ld%%\n", (delsum * 100L) / onsyms);
        !           193:        /*  compression complete;  close both files  */
        !           194:        fclose(compress);
        !           195:        ldaclose(oldfile);
        !           196:        return(SUCCESS);
        !           197: }
        !           198: 
        !           199: 
        !           200: /*eject*/
        !           201: /* function "proln" adjust linenumber information for compressed file  */
        !           202: 
        !           203: 
        !           204: long
        !           205: proln(indx,lnindx,lnsum)
        !           206: 
        !           207: long indx, lnindx;
        !           208: int lnsum;
        !           209: {
        !           210:        extern long     newindx();
        !           211: 
        !           212:        extern int      vflag;
        !           213: 
        !           214:        struct  lineno lnptr;
        !           215:        int     k;
        !           216: 
        !           217:        /* verify position of file ptr.  */
        !           218: 
        !           219:        if ( indx != lnindx)
        !           220:                if ( vflag > 0)
        !           221:                        fprintf(stderr, "could not indx to line number \n");
        !           222:        for( k=0; k < lnsum; k++) {
        !           223: 
        !           224:                if ( FREAD(&lnptr, LINESZ, 1, oldfile) != 1) {
        !           225:                        if ( vflag > 0)
        !           226:                                fprintf(stderr, "cannot read lineno infor\n");
        !           227:                        return(FAILURE);
        !           228:                }
        !           229:                if (lnptr.l_lnno == 0)
        !           230:                        lnptr.l_addr.l_symndx=newindx(lnptr.l_addr.l_symndx);
        !           231:                if ( fwrite(&lnptr, LINESZ, 1, compress) != 1) {
        !           232:                        if ( vflag > 0)
        !           233:                                fprintf(stderr, "write to lineno failed\n");
        !           234:                        return(FAILURE);
        !           235:                }
        !           236:                indx += LINESZ;
        !           237:        }
        !           238:        return(indx);
        !           239: }
        !           240: 
        !           241: 
        !           242: /*eject*/
        !           243: /*  function prorel, updates relocation entries for compression  *?
        !           244: */
        !           245: 
        !           246: long
        !           247: prorel(indx,frstrel,sumrel)
        !           248: 
        !           249: long indx, frstrel; 
        !           250: int sumrel;
        !           251: {
        !           252:        extern int      vflag;
        !           253: 
        !           254:        struct reloc    relptr;
        !           255:        long            k;
        !           256: 
        !           257:        /*  verify position of file ptr to start of reloc section   */
        !           258: 
        !           259:        if ( indx != frstrel) {
        !           260:                if ( vflag > 0)
        !           261:                        fprintf(stderr, "error in index computation at reloc\n");
        !           262:                exit(1);
        !           263:        }
        !           264:        if ( vflag > 0)
        !           265:                fprintf(stderr, "total number of rel entries = %d\n",sumrel);
        !           266: 
        !           267:        for( k=0; k<sumrel; k++) {
        !           268:                if ( fread(&relptr, RELSZ, 1, IOPTR(oldfile)) < 1) {
        !           269:                        if ( vflag > 0)
        !           270:                                fprintf(stderr, "read rel failed\n");
        !           271:                        return(FAILURE);
        !           272:                }
        !           273: 
        !           274:                relptr.r_symndx = newindx(relptr.r_symndx);
        !           275:                if ( fwrite(&relptr, RELSZ, 1, compress) != 1) {
        !           276:                        if ( vflag > 0)
        !           277:                                fprintf(stderr, "write to rel failed\n");
        !           278:                        return(FAILURE);
        !           279:                }
        !           280: 
        !           281:                indx = indx + RELSZ;
        !           282:        }
        !           283:        return(indx);
        !           284: }
        !           285: 
        !           286: 
        !           287: 
        !           288: /*eject*/
        !           289: 
        !           290: /*  function "newindx" computes newloc for pointers into the symbol table  */
        !           291: 
        !           292: long
        !           293: newindx(x)
        !           294: 
        !           295: long x;
        !           296: {
        !           297: 
        !           298:        extern struct table *tbl_head;
        !           299:        extern long     tag_sum;
        !           300:        extern long     delsum;
        !           301:        extern int      vflag;
        !           302: 
        !           303:        struct table    *tbl_ptr;
        !           304:        long            i; 
        !           305: 
        !           306:        /*  compare number against old/new/real table,  if less than 1st entry
        !           307:         *  return the same value         */
        !           308: 
        !           309:        tbl_ptr = tbl_head;
        !           310:        for (i = 0L; i < tag_sum; i++) {
        !           311:                if ( x == tbl_ptr->oldlcn) {
        !           312:                        return(tbl_ptr->newlcn);
        !           313:                        }
        !           314:                if ( x < tbl_ptr->oldlcn) {
        !           315:                        if ( tbl_ptr == tbl_head)
        !           316:                                return(x);
        !           317:                        x -= (tbl_ptr->oldlcn - tbl_ptr->newlcn);
        !           318:                        return(x);
        !           319:                }
        !           320:                if ( i == tag_sum-1 && x > tbl_ptr->oldlcn) {
        !           321:                        x -= delsum;
        !           322:                        return(x);
        !           323:                }
        !           324:        if ( i != tag_sum-1 ) {
        !           325:                ++tbl_ptr;
        !           326:                }
        !           327:        }
        !           328:        if ( vflag > 0)
        !           329:                fprintf(stderr, "failed to compute indx\n");
        !           330:        exit(1);
        !           331: }
        !           332: 
        !           333: 
        !           334: /*eject*/
        !           335: 
        !           336: /*  function "realindx" gives actual index of any "real" tag  */
        !           337: 
        !           338: /* given that newloc != oldloc in our table, tag is C_ALIAS  */
        !           339: 
        !           340: long
        !           341: realindx(x)
        !           342: 
        !           343: long x;
        !           344: {
        !           345:        long    i;
        !           346:        extern long tag_sum;
        !           347:        extern int      vflag;
        !           348:        extern struct table *tbl_head;
        !           349: 
        !           350:        struct table *tbl_ptr;
        !           351: 
        !           352:        /*   search table til x lies between 2 tag indexes   */
        !           353: 
        !           354:        tbl_ptr = tbl_head;
        !           355: 
        !           356:        for( i=0L; i<tag_sum; i++) { 
        !           357:                if (x != tbl_ptr->oldlcn) {
        !           358:                        if ( i != tag_sum-1 ) {
        !           359:                                ++tbl_ptr;
        !           360:                                }
        !           361:                        }
        !           362:                else {
        !           363:                        return(tbl_ptr->real_loc);
        !           364:                }
        !           365:        }
        !           366:        if ( vflag > 0)
        !           367:                fprintf(stderr, "failed to compute realindx at %ld\n", x);
        !           368:        exit(2);
        !           369: }
        !           370: 
        !           371: /*eject*/
        !           372: /*  "prosym" processes entries in symbol table by actually deleting 
        !           373:  *     duplicate structures and modifying pointer information   */
        !           374: 
        !           375: struct syment symbol;
        !           376: union auxent auxil;
        !           377: 
        !           378: extern char *str_table, *str_next;
        !           379: 
        !           380: int
        !           381: prosym(indx, nsyms, start)
        !           382: 
        !           383: long indx, nsyms, start;
        !           384: {
        !           385:        extern int      vflag,
        !           386:                        pflag;
        !           387:        extern long     realindx(),
        !           388:                        newindx();
        !           389:        long    nextin, thisin;
        !           390:        long    duptag;
        !           391:        char    *s;
        !           392:        long    slength;
        !           393: 
        !           394:        /*  verify that index is start of symbol table    */
        !           395: 
        !           396:        duptag = 0;
        !           397:        if ( indx != start) {
        !           398:                if ( vflag > 0)
        !           399:                        fprintf(stderr, "error in symbol table indexing \n");
        !           400:                return(FAILURE);
        !           401:        }
        !           402: 
        !           403:        /*  read each entry and/or aux entry        */
        !           404: 
        !           405:        nextin = 0;
        !           406:        while (nextin < nsyms) {
        !           407:                thisin = nextin;
        !           408:                if ( ldtbread(oldfile, thisin, &symbol) == FAILURE) {
        !           409:                        if ( vflag > 0)
        !           410:                                fprintf(stderr, "unable to read symbol entry\n");
        !           411:                        return(ERROR);
        !           412:                }
        !           413: #ifdef FLEXNAMES
        !           414:                if (symbol.n_zeroes == 0)       /* put name in string table */
        !           415:                {
        !           416:                        extern char *keep_name();
        !           417:                        char *p;
        !           418: 
        !           419:                        if ((p = keep_name(oldfile, &symbol)) == NULL)
        !           420:                                return (ERROR);
        !           421:                        symbol.n_offset = p - str_table;        /* new offset */
        !           422:                }
        !           423: #endif
        !           424:                if ( symbol.n_numaux == 0)
        !           425:                        nextin = thisin + 1;
        !           426:                else {
        !           427:                        nextin=thisin + 2;
        !           428: 
        !           429:                /*  read aux entry      */
        !           430: 
        !           431:                        if ( fread(&auxil, AUXESZ, 1, IOPTR(oldfile))==FAILURE) {
        !           432:                                if ( vflag > 0)
        !           433:                                        fprintf(stderr, "cannot read auxiliary entry\n");
        !           434:                                return(ERROR);
        !           435:                        }
        !           436:                }
        !           437:                if ( symbol.n_numaux == 0) {
        !           438:                        if ( symbol.n_sclass == C_ALIAS) {
        !           439:                                symbol.n_value = realindx(symbol.n_value);
        !           440:                        }
        !           441:                }
        !           442:                else {
        !           443:                        switch (symbol.n_sclass) {
        !           444: 
        !           445:                                case C_BLOCK:
        !           446:                                  s = symbol.n_name;
        !           447:                                  if (*s=='.' && *(++s)=='b' && *(++s)=='b')
        !           448:                                      auxil.x_sym.x_fcnary.x_fcn.x_endndx=newindx(auxil.x_sym.x_fcnary.x_fcn.x_endndx);
        !           449:                                  break;
        !           450: 
        !           451:                                case C_ENTAG:
        !           452:                                  auxil.x_sym.x_fcnary.x_fcn.x_endndx = newindx(auxil.x_sym.x_fcnary.x_fcn.x_endndx);
        !           453:                                  auxil.x_sym.x_tagndx=newindx(auxil.x_sym.x_tagndx);
        !           454:                                  break;
        !           455: 
        !           456:                                case C_EOS:
        !           457:                                  auxil.x_sym.x_tagndx=newindx(auxil.x_sym.x_tagndx);
        !           458:                                  break;
        !           459: 
        !           460:                                case C_FILE:
        !           461:                                  symbol.n_value=newindx(symbol.n_value);
        !           462:                                  break;
        !           463: 
        !           464:                                case C_STRTAG:
        !           465:                                case C_UNTAG:
        !           466:                                  if ( tagindx(thisin)==C_ALIAS) {
        !           467:                                    nextin = auxil.x_sym.x_fcnary.x_fcn.x_endndx;
        !           468:                                    duptag++;
        !           469:                                  } else
        !           470:                                    auxil.x_sym.x_fcnary.x_fcn.x_endndx=newindx(auxil.x_sym.x_fcnary.x_fcn.x_endndx);
        !           471:                                  break;
        !           472: 
        !           473:                                default:
        !           474:                                  if (ISFCN(symbol.n_type)) {
        !           475:                                    auxil.x_sym.x_fcnary.x_fcn.x_endndx=newindx(auxil.x_sym.x_fcnary.x_fcn.x_endndx);
        !           476:                                  }
        !           477: 
        !           478:                                  switch BTYPE(symbol.n_type) {
        !           479: 
        !           480:                                  case T_ENUM:
        !           481:                                    if (auxil.x_sym.x_tagndx == 0L)
        !           482:                                        break;
        !           483:                                    else
        !           484:                                    auxil.x_sym.x_tagndx = newindx(auxil.x_sym.x_tagndx);
        !           485:                                    break;
        !           486: 
        !           487:                                  case T_STRUCT:
        !           488:                                  case T_UNION:
        !           489:                                    if (auxil.x_sym.x_tagndx == 0L)
        !           490:                                        break;
        !           491:                                    else
        !           492:                                    auxil.x_sym.x_tagndx = realindx(auxil.x_sym.x_tagndx);
        !           493:                                    break;
        !           494:                                  }  /* end of second switch  */
        !           495: 
        !           496:                                break;
        !           497:                        }  /*  end of main switch  */
        !           498:                }  /*  end of else  */
        !           499: 
        !           500:                if ( fwrite(&symbol, SYMESZ, 1, compress) != 1) {
        !           501:                        if ( vflag > 0)
        !           502:                                fprintf(stderr, "failed to write symbol\n");
        !           503:                        return(FAILURE);
        !           504:                }
        !           505:                if ( symbol.n_numaux == 1)
        !           506:                        if ( fwrite(&auxil, AUXESZ, 1, compress) != 1) {
        !           507:                                if ( vflag > 0)
        !           508:                                        fprintf(stderr, "failed to write aux\n");
        !           509:                                return(FAILURE);
        !           510:                        }
        !           511:                }   /*   end of while loop  */
        !           512: 
        !           513: #ifdef FLEXNAMES
        !           514:        /*
        !           515:        * Write out modified string table.  Place string table length
        !           516:        * at beginning.  Don't bother to check stuff at end of old file.
        !           517:        */
        !           518:        slength = str_next - str_table;
        !           519:        if (slength > sizeof(long) / sizeof(char))
        !           520:        {
        !           521:                str_table += sizeof(long) / sizeof(char);
        !           522:                if (fwrite((char *)&slength, sizeof(long), 1, compress) != 1 ||
        !           523:                        fwrite(str_table, sizeof(char),
        !           524:                        slength - sizeof(long) / sizeof(char), compress) !=
        !           525:                        slength - sizeof(long) / sizeof(char))
        !           526:                {
        !           527:                        if (vflag > 0)
        !           528:                                fprintf(stderr,
        !           529:                                        "failed to write string table\n");
        !           530:                        return (FAILURE);
        !           531:                }
        !           532:        }
        !           533: #else
        !           534:        /*  verify that no more entries exist     */
        !           535:        if ( ldtbread(oldfile, nextin, &symbol) != FAILURE) {
        !           536:                if ( vflag > 0)
        !           537:                        fprintf(stderr, "error in count of symbols\n");
        !           538:                exit(3);
        !           539:        }
        !           540: #endif
        !           541:        if ( pflag > 0)
        !           542:                printf("total number of duplicate tags = %ld\n", duptag);
        !           543:        return(SUCCESS);
        !           544: }
        !           545: 
        !           546: 
        !           547: 
        !           548: /*eject*/
        !           549: 
        !           550: /*  "tagindx" computes value for C_ALIAS entries   */
        !           551: 
        !           552: 
        !           553: int
        !           554: tagindx(symindx)
        !           555: 
        !           556: long symindx;
        !           557: {
        !           558:        extern long tag_sum;
        !           559:        extern struct table *tbl_head;
        !           560:        struct table *tbl_ptr;
        !           561:        long    i;
        !           562: 
        !           563:        /* search tag table for oldloc of given tag indx   */
        !           564: 
        !           565:        tbl_ptr = tbl_head;
        !           566: 
        !           567:        for( i=0L; i < tag_sum; i++) {
        !           568:                if ( symindx == tbl_ptr->oldlcn) {
        !           569:                        if ( tbl_ptr->newlcn != tbl_ptr->real_loc) {
        !           570:                                symbol.n_sclass = C_ALIAS;
        !           571:                                symbol.n_numaux = 0;
        !           572:                                symbol.n_value = tbl_ptr->real_loc;
        !           573:                                return(C_ALIAS);
        !           574:                        }
        !           575:                return(0);
        !           576:                }
        !           577:                if ( i != tag_sum-1 ) {
        !           578:                        ++tbl_ptr;
        !           579:                        }
        !           580:        }
        !           581:        return(0);
        !           582: }
        !           583: 
        !           584: 
        !           585: /*eject*/
        !           586: int
        !           587: copy(size)
        !           588: 
        !           589: long   size;
        !           590: 
        !           591: {
        !           592:     extern int         fread( ),
        !           593:                        fwrite( );
        !           594: 
        !           595:        extern FILE     *compress;
        !           596:        extern LDFILE   *oldfile;
        !           597: 
        !           598: /* */    short         buffer[BSIZE];
        !           599:     long               index;
        !           600: /* */    short         remaindr;
        !           601: 
        !           602: 
        !           603:     for (index = size/BSIZE; index > 0; --index) {
        !           604:        if (fread(buffer, BSIZE, 1, IOPTR(oldfile)) < 1) {
        !           605:            return(FAILURE);
        !           606:        }
        !           607: 
        !           608:        if (fwrite(buffer, BSIZE, 1, compress) != 1) {
        !           609:            return(FAILURE);
        !           610:        }
        !           611:     }
        !           612: 
        !           613:     if ((remaindr = size % BSIZE) != 0) {
        !           614:        if (fread(buffer, remaindr, 1, IOPTR(oldfile)) != 1) {
        !           615:            return(FAILURE);
        !           616:        }
        !           617: 
        !           618:        if (fwrite(buffer, remaindr, 1, compress) != 1) {
        !           619:            return(FAILURE);
        !           620:        }
        !           621:     }
        !           622: 
        !           623:     return(SUCCESS);
        !           624: }
        !           625: 
        !           626: #ifdef FLEXNAMES
        !           627: reinit_strings()
        !           628: {
        !           629:        register int i;
        !           630: 
        !           631:        str_next = str_table + (sizeof(long) / sizeof(char));
        !           632:        for (i=0; i < sizeof(long) / sizeof(char); i++)
        !           633:                str_table[i] = '\0';
        !           634: }
        !           635: #endif

unix.superglobalmegacorp.com

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