1
0
Files
irix-657m-src/irix/cmd/netman/lib/ex_create.c
2022-09-29 17:59:04 +03:00

89 lines
1.4 KiB
C

/*
* Copyright 1988 Silicon Graphics, Inc. All rights reserved.
*
* Expression node constructor and destructor.
*/
#include <bstring.h>
#include "expr.h"
#include "heap.h"
static Expr *exfreelist; /* private expr allocation list */
Expr *
expr(enum exop op, enum exarity arity, char *token)
{
Expr *ex;
int len;
ex = exfreelist;
if (ex == 0) {
len = 16;
ex = exfreelist = vnew(len, Expr);
while (--len > 0) {
ex->ex_kid = ex + 1;
ex++;
}
ex->ex_kid = 0;
ex = exfreelist;
}
exfreelist = ex->ex_kid;
ex->ex_op = op;
ex->ex_arity = arity;
ex->ex_count = 1;
ex->ex_token = token;
ex->ex_src = 0;
bzero(&ex->ex_u, sizeof ex->ex_u);
return ex;
}
/*
* NB: ex_destroy knows that ex_kid is equivalent to ex_right.
*/
void
ex_destroy(Expr *ex)
{
int n;
if (ex == 0 || --ex->ex_count != 0)
return;
switch (ex->ex_arity) {
case EX_NULLARY:
switch (ex->ex_op) {
case EXOP_PROTOCOL:
ex_destroy(ex->ex_member);
break;
case EXOP_CALL:
for (n = 0; n < MAXCALLARGS; n++) {
if (ex->ex_args[n])
ex_destroy(ex->ex_args[n]);
}
}
break;
case EX_BINARY:
ex_destroy(ex->ex_left);
/* FALL THROUGH */
case EX_UNARY:
ex_destroy(ex->ex_right);
break;
}
ex_dropsrc(ex);
ex->ex_kid = exfreelist;
exfreelist = ex;
}
void
ex_holdsrc(Expr *ex, ExprSource *src)
{
ex->ex_src = holdExprSource(src);
}
void
ex_dropsrc(Expr *ex)
{
ExprSource *src;
src = ex->ex_src;
dropExprSource(src);
ex->ex_src = 0;
}