Annotation of researchv9/jerq/sgs/ld/util.c, revision 1.1

1.1     ! root        1: static char ID[] = "@(#) util.c: 1.5 5/27/83";
        !             2: #include "system.h"
        !             3: 
        !             4: #include <stdio.h>
        !             5: #include <signal.h>
        !             6: #include "structs.h"
        !             7: #include "extrns.h"
        !             8: #include "sgs.h"
        !             9: #include "sgsmacros.h"
        !            10: 
        !            11: #define INT int
        !            12: #define BUSY 1
        !            13: #define testbusy(p) ((INT)(p)&BUSY)
        !            14: /*eject*/
        !            15: ACTITEM *
        !            16: dfnscngrp(type, bondaddr, align, block)
        !            17: int type;
        !            18: ADDRESS *bondaddr, *align, *block;
        !            19: {
        !            20: 
        !            21: /*
        !            22:  * Build a AIDFNSCN/AIDFNGRP action item
        !            23:  */
        !            24: 
        !            25:        ACTITEM *p;
        !            26: 
        !            27:        p = (ACTITEM *) myalloc(sizeof(ACTITEM));
        !            28: 
        !            29:        p->dfnscn.aiinflnm = curfilnm;
        !            30:        p->dfnscn.aiinlnno = lineno;
        !            31:        p->dfnscn.aitype = type;
        !            32:        p->dfnscn.aibndadr = -1L;
        !            33:        p->dfnscn.aialign  =  0L;
        !            34:        p->dfnscn.aiblock  =  0L;
        !            35: 
        !            36:        if ( bondaddr != NULL ) {       /* there is a bond */
        !            37:                p->dfnscn.aibndadr = *bondaddr;
        !            38:                }
        !            39: 
        !            40:        if (align != NULL) {            /* there is alignment */
        !            41:                p->dfnscn.aialign = *align;
        !            42:                chkpower2(p->dfnscn.aialign);
        !            43:                }
        !            44: 
        !            45:        if (block) {
        !            46:                p->dfnscn.aiblock = *block;
        !            47:                chkpower2(*block);
        !            48:                }
        !            49: 
        !            50:        return(p);
        !            51: }
        !            52: /*eject*/
        !            53: chkpower2(n)
        !            54: long n;
        !            55: {
        !            56: 
        !            57: /*
        !            58:  * Determine if 'n' is a power of two
        !            59:  */
        !            60: 
        !            61:        long c;
        !            62: 
        !            63:        for( c = n; c > 2; c >>= 1 )
        !            64:                if( (c % 2) == 1 ) {
        !            65:                        lderror(0, lineno, curfilnm, "%.1lx is not a power of 2", n );
        !            66:                        break;
        !            67:                        }
        !            68: }
        !            69: /*eject*/
        !            70: char *
        !            71: zero(ptr, cnt)
        !            72: char *ptr;
        !            73: int cnt;
        !            74: {
        !            75: 
        !            76: /*
        !            77:  * Zero "cnt" bytes starting at the address "ptr".
        !            78:  * Return "ptr".
        !            79:  */
        !            80: 
        !            81:        register char *p, *w;
        !            82: 
        !            83:        if( cnt > 0 ) {
        !            84:                if( ((short) (p = ptr)) & 1 ) {
        !            85:                        *p++ = '\0';
        !            86:                        --cnt;
        !            87:                        }
        !            88: 
        !            89:                w = p + (cnt & (~1));
        !            90:                while (p < w) {
        !            91:                        *((short *) p) = 0;
        !            92:                        p += sizeof(short);
        !            93:                        }
        !            94: 
        !            95:                if (cnt & 1)
        !            96:                        *p = '\0';
        !            97:                }
        !            98:        
        !            99:        return( ptr );
        !           100: }
        !           101: /*eject*/
        !           102: zerofile(fildes,bptr,bsiz)
        !           103:        FILE            *fildes;        /* write opened file */
        !           104:        unsigned        *bptr;          /* zero filled buffer */
        !           105:        int             bsiz;           /* size of buffer */
        !           106: {
        !           107:        long    file_end;
        !           108:        OUTSECT *osptr;
        !           109: /*
        !           110:  * Insure that fildes is zero filled up to the point
        !           111:  * of symbol table origin, or up to the last section if the symbol
        !           112:  * table is stripped. Under TS, we simply seek to the point
        !           113:  * and write one unsigned. Under RT or DMERT we must write 0's
        !           114:  * throughout the entire space.
        !           115:  */
        !           116: #if PAGING
        !           117:        if (Fflag || !sflag)
        !           118: #else
        !           119:        if (!sflag)
        !           120: #endif
        !           121:                file_end = symtborg - 4;
        !           122:        else
        !           123:        {
        !           124:                file_end = 0L;
        !           125:                for (osptr = (OUTSECT *) outsclst.head; osptr; osptr = osptr->osnext)
        !           126:                        file_end = max( file_end, osptr->oshdr.s_scnptr );
        !           127: 
        !           128:        }
        !           129: 
        !           130: #if RT
        !           131:        rewind(fildes);
        !           132:        while ( file_end > ftell(fildes) ) 
        !           133:                fwrite( (char*) bptr, bsiz, 1, fildes);
        !           134: #else
        !           135:        fseek(fildes, file_end, 0);
        !           136:        fwrite( (char *) bptr, sizeof(long), 1, fildes);
        !           137: #endif
        !           138:        rewind(fildes);         /* leave everythiing as we found it */
        !           139: 
        !           140:        return;
        !           141: }
        !           142: /*eject*/
        !           143: char *
        !           144: sname(s)
        !           145: char *s;
        !           146: {
        !           147: 
        !           148: /*
        !           149:  * Returns pointer to "simple" name of path name; that is,
        !           150:  * pointer to first character after last '/'.  If no slashes,
        !           151:  * returns pointer to first char of arg.
        !           152:  *
        !           153:  * If the string ends in a slash:
        !           154:  *     1. replace the terminating slash with '\0'
        !           155:  *     2. return a pointer to the first character after the last
        !           156:  *             '/', or the first character in the string
        !           157:  */
        !           158: 
        !           159:        register char *p;
        !           160: 
        !           161:        p = s;
        !           162:        while( *p )
        !           163:                if(*p++ == '/')
        !           164:                        if( *p == '\0' ) {
        !           165:                                *(p-1) = '\0';
        !           166:                                break;
        !           167:                                }
        !           168:                        else
        !           169:                                s = p;
        !           170: 
        !           171:        return(s);
        !           172: }
        !           173: /*eject*/
        !           174: char *
        !           175: myalloc(nbytes)
        !           176: int nbytes;
        !           177: {
        !           178: 
        !           179: /*
        !           180:  * Allocate "nbytes" of memory, and exit from ld
        !           181:  * upon failure.
        !           182:  */
        !           183: 
        !           184:        register char *mem;
        !           185:        extern char *calloc();
        !           186: 
        !           187:        if( (mem = calloc(1,nbytes)) == NULL ) {
        !           188:                lderror(0,0,NULL, "memory allocation failure on %d-byte 'calloc' call",
        !           189:                        nbytes);
        !           190:                lderror(2,0,NULL, "%s run is too large and complex", SGS );
        !           191:                }
        !           192: 
        !           193:        allocspc += (long) nbytes;
        !           194:        maxalloc = max(maxalloc,allocspc);
        !           195: 
        !           196:        return(mem);
        !           197: }
        !           198: 
        !           199: 
        !           200: stoi(p)
        !           201: char *p;
        !           202: {
        !           203: 
        !           204: /*
        !           205:  * Given a string of digits, perhaps beginning with "0" or "0x",
        !           206:  * convert to an integer
        !           207:  *
        !           208:  * Return 0x8000 on any type of error
        !           209:  */
        !           210: 
        !           211:        register int base, num;
        !           212:        register char limit;
        !           213: 
        !           214:        num = 0;
        !           215:        
        !           216:        if (*p == '0') {
        !           217:                if (*++p == 'x' || *p == 'X') {         /* string is hex */
        !           218:                        for (p++; *p; p++) {
        !           219:                                num <<= 4;
        !           220:                                if (*p >= '0' && *p <= '9')
        !           221:                                        num += *p - '0';
        !           222:                                else if (*p >= 'a' && *p <= 'f')
        !           223:                                        num += *p - 'a' + 10;
        !           224:                                else if (*p >= 'A' && *p <= 'F')
        !           225:                                        num += *p - 'A' + 10;
        !           226:                                else return(0x8000);
        !           227:                                }
        !           228:                        return (num);
        !           229:                        }
        !           230:                else {
        !           231:                        base = 8;
        !           232:                        limit = '7';
        !           233:                        }
        !           234:                }
        !           235:        else {
        !           236:                base = 10;
        !           237:                limit = '9';
        !           238:                }
        !           239: 
        !           240:        for ( ; *p; p++)
        !           241:                if( (*p >= '0')  &&  (*p <= limit) )
        !           242:                        num = num * base + *p - '0';
        !           243:                else
        !           244:                        return(0x8000);
        !           245: 
        !           246:        return(num);
        !           247: }
        !           248: /*eject*/
        !           249: copybyts(src,dest,len)
        !           250: char *src, *dest;
        !           251: int len;
        !           252: {
        !           253: 
        !           254: /*
        !           255:  * Copy len bytes from src to dest
        !           256:  */
        !           257:        
        !           258:        while( len-- > 0 )
        !           259:                *dest++ = *src++;
        !           260: }
        !           261: /*eject*/
        !           262: /*VARARGS*/
        !           263: lderror(lvl, ln,fln,strng, a1,a2,a3,a4,a5,a6,a7,a8,a9,aa)
        !           264: int lvl;               /* error severity level */
        !           265: int ln;                        /* line in ifile containing the error */
        !           266: char *fln;             /* name of the ifile containing the error */
        !           267: char *strng;           /* error message format */
        !           268: int a1,a2,a3,a4,a5,    /* error message format arguments */
        !           269:     a6,a7,a8,a9,aa;
        !           270: {
        !           271: 
        !           272: /*
        !           273:  *  Prepend a filename and a line number to an error message.
        !           274:  *  used for printing all parsing-related errors.
        !           275:  */
        !           276: 
        !           277:        errlev = (errlev < lvl ) ? lvl : errlev;
        !           278: 
        !           279:        if( Sflag  &&  (lvl != 2) )
        !           280:                return;
        !           281: 
        !           282:        fprintf(stderr, "%sld", SGS);
        !           283:        if (fln != NULL)
        !           284:                fprintf(stderr, " %s", sname(fln));
        !           285:        if ( ln > 0 )
        !           286:                fprintf(stderr, " %d", ln) ;
        !           287: 
        !           288:        switch(lvl) {
        !           289:        case 0:
        !           290:                fprintf(stderr, " warning: ");
        !           291:                break;
        !           292:        case 2:
        !           293:                fprintf(stderr, " fatal: ");
        !           294:                break;
        !           295:        default:
        !           296:                fprintf(stderr, ": ");
        !           297:                break;
        !           298:        }
        !           299: 
        !           300:        fprintf(stderr, strng, a1, a2, a3, a4, a5, a6, a7, a8, a9, aa);
        !           301:        fprintf(stderr, "\n");
        !           302:        fflush(stderr);
        !           303: 
        !           304:        if(lvl > 1)
        !           305:                ldexit();
        !           306: }
        !           307: 

unix.superglobalmegacorp.com

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