diff options
Diffstat (limited to 'src/lib/main.c')
| -rw-r--r-- | src/lib/main.c | 46 |
1 files changed, 38 insertions, 8 deletions
diff --git a/src/lib/main.c b/src/lib/main.c index d25ad99..6cfff40 100644 --- a/src/lib/main.c +++ b/src/lib/main.c @@ -20,12 +20,17 @@ #include "aplwc_internal.h" #include "boot.h" +static void aplwc_failsim_init(unsigned long (*)(enum aplwc_failsim_parameter, unsigned long)); + struct aplwc * aplwc_new(struct aplwc_fns fns, enum aplwc_rc *rcp) { enum aplwc_rc rc; struct aplwc *aplwc; + if(fns.setup_failsim) + aplwc_failsim_init(fns.setup_failsim); + aplwc = NULL; if(fns.alloc == NULL){ rc = APLWC_OUT_OF_MEMORY; @@ -41,7 +46,8 @@ aplwc_new(struct aplwc_fns fns, enum aplwc_rc *rcp) aplwc->fns = fns; aplwc->symtab = NULL; memory_init(aplwc); - keyword_init(aplwc); + if((rc = keyword_init(aplwc)) != APLWC_OK) + goto end; rc = aplwc_load_module(aplwc, "Boot", (const char *)boot_src, boot_src_len); end: @@ -231,15 +237,39 @@ aplwc_valid_line(AplwcLine *l) return valid_ref(&l->ref); } -uint64_t aplwc_simulate_failure_at; -uint64_t aplwc_simulate_failure_count; +static unsigned long aplwc_failsim_properties[APLWC_FAILSIM_PARAMETER_COUNT]; int aplwc_simulate_failure(void) { - aplwc_simulate_failure_count++; - if(aplwc_simulate_failure_at && (aplwc_simulate_failure_count >= aplwc_simulate_failure_at)) - return 1; - else - return 0; + unsigned long hits, start, count; + int fail; + + hits = aplwc_failsim_properties[APLWC_FAILSIM_HITS]++; + start = aplwc_failsim_query(APLWC_FAILSIM_START); + count = aplwc_failsim_query(APLWC_FAILSIM_COUNT); + + fail = (hits >= start) && (hits < start+count); + aplwc_failsim_properties[APLWC_FAILSIM_FAILS] += fail; + return fail; +} + +unsigned long +aplwc_failsim_query(enum aplwc_failsim_parameter p) +{ + return aplwc_failsim_properties[p]; +} + +static void +aplwc_failsim_init(unsigned long (*f)(enum aplwc_failsim_parameter, unsigned long)) +{ + enum aplwc_failsim_parameter p; + unsigned long v; + + for(p = 0; p < APLWC_FAILSIM_PARAMETER_COUNT; p++){ + switch(p){ + default: v = 0; break; + } + aplwc_failsim_properties[p] = f(p, v); + } } |