summaryrefslogtreecommitdiff
path: root/src/sp_config.c
diff options
context:
space:
mode:
authorxXx-caillou-xXx2018-07-13 10:36:50 +0200
committerjvoisin2018-07-13 08:36:50 +0000
commit7963580d72a358975133f86f01de2d2eab08ba38 (patch)
tree4bec345d70f687a2a6002b36e2f2fc79318959f6 /src/sp_config.c
parent12b740bc7bb01ffe397cecc5b6fa25b136304911 (diff)
Massively optimize how rules are handled
This commit does a lot of things: - Use hashtables instead of lists to store the rules - Rules that can be applied at launch time won't be tried at runtime - Improve feedback when writing nonsensical rules - Make intensive use of `zend_string` instead of `char*`
Diffstat (limited to 'src/sp_config.c')
-rw-r--r--src/sp_config.c36
1 files changed, 18 insertions, 18 deletions
diff --git a/src/sp_config.c b/src/sp_config.c
index eb5b324..c652984 100644
--- a/src/sp_config.c
+++ b/src/sp_config.c
@@ -63,29 +63,29 @@ int parse_empty(char *restrict line, char *restrict keyword, void *retval) {
63 63
64int parse_php_type(char *restrict line, char *restrict keyword, void *retval) { 64int parse_php_type(char *restrict line, char *restrict keyword, void *retval) {
65 size_t consumed = 0; 65 size_t consumed = 0;
66 char *value = get_param(&consumed, line, SP_TYPE_STR, keyword); 66 zend_string *value = get_param(&consumed, line, SP_TYPE_STR, keyword);
67 if (value) { 67 if (value) {
68 if (0 == strcasecmp("undef", value)) { 68 if (zend_string_equals_literal_ci(value, "undef")) {
69 *(sp_php_type *)retval = SP_PHP_TYPE_UNDEF; 69 *(sp_php_type *)retval = SP_PHP_TYPE_UNDEF;
70 } else if (0 == strcasecmp("null", value)) { 70 } else if (zend_string_equals_literal_ci(value, "null")) {
71 *(sp_php_type *)retval = SP_PHP_TYPE_NULL; 71 *(sp_php_type *)retval = SP_PHP_TYPE_NULL;
72 } else if (0 == strcasecmp("true", value)) { 72 } else if (zend_string_equals_literal_ci(value, "true")) {
73 *(sp_php_type *)retval = SP_PHP_TYPE_TRUE; 73 *(sp_php_type *)retval = SP_PHP_TYPE_TRUE;
74 } else if (0 == strcasecmp("false", value)) { 74 } else if (zend_string_equals_literal_ci(value, "false")) {
75 *(sp_php_type *)retval = SP_PHP_TYPE_FALSE; 75 *(sp_php_type *)retval = SP_PHP_TYPE_FALSE;
76 } else if (0 == strcasecmp("long", value)) { 76 } else if (zend_string_equals_literal_ci(value, "long")) {
77 *(sp_php_type *)retval = SP_PHP_TYPE_LONG; 77 *(sp_php_type *)retval = SP_PHP_TYPE_LONG;
78 } else if (0 == strcasecmp("double", value)) { 78 } else if (zend_string_equals_literal_ci(value, "double")) {
79 *(sp_php_type *)retval = SP_PHP_TYPE_DOUBLE; 79 *(sp_php_type *)retval = SP_PHP_TYPE_DOUBLE;
80 } else if (0 == strcasecmp("string", value)) { 80 } else if (zend_string_equals_literal_ci(value, "string")) {
81 *(sp_php_type *)retval = SP_PHP_TYPE_STRING; 81 *(sp_php_type *)retval = SP_PHP_TYPE_STRING;
82 } else if (0 == strcasecmp("array", value)) { 82 } else if (zend_string_equals_literal_ci(value, "array")) {
83 *(sp_php_type *)retval = SP_PHP_TYPE_ARRAY; 83 *(sp_php_type *)retval = SP_PHP_TYPE_ARRAY;
84 } else if (0 == strcasecmp("object", value)) { 84 } else if (zend_string_equals_literal_ci(value, "object")) {
85 *(sp_php_type *)retval = SP_PHP_TYPE_OBJECT; 85 *(sp_php_type *)retval = SP_PHP_TYPE_OBJECT;
86 } else if (0 == strcasecmp("resource", value)) { 86 } else if (zend_string_equals_literal_ci(value, "resource")) {
87 *(sp_php_type *)retval = SP_PHP_TYPE_RESOURCE; 87 *(sp_php_type *)retval = SP_PHP_TYPE_RESOURCE;
88 } else if (0 == strcasecmp("reference", value)) { 88 } else if (zend_string_equals_literal_ci(value, "reference")) {
89 *(sp_php_type *)retval = SP_PHP_TYPE_REFERENCE; 89 *(sp_php_type *)retval = SP_PHP_TYPE_REFERENCE;
90 } else { 90 } else {
91 pefree(value, 1); 91 pefree(value, 1);
@@ -105,12 +105,12 @@ int parse_php_type(char *restrict line, char *restrict keyword, void *retval) {
105} 105}
106 106
107int parse_str(char *restrict line, char *restrict keyword, void *retval) { 107int parse_str(char *restrict line, char *restrict keyword, void *retval) {
108 char *value = NULL; 108 zend_string *value = NULL;
109 109
110 size_t consumed = 0; 110 size_t consumed = 0;
111 value = get_param(&consumed, line, SP_TYPE_STR, keyword); 111 value = get_param(&consumed, line, SP_TYPE_STR, keyword);
112 if (value) { 112 if (value) {
113 *(char **)retval = value; 113 *(zend_string **)retval = value;
114 return consumed; 114 return consumed;
115 } 115 }
116 return -1; 116 return -1;
@@ -118,11 +118,11 @@ int parse_str(char *restrict line, char *restrict keyword, void *retval) {
118 118
119int parse_cidr(char *restrict line, char *restrict keyword, void *retval) { 119int parse_cidr(char *restrict line, char *restrict keyword, void *retval) {
120 size_t consumed = 0; 120 size_t consumed = 0;
121 char *value = get_param(&consumed, line, SP_TYPE_STR, keyword); 121 zend_string *value = get_param(&consumed, line, SP_TYPE_STR, keyword);
122 sp_cidr *cidr = pecalloc(sizeof(sp_cidr), 1, 1); 122 sp_cidr *cidr = pecalloc(sizeof(sp_cidr), 1, 1);
123 123
124 if (value) { 124 if (value) {
125 if (-1 == get_ip_and_cidr(value, cidr)) { 125 if (-1 == get_ip_and_cidr(ZSTR_VAL(value), cidr)) {
126 return -1; 126 return -1;
127 } 127 }
128 *(sp_cidr **)retval = cidr; 128 *(sp_cidr **)retval = cidr;
@@ -139,10 +139,10 @@ int parse_regexp(char *restrict line, char *restrict keyword, void *retval) {
139 * (http://www.pcre.org/original/doc/html/pcre_study.html) 139 * (http://www.pcre.org/original/doc/html/pcre_study.html)
140 * maybe not: http://sljit.sourceforge.net/pcre.html*/ 140 * maybe not: http://sljit.sourceforge.net/pcre.html*/
141 size_t consumed = 0; 141 size_t consumed = 0;
142 char *value = get_param(&consumed, line, SP_TYPE_STR, keyword); 142 zend_string *value = get_param(&consumed, line, SP_TYPE_STR, keyword);
143 143
144 if (value) { 144 if (value) {
145 sp_pcre *compiled_re = sp_pcre_compile(value); 145 sp_pcre *compiled_re = sp_pcre_compile(ZSTR_VAL(value));
146 if (NULL != compiled_re) { 146 if (NULL != compiled_re) {
147 *(sp_pcre **)retval = compiled_re; 147 *(sp_pcre **)retval = compiled_re;
148 return consumed; 148 return consumed;