union u {
char *string;
int number;
struct object *ob;
struct vector *vec;
struct vector_regexp *reg;
};
/*
* The definition of a value node. It is used for all computations.
* Strings can be constant, in which case they must not be freed.
*/
struct value {
short type;
short constant; /* This string is not alloced with malloc */
struct value *next; /* Linked list of values. */
union u u;
};
/*
* This structure is equivalent with struct value but with one exception.
* The 'next' pointer is not here. This will save space for all global
* variables in objects, as the pointer is not needed for them.
*/
struct svalue {
int type;
union u u;
};
#define T_INVALID 0
#define T_NUMBER 1
#define T_STRING 2
#define T_POINTER 3
#define T_OBJECT 4
/* What is this? (bub) */
/*struct lnode_variable;*/
struct value *alloc_value(),
*apply PROT((char *, struct object *, struct value *));
struct svalue *find_value PROT((struct lnode_variable *));
struct value *make_number PROT((int)), *make_string PROT ((char *));
extern struct value const0, const1;
struct vector {
short size;
short ref;
struct wiz_list *wl; /* Save who made the vector */
struct svalue item[1];
};
#define ALLOC_VECTOR(nelem) \
(struct vector *)xalloc(sizeof (struct vector) + \
sizeof(struct svalue) * (nelem - 1))
/*
* regexp compiled code is stored in vector of size -1.
* This is not implemented yet.
*/
struct vector_regexp {
struct vector vector;
struct regexp *regexp;
};
/* What is this? (bub) */
/*struct lnode_def;*/
void free_vector PROT((struct vector *)), free_all_values(),
call_function PROT((struct lnode_def *));