RPA Toolkit
added abort functionality
authorMartin Stoilov <martin@rpasearch.com>
Sat, 23 Apr 2011 03:16:41 +0000 (20:16 -0700)
committerMartin Stoilov <martin@rpasearch.com>
Sat, 23 Apr 2011 03:16:41 +0000 (20:16 -0700)
rpa2/rpaerror.h
rpa2/rpastat.c
rvm/rvmcpu.c
rvm/rvmcpu.h

index d793b8f..60fab82 100644 (file)
 #include "rtypes.h"
 #include "rpadbex.h"
 
+#define RPA_ERRINFO_NONE 0
+#define RPA_ERRINFO_CODE (1<<0)
+#define RPA_ERRINFO_OFFSET (1<<1)
+#define RPA_ERRINFO_RULEID (1<<2)
+#define RPA_ERRINFO_NAME (1<<3)
+
+
 #define RPA_E_NONE 0
 #define RPA_E_OUTOFMEM 1001
 #define RPA_E_INVALID_INPUT 1002
 #define RPA_E_SYNTAX_ERROR 1006
 #define RPA_E_UNRESOLVED_SYMBOL 1007
 
-#define RPA_ERRINFO_NONE 0
-#define RPA_ERRINFO_CODE (1<<0)
-#define RPA_ERRINFO_OFFSET (1<<1)
-#define RPA_ERRINFO_RULEID (1<<2)
-#define RPA_ERRINFO_NAME (1<<3)
+#define RPA_E_USERABORT 2001
 
 
 typedef struct rpa_errinfo_s rpa_errinfo_t;
index 2e4dc9c..8c01310 100644 (file)
@@ -1,12 +1,16 @@
 #include "rmem.h"
 #include "rarray.h"
 #include "rpastat.h"
+#include "rpaerror.h"
 #include "rvmcodegen.h"
 #include "rvmcpu.h"
 #include "rutf.h"
 #include "rcharconv.h"
 
 
+#define RPA_STAT_SETERROR_CODE(__s__, __e__) do { (__s__)->error = __e__; } while (0)
+
+
 rpastat_t *rpa_stat_create(rpadbex_t *dbex, rulong stacksize)
 {
        rpastat_t *stat = (rpastat_t *) r_zmalloc(sizeof(*stat));
@@ -154,9 +158,10 @@ rlong rpa_stat_exec(rpastat_t *stat, rvm_asmins_t *prog, rword off)
                ret = rvm_cpu_exec(stat->cpu, prog, off);
        }
        if (ret < 0) {
-               /*
-                * TBD: Set the error
-                */
+               if (stat->cpu->error == RVM_E_USERABORT)
+                       RPA_STAT_SETERROR_CODE(stat, RPA_E_USERABORT);
+               else
+                       RPA_STAT_SETERROR_CODE(stat, stat->cpu->error);
                r_array_setlength(stat->records, 0);
                return -1;
        }
@@ -193,9 +198,11 @@ rlong rpa_stat_scan(rpastat_t *stat, rparule_t rid, const rchar *input, const rc
        if (!stat) {
                return -1;
        }
-
        while (input < end) {
-               if ((ret = rpa_stat_exec_noinit(stat, rid, input, start, end)) > 0) {
+               ret = rpa_stat_exec_noinit(stat, rid, input, start, end);
+               if (ret < 0)
+                       return -1;
+               if (ret > 0) {
                        *where = input;
                        return ret;
                }
@@ -239,6 +246,7 @@ rint rpa_stat_abort(rpastat_t *stat)
                return -1;
        }
 
+       rvm_cpu_abort(stat->cpu);
        return 0;
 }
 
index c49e529..808427b 100644 (file)
@@ -2088,6 +2088,16 @@ rint rvm_cpu_addswitable(rvmcpu_t *cpu, const rchar *tabname, rvm_switable_t *sw
 }
 
 
+rint rvm_cpu_abort(rvmcpu_t *cpu)
+{
+       if (!cpu)
+               return -1;
+       cpu->error = RVM_E_USERABORT;
+       cpu->abort = 1;
+       return 0;
+}
+
+
 rvm_asmins_t rvm_cond_asma(rword cond, rword opcode, rword op1, rword op2, rword op3, rchar *data, rulong size)
 {
        rvm_asmins_t a;
index 5b67000..4c8a364 100644 (file)
@@ -278,6 +278,7 @@ do { \
 #define RVM_E_NOMEM                    (7)
 #define RVM_E_NOTFUNCTION      (8)
 #define RVM_E_NOTOBJECT                (9)
+#define RVM_E_USERABORT                (10)
 
 typedef struct rvm_asmins_s rvm_asmins_t;
 typedef struct rvmcpu_s rvmcpu_t;
@@ -336,6 +337,7 @@ struct rvmcpu_s {
 rvmcpu_t *rvm_cpu_create_default();
 rvmcpu_t *rvm_cpu_create(rulong stacksize);
 void rvm_cpu_destroy(rvmcpu_t * vm);
+rint rvm_cpu_abort(rvmcpu_t *cpu);
 rint rvm_cpu_exec(rvmcpu_t *cpu, rvm_asmins_t *prog, rword off);
 rint rvm_cpu_exec_debug(rvmcpu_t *cpu, rvm_asmins_t *prog, rword off);
 rint rvm_cpu_swilookup(rvmcpu_t *cpu, const rchar *tabname, const rchar *swiname, rsize_t size);