/* dataop.c: Function operators for miscellaneous data manipulation. */
#define _POSIX_SOURCE
#include <stdlib.h>
#include "x.tab.h"
#include "operator.h"
#include "execute.h"
#include "data.h"
#include "ident.h"
#include "cache.h"
#include "util.h"
void op_type(void)
{
Data *args;
int type;
/* Accept one argument of any type. */
if (!func_init_1(&args, 0))
return;
/* Replace argument with symbol for type name. */
type = args[0].type;
pop(1);
push_symbol(data_type_id(type));
}
void op_class(void)
{
Data *args;
long class;
/* Accept one argument of frob type. */
if (!func_init_1(&args, FROB))
return;
/* Replace argument with class. */
class = ident_dup(args[0].u.frob.class);
pop(1);
push_dbref(class);
ident_discard(class);
}
void op_toint(void)
{
Data *args;
long val;
/* Accept a string to convert into an integer. */
if (!func_init_1(&args, STRING))
return;
val = atoln(data_sptr(&args[0]), args[0].u.substr.span);
pop(1);
push_int(val);
}
void op_tostr(void)
{
Data *args;
String *str;
/* Accept one argument of any type. */
if (!func_init_1(&args, 0))
return;
/* Replace the argument with its text version. */
str = data_tostr(&args[0]);
pop(1);
push_string(str);
string_discard(str);
}
void op_toliteral(void)
{
Data *args;
String *str;
/* Accept one argument of any type. */
if (!func_init_1(&args, 0))
return;
/* Replace the argument with its unparsed version. */
str = data_to_literal(&args[0]);
pop(1);
push_string(str);
string_discard(str);
}
void op_todbref(void)
{
Data *args;
long dbref;
/* Accept one string argument to convert to a dbref. */
if (!func_init_1(&args, STRING))
return;
substring_truncate(&args[0].u.substr);
dbref = ident_get(data_sptr(&args[0]));
pop(1);
push_dbref(dbref);
}
void op_tosym(void)
{
Data *args;
long sym;
/* Accept one string argument. */
if (!func_init_1(&args, STRING))
return;
substring_truncate(&args[0].u.substr);
sym = ident_get(data_sptr(&args[0]));
pop(1);
push_symbol(sym);
}
void op_toerr(void)
{
Data *args;
long error;
/* Accept one string argument. */
if (!func_init_1(&args, STRING))
return;
substring_truncate(&args[0].u.substr);
error = ident_get(data_sptr(&args[0]));
pop(1);
push_error(error);
}
void op_valid(void)
{
Data *args;
int is_valid;
/* Accept one argument of any type (only dbrefs can be valid, though). */
if (!func_init_1(&args, 0))
return;
is_valid = (args[0].type == DBREF && cache_check(args[0].u.dbref));
pop(1);
push_int(is_valid);
}