1603Sbill /* 2*5830Srrh * Copyright (c) 1982 Regents of the University of California 3*5830Srrh * @(#)asscan.h 4.4 02/14/82 4*5830Srrh */ 5*5830Srrh /* 6603Sbill * The character scanner is called to fill up one token buffer 7603Sbill * 8603Sbill * However, once the tokens are filled up by the 9603Sbill * character scanner, they are used in both the first and the second 10603Sbill * pass. Holes created by .stab removal are replaced 11603Sbill * with 'skip' tokens that direct the second pass to ignore the 12603Sbill * following tokens. 13603Sbill */ 14603Sbill 15603Sbill #define TOKBUFLG BUFSIZ 16603Sbill #define MAXVAX 32 17603Sbill #define SAFETY 16 18603Sbill 19603Sbill #define AVAILTOKS TOKBUFLG -\ 20603Sbill sizeof(int) -\ 21603Sbill sizeof (struct tokbufdesc *) -\ 22603Sbill MAXVAX - SAFETY 23603Sbill 24603Sbill struct tokbufdesc{ 25603Sbill int tok_count; /*absolute byte length*/ 26603Sbill struct tokbufdesc *tok_next; 27603Sbill char toks[AVAILTOKS]; 28603Sbill char bufovf[MAXVAX + SAFETY]; 29603Sbill }; 30603Sbill /* 31603Sbill * Definitions for handling tokens in the intermediate file 32603Sbill * buffers. 33603Sbill * 34603Sbill * We want to have the compiler produce the efficient auto increment 35603Sbill * instruction for stepping through the buffer of tokens. We must 36603Sbill * fool the type checker into thinking that a pointer can point 37603Sbill * to various size things. 38603Sbill */ 39603Sbill 40*5830Srrh typedef int inttoktype; 41*5830Srrh typedef char bytetoktype; 42603Sbill 43603Sbill typedef char *ptrall; /*all uses will be type cast*/ 44603Sbill typedef short lgtype; /*for storing length of strings or skiping*/ 45603Sbill /* 46603Sbill * defintions for putting various typed values 47603Sbill * into the intermediate buffers 48603Sbill * ptr will ALWAYS be of type ptrall 49603Sbill */ 50603Sbill 51603Sbill #define pchar(ptr,val) *ptr++ = val 52603Sbill #define puchar(ptr,val) *ptr++ = val 53603Sbill 54603Sbill #define pshort(ptr,val) *(short *)ptr=val, ptr += sizeof(short) 55*5830Srrh #define pushort(ptr,val) *(u_short *)ptr=val, ptr += sizeof(short) 56603Sbill #define pint(ptr,val) *(int *)ptr = val, ptr += sizeof(int) 57*5830Srrh #define puint(ptr,val) *(u_int int *)ptr=val, ptr += sizeof(int) 58603Sbill #define plong(ptr,val) *(long *)ptr = val, ptr += sizeof(long) 59*5830Srrh #define pulong(ptr,val) *(u_int long *)ptr=val, ptr += sizeof(long) 60*5830Srrh #define pnumber(ptr,val) *(Bignum*)ptr=val, ptr += sizeof(Bignum) 61*5830Srrh #define popcode(ptr,val) *(struct Opcode*)ptr=val, ptr += sizeof(struct Opcode) 62*5830Srrh 63603Sbill #define pptr(ptr,val) *(int *)ptr = (val), ptr += sizeof(ptrall) 64603Sbill #define ptoken(ptr,val) *ptr++ = val 65603Sbill #define pstrlg(ptr,val) *(lgtype *)ptr = val, ptr += sizeof(short) 66603Sbill #define pskiplg(ptr,val) *(lgtype *)ptr = val, ptr += sizeof(short) 67603Sbill 68603Sbill #define gchar(val, ptr) val = *ptr++ 69603Sbill #define guchar(val, ptr) val = *ptr++ 70603Sbill 71603Sbill #define gshort(val, ptr) val = *(short *)ptr , ptr += sizeof (short) 72*5830Srrh #define gushort(val, ptr) val = *(u_short *)ptr , ptr += sizeof (short) 73603Sbill #define gint(val, ptr) val = *(int *)ptr, ptr += sizeof (int) 74*5830Srrh #define guint(val, ptr) val = *(u_int *)ptr, ptr += sizeof (int) 75603Sbill #define glong(val, ptr) val = *(long *)ptr, ptr += sizeof (long) 76*5830Srrh #define gulong(val, ptr) val = *(u_int *)ptr, ptr += sizeof (long) 77*5830Srrh #define gnumber(val, ptr) val = *(Bignum *)ptr, ptr += sizeof(Bignum) 78*5830Srrh #define gopcode(val, ptr) val = *(struct Opcode *)ptr, ptr += sizeof(struct Opcode) 79*5830Srrh 80603Sbill #define gptr(val, ptr) val = *(int *)ptr, ptr += sizeof (ptrall) 81603Sbill #define gtoken(val, ptr) val = *ptr++ 82603Sbill #define gstrlg(val, ptr) val = *(lgtype *)ptr, ptr += sizeof (short) 83603Sbill #define gskiplg(val, ptr) val = *(lgtype *)ptr, ptr += sizeof (short) 84603Sbill 85603Sbill 86603Sbill extern ptrall tokptr; /*the next token to consume, call by copy*/ 87603Sbill extern ptrall tokub; /*current upper bound in the current buffer*/ 88603Sbill 89603Sbill /* 90603Sbill * Strings are known for their characters and for their length. 91603Sbill * We cannot use a normal zero termination byte, because strings 92603Sbill * can contain anything. 93603Sbill * 94603Sbill * We have two "strings", so that an input string that is too long can be 95603Sbill * split across two string buffers, and not confuse the yacc grammar. 96603Sbill * (This is probably superflous) 97603Sbill * 98603Sbill * We have a third string of nulls so that the .skip can be 99603Sbill * handled in the same way as strings. 100603Sbill */ 101603Sbill #define MAXSTRLG 127 102603Sbill 103603Sbill struct strdesc{ 104603Sbill char str_lg; 105603Sbill char str[MAXSTRLG]; 106603Sbill }; 107603Sbill 108603Sbill extern struct strdesc strbuf[3]; 109603Sbill extern struct strdesc *strptr; /*points to the current string*/ 110603Sbill extern int strno; /*the current string being filled*/ 111603Sbill char *savestr(); 112