-
Notifications
You must be signed in to change notification settings - Fork 0
/
table.h
154 lines (121 loc) · 4.01 KB
/
table.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
/********************************************
table.h
copyright 1991,2014-2016 Michael D. Brennan
This is a source file for mawk, an implementation of
the AWK programming language.
Mawk is distributed without warranty under the terms of
the GNU General Public License, version 3, 2007.
If you import elements of this code into another product,
you agree to not name that product mawk.
********************************************/
/* types related to symbols are defined here */
#ifndef SYMTYPE_H
#define SYMTYPE_H
#include "types.h"
#define HASH_PRIME 113
/* struct to hold info about builtins */
typedef struct {
const char * name;
PF_CP fp; /* ptr to function that does the builtin */
unsigned char min_args, max_args;
/* info for parser to check correct number of arguments */
} BI_REC;
/*---------------------------
structures and types for arrays
*--------------------------*/
#include "array.h"
extern ARRAY Argv;
/* for parsing (i,j) in A */
typedef struct {
int start; /* offset to code_base */
int cnt;
} ARG2_REC;
/*------------------------
user defined functions
------------------------*/
typedef struct fblock {
const char * name;
INST * code;
unsigned short nargs;
char * typev; /* array of size nargs holding types */
} FBLOCK; /* function block */
void add_to_fdump_list( FBLOCK * );
void fdump( void );
/*-------------------------
elements of the symbol table
-----------------------*/
#define ST_NONE 0
#define ST_VAR 1
#define ST_KEYWORD 2
#define ST_BUILTIN 3 /* a pointer to a builtin record */
#define ST_ARRAY 4 /* a void * ptr to a hash table */
#define ST_FIELD 5 /* a cell ptr to a field */
#define ST_FUNCT 6
#define ST_NR 7 /* NR is special */
#define ST_ENV 8 /* and so is ENVIRON */
#define ST_UNUSED 9
#define ST_LOCAL_NONE 10
#define ST_LOCAL_VAR 11
#define ST_LOCAL_ARRAY 12
#define is_local( stp ) ( ( stp )->type >= ST_LOCAL_NONE )
typedef struct {
const char * name;
int type;
unsigned offset; /* offset in stack frame for local vars */
union {
CELL * cp;
int kw;
PF_CP fp;
BI_REC * bip;
ARRAY array;
FBLOCK * fbp;
} stval;
} SYMTAB;
/* for patching length(A) when A is local and type unknown */
typedef struct {
FBLOCK * fbp;
unsigned offset;
} Local_PI;
/*****************************
structures for type checking function calls
******************************/
typedef struct ca_rec {
struct ca_rec * link;
short type;
short arg_num; /* position in callee's stack */
/*--------- this data only set if we'll need to patch -------*/
/* happens if argument is an ID or type ST_NONE or ST_LOCAL_NONE */
int call_offset;
/* where the type is stored */
SYMTAB * sym_p; /* if type is ST_NONE */
char * type_p; /* if type is ST_LOCAL_NONE */
} CA_REC; /* call argument record */
/* type field of CA_REC matches with ST_ types */
#define CA_EXPR ST_LOCAL_VAR
#define CA_ARRAY ST_LOCAL_ARRAY
typedef struct fcall {
struct fcall * link;
FBLOCK * callee;
short call_scope;
short move_level;
FBLOCK * call; /* only used if call_scope == SCOPE_FUNCT */
INST * call_start; /* computed later as code may be moved */
CA_REC * arg_list;
short arg_cnt_checked;
unsigned line_no; /* for error messages */
} FCALL_REC;
extern FCALL_REC * resolve_list;
void resolve_fcalls( void );
void check_fcall( FBLOCK *, int, int, FBLOCK *, CA_REC *, unsigned );
void relocate_resolve_list( int, int, FBLOCK *, int, unsigned, int );
/* hash.c */
unsigned hash( const char * );
unsigned hash2( const char *, size_t );
SYMTAB * insert( const char * );
SYMTAB * find( const char * );
const char * reverse_find( int,void *);
SYMTAB * save_id( const char * );
void restore_ids( void );
/* error.c */
void type_error( SYMTAB * );
#endif /* SYMTYPE_H */