/* sys6b.c */
#include "config.h"
#include "object.h"
#include "operproto.h"
#include "instr.h"
#include "construct.h"
#include "dbhandle.h"
int s_atoo(struct object *caller, struct object *obj, struct object *player,
struct var_stack **rts) {
struct var tmp;
struct object *result;
char *pathbuf,*numbuf;
long breakpoint;
signed long expected_refno;
if (pop(&tmp,rts,obj)) return 1;
if (tmp.type!=NUM_ARGS) {
clear_var(&tmp);
return 1;
}
if (tmp.value.num!=1) return 1;
if (pop(&tmp,rts,obj)) return 1;
if (tmp.type==INTEGER && tmp.value.integer==0) {
tmp.type=STRING;
*(tmp.value.string=MALLOC(1))='\0';
}
if (tmp.type!=STRING) {
clear_var(&tmp);
return 1;
}
breakpoint=0;
pathbuf=tmp.value.string;
numbuf="";
while (tmp.value.string[breakpoint]) {
if (tmp.value.string[breakpoint]=='#') {
numbuf=&(tmp.value.string[breakpoint+1]);
tmp.value.string[breakpoint]='\0';
break;
}
breakpoint++;
}
if (*numbuf=='\0') {
result=find_proto(pathbuf);
} else {
expected_refno=atol(numbuf);
result=ref_to_obj(expected_refno);
if (result)
if (*pathbuf)
if (strcmp(pathbuf,result->parent->pathname))
result=NULL;
}
clear_var(&tmp);
if (result) {
tmp.type=OBJECT;
tmp.value.objptr=result;
} else {
tmp.type=INTEGER;
tmp.value.integer=0;
}
push(&tmp,rts);
return 0;
}
int s_upcase(struct object *caller, struct object *obj, struct object *player,
struct var_stack **rts) {
struct var tmp;
long loop,len;
if (pop(&tmp,rts,obj)) return 1;
if (tmp.type!=NUM_ARGS) {
clear_var(&tmp);
return 1;
}
if (tmp.value.num!=1) return 1;
if (pop(&tmp,rts,obj)) return 1;
if (tmp.type==INTEGER && tmp.value.integer==0) {
push(&tmp,rts);
return 0;
}
if (tmp.type!=STRING) {
clear_var(&tmp);
return 1;
}
loop=0;
len=strlen(tmp.value.string);
while (loop<len) {
if (islower(tmp.value.string[loop]))
tmp.value.string[loop]=toupper(tmp.value.string[loop]);
loop++;
}
pushnocopy(&tmp,rts);
return 0;
}
int s_downcase(struct object *caller, struct object *obj, struct object
*player, struct var_stack **rts) {
struct var tmp;
long loop,len;
if (pop(&tmp,rts,obj)) return 1;
if (tmp.type!=NUM_ARGS) {
clear_var(&tmp);
return 1;
}
if (tmp.value.num!=1) return 1;
if (pop(&tmp,rts,obj)) return 1;
if (tmp.type==INTEGER && tmp.value.integer==0) {
push(&tmp,rts);
return 0;
}
if (tmp.type!=STRING) {
clear_var(&tmp);
return 1;
}
loop=0;
len=strlen(tmp.value.string);
while (loop<len) {
if (isupper(tmp.value.string[loop]))
tmp.value.string[loop]=tolower(tmp.value.string[loop]);
loop++;
}
pushnocopy(&tmp,rts);
return 0;
}
int s_is_legal(struct object *caller, struct object *obj,
struct object *player, struct var_stack **rts) {
struct var tmp;
long result;
if (pop(&tmp,rts,obj)) return 1;
if (tmp.type!=NUM_ARGS) {
clear_var(&tmp);
return 1;
}
if (tmp.value.num!=1) return 1;
if (pop(&tmp,rts,obj)) return 1;
if (tmp.type==INTEGER && tmp.value.integer==0) {
push(&tmp,rts);
return 0;
}
if (tmp.type!=STRING) {
clear_var(&tmp);
return 1;
}
result=is_legal(tmp.value.string);
clear_var(&tmp);
tmp.type=INTEGER;
tmp.value.integer=result;
push(&tmp,rts);
return 0;
}
int s_otoi(struct object *caller, struct object *obj, struct object *player,
struct var_stack **rts) {
struct var tmp;
signed long result;
if (pop(&tmp,rts,obj)) return 1;
if (tmp.type!=NUM_ARGS) {
clear_var(&tmp);
return 1;
}
if (tmp.value.num!=1) return 1;
if (pop(&tmp,rts,obj)) return 1;
if (tmp.type!=OBJECT) {
clear_var(&tmp);
return 1;
}
result=tmp.value.objptr->refno;
tmp.type=INTEGER;
tmp.value.integer=result;
push(&tmp,rts);
return 0;
}
int s_itoo(struct object *caller, struct object *obj, struct object *player,
struct var_stack **rts) {
struct var tmp;
struct object *result;
if (pop(&tmp,rts,obj)) return 1;
if (tmp.type!=NUM_ARGS) {
clear_var(&tmp);
return 1;
}
if (tmp.value.num!=1) return 1;
if (pop(&tmp,rts,obj)) return 1;
if (tmp.type!=INTEGER) {
clear_var(&tmp);
return 1;
}
result=ref_to_obj(tmp.value.integer);
if (result) {
tmp.type=OBJECT;
tmp.value.objptr=result;
} else {
tmp.type=INTEGER;
tmp.value.integer=0;
}
push(&tmp,rts);
return 0;
}
int s_chr(struct object *caller, struct object *obj, struct object *player,
struct var_stack **rts) {
struct var tmp;
char *buf;
if (pop(&tmp,rts,obj)) return 1;
if (tmp.type!=NUM_ARGS) {
clear_var(&tmp);
return 1;
}
if (tmp.value.num!=1) return 1;
if (pop(&tmp,rts,obj)) return 1;
if (tmp.type!=INTEGER) {
clear_var(&tmp);
return 1;
}
if (tmp.value.integer<0 || tmp.value.integer>SCHAR_MAX) {
tmp.value.integer=0;
push(&tmp,rts);
return 0;
}
if (!isgraph(((unsigned char) tmp.value.integer)) &&
!isspace(((unsigned char) tmp.value.integer))) {
tmp.value.integer=0;
push(&tmp,rts);
return 0;
}
buf=MALLOC(2);
buf[0]=(char) tmp.value.integer;
buf[1]='\0';
tmp.type=STRING;
tmp.value.string=buf;
pushnocopy(&tmp,rts);
return 0;
}
int s_asc(struct object *caller, struct object *obj, struct object *player,
struct var_stack **rts) {
struct var tmp;
long result;
if (pop(&tmp,rts,obj)) return 1;
if (tmp.type!=NUM_ARGS) {
clear_var(&tmp);
return 1;
}
if (tmp.value.num!=1) return 1;
if (pop(&tmp,rts,obj)) return 1;
if (tmp.type==INTEGER && tmp.value.integer==0) {
push(&tmp,rts);
return 0;
}
if (tmp.type!=STRING) {
clear_var(&tmp);
return 1;
}
result=*(tmp.value.string);
clear_var(&tmp);
tmp.type=INTEGER;
tmp.value.integer=result;
push(&tmp,rts);
return 0;
}