#include "config.h"
#include "mud.h"
#include "u.h"
#include "y.tab.h"
#include "sbuf.h"
int ub_ladd (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);
}
int ub_ldel (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);
}
int ub_llok (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);
}
int ub_lcnt (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);
}
int ub_litem (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);
}