Annotation of coherent/d/bin/as/grindy.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * The routines in this file
        !             3:  * completely dominate the execution time
        !             4:  * of the assembler. If you write tuned
        !             5:  * versions of them in assembly code, the
        !             6:  * performance of the assembler will be
        !             7:  * much better.
        !             8:  */
        !             9: #include "asm.h"
        !            10: 
        !            11: /*
        !            12:  * Read in an identifier.
        !            13:  * Pack the name, null filled, into
        !            14:  * the buffer `id'. The character `c'
        !            15:  * is the first character of the name;
        !            16:  * if < 0 then a character must be
        !            17:  * read.
        !            18:  */
        !            19: getid(id, c)
        !            20: register c;
        !            21: char *id;
        !            22: {
        !            23:        register char *e, *p;
        !            24: 
        !            25:        if (c < 0) {
        !            26:                do {
        !            27:                        if ((c = *ip) != 0)
        !            28:                                ++ip;
        !            29:                } while (c==' ' || c=='\t');
        !            30:                if (ctype[c] >= 0)      /* Not LETTER */
        !            31:                        qerr("invalid identifier");
        !            32:        }
        !            33:        p = id;
        !            34:        e = p + NCPLN;
        !            35:        do {
        !            36:                if (p < e)
        !            37:                        *p++ = c;
        !            38:                if ((c = *ip) != 0)
        !            39:                        ++ip;
        !            40:        } while (ctype[c] <= 0);        /* LETTER or DIGIT */
        !            41:        if (c != 0)
        !            42:                --ip;
        !            43:        while (p < e)
        !            44:                *p++ = 0;
        !            45: }
        !            46: 
        !            47: /*
        !            48:  * Read a line from the standard I/O
        !            49:  * stream `sfp' into the buffer `ib' and
        !            50:  * return true if a line was obtained.
        !            51:  */
        !            52: getline()
        !            53: {
        !            54:        register char *p;
        !            55:        register c;
        !            56: 
        !            57:        p = ib;
        !            58:        while ((c=getc(sfp))!=EOF && c!='\n')
        !            59:                if (p < &ib[NINPUT-1])
        !            60:                        *p++ = c;
        !            61:        *p = '\0';
        !            62:        return (c != EOF);
        !            63: }
        !            64: 
        !            65: /*
        !            66:  * Lookup the name `id' in the hashtable.
        !            67:  * If it is not found either return a
        !            68:  * `NULL' (`f' is false) or a
        !            69:  * pointer to a newly created hash table
        !            70:  * entry (`f' is true).
        !            71:  */
        !            72: struct sym *
        !            73: lookup(id, f)
        !            74: char *id;
        !            75: {
        !            76:        register struct sym *sp;
        !            77:        int ht;
        !            78: 
        !            79:        {
        !            80:                register char *p1;
        !            81:                register nc;
        !            82: 
        !            83:                ht = 0;
        !            84:                nc = NCPLN;
        !            85:                p1 = id;
        !            86:                do {
        !            87:                        ht += *p1++;
        !            88:                } while (--nc);
        !            89:        }
        !            90:        if ((sp = symhash[ht&HMASK]) != NULL) {
        !            91:                do {
        !            92:                        if (sp->s_total==ht && symeq(id, sp->s_id))
        !            93:                                return (sp);
        !            94:                } while ((sp = sp->s_sp) != NULL);
        !            95:        }
        !            96:        if (f == 0)
        !            97:                return (NULL);
        !            98:        sp = (struct sym *) new(sizeof(struct sym));
        !            99:        sp->s_total = ht;
        !           100:        ht &= HMASK;
        !           101:        sp->s_sp = symhash[ht];
        !           102:        symhash[ht] = sp;
        !           103:        sp->s_kind = S_NEW;
        !           104:        sp->s_type = E_ACON;
        !           105:        sp->s_flag = S_SYMT;
        !           106:        sp->s_addr = 0;
        !           107:        symcopy(sp->s_id, id);
        !           108:        return (sp);
        !           109: }
        !           110: 
        !           111: /*
        !           112:  * Compare two symbol names.
        !           113:  */
        !           114: symeq(p1, p2)
        !           115: register char *p1, *p2;
        !           116: {
        !           117:        register n;
        !           118: 
        !           119:        n = NCPLN;
        !           120:        do {
        !           121:                if (*p1++ != *p2++)
        !           122:                        return (0);
        !           123:        } while (--n);
        !           124:        return (1);
        !           125: }

unix.superglobalmegacorp.com

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