1 /*-------------------------------------------------*
2  | array.h                                         |
3  | Header file for awka.c, part of the awka        |
4  | program, Copyright 1999, Andrew Sumner.         |
5  | This file is covered by the GNU General         |
6  | Public License - see file GPL for more details. |
7  *-------------------------------------------------*/
8 
9 #ifndef _AWKA_EXE_H
10 #define _AWKA_EXE_H
11 
12 #define Max(a, b) (((a) > (b)) ? (a) : (b))
13 #define Min(a, b) (((a) < (b)) ? (a) : (b))
14 #ifndef TRUE
15 #  define TRUE  1
16 #  define FALSE 0
17 #endif
18 
19 #include "../lib/builtin_priv.h"
20 #include "code.h"
21 
22 char *       awka_a_cat(int, int *, char *);
23 char *       awka_a_del(int, int *, char *);
24 char *        awka_push(int, int *, char *);
25 char *      awka_a_test(int, int *, char *);
26 char *         awka_add(int, int *, char *);
27 char *     awka_add_asg(int, int *, char *);
28 char *       awka_aloop(int, int *, char *);
29 char *      awka_assign(int, int *, char *);
30 char *         awka_cat(int, int *, char *);
31 char *        awka_call(int, int *, char *);
32 char *       awka_del_a(int, int *, char *);
33 char *         awka_div(int, int *, char *);
34 char *     awka_div_asg(int, int *, char *);
35 char *          awka_eq(int, int *, char *);
36 char *        awka_exit(int, int *, char *);
37 char *       awka_exit0(int, int *, char *);
38 char *   awka_f_add_asg(int, int *, char *);
39 char *    awka_f_assign(int, int *, char *);
40 char *   awka_f_div_asg(int, int *, char *);
41 char *   awka_f_mod_asg(int, int *, char *);
42 char *   awka_f_mul_asg(int, int *, char *);
43 char *  awka_f_post_dec(int, int *, char *);
44 char *  awka_f_post_inc(int, int *, char *);
45 char *   awka_f_pow_asg(int, int *, char *);
46 char *   awka_f_pre_dec(int, int *, char *);
47 char *   awka_f_pre_inc(int, int *, char *);
48 char *   awka_f_sub_asg(int, int *, char *);
49 char *          awka_gt(int, int *, char *);
50 char *         awka_gte(int, int *, char *);
51 char *         awka_jnz(int, int *, char *);
52 char *          awka_jz(int, int *, char *);
53 char *        awka_ljnz(int, int *, char *);
54 char *         awka_ljz(int, int *, char *);
55 char *          awka_lt(int, int *, char *);
56 char *         awka_lte(int, int *, char *);
57 char *       awka_match(int, int *, char *);
58 char *      awka_match0(int, int *, char *);
59 char *       awka_match(int, int *, char *);
60 char *         awka_mod(int, int *, char *);
61 char *     awka_mod_asg(int, int *, char *);
62 char *         awka_mul(int, int *, char *);
63 char *     awka_mul_asg(int, int *, char *);
64 char *         awka_neq(int, int *, char *);
65 char *        awka_next(int, int *, char *);
66 char *    awka_nextfile(int, int *, char *);
67 char *         awka_not(int, int *, char *);
68 char *       awka_ol_gl(int, int *, char *);
69 char *         awka_pop(int, int *, char *);
70 char *    awka_post_dec(int, int *, char *);
71 char *    awka_post_inc(int, int *, char *);
72 char *         awka_pow(int, int *, char *);
73 char *     awka_pow_asg(int, int *, char *);
74 char *     awka_pre_dec(int, int *, char *);
75 char *     awka_pre_inc(int, int *, char *);
76 char *      awka_printf(int, int *, char *);
77 char *       awka_range(int, int *, char *);
78 char *         awka_ret(int, int *, char *);
79 char *        awka_ret0(int, int *, char *);
80 char *      awka_set_al(int, int *, char *);
81 char *         awka_sub(int, int *, char *);
82 char *     awka_sub_asg(int, int *, char *);
83 char *        awka_test(int, int *, char *);
84 char *      awka_uminus(int, int *, char *);
85 char *       awka_uplus(int, int *, char *);
86 char *     awka_builtin(int, int *, char *);
87 char *     awka_getline(int, int *, char *);
88 char *       awka_split(int, int *, char *);
89 char *        awka_gsub(int, int *, char *);
90 char *       awka_close(int, int *, char *);
91 char *        awka_goto(int, int *, char *);
92 char *      awka_tocase(int, int *, char *);
93 char *    awka_nullfunc(int, int *, char *);
94 char *        awka_math(int, int *, char *);
95 char *       awka_index(int, int *, char *);
96 char *       awka_colon(int, int *, char *);
97 char *      awka_length(int, int *, char *);
98 char *      awka_substr(int, int *, char *);
99 char *       awka_asort(int, int *, char *);
100 char *     awka_alength(int, int *, char *);
101 char *        awka_expr(int, int *, char *);
102 char *    awka_argcount(int, int *, char *);
103 char *      awka_argval(int, int *, char *);
104 char *      awka_gensub(int, int *, char *);
105 
106 #define _VAR_REF  0
107 #define _VAR_SET  1
108 #define _VARTYPE_G_SCALAR  1
109 #define _VARTYPE_G_ARRAY   2
110 #define _VARTYPE_L_SCALAR  3
111 #define _VARTYPE_L_ARRAY   4
112 
113 #define _VALTYPE_UNK       0
114 #define _VALTYPE_NUM       1
115 #define _VALTYPE_STR       2
116 #define _VALTYPE_RE        4
117 
118 typedef struct {
119   char *name;
120   unsigned int *usage;
121   unsigned int *lines;
122   char **files;
123   unsigned line_no;
124   unsigned line_allc;
125   char type;
126   char valtype;    /* the primary type of data held by this var */
127   char valtype2;   /* if its been cast to another type */
128 } awka_varname;
129 
130 struct a_sc
131 {
132    char *name;
133    char *(*func)(int, int *, char *);
134    int op;
135    int varidx;
136    char pop;
137    char ftype;
138 };
139 
140 #ifdef AWKA_MAIN
141 struct a_sc code[] = {
142 { "abort",       awka_exit,         _ABORT,       -1,             TRUE,  0, },
143 { "abort0",      awka_exit0,        _ABORT0,      -1,             TRUE,  0, },
144 { "a_cat",       awka_a_cat,        A_CAT,        -1,             FALSE, 0, },
145 { "a_del",       awka_a_del,        A_DEL,        -1,             TRUE,  0, },
146 { "a_pusha",     awka_push,         A_PUSHA,      -1,             FALSE, 0, },
147 { "a_test",      awka_a_test,       A_TEST,       -1,             FALSE, 0, },
148 { "add",         awka_add,          _ADD,         -1,             FALSE, 0, },
149 { "add_asg",     awka_add_asg,      _ADD_ASG,     -1,             FALSE, 0, },
150 { "ae_pusha",    awka_push,         AE_PUSHA,     -1,             FALSE, 0, },
151 { "ae_pushi",    awka_push,         AE_PUSHI,     -1,             FALSE, 0, },
152 { "aloop",       awka_aloop,        ALOOP,        -1,             TRUE,  0, },
153 { "assign",      awka_assign,       _ASSIGN,      -1,             FALSE, 0, },
154 { "break",       awka_pop,          _BREAK,       -1,             TRUE,  0, },
155 { "builtin",     awka_nullfunc,     _BUILTIN,     -1,             FALSE, 0, },
156 { "call",        awka_call,         _CALL,        -1,             FALSE, 0, },
157 { "cat",         awka_cat,          _CAT,         -1,             FALSE, 0, },
158 { "cleanup",     awka_exit0,        _CLEANUP,     -1,             TRUE,  0, },
159 { "colon",       awka_colon,        _COLON,       -1,             FALSE, 0, },
160 { "continue",    awka_pop,          _CONTINUE,    -1,             TRUE,  0, },
161 { "del_a",       awka_del_a,        DEL_A,        -1,             TRUE,  0, },
162 { "div",         awka_div,          _DIV,         -1,             FALSE, 0, },
163 { "div_asg",     awka_div_asg,      _DIV_ASG,     -1,             FALSE, 0, },
164 { "eq",          awka_eq,           _EQ,          -1,             FALSE, 0, },
165 { "else",        awka_jz,           _ELSE,        -1,             TRUE,  0, },
166 { "exit",        awka_exit,         _EXIT,        -1,             TRUE,  0, },
167 { "exit0",       awka_exit0,        _EXIT0,       -1,             TRUE,  0, },
168 { "f_add_asg",   awka_add_asg,      F_ADD_ASG,    -1,             FALSE, 0, },
169 { "f_assign",    awka_assign,       F_ASSIGN,     -1,             FALSE, 0, },
170 { "f_div_asg",   awka_div_asg,      F_DIV_ASG,    -1,             FALSE, 0, },
171 { "f_mod_asg",   awka_mod_asg,      F_MOD_ASG,    -1,             FALSE, 0, },
172 { "f_mul_asg",   awka_mul_asg,      F_MUL_ASG,    -1,             FALSE, 0, },
173 { "f_post_dec",  awka_post_dec,     F_POST_DEC,   -1,             FALSE, 0, },
174 { "f_post_inc",  awka_post_inc,     F_POST_INC,   -1,             FALSE, 0, },
175 { "f_pow_asg",   awka_pow_asg,      F_POW_ASG,    -1,             FALSE, 0, },
176 { "f_pre_dec",   awka_pre_dec,      F_PRE_DEC,    -1,             FALSE, 0, },
177 { "f_pre_inc",   awka_pre_inc,      F_PRE_INC,    -1,             FALSE, 0, },
178 { "f_pusha",     awka_push,         F_PUSHA,      -1,             FALSE, 0, },
179 { "f_pushi",     awka_push,         F_PUSHI,      -1,             FALSE, 0, },
180 { "f_sub_asg",   awka_sub_asg,      F_SUB_ASG,    -1,             FALSE, 0, },
181 { "fe_pusha",    awka_push,         _FE_PUSHA,    -1,             FALSE, 0, },
182 { "fe_pushi",    awka_push,         FE_PUSHI,     -1,             FALSE, 0, },
183 { "halt",        NULL,              _HALT,        -1,             FALSE, 0, },
184 { "goto",        awka_goto,         _GOTO,        -1,             TRUE,  0, },
185 { "gt",          awka_expr,         _GT,          -1,             FALSE, 0, },
186 { "gte",         awka_expr,         _GTE,         -1,             FALSE, 0, },
187 { "jmain",       awka_nullfunc,     _JMAIN,       -1,             TRUE,  0, },
188 { "jmp",         awka_nullfunc,     _JMP,         -1,             FALSE, 0, },
189 { "jnz",         awka_jnz,          _JNZ,         -1,             TRUE,  0, },
190 { "jz",          awka_jz,           _JZ,          -1,             TRUE,  0, },
191 { "l_pusha",     awka_push,         L_PUSHA,      -1,             FALSE, 0, },
192 { "l_pushi",     awka_push,         L_PUSHI,      -1,             FALSE, 0, },
193 { "la_pusha",    awka_push,         LA_PUSHA,     -1,             FALSE, 0, },
194 { "lae_pusha",   awka_push,         LAE_PUSHA,    -1,             FALSE, 0, },
195 { "lae_pushi",   awka_push,         LAE_PUSHI,    -1,             FALSE, 0, },
196 { "ljnz",        awka_ljnz,         _LJNZ,        -1,             FALSE, 0, },
197 { "ljz",         awka_ljz,          _LJZ,         -1,             FALSE, 0, },
198 { "lt",          awka_expr,         _LT,          -1,             FALSE, 0, },
199 { "lte",         awka_expr,         _LTE,         -1,             FALSE, 0, },
200 { "match",       awka_match,        _MATCH,       -1,             FALSE, 1, },
201 { "match0",      awka_match,        _MATCH0,      -1,             FALSE, 1, },
202 { "match1",      awka_match,        _MATCH1,      -1,             FALSE, 1, },
203 { "match2",      awka_match,        _MATCH2,      -1,             FALSE, 1, },
204 { "mod",         awka_mod,          _MOD,         -1,             FALSE, 0, },
205 { "mod_asg",     awka_mod_asg,      _MOD_ASG,     -1,             FALSE, 0, },
206 { "mul",         awka_mul,          _MUL,         -1,             FALSE, 0, },
207 { "mul_asg",     awka_mul_asg,      _MUL_ASG,     -1,             FALSE, 0, },
208 { "neq",         awka_neq,          _NEQ,         -1,             FALSE, 0, },
209 { "next",        awka_next,         _NEXT,        -1,             TRUE,  0, },
210 { "nextfile",    awka_nextfile,     _NEXTFILE,    -1,             TRUE,  0, },
211 { "nf_pushi",    awka_push,         NF_PUSHI,     -1,             FALSE, 0, },
212 { "not",         awka_not,          _NOT,         -1,             FALSE, 0, },
213 { "ol_gl",       awka_ol_gl,        OL_GL,        -1,             TRUE,  0, },
214 { "ol_gl_nr",    awka_ol_gl,        OL_GL_NR,     -1,             TRUE,  0, },
215 { "omain",       awka_nullfunc,     _OMAIN,       -1,             TRUE,  0, },
216 { "pop",         awka_pop,          _POP,         -1,             TRUE,  0, },
217 { "pop_al",      awka_nullfunc,     POP_AL,       -1,             TRUE,  0, },
218 { "post_dec",    awka_post_dec,     _POST_DEC,    -1,             FALSE, 0, },
219 { "post_inc",    awka_post_inc,     _POST_INC,    -1,             FALSE, 0, },
220 { "pow",         awka_pow,          _POW,         -1,             FALSE, 0, },
221 { "pow_asg",     awka_pow_asg,      _POW_ASG,     -1,             FALSE, 0, },
222 { "pre_dec",     awka_pre_dec,      _PRE_DEC,     -1,             FALSE, 0, },
223 { "pre_inc",     awka_pre_inc,      _PRE_INC,     -1,             FALSE, 0, },
224 { "print",       awka_printf,       _PRINT,       -1,             TRUE,  0, },
225 { "printf",      awka_printf,       _PRINTF,      -1,             TRUE,  0, },
226 { "pusha",       awka_push,         _PUSHA,       -1,             FALSE, 0, },
227 { "pushc",       awka_push,         _PUSHC,       -1,             FALSE, 0, },
228 { "pushd",       awka_push,         _PUSHD,       -1,             FALSE, 0, },
229 { "pushi",       awka_push,         _PUSHI,       -1,             FALSE, 0, },
230 { "pushint",     awka_push,         _PUSHINT,     -1,             FALSE, 0, },
231 { "pushs",       awka_push,         _PUSHS,       -1,             FALSE, 0, },
232 { "qmark",       awka_jz,           _QMARK,       -1,             FALSE, 0, },
233 { "range",       awka_range,        _RANGE,       -1,             FALSE, 0, },
234 { "ret",         awka_ret,          _RET,         -1,             TRUE,  0, },
235 { "ret0",        awka_ret0,         _RET0,        -1,             TRUE,  0, },
236 { "set_al",      awka_set_al,       SET_ALOOP,    -1,             TRUE,  0, },
237 { "stop",        awka_jz,           _STOP,        -1,             TRUE,  0, },
238 { "sub",         awka_sub,          _SUB,         -1,             FALSE, 0, },
239 { "sub_asg",     awka_sub_asg,      _SUB_ASG,     -1,             FALSE, 0, },
240 { "test",        awka_test,         _TEST,        -1,             FALSE, 0, },
241 { "uminus",      awka_uminus,       _UMINUS,      -1,             FALSE, 0, },
242 { "uplus",       awka_uplus,        _UPLUS,       -1,             FALSE, 0, },
243 { "alength",     awka_alength,      _ALENGTH,     _BI_ALENGTH,    FALSE, 1, },
244 { "and",         awka_builtin,      _AND,         _BI_AND,        FALSE, 1, },
245 { "argcount",    awka_argcount,     _ARGCOUNT,    _BI_ARGCOUNT,   FALSE, 1, },
246 { "argval",      awka_argval,       _ARGVAL,      _BI_ARGVAL,     FALSE, 1, },
247 { "ascii",       awka_builtin,      _ASCII,       _BI_ASCII,      FALSE, 1, },
248 { "asort",       awka_asort,        _ASORT,       _BI_ASORT,      FALSE, 1, },
249 { "atan2",       awka_math,         _ATAN2,       _BI_ATAN2,      FALSE, 0, },
250 { "char",        awka_builtin,      _CHAR,        _BI_CHAR,       FALSE, 2, },
251 { "close",       awka_close,        _CLOSE,       _BI_CLOSE,      TRUE,  1, },
252 { "compl",       awka_builtin,      _COMPL,       _BI_COMPL,      FALSE, 1, },
253 { "cos",         awka_math,         _COS,         _BI_COS,        FALSE, 0, },
254 { "exp",         awka_math,         _EXP,         _BI_EXP,        FALSE, 0, },
255 { "fflush",      awka_builtin,      _FFLUSH,      _BI_FFLUSH,     TRUE,  0, },
256 { "gensub",      awka_gensub,       _GENSUB,      _BI_GENSUB,     FALSE, 2, },
257 { "getline",     awka_getline,      _GETLINE,     _BI_GETLINE,    FALSE, 1, },
258 { "gmtime",      awka_builtin,      a_GMTIME,     _BI_GMTIME,     FALSE, 2, },
259 { "gsub",        awka_gsub,         _GSUB,        _BI_SUB,        FALSE, 1, },
260 { "index",       awka_index,        _INDEX,       _BI_INDEX,      FALSE, 1, },
261 { "int",         awka_math,         a_INT,        _BI_INT,        FALSE, 0, },
262 { "left",        awka_builtin,      _LEFT,        _BI_LEFT,       FALSE, 2, },
263 { "length",      awka_length,       _LENGTH,      _BI_LENGTH,     FALSE, 1, },
264 { "localtime",   awka_builtin,      a_LOCALTIME,  _BI_LOCALTIME,  FALSE, 2, },
265 { "log",         awka_math,         _LOG,         _BI_LOG,        FALSE, 0, },
266 { "lshift",      awka_builtin,      _LSHIFT,      _BI_LSHIFT,     FALSE, 1, },
267 { "ltrim",       awka_builtin,      _LTRIM,       _BI_LTRIM,      FALSE, 2, },
268 { "max",         awka_builtin,      _MAX,         _BI_MAX,        FALSE, 1, },
269 { "min",         awka_builtin,      _MIN,         _BI_MIN,        FALSE, 1, },
270 { "mktime",      awka_builtin,      a_MKTIME,     _BI_MKTIME,     FALSE, 1, },
271 { "or",          awka_builtin,      _OR,          _BI_OR,         FALSE, 1, },
272 { "rand",        awka_builtin,      _RAND,        _BI_RAND,       FALSE, 1, },
273 { "right",       awka_builtin,      _RIGHT,       _BI_RIGHT,      FALSE, 2, },
274 { "rshift",      awka_builtin,      _RSHIFT,      _BI_RSHIFT,     FALSE, 1, },
275 { "rtrim",       awka_builtin,      _RTRIM,       _BI_RTRIM,      FALSE, 2, },
276 { "sin",         awka_math,         _SIN,         _BI_SIN,        FALSE, 0, },
277 { "split",       awka_split,        _SPLIT,       _BI_SPLIT,      FALSE, 1, },
278 { "sprintf",     awka_builtin,      _SPRINTF,     _BI_SPRINTF,    FALSE, 2, },
279 { "sqrt",        awka_math,         _SQRT,        _BI_SQRT,       FALSE, 0, },
280 { "srand",       awka_builtin,      _SRAND,       _BI_SRAND,      FALSE, 0, },
281 { "strftime",    awka_builtin,      a_STRFTIME,   _BI_STRFTIME,   FALSE, 2, },
282 { "sub_bi",      awka_gsub,         _SUB_BI,      _BI_SUB,        FALSE, 1, },
283 { "substr",      awka_substr,       _SUBSTR,      _BI_SUBSTR,     FALSE, 2, },
284 { "system",      awka_builtin,      _SYSTEM,      _BI_SYSTEM,     FALSE, 1, },
285 { "systime",     awka_builtin,      _SYSTIME,     _BI_SYSTIME,    FALSE, 1, },
286 { "time",        awka_builtin,      a_TIME,       _BI_TIME,       FALSE, 1, },
287 { "tolower",     awka_tocase,       _TOLOWER,     _BI_TOCASE,     FALSE, 2, },
288 { "totitle",     awka_tocase,       _TOTITLE,     _BI_TOCASE,     FALSE, 2, },
289 { "toupper",     awka_tocase,       _TOUPPER,     _BI_TOCASE,     FALSE, 2, },
290 { "trim",        awka_builtin,      _TRIM,        _BI_TRIM,       FALSE, 2, },
291 { "xor",         awka_builtin,      _XOR,         _BI_XOR,        FALSE, 1  }
292 };
293 
294 struct a_sc ext_funcs[] = {
295 { "alength",     awka_alength,      _ALENGTH,     _BI_ALENGTH,    FALSE, 1, },
296 { "and",         awka_builtin,      _AND,         _BI_AND,        FALSE, 1, },
297 { "argcount",    awka_argcount,     _ARGCOUNT,    _BI_ARGCOUNT,   FALSE, 1, },
298 { "argval",      awka_argval,       _ARGVAL,      _BI_ARGVAL,     FALSE, 1, },
299 { "ascii",       awka_builtin,      _ASCII,       _BI_ASCII,      FALSE, 1, },
300 { "asort",       awka_asort,        _ASORT,       _BI_ASORT,      FALSE, 1, },
301 { "char",        awka_builtin,      _CHAR,        _BI_CHAR,       FALSE, 2, },
302 { "compl",       awka_builtin,      _COMPL,       _BI_COMPL,      FALSE, 1, },
303 { "gmtime",      awka_builtin,      a_GMTIME,     _BI_GMTIME,     FALSE, 2, },
304 { "left",        awka_builtin,      _LEFT,        _BI_LEFT,       FALSE, 2, },
305 { "localtime",   awka_builtin,      a_LOCALTIME,  _BI_LOCALTIME,  FALSE, 2, },
306 { "lshift",      awka_builtin,      _LSHIFT,      _BI_LSHIFT,     FALSE, 1, },
307 { "ltrim",       awka_builtin,      _LTRIM,       _BI_LTRIM,      FALSE, 2, },
308 { "max",         awka_builtin,      _MAX,         _BI_MAX,        FALSE, 1, },
309 { "min",         awka_builtin,      _MIN,         _BI_MIN,        FALSE, 1, },
310 { "mktime",      awka_builtin,      a_MKTIME,     _BI_MKTIME,     FALSE, 1, },
311 { "or",          awka_builtin,      _OR,          _BI_OR,         FALSE, 1, },
312 { "right",       awka_builtin,      _RIGHT,       _BI_RIGHT,      FALSE, 2, },
313 { "rshift",      awka_builtin,      _RSHIFT,      _BI_RSHIFT,     FALSE, 1, },
314 { "rtrim",       awka_builtin,      _RTRIM,       _BI_RTRIM,      FALSE, 2, },
315 { "strftime",    awka_builtin,      a_STRFTIME,   _BI_STRFTIME,   FALSE, 2, },
316 { "systime",     awka_builtin,      _SYSTIME,     _BI_SYSTIME,    FALSE, 1, },
317 { "time",        awka_builtin,      a_TIME,       _BI_TIME,       FALSE, 1, },
318 { "totitle",     awka_tocase,       _TOTITLE,     _BI_TOCASE,     FALSE, 2, },
319 { "trim",        awka_builtin,      _TRIM,        _BI_TRIM,       FALSE, 2, },
320 { "xor",         awka_builtin,      _XOR,         _BI_XOR,        FALSE, 1, },
321 { NULL,          awka_nullfunc,     0,            0,              FALSE, 0  }
322 };
323 #else
324 extern struct a_sc code[];
325 extern struct a_sc ext_funcs[];
326 #endif
327 
328 #define NONE 0
329 #define BEGIN 1
330 #define MAIN 2
331 #define END 3
332 #define FUNC 4
333 
334 #define _NUL 0
335 #define _VAR 1
336 #define _DBL 2
337 #define _STR 3
338 #define _REG 4
339 #define _UNK 5
340 #define _TRU 6
341 #define _ARR 7
342 #define _ROVAR 8
343 #define _VARX 9
344 
345 struct pc
346 {
347    char *(*func)(int, int *, char *);
348    char *val ;
349    char *arg ;
350    char **code0 ;
351    char **code ;
352    char *file ;
353    int code0_used;
354    int code_used;
355    int code0_allc;
356    int code_allc;
357    int inst ;
358    int line ;
359    int minst ;
360    int ljumpfrom ;
361    int jumpfrom ;
362    int jumpto ;
363    int op ;
364    int earliest ;
365    int endloop ;
366    int varidx ;
367    int prevcat;
368    int prev2;
369    char done ;
370    char foreverloop ;
371    char doloop ;
372    char context ;
373    char label ;
374    char pop ;
375    char printed ;
376    char ftype ;
377 };
378 
379 struct ivar_idx
380 {
381   char *name;
382   char *vname;
383 };
384 
385 struct _fargs
386 {
387   char *func;
388   int arg_no;
389   char array;
390 };
391 
392 struct _fcalls
393 {
394   char *calledfunc;
395   char *callingfunc;
396   char *var_calling;
397   int arg_calling;
398   int arg_called;
399 };
400 
401 void readprog();
402 void translate();
403 int add2arraylist(char *);
404 int add2fargs(char *, char, int);
405 void add2fcalls(char *, char *, char *, int, int);
406 
407 #ifndef AWKA_MAIN
408 extern struct pc *progcode;
409 extern FILE *fp;
410 extern int curop_id, prog_allc, prog_no, curinst, curminst;
411 extern char buf[4096], *curarg, *curval;
412 extern char begin_used, main_used, end_used;
413 extern int mode;
414 #endif
415 
416 #endif
417