Annotation of researchv9/jerq/sgs/ld/util.c, revision 1.1.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.