Make nstr_exec_val() more robust

Oops on bad argument, and make a better error value then.
This commit is contained in:
Markus Armbruster 2008-03-04 07:55:32 +01:00
parent 422cd52209
commit 0bcb047806
2 changed files with 14 additions and 11 deletions

View file

@ -67,6 +67,9 @@ typedef enum {
} 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. */
#define NSC_SITYPE(type) \
(sizeof(type) == 1 ? NSC_CHAR \

View file

@ -36,6 +36,7 @@
#include <config.h>
#include <limits.h>
#include <string.h>
#include "file.h"
#include "nat.h"
#include "nsc.h"
@ -45,7 +46,7 @@
/*
* Evaluate VAL.
* 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
* the value.
* 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;
struct natstr *natp;
if (CANT_HAPPEN(want != NSC_NOTYPE && !NSC_IS_PROMOTED(want)))
want = nstr_promote(want);
switch (val->val_cat) {
default:
CANT_REACH();
/* fall through */
case NSC_VAL:
valtype = val->val_type;
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_cat = NSC_VAL;
break;
default:
CANT_REACH();
valtype = NSC_NOTYPE;
}
if (valtype == want)
@ -147,14 +152,9 @@ nstr_exec_val(struct valstr *val, natid cnum, void *ptr, nsc_type want)
CANT_REACH(); /* FIXME implement */
if (CANT_HAPPEN(valtype != want && want != NSC_NOTYPE)) {
/* make up an error value */
valtype = want;
switch (want) {
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();
}
memset(&val->val_as, 0, sizeof(val->val_as));
}
val->val_type = valtype;