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