#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); }