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

1.1       root        1: /*
                      2:  * Convert old as format to new asm format.
                      3:  */
                      4: #include <stdio.h>
                      5: #include <ctype.h>
                      6: #define MAXL   100
                      7: 
                      8: #define START  0
                      9: #define INTOKEN        1
                     10: #define BSL    2
                     11: #define DQUOTE 3
                     12: #define SQUOTE 4
                     13: #define WHITE  5
                     14: #define ACOMM  6
                     15: 
                     16: typedef struct locsym locsym;
                     17: struct locsym {        /* one for local symbol */
                     18:        int number;     /* old local symbol number */
                     19:        int def;        /* 0 if undefined 1 if defined */
                     20: };
                     21: locsym locs[MAXL];
                     22: int top;               /* highest defined symbol */
                     23: int lineno = 1;                /* line number */
                     24: int rc;                        /* return code */
                     25: int octdig;            /* octal digit ct */
                     26: 
                     27: /*
                     28:  * Report an error on stderr.
                     29:  */
                     30: error(s)
                     31: char *s;
                     32: {
                     33:        fprintf(stderr, "%d: %s\n", lineno, s);
                     34:        rc = 1;
                     35: }
                     36: /*
                     37:  * Find a local symbol in the right defined state.
                     38:  */
                     39: locsym *
                     40: scanLoc(n, at)
                     41: {
                     42:        register locsym *s;
                     43: 
                     44:        for (s = locs + (top - 1); s >= locs; s--)
                     45:                if (n == s->number && at == s->def)
                     46:                        return (s);
                     47:        return(NULL);
                     48: }
                     49: 
                     50: /*
                     51:  * A token has been read process it looking for local symbols.
                     52:  * These are in the form [0-9]+[:bf]
                     53:  * Where [:] requires a pstate of START and [bf] a pstate of white
                     54:  */
                     55: static void
                     56: crunch(token, pstate)
                     57: char *token;
                     58: {
                     59:        register locsym *s;
                     60:        register i, c;
                     61:        register char *p;
                     62:        int sw;
                     63: 
                     64:        for (sw = i = 0, p = token; (c = *p++) && isdigit(c); ) {
                     65:                sw = 1;
                     66:                i = (i * 10) + (c - '0');
                     67:        }
                     68:        if (!sw || *p)  /* mark nomatch */
                     69:                c = 0;
                     70: 
                     71:        s = NULL;
                     72:        switch (c) {
                     73:        case ':':
                     74:                if (START != pstate)
                     75:                        error(": local symbol after start of line");
                     76:                /* 
                     77:                 * if first use of this symbol build table entry.
                     78:                 * else mark it defined.
                     79:                 */
                     80:                if (NULL == (s = scanLoc(i, 0))) {
                     81:                        s = locs + top++;
                     82:                        s->number = i;
                     83:                        break;
                     84:                }
                     85:                s->def = 1;
                     86:                break;
                     87:        case 'b':
                     88:                if (WHITE != pstate)
                     89:                        error("b local symbol after start of line");
                     90:                if (NULL == (s = scanLoc(i, 1)))
                     91:                        error("Unresolved local symbol");
                     92:                break;
                     93:        case 'f':
                     94:                if (WHITE != pstate)
                     95:                        error("f local symbol after start of line");
                     96:                /*
                     97:                 * If first use of this symbol build it
                     98:                 * else use it.
                     99:                 */
                    100:                if (NULL == (s = scanLoc(i, 0))) {
                    101:                        s = locs + top++;
                    102:                        s->number = i;
                    103:                        s->def = 0;
                    104:                        break;
                    105:                }
                    106:                break;
                    107:        }
                    108:        if (NULL == s)
                    109:                printf("%s", token);
                    110:        else
                    111:                printf("?%03d", (int)(s - locs));
                    112: }
                    113: 
                    114: /*
                    115:  * Read input to output finding tokens.
                    116:  */
                    117: main()
                    118: {
                    119:        register c, state, pstate;
                    120:        char *tp, token[20];
                    121: 
                    122:        for (state = pstate = START; EOF != (c = getchar()); ) {
                    123:                switch (state) {
                    124:                case START:
                    125:                        if (isspace(c)) {
                    126:                                state = WHITE;
                    127:                                break;
                    128:                        }
                    129:                case WHITE:
                    130:                        if (isalnum(c)) {
                    131:                                pstate = state;
                    132:                                state = INTOKEN;
                    133:                                tp = token;
                    134:                                *tp++ = c;
                    135:                                continue;
                    136:                        }
                    137:                        switch (c) {
                    138:                        case '"':
                    139:                                state = DQUOTE;
                    140:                                break;
                    141:                        case '\'':
                    142:                                state = SQUOTE;
                    143:                                octdig = 0;
                    144:                                break;
                    145:                        case '/':
                    146:                                state = ACOMM;
                    147:                        }
                    148:                case ACOMM:
                    149:                        break;
                    150:                case INTOKEN:
                    151:                        if ((':' == c) || isalnum(c)) {
                    152:                                *tp++ = c;
                    153:                                continue;
                    154:                        }
                    155:                        *tp = '\0';
                    156:                        crunch(token, pstate);
                    157:                        state = WHITE;
                    158:                        break;
                    159:                case DQUOTE:
                    160:                        switch (c) {
                    161:                        case '\'':
                    162:                                pstate = state;
                    163:                                state = BSL;
                    164:                                break;
                    165:                        case '"':
                    166:                                state = WHITE;
                    167:                                break;
                    168:                        }
                    169:                        break;
                    170:                case BSL:
                    171:                        if (SQUOTE != (state = pstate))
                    172:                                break;
                    173:                        if ('\\' == c) {
                    174:                                putchar(c);
                    175:                                c = '\'';
                    176:                                state = WHITE;
                    177:                                break;
                    178:                        }
                    179:                        octdig = 2;     /* fall through */
                    180: 
                    181:                case SQUOTE:
                    182:                        if ('\\' == c) {
                    183:                                pstate = state;
                    184:                                state = BSL;
                    185:                                break;
                    186:                        }
                    187:                        if (isdigit(c) && octdig--)
                    188:                                break;
                    189:                        putchar(c);     /* turn 'x to 'x' */
                    190:                        c = '\'';
                    191:                        state = WHITE;
                    192:                }
                    193:                putchar(c);
                    194:                if ('\n' == c) {
                    195:                        lineno++;
                    196:                        state = START;
                    197:                }
                    198:        }
                    199:        exit(rc);
                    200: }

unix.superglobalmegacorp.com

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