Commit | Line | Data |
79072805 |
1 | int /*SUPPRESS 590*/ |
2 | do_defined(TARG,arg,gimme,arglast) |
3 | STR *TARG; |
4 | register ARG *arg; |
5 | int gimme; |
6 | int *arglast; |
7 | { |
8 | register int type; |
9 | register int retarg = arglast[0] + 1; |
10 | int retval; |
11 | ARRAY *ary; |
12 | HASH *hash; |
13 | |
14 | if ((arg[1].arg_type & A_MASK) != A_LEXPR) |
15 | fatal("Illegal argument to defined()"); |
16 | arg = arg[1].arg_ptr.arg_arg; |
17 | type = arg->arg_type; |
18 | |
19 | if (type == O_SUBR || type == O_DBSUBR) { |
20 | if ((arg[1].arg_type & A_MASK) == A_WORD) |
21 | retval = stab_sub(arg[1].arg_ptr.arg_stab) != 0; |
22 | else { |
23 | STR *tmpstr = STAB_STR(arg[1].arg_ptr.arg_stab); |
24 | |
25 | retval = tmpstr && stab_sub(stabent(str_get(tmpstr),TRUE)) != 0; |
26 | } |
27 | } |
28 | else if (type == O_ARRAY || type == O_LARRAY || |
29 | type == O_ASLICE || type == O_LASLICE ) |
30 | retval = ((ary = stab_xarray(arg[1].arg_ptr.arg_stab)) != 0 |
31 | && ary->ary_max >= 0 ); |
32 | else if (type == O_HASH || type == O_LHASH || |
33 | type == O_HSLICE || type == O_LHSLICE ) |
34 | retval = ((hash = stab_xhash(arg[1].arg_ptr.arg_stab)) != 0 |
35 | && hash->tbl_array); |
36 | else |
37 | retval = FALSE; |
38 | str_numset(TARG,(double)retval); |
39 | stack->ary_array[retarg] = TARG; |
40 | return retarg; |
41 | } |
42 | |