/
umud/DOC/
umud/DOC/U/
umud/DOC/U/U-examples/
umud/DOC/internals/
umud/DOC/wizard/
umud/MISC/
umud/MISC/dbchk/
umud/RWHO/rwhod/
#include	"config.h"
#include	"mud.h"
#include	"u.h"
#include	"y.tab.h"
#include	"sbuf.h"

ub_ladd(who,aswho,ac,av,retnode)
char	*who;
char	*aswho;
int	ac;
Nod	*av[];
Nod	*retnode;
{
	char	*lp;
	int	x;

	if(av[0]->rv.t != STR && av[0]->rv.t != OID && av[0]->rv.t != NUM)
		lp = "";
	else
		lp = eval_caststr(av[0]);

	for(x = 1; x < ac; x++) {
		if(av[x]->rv.t != STR && av[x]->rv.t != OID && av[x]->rv.t != NUM)
			continue;

		/* making a temp copy is necessary. :( */
		lp = tmpstr(lstadd(lp,eval_caststr(av[x]),(int *)0));
		if(lp == (char *)0)
			return(UERR_FATAL);
	}
	retnode->rv.cv = lp;
	retnode->rv.t = STR;
	return(UERR_NONE);
}




ub_ldel(who,aswho,ac,av,retnode)
char	*who;
char	*aswho;
int	ac;
Nod	*av[];
Nod	*retnode;
{
	char	*l;
	int	x;

	if(av[0]->rv.t != STR && av[0]->rv.t != OID && av[0]->rv.t != NUM)
		l = "";
	else
		l = eval_caststr(av[0]);

	for(x = 1; x < ac; x++) {
		if(av[x]->rv.t != STR && av[x]->rv.t != OID && av[x]->rv.t != NUM)
			continue;

		/* making a temp copy is necessary. :( */
		l = tmpstr(lstdel(l,eval_caststr(av[x]),(int *)0));
		if(l == (char *)0)
			return(UERR_FATAL);
	}

	/* empty list? */
	if(l == (char *)0 || l[0] == '\n' || (l[0] == ';' && l[1] == '\0')) {
		retnode->rv.iv = UERR_NONE;
		retnode->rv.t = VNULL;
	} else {
		retnode->rv.cv = l;
		retnode->rv.t = STR;
	}
	return(UERR_NONE);
}




ub_llok(who,aswho,ac,av,retnode)
char	*who;
char	*aswho;
int	ac;
Nod	*av[];
Nod	*retnode;
{
	if(av[0]->rv.t != STR && av[0]->rv.t != OID && av[0]->rv.t != NUM) {
		retnode->rv.iv = 0;
		retnode->rv.t = NUM;
		return(UERR_NONE);
	}
	if(av[1]->rv.t != STR && av[1]->rv.t != OID && av[1]->rv.t != NUM) {
		retnode->rv.iv = 0;
		retnode->rv.t = NUM;
		return(UERR_NONE);
	}
	retnode->rv.iv = lstlook(eval_caststr(av[0]),eval_caststr(av[1]));
	retnode->rv.t = NUM;
	return(UERR_NONE);
}




ub_lcnt(who,aswho,ac,av,retnode)
char	*who;
char	*aswho;
int	ac;
Nod	*av[];
Nod	*retnode;
{
	if(av[0]->rv.t != STR && av[0]->rv.t != OID && av[0]->rv.t != NUM) {
		retnode->rv.iv = 0;
		retnode->rv.t = NUM;
		return(UERR_NONE);
	}
	retnode->rv.iv = lstcnt(eval_caststr(av[0]));
	retnode->rv.t = NUM;
	return(UERR_NONE);
}




ub_litem(who,aswho,ac,av,retnode)
char	*who;
char	*aswho;
int	ac;
Nod	*av[];
Nod	*retnode;
{
	Sbuf	sb;
	int	cnt;
	int	ele;
	char	*lp;

	if(av[0]->rv.t != STR && av[0]->rv.t != OID && av[0]->rv.t != NUM)
		return(UERR_BADOID);
	if(av[1]->rv.t != STR && av[1]->rv.t != OID && av[1]->rv.t != NUM)
		return(UERR_BADPARM);

	lp = eval_caststr(av[0]);
	cnt = lstcnt(lp);
	/* out of range */
	ele = eval_castint(av[1]);
	if(ele < 1 || ele > cnt)
		return(UERR_BADOID);

	sbuf_initstatic(&sb);
	while(ele > 0) {
		if((lp = lstnextsbuf(lp,&sb)) == (char *)0)
			return(UERR_BADOID);
		ele--;
	}
	retnode->rv.cv = tmpstr(sbuf_buf(&sb));
	retnode->rv.t = OID;
	sbuf_freestatic(&sb);
	return(UERR_NONE);
}