Annotation of coherent/b/bin/as/common.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * 80386 assembler common functions.
                      3:  */
                      4: #include <asm.h>
                      5: 
                      6: /*
                      7:  * Open a file or die in the attempt.
                      8:  */
                      9: FILE *
                     10: xopen(fn, acs)
                     11: char *fn, *acs;
                     12: {
                     13:        FILE *tmp;
                     14: 
                     15:        if (NULL == (tmp = fopen(fn, acs)))
                     16:                fatal("Cannot fopen(%s, %s)", fn, acs); /**/
                     17:        return (tmp);
                     18: }
                     19: 
                     20: /*
                     21:  * Make a new copy of a string into tmp space.
                     22:  * in temp space on a struct.
                     23:  */
                     24: char *
                     25: gcpy(id, disp)
                     26: register char *id;
                     27: register unsigned disp;
                     28: {
                     29:        register char *tmp;
                     30: 
                     31:        tmp = galloc(strlen(id) + 1 + disp);
                     32:        strcpy(tmp + disp, id);
                     33:        return(tmp);
                     34: }
                     35: 
                     36: /*
                     37:  * Make a new copy of a string.
                     38:  * in temp space on a struct.
                     39:  */
                     40: 
                     41: char *
                     42: scpy(id, disp)
                     43: register char *id;
                     44: register unsigned disp;
                     45: {
                     46:        register char *tmp;
                     47: 
                     48:        tmp = alloc(strlen(id) + 1 + disp);
                     49:        strcpy(tmp + disp, id);
                     50:        return(tmp);
                     51: }
                     52: 
                     53: /*
                     54:  * Trim surrounding spaces and tabs.
                     55:  */
                     56: char *
                     57: trim(s)
                     58: char *s;
                     59: {
                     60:        register char *p, c;
                     61: 
                     62:        for(p = strchr(s, '\0'); --p > s; )
                     63:                if((' ' == (c = *p)) || ('\t' == c))
                     64:                        *p = '\0';
                     65:                else
                     66:                        break;
                     67: 
                     68:        for(p = s; (' ' == (c = *p)) || ('\t' == c); p++)
                     69:                ;
                     70:        return(p);
                     71: }
                     72: 
                     73: /*
                     74:  * Count structs with a next or prev pointer  as the first item.
                     75:  */
                     76: short
                     77: countList(p)
                     78: parm *p;
                     79: {
                     80:        register short n;
                     81: 
                     82:        for(n = 0; NULL != p; p = p->next)
                     83:                n++;
                     84: 
                     85:        return(n);
                     86: }
                     87: 
                     88: /*
                     89:  * Find a parm by name. Return it or NULL.
                     90:  */
                     91: char *
                     92: lookList(t)
                     93: char *t;
                     94: {
                     95:        short n;
                     96:        register parm *p;
                     97: 
                     98:        for((p = trueMac->names), (n = 0); NULL != p; p = p->next) {
                     99:                if(!strcmp(t, p->str))
                    100:                        return(parmFind(n, trueMac->parms));
                    101:                n++;
                    102:        }
                    103:        if(!strcmp(".macno", t)) {
                    104:                static char buf[6];
                    105: 
                    106:                sprintf(buf, "%d", trueMac->expno);
                    107:                return(buf);
                    108:        }
                    109:        return(NULL);
                    110: }
                    111: 
                    112: /*
                    113:  * Find parm n.
                    114:  */
                    115: char *
                    116: parmFind(n, p)
                    117: short n;
                    118: register parm *p;
                    119: {
                    120:        for(; NULL != p; p = p->next)
                    121:                if(!n--)
                    122:                        return(p->str);
                    123:        return("");
                    124: }
                    125: 
                    126: /*
                    127:  * Do shift operation.
                    128:  */
                    129: void
                    130: doShift(n)
                    131: short n;
                    132: {
                    133:        register parm *p, **pp;
                    134:        short sav = n;
                    135: 
                    136:        if(NULL == trueMac)
                    137:                yyerror(".shift not in macro");
                    138:                /* \fB.shift\fR shifts macro parameters.
                    139:                 * It has no meaning outside a macro. */
                    140:        for(pp = &(trueMac->parms); NULL != (p = *pp); pp = &(p->next)) {
                    141:                if(--n == 0) {
                    142:                        *pp = p->next;
                    143:                        free((char *)p);
                    144:                        return;
                    145:                }
                    146:        }
                    147:        yyerror("Parm %d not found", sav);
                    148:        /* An attempt to \fB.shift\fR too far has been made. */
                    149: }
                    150: 
                    151: /*
                    152:  * push a new logic level.
                    153:  */
                    154: void
                    155: newLevel(type)
                    156: {
                    157:        macctl *mac;
                    158: 
                    159:        mac = new(macctl);
                    160:        mac->type = type;
                    161:        if(NULL != trueMac)
                    162:                mac->expno = trueMac->expno;
                    163:        mac->prev = logic;
                    164:        logic  = mac;
                    165: }
                    166: 
                    167: /*
                    168:  * Pop a logic level.
                    169:  */
                    170: void
                    171: freeLevel()
                    172: {
                    173:        macctl *tmp;
                    174: 
                    175:        logic = (tmp = logic)->prev;
                    176:        free((char *)tmp);
                    177: }
                    178: 
                    179: /*
                    180:  * Open a file
                    181:  */
                    182: void
                    183: fileOpen(fn)
                    184: char *fn;
                    185: {
                    186:        inpctl *ip;
                    187: 
                    188:        /*
                    189:         * NIGEL: Hack this up so that after the string is copied into the
                    190:         * temp space we try and strip quote-marks. This job made a little
                    191:         * harder because Charles was a perverse son-of-a-bitch and used
                    192:         * flex-arrays.
                    193:         */
                    194: 
                    195:        ip = (inpctl *)scpy(fn, offset(inpctl, name));
                    196: 
                    197:        if (* ip->name == '"') {
                    198:                int             len = strlen (ip->name);
                    199: 
                    200:                if (ip->name [len - 1] == '"') {
                    201:                        strncpy (ip->name, fn + 1, len - 2);
                    202:                        ip->name [len - 2] = 0;
                    203:                }
                    204:        }
                    205: 
                    206:        ip->fp = xopen (ip->name, "r");
                    207:        ip->prev = inpc;
                    208:        inpc = ip;
                    209: }
                    210: 
                    211: /*
                    212:  * Check for no truncation to short.
                    213:  */
                    214: ck16(n)
                    215: register long n;
                    216: {
                    217:        register short i;
                    218: 
                    219:        /* PMC: LINT: OK. Intentional Loss of accuracy. */
                    220:        i = n;
                    221:        return(i != n);
                    222: }
                    223: 
                    224: /*
                    225:  * Build a label.
                    226:  */
                    227: void
                    228: buildlab(label)
                    229: parm *label;
                    230: {
                    231:        if(NULL != label)
                    232:                symLookUp(label->str, S_LOCAL, dot.loc, dot.sg);
                    233: }
                    234: 
                    235: /*
                    236:  * Label ignored message.
                    237:  */
                    238: void
                    239: labelIgnored(label)
                    240: parm *label;
                    241: {
                    242:        if (NULL != label)
                    243:                yyerror("Label ignored");
                    244:                /* This statement cannot take a label. */
                    245: }
                    246: 
                    247: /*
                    248:  * Table error detected.
                    249:  */
                    250: kindErr(kind)
                    251: unsigned short kind;
                    252: {
                    253:        fatal("Table error kind %x detected", kind); /* TECH */
                    254: }
                    255: 
                    256: /*
                    257:  * Find a name on a char ** and return index.
                    258:  */
                    259: nameList(n, nl)
                    260: register char *n, **nl;
                    261: {
                    262:        register i;
                    263: 
                    264:        for(i = 0; (NULL != *nl) && strcmp(n, *nl); i++, nl++)
                    265:                ;
                    266:        return(i);
                    267: }

unix.superglobalmegacorp.com

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