RPA Toolkit
Added RJS to the project. Reduced the size of the rparecord_t.
[rpatk.git] / rjs / rjsparser.c
1 #include "rmem.h"
2 #include "rjsrules.h"
3 #include "rjsparser.h"
4
5
6 void rjs_parser_dbex_error(rjs_parser_t *parser)
7 {
8         rpa_errinfo_t err;
9         r_memset(&err, 0, sizeof(err));
10         rpa_dbex_getlasterrinfo(parser->dbex, &err);
11         r_printf("Failed to load RPA rules");
12         if (err.mask & RPA_ERRINFO_CODE) {
13                 r_printf(", Error Code: %ld", err.code);
14         }
15         if (err.mask & RPA_ERRINFO_OFFSET) {
16                 rlong line = 1, i;
17                 const rchar *ptr = rjs_rules_get();
18                 for (i = 0; i < err.offset; i++) {
19                         if (ptr[i] == '\n')
20                                 line += 1;
21                 }
22                 r_printf(", Offset: %ld, Line: %ld", err.offset, line);
23         }
24         if (err.mask & RPA_ERRINFO_NAME) {
25                 r_printf(", Rule Name: %s", err.name);
26         }
27         r_printf("\n");
28 }
29
30
31 rjs_parser_t *rjs_parser_create()
32 {
33         rjs_parser_t *parser = (rjs_parser_t *) r_zmalloc(sizeof(*parser));
34
35         parser->dbex = rpa_dbex_create();
36         if (!parser) {
37                 rjs_parser_destroy(parser);
38                 return NULL;
39         }
40         rpa_dbex_open(parser->dbex);
41         if (rpa_dbex_load(parser->dbex, rjs_rules_get(), rjs_rules_size()) < 0) {
42                 rjs_parser_dbex_error(parser);
43                 rjs_parser_destroy(parser);
44                 return NULL;
45         }
46         rpa_dbex_close(parser->dbex);
47         if (rpa_dbex_compile(parser->dbex) < 0) {
48                 rjs_parser_dbex_error(parser);
49                 rjs_parser_destroy(parser);
50                 return NULL;
51         }
52         return parser;
53 }
54
55
56 void rjs_parser_destroy(rjs_parser_t *parser)
57 {
58         if (parser) {
59                 rpa_dbex_destroy(parser->dbex);
60                 r_free(parser);
61         }
62 }
63
64
65 rlong rjs_parser_exec(rjs_parser_t *parser, const rchar *script, rsize_t size, rarray_t **ast)
66 {
67         rlong res = 0;
68         rpastat_t *stat = rpa_stat_create(parser->dbex, 4096);
69         res = rpa_stat_parse(stat, rpa_dbex_default(parser->dbex), script, script, script + size, ast);
70         rpa_stat_destroy(stat);
71         return res;
72 }