* ca_len is zero), or an array of ca_len elements of that type.
* If ca_get is not null, the selector is virtual. Values can be
* obtained by calling ca_get(VAL, CNUM, CTXO), where VAL has been
- * initialized from the selector and an index, CNUM is the country to
- * use for coordinate translation and access control, and CTXO is the
- * context object. See struct valstr for details.
+ * initialized my from the selector and an index by nstr_mksymval(),
+ * CNUM is the country to use for coordinate translation and access
+ * control, and CTXO is the context object. See struct valstr for
+ * details.
* If flag NSC_DEITY is set, only to deities can use this selector.
* If flag NSC_EXTRA is set, xdump ignores this selector.
* If flag NSC_CONST is set, the datum can't be changed from its
extern int nstr_coerce_val(struct valstr *, nsc_type, char *);
extern int nstr_exec(struct nscstr *, int, void *);
/* src/lib/common/nstreval.c */
+extern struct valstr *nstr_mksymval(struct valstr *, struct castr *, int);
extern struct valstr *nstr_exec_val(struct valstr *, natid, void *, nsc_type);
extern int nstr_promote(int);
extern char *symbol_by_value(int, struct symbol *);
static struct valstr *
xdeval(struct valstr *val, struct castr *ca, void *ptr, int idx)
{
- val->val_type = ca->ca_type;
- val->val_cat = NSC_OFF;
- val->val_as.sym.off = ca->ca_off;
- val->val_as.sym.len = ca->ca_len;
- val->val_as.sym.idx = idx;
- val->val_as.sym.get = ca->ca_get;
+ nstr_mksymval(val, ca, idx);
return nstr_exec_val(val, player->cnum, ptr, NSC_NOTYPE);
}
do {
if (ca[i].ca_table == EF_BAD)
continue;
- /* FIXME use xdeval() */
- val.val_type = ca[i].ca_type;
- val.val_cat = NSC_OFF;
- val.val_as.sym.off = ca[i].ca_off;
- val.val_as.sym.len = ca[i].ca_len;
- val.val_as.sym.idx = j;
- val.val_as.sym.get = ca[i].ca_get;
+ nstr_mksymval(&val, &ca[i], j);
nstr_exec_val(&val, 0, row_ref, NSC_NOTYPE);
if (val.val_type != NSC_LONG)
continue;
#include "nsc.h"
#include "optlist.h"
+/*
+ * Initialize VAL to symbolic value for selector CA with index IDX.
+ * Return VAL.
+ */
+struct valstr *
+nstr_mksymval(struct valstr *val, struct castr *ca, int idx)
+{
+ val->val_type = ca->ca_type;
+ val->val_cat = NSC_OFF;
+ val->val_as.sym.off = ca->ca_off;
+ val->val_as.sym.len = ca->ca_len;
+ val->val_as.sym.idx = idx;
+ val->val_as.sym.get = ca->ca_get;
+ return val;
+}
/*
* Evaluate VAL.
return NULL;
}
- val->val_type = ca->ca_type;
- val->val_cat = NSC_OFF;
- val->val_as.sym.off = ca->ca_off;
- val->val_as.sym.len = ca->ca_len;
- val->val_as.sym.idx = 0;
- val->val_as.sym.get = ca->ca_get;
- return val;
+ return nstr_mksymval(val, ca, 0);
}
/*