summaryrefslogtreecommitdiff
path: root/src/lib/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/main.c')
-rw-r--r--src/lib/main.c46
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);
+ }
}