1: /*
   2:  * Lexical analysis routines.
   3:  */
   4: 
   5: #include "ilink.h"
   6: #include "opcode.h"
   7: 
   8: static int nlflag = 0;      /* newline last seen */
   9: 
  10: /*
  11:  * getop - get an opcode from infile, return the opcode number (via
  12:  *  binary search of opcode table), and point id at the name of the opcode.
  13:  */
  14: getop(id)
  15: char **id;
  16:    {
  17:    register char *s;
  18:    register struct opentry *p;
  19:    register int test;
  20:    int low, high, cmp;
  21:    extern char *getstr();
  22: 
  23:    s = getstr();
  24:    if (s == NULL)
  25:       return (EOF);
  26:    low = 0;
  27:    high = NOPCODES;
  28:    do {
  29:       test = (low + high) / 2;
  30:       p = &optable[test];
  31:       if ((cmp = strcmp(p->op_name, s)) < 0)
  32:          low = test + 1;
  33:       else if (cmp > 0)
  34:          high = test;
  35:       else {
  36:          *id = p->op_name;
  37:          return (p->op_code);
  38:          }
  39:       } while (low < high);
  40:    *id = s;
  41:    return (NULL);
  42:    }
  43: 
  44: /*
  45:  * getid - get an identifier from infile, put it in the identifier
  46:  *  table, and return a pointer to it.
  47:  */
  48: char *getid()
  49:    {
  50:    register char *s;
  51:    extern char *getstr();
  52:    extern char *putident();
  53: 
  54:    s = getstr();
  55:    if (s == NULL)
  56:       return (NULL);
  57:    return (putident(strlen(s)+1));
  58:    }
  59: 
  60: /*
  61:  * getstr - get an identifier from infile and return a pointer to it.
  62:  */
  63: char *getstr()
  64:    {
  65:    register int c;
  66:    register char *p;
  67: 
  68:    p = sfree;
  69:    while ((c = getc(infile)) == ' ' || c == '\t') ;
  70:    if (c == EOF)
  71:       return (NULL);
  72:    while (c != ' ' && c != '\t' && c != '\n' && c != ',' && c != EOF) {
  73:       *p++ = c;
  74:       c = getc(infile);
  75:       }
  76:    *p = 0;
  77:    nlflag = (c == '\n');
  78:    return (sfree);
  79:    }
  80: 
  81: /*
  82:  * getdec - get a decimal integer from infile, and return it.
  83:  */
  84: getdec()
  85:    {
  86:    register int c, n;
  87: 
  88:    n = 0;
  89:    while ((c = getc(infile)) == ' ' || c == '\t') ;
  90:    if (c == EOF)
  91:       return (0);
  92:    while (c >= '0' && c <= '9') {
  93:       n = n * 10 + (c - '0');
  94:       c = getc(infile);
  95:       }
  96:    nlflag = (c == '\n');
  97:    return (n);
  98:    }
  99: 
 100: /*
 101:  * getoct - get an octal number from infile, and return it.
 102:  */
 103: getoct()
 104:    {
 105:    register int c, n;
 106: 
 107:    n = 0;
 108:    while ((c = getc(infile)) == ' ' || c == '\t') ;
 109:    if (c == EOF)
 110:       return (0);
 111:    while (c >= '0' && c <= '7') {
 112:       n = (n << 3) | (c - '0');
 113:       c = getc(infile);
 114:       }
 115:    nlflag = (c == '\n');
 116:    return (n);
 117:    }
 118: 
 119: /*
 120:  * getint - get an Icon integer from infile, and return it.
 121:  */
 122: long getint()
 123:    {
 124:    register c;
 125:    register int r;
 126:    long int n;
 127: 
 128:    n = 0L;
 129:    while ((c = getc(infile)) >= '0' && c <= '9')
 130:       n = n * 10 + (c - '0');
 131:    if (c == 'r' || c == 'R') {
 132:       r = n;
 133:       n = 0L;
 134:       while (c = getc(infile)) {
 135:          if (c >= '0' && c <= '9')
 136:             c -= '0';
 137:          else if (c >= 'a' && c <= 'z')
 138:             c -= 'a' - 10;
 139:          else if (c >= 'A' && c <= 'Z')
 140:             c -= 'A' - 10;
 141:          else
 142:             break;
 143:          n = n * r + c;
 144:          }
 145:       }
 146:    nlflag = (c == '\n');
 147:    return (n);
 148:    }
 149: 
 150: /*
 151:  * getreal - get an Icon real number from infile, and return it.
 152:  */
 153: double getreal()
 154:    {
 155:    double n;
 156:    register int c, d, e;
 157:    int esign;
 158:    static double tens[] = {
 159:       1.0e0,  1.0e1,  1.0e2,  1.0e3,  1.0e4,  1.0e5,
 160:       1.0e6,  1.0e7,  1.0e8,  1.0e9,  1.0e10, 1.0e11,
 161:       1.0e12, 1.0e13, 1.0e14, 1.0e15, 1.0e16, 1.0e17,
 162:       1.0e18, 1.0e19, 1.0e20, 1.0e21, 1.0e22, 1.0e23,
 163:       1.0e24, 1.0e25, 1.0e26, 1.0e27, 1.0e28, 1.0e29,
 164:       1.0e30, 1.0e31, 1.0e32, 1.0e33, 1.0e34, 1.0e35,
 165:       1.0e36, 1.0e37, 1.0e38
 166:       };
 167:    static double ntens[] = {
 168:       1.0e0,   1.0e-1,  1.0e-2,  1.0e-3,  1.0e-4,  1.0e-5,
 169:       1.0e-6,  1.0e-7,  1.0e-8,  1.0e-9,  1.0e-10, 1.0e-11,
 170:       1.0e-12, 1.0e-13, 1.0e-14, 1.0e-15, 1.0e-16, 1.0e-17,
 171:       1.0e-18, 1.0e-19, 1.0e-20, 1.0e-21, 1.0e-22, 1.0e-23,
 172:       1.0e-24, 1.0e-25, 1.0e-26, 1.0e-27, 1.0e-28, 1.0e-29,
 173:       1.0e-30, 1.0e-31, 1.0e-32, 1.0e-33, 1.0e-34, 1.0e-35,
 174:       1.0e-36, 1.0e-37, 1.0e-38
 175:       };
 176: 
 177:    n = 0.0;
 178:    d = e = 0;
 179:    esign = 1;
 180:    while ((c = getc(infile)) >= '0' && c <= '9')
 181:       n = n * 10 + (c - '0');
 182:    if (c == '.') {
 183:       while ((c = getc(infile)) >= '0' && c <= '9') {
 184:          n = n * 10 + (c - '0');
 185:          d++;
 186:          }
 187:       }
 188:    if (c == 'e' || c == 'E') {
 189:       if ((c = getc(infile)) == '+' || c == '-') {
 190:          if (c == '-')
 191:             esign = -1;
 192:          c = getc(infile);
 193:          }
 194:       while (c >= '0' && c <= '9') {
 195:          e = e * 10 + (c - '0');
 196:          c = getc(infile);
 197:          }
 198:       }
 199:    if (esign < 0)
 200:       e = -e;
 201:    e = e - d;
 202:    if (e >= -38 && e < 0)
 203:       n = n * ntens[-e];
 204:    else if (e > 0 && e <= 38)
 205:       n = n * tens[e];
 206:    nlflag = (c == '\n');
 207:    return (n);
 208:    }
 209: 
 210: /*
 211:  * getlab - get a label ("L" followed by a number) from infile,
 212:  *  and return the number.
 213:  */
 214: 
 215: getlab()
 216:    {
 217:    register int c;
 218: 
 219:    while ((c = getc(infile)) != 'L' && c != EOF && c != '\n') ;
 220:    if (c == 'L')
 221:       return (getdec());
 222:    nlflag = (c == '\n');
 223:    return (0);
 224:    }
 225: 
 226: /*
 227:  * getstrlit - get a string literal from infile, as a string
 228:  *  of octal bytes, and return it.
 229:  */
 230: char *getstrlit(l)
 231: register int l;
 232:    {
 233:    register char *p;
 234:    extern char *putident();
 235: 
 236:    p = sfree;
 237:    while (!nlflag && l--)
 238:       *p++ = getoct();
 239:    *p++ = 0;
 240:    return (putident(p-sfree));
 241:    }
 242: 
 243: /*
 244:  * newline - skip to next line.
 245:  */
 246: newline()
 247:    {
 248:    register int c;
 249: 
 250:    if (!nlflag) {
 251:       while ((c = getc(infile)) != '\n' && c != EOF) ;
 252:       }
 253:    nlflag = 0;
 254:    }

Defined functions

getdec defined in line 84; used 18 times
getid defined in line 48; used 9 times
getint defined in line 122; used 2 times
getlab defined in line 215; used 3 times
getoct defined in line 103; used 4 times
getop defined in line 14; used 3 times
getreal defined in line 153; used 2 times
getstr defined in line 63; used 6 times
getstrlit defined in line 230; used 3 times
newline defined in line 246; used 25 times

Defined variables

nlflag defined in line 8; used 9 times
Last modified: 1984-11-18
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1231
Valid CSS Valid XHTML 1.0 Strict