/*
Copyright (C) 1991, Marcus J. Ranum. All rights reserved.
*/
/* configure all options BEFORE including system stuff. */
#include "config.h"
#include "mud.h"
/* allocate a new object holder */
Obj *objnew ()
{
Obj *ret;
if ((ret = (Obj *) malloc (sizeof (Obj))) == (Obj *) 0)
return ((Obj *) 0);
ret->ocnt = 0;
ret->oap = (char **) 0;
return (ret);
}
/* free an object, its holder, and its attributes - actual free() is deferred */
void objfree (Obj * obj)
{
int x;
if (obj == (Obj *) 0)
return;
if (obj->ocnt > 0) {
for (x = 0; x < (int) obj->ocnt; x++)
deferfree ((mall_t) obj->oap[x]);
deferfree ((mall_t) obj->oap);
}
deferfree ((mall_t) obj);
}
/*
search for attributes by name
*/
char *objattr (Obj * obj, char *attr, int *slot)
{
char *p1;
char *p2;
int s = 0;
for (; s < (int) obj->ocnt; s++) {
p2 = obj->oap[s];
/* skip the type information */
while (*p2 != ' ' && *p2 != '\0')
p2++;
if (*p2 != ' ')
continue;
p1 = attr;
/* p2 is left pointing at the ' ' after the type */
p2++;
/* check matching chars */
while (*p1 == *p2 && *p1 != '\0')
p1++, p2++;
/* validate match */
if (*p1 != '\0' || *p2 != '=')
continue;
/* match */
if (slot != (int *) 0)
*slot = s;
return (obj->oap[s]);
}
if (slot != (int *) 0)
*slot = -1;
return ((char *) 0);
}
int objsetattr (Obj * o, char *aty, char *att, char *ada)
{
char **a;
char *ip;
int s;
int atlen;
int anlen;
int adlen;
if (o == (Obj *) 0 || aty == (char *) 0 || att == (char *) 0 ||
ada == (char *) 0)
return (-1);
(void) objattr (o, att, &s);
atlen = strlen (aty);
anlen = strlen (att);
adlen = strlen (ada);
if ((ip =
(char *) malloc ((unsigned) (atlen + anlen + adlen + 3))) == (char *) 0)
return (-1);
/* copy the type string */
(void) bcopy (aty, ip, atlen);
/* add a space */
*(ip + atlen) = ' ';
/* copy the attribute name */
(void) bcopy (att, ip + atlen + 1, anlen);
/* add the equals sign */
*(ip + atlen + anlen + 1) = '=';
/* copy the data */
(void) bcopy (ada, ip + atlen + anlen + 2, adlen);
/* terminate */
*(ip + atlen + anlen + adlen + 2) = '\0';
if (s > -1 && s < (int) o->ocnt && o->oap != (char **) 0 &&
o->oap[s] != (char *) 0)
deferfree ((mall_t) o->oap[s]);
if (o->oap == (char **) 0) {
a = (char **) malloc (sizeof (char *));
if (a == (char **) 0)
return (-1);
o->oap = a;
o->ocnt = 1;
s = 0;
} else if (s == -1 || s >= (int) o->ocnt) {
a =
(char **) realloc ((mall_t) o->oap,
(unsigned) ((o->ocnt + 1) * sizeof (char *)));
if (a == (char **) 0)
return (-1);
o->oap = a;
s = o->ocnt;
o->ocnt++;
}
o->oap[s] = ip;
return (0);
}
int objunsetattr (Obj * obj, char *attr)
{
int slot;
char **a;
if (objattr (obj, attr, &slot) == (char *) 0)
return (0);
if (slot > -1 && slot < (int) obj->ocnt && obj->oap[slot] != (char *) 0)
deferfree ((mall_t) obj->oap[slot]);
/* if none left, free it */
if (obj->ocnt == 1) {
deferfree ((mall_t) obj->oap);
obj->oap = (char **) 0;
obj->ocnt = 0;
return (0);
}
/* shift all one slot down */
while (slot < (int) obj->ocnt - 1) {
obj->oap[slot] = obj->oap[slot + 1];
slot++;
}
/* realloc may pack memory. */
a =
(char **) realloc ((mall_t) obj->oap,
(unsigned) ((obj->ocnt - 1) * sizeof (char *)));
if (a == (char **) 0)
return (-1);
obj->oap = a;
(obj->ocnt)--;
return (0);
}
int objstuffattr (Obj * o, char *data, int len)
{
char *p;
if (o->oap == (char **) 0) {
o->oap = (char **) malloc (sizeof (char *));
o->ocnt = 1;
} else {
o->oap =
(char **) realloc ((mall_t) o->oap, (o->ocnt + 1) * sizeof (char *));
o->ocnt++;
}
if ((p = (char *) malloc ((unsigned) (len + 1))) == (char *) 0)
return (-1);
(void) bcopy (data, p, len);
p[len] = '\0';
o->oap[o->ocnt - 1] = p;
return (0);
}
/*
return nonzero if the variable is of the given type. simple
type-checking function.
*/
int attistype (char *v, char *vt)
{
while (*v != '\0' && *v != ' ' && *vt != '\0' && *v == *vt)
v++, vt++;
if (*vt == '\0' && *v == ' ')
return (1);
return (0);
}
/*
return data part of an attribute. note that this does NOT return NULL
if the attribute is of zero-length.
*/
char *attdata (char *v)
{
while (*v != '\0' && *v != ' ')
v++;
if (*v != ' ')
return ((char *) 0);
while (*v != '\0' && *v != '=')
v++;
if (*v != '=')
return ((char *) 0);
return (++v);
}
/*
return name part of an attribute. Note! suceeds even if name is zero length.
*/
int attname (char *a, char *aname)
{
int i;
while (*a != '\0' && *a != ' ')
a++;
if (*a != ' ')
return (1);
for (i = 0, ++a; i < MAXOID - 1 && *a != '\0' && *a != '='; ++i, ++a)
aname[i] = *a;
aname[i] = '\0';
return (0);
}