Make nstr_exec_val() more robust
Oops on bad argument, and make a better error value then.
This commit is contained in:
parent
422cd52209
commit
0bcb047806
2 changed files with 14 additions and 11 deletions
|
@ -67,6 +67,9 @@ typedef enum {
|
||||||
} nsc_type;
|
} nsc_type;
|
||||||
typedef char packed_nsc_type;
|
typedef char packed_nsc_type;
|
||||||
|
|
||||||
|
/* Is TYPE a promoted value type? */
|
||||||
|
#define NSC_IS_PROMOTED(type) (NSC_LONG <= (type) && (type) <= NSC_STRING)
|
||||||
|
|
||||||
/* Return nsc_type for a signed integer with the same size as TYPE. */
|
/* Return nsc_type for a signed integer with the same size as TYPE. */
|
||||||
#define NSC_SITYPE(type) \
|
#define NSC_SITYPE(type) \
|
||||||
(sizeof(type) == 1 ? NSC_CHAR \
|
(sizeof(type) == 1 ? NSC_CHAR \
|
||||||
|
|
|
@ -36,6 +36,7 @@
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
|
#include <string.h>
|
||||||
#include "file.h"
|
#include "file.h"
|
||||||
#include "nat.h"
|
#include "nat.h"
|
||||||
#include "nsc.h"
|
#include "nsc.h"
|
||||||
|
@ -45,7 +46,7 @@
|
||||||
/*
|
/*
|
||||||
* Evaluate VAL.
|
* Evaluate VAL.
|
||||||
* If VAL is symbolic, evaluate it into a promoted value type.
|
* If VAL is symbolic, evaluate it into a promoted value type.
|
||||||
* Use coordinate system of country CNUM.
|
* Use country CNUM's coordinate system and access control.
|
||||||
* PTR points to a context object of the type that was used to compile
|
* PTR points to a context object of the type that was used to compile
|
||||||
* the value.
|
* the value.
|
||||||
* Unless WANT is NSC_NOTYPE, coerce the value to promoted value type
|
* Unless WANT is NSC_NOTYPE, coerce the value to promoted value type
|
||||||
|
@ -60,10 +61,10 @@ nstr_exec_val(struct valstr *val, natid cnum, void *ptr, nsc_type want)
|
||||||
int idx;
|
int idx;
|
||||||
struct natstr *natp;
|
struct natstr *natp;
|
||||||
|
|
||||||
|
if (CANT_HAPPEN(want != NSC_NOTYPE && !NSC_IS_PROMOTED(want)))
|
||||||
|
want = nstr_promote(want);
|
||||||
|
|
||||||
switch (val->val_cat) {
|
switch (val->val_cat) {
|
||||||
default:
|
|
||||||
CANT_REACH();
|
|
||||||
/* fall through */
|
|
||||||
case NSC_VAL:
|
case NSC_VAL:
|
||||||
valtype = val->val_type;
|
valtype = val->val_type;
|
||||||
break;
|
break;
|
||||||
|
@ -134,6 +135,10 @@ nstr_exec_val(struct valstr *val, natid cnum, void *ptr, nsc_type want)
|
||||||
val->val_as.lng = 0;
|
val->val_as.lng = 0;
|
||||||
}
|
}
|
||||||
val->val_cat = NSC_VAL;
|
val->val_cat = NSC_VAL;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
CANT_REACH();
|
||||||
|
valtype = NSC_NOTYPE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (valtype == want)
|
if (valtype == want)
|
||||||
|
@ -147,14 +152,9 @@ nstr_exec_val(struct valstr *val, natid cnum, void *ptr, nsc_type want)
|
||||||
CANT_REACH(); /* FIXME implement */
|
CANT_REACH(); /* FIXME implement */
|
||||||
|
|
||||||
if (CANT_HAPPEN(valtype != want && want != NSC_NOTYPE)) {
|
if (CANT_HAPPEN(valtype != want && want != NSC_NOTYPE)) {
|
||||||
|
/* make up an error value */
|
||||||
valtype = want;
|
valtype = want;
|
||||||
switch (want) {
|
memset(&val->val_as, 0, sizeof(val->val_as));
|
||||||
case NSC_LONG: val->val_as.lng = 0; break;
|
|
||||||
case NSC_DOUBLE: val->val_as.dbl = 0.0; break;
|
|
||||||
case NSC_STRING: val->val_as.str.base = NULL; break;
|
|
||||||
default:
|
|
||||||
CANT_REACH();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
val->val_type = valtype;
|
val->val_type = valtype;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue