1 /* 2 * Copyright (c) 1982 Regents of the University of California 3 * @(#)asscanl.h 4.5 06/30/83 4 */ 5 /* 6 * This file contains definitions local to the files implementing 7 * the character scanner and the token buffer managers. 8 * It is not intended to be shared with any other parts of the 9 * assembler. 10 * The file ``asscan.h'' is shared with other parts of the assembler 11 */ 12 #include <stdio.h> 13 #include "as.h" 14 #include "asscan.h" 15 16 #define EOFCHAR (-1) 17 /* 18 * The table of possible uses for each character to test set inclusion. 19 */ 20 #define HEXFLAG 01 /* 'x' or 'X' */ 21 #define HEXLDIGIT 02 /* 'a' .. 'f' */ 22 #define HEXUDIGIT 04 /* 'A' .. 'F' */ 23 #define ALPHA 010 /* 'A' .. 'Z', 'a' .. 'z', '_'*/ 24 #define DIGIT 020 /* '0' .. '9' */ 25 #define FLOATEXP 040 /* 'd' 'e' 'D' 'E' 'g' 'h' 'G' 'H' */ 26 #define SIGN 0100 /* '+' .. '-'*/ 27 #define REGDIGIT 0200 /* '0' .. '5' */ 28 #define SZSPECBEGIN 0400 /* 'b', 'B', 'l', 'L', 'w', 'W' */ 29 #define POINT 01000 /* '.' */ 30 #define SPACE 02000 /* '\t' or ' ' */ 31 #define BSESCAPE 04000 /* bnrtf */ 32 #define STRESCAPE 010000 /* '"', '\\', '\n' */ 33 #define OCTDIGIT 020000 /* '0' .. '7' */ 34 #define FLOATFLAG 040000 /* 'd', 'D', 'f', 'F' */ 35 36 #define INCHARSET(val, kind) (charsets[val] & (kind) ) 37 /* 38 * We use our own version of getchar/ungetc to get 39 * some speed improvement 40 */ 41 extern char *Ginbufptr; 42 extern int Ginbufcnt; 43 #define REGTOMEMBUF Ginbufptr = inbufptr, Ginbufcnt = inbufcnt 44 #define MEMTOREGBUF inbufptr = Ginbufptr, inbufcnt = Ginbufcnt 45 #undef getchar 46 #define getchar() \ 47 (inbufcnt-- > 0 ? (*inbufptr++) : \ 48 (fillinbuffer(), \ 49 MEMTOREGBUF, \ 50 inbufptr[-1])) 51 #undef ungetc 52 #define ungetc(ch) \ 53 (++inbufcnt, *--inbufptr = ch) 54 55 /* 56 * Variables and definitions to manage the token buffering. 57 * We scan (lexically analyze) a large number of tokens, and 58 * then parse all of the tokens in the scan buffer. 59 * This reduces procedure call overhead when the parser 60 * demands a token, allows for an efficient reread during 61 * the second pass, and confuses the line number reporting 62 * for errors encountered in the scanner and in the parser. 63 */ 64 #define TOKDALLOP 8 65 struct tokbufdesc *bufstart; /*where the buffer list begins*/ 66 struct tokbufdesc *buftail; /*last one on the list*/ 67 struct tokbufdesc *emptybuf; /*the one being filled*/ 68 /* 69 * If we are using VM, during the second pass we reclaim the used 70 * token buffers for saving the relocation information 71 */ 72 struct tokbufdesc *tok_free; /* free pool */ 73 struct tokbufdesc *tok_temp; /* temporary for doing list manipulation */ 74 /* 75 * Other token buffer managers 76 */ 77 int bufno; /*which buffer number: 0,1 for tmp file*/ 78 struct tokbufdesc tokbuf[2]; /*our initial increment of buffers*/ 79 ptrall tokptr; /*where the current token comes from*/ 80 ptrall tokub; /*the last token in the current token buffer*/ 81 /* 82 * as does not use fread and fwrite for the token buffering. 83 * The token buffers are integrals of BUFSIZ 84 * at all times, so we use direct read and write. 85 * fread and fwrite in stdio are HORRENDOUSLY inefficient, 86 * as they use putchar for each character, nested two deep in loops. 87 */ 88 #define writeTEST(pointer, size, nelements, ioptr) \ 89 write(ioptr->_file, pointer, nelements * size) != nelements * size 90 91 #define readTEST(pointer, size, nelements, ioptr) \ 92 read(ioptr->_file, pointer, nelements * size) != nelements * size 93 94 #define bskiplg(from, length) \ 95 *(lgtype *)from = length; \ 96 (bytetoktype *)from += sizeof(lgtype) + length 97 98 #define bskipfromto(from, to) \ 99 *(lgtype *)from = (bytetoktype *)to - (bytetoktype *)from - sizeof(lgtype); \ 100 (bytetoktype *)from += sizeof (lgtype) + (bytetoktype *)to - (bytetoktype *)from 101 102 #define eatskiplg(from) \ 103 (bytetoktype *)from += sizeof(lgtype) + *(lgtype *)from 104 105 #ifdef DEBUG 106 ptrall firsttoken; 107 #endif DEBUG 108 109 /* 110 * The following three variables are the slots for global 111 * communication with the parser. 112 * They are the semantic values associated with a particular token. 113 * The token itself is the return value from yylex() 114 */ 115 int yylval; /* normal semantic value */ 116 Bignum yybignum; /* a big number */ 117 struct Opcode yyopcode; /* a structure opcode */ 118 119 int newfflag; 120 char *newfname; 121 int scanlineno; /*the scanner's linenumber*/ 122 123 /* 124 * Definitions for sets of characters 125 */ 126 readonly short charsets[]; 127 readonly short type[]; 128