/* boolutils.c */
#include "config.h"
/*
* This file is part of TeenyMUD II.
* Copyright(C) 1995 by Jason Downs. All rights reserved.
*
* TeenyMUD II is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* TeenyMUD II is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program (see the file 'COPYING'); if not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
* MA 02111-1307, USA.
*
*/
#include <stdio.h>
#include <sys/types.h>
#ifdef HAVE_STRING_H
#include <string.h>
#else
#include <strings.h>
#endif /* HAVE_STRING_H */
#include "conf.h"
#include "teeny.h"
#include "externs.h"
#define ATTR_NAME 0
#define ATTR_CONT 1
/* Boolexp utility routines. */
static struct boolexp *boolexp_pool = (struct boolexp *)NULL;
struct boolexp *boolexp_alloc()
{
register struct boolexp *ret;
if(boolexp_pool == (struct boolexp *)NULL) {
register int idx = 0;
boolexp_pool = (struct boolexp *)ty_malloc(sizeof(struct boolexp) * 256,
"boolexp_alloc.boolexp_pool");
/* This loop is written like this for a *reason*. */
while(idx < 255) {
boolexp_pool[idx].sub1 = &boolexp_pool[idx + 1];
idx++;
}
boolexp_pool[idx].sub1 = (struct boolexp *)NULL;
}
ret = boolexp_pool;
boolexp_pool = boolexp_pool->sub1;
bzero((VOID *)ret, sizeof(struct boolexp));
return(ret);
}
void boolexp_free(b)
struct boolexp *b;
{
if (b != (struct boolexp *) NULL) {
switch (b->type) {
case BOOLEXP_AND:
case BOOLEXP_OR:
boolexp_free(b->sub2);
case BOOLEXP_NOT:
boolexp_free(b->sub1);
break;
case BOOLEXP_ATTR:
ty_free((VOID *) (b->dat).atr[ATTR_NAME]);
ty_free((VOID *) (b->dat).atr[ATTR_CONT]);
break;
}
b->sub1 = boolexp_pool;
boolexp_pool = b;
}
}
struct boolexp *copy_boolexp(b)
struct boolexp *b;
{
register struct boolexp *r;
if (b == (struct boolexp *)NULL)
return((struct boolexp *)NULL);
r = boolexp_alloc();
r->type = b->type;
switch(b->type) {
case BOOLEXP_AND:
case BOOLEXP_OR:
r->sub2 = copy_boolexp(b->sub2);
case BOOLEXP_NOT:
r->sub1 = copy_boolexp(b->sub1);
break;
case BOOLEXP_CONST:
(r->dat).thing = (b->dat).thing;
break;
case BOOLEXP_FLAG:
bcopy((VOID *)((b->dat).flags), (VOID *)((r->dat).flags),
sizeof(int)*FLAGS_LEN);
break;
case BOOLEXP_ATTR:
(r->dat).atr[ATTR_NAME] = (char *)ty_strdup((b->dat).atr[ATTR_NAME],
"copy_boolexp");
(r->dat).atr[ATTR_CONT] = (char *)ty_strdup((b->dat).atr[ATTR_CONT],
"copy_boolexp");
break;
default:
logfile(LOG_ERROR, "copy_boolexp: bad bool type (%d)\n", b->type);
boolexp_free(r);
return((struct boolexp *)NULL);
}
return(r);
}