Deleted
Added
nxt_tstr.c (2246:5f4056478375) | nxt_tstr.c (2247:baa6b9879267) |
---|---|
1 2/* 3 * Copyright (C) NGINX, Inc. 4 */ 5 6#include <nxt_main.h> 7 8 9typedef enum { 10 NXT_TSTR_CONST = 0, 11 NXT_TSTR_VAR, | 1 2/* 3 * Copyright (C) NGINX, Inc. 4 */ 5 6#include <nxt_main.h> 7 8 9typedef enum { 10 NXT_TSTR_CONST = 0, 11 NXT_TSTR_VAR, |
12#if (NXT_HAVE_NJS) 13 NXT_TSTR_JS, 14#endif |
|
12} nxt_tstr_type_t; 13 14 15struct nxt_tstr_s { 16 nxt_str_t str; | 15} nxt_tstr_type_t; 16 17 18struct nxt_tstr_s { 19 nxt_str_t str; |
17 nxt_var_t *var; | 20 21 union { 22 nxt_var_t *var; 23#if (NXT_HAVE_NJS) 24 nxt_js_t *js; 25#endif 26 } u; 27 |
18 nxt_tstr_flags_t flags; 19 nxt_tstr_type_t type; 20}; 21 22 23struct nxt_tstr_query_s { 24 nxt_mp_t *pool; 25 26 nxt_tstr_state_t *state; | 28 nxt_tstr_flags_t flags; 29 nxt_tstr_type_t type; 30}; 31 32 33struct nxt_tstr_query_s { 34 nxt_mp_t *pool; 35 36 nxt_tstr_state_t *state; |
27 nxt_var_cache_t *cache; | 37 nxt_tstr_cache_t *cache; |
28 29 nxt_uint_t waiting; 30 nxt_uint_t failed; /* 1 bit */ 31 32 void *ctx; 33 void *data; 34 35 nxt_work_handler_t ready; 36 nxt_work_handler_t error; 37}; 38 39 | 38 39 nxt_uint_t waiting; 40 nxt_uint_t failed; /* 1 bit */ 41 42 void *ctx; 43 void *data; 44 45 nxt_work_handler_t ready; 46 nxt_work_handler_t error; 47}; 48 49 |
50#define nxt_tstr_is_js(str) \ 51 nxt_strchr_start(str, '`') 52 53 |
|
40nxt_tstr_state_t * | 54nxt_tstr_state_t * |
41nxt_tstr_state_new(nxt_mp_t *mp) | 55nxt_tstr_state_new(nxt_mp_t *mp, nxt_bool_t test) |
42{ 43 nxt_tstr_state_t *state; 44 45 state = nxt_mp_get(mp, sizeof(nxt_tstr_state_t)); 46 if (nxt_slow_path(state == NULL)) { 47 return NULL; 48 } 49 50 state->pool = mp; | 56{ 57 nxt_tstr_state_t *state; 58 59 state = nxt_mp_get(mp, sizeof(nxt_tstr_state_t)); 60 if (nxt_slow_path(state == NULL)) { 61 return NULL; 62 } 63 64 state->pool = mp; |
65 state->test = test; |
|
51 52 state->var_fields = nxt_array_create(mp, 4, sizeof(nxt_var_field_t)); 53 if (nxt_slow_path(state->var_fields == NULL)) { 54 return NULL; 55 } 56 | 66 67 state->var_fields = nxt_array_create(mp, 4, sizeof(nxt_var_field_t)); 68 if (nxt_slow_path(state->var_fields == NULL)) { 69 return NULL; 70 } 71 |
72#if (NXT_HAVE_NJS) 73 state->jcf = nxt_js_conf_new(mp); 74 if (nxt_slow_path(state->jcf == NULL)) { 75 return NULL; 76 } 77#endif 78 |
|
57 return state; 58} 59 60 61nxt_tstr_t * 62nxt_tstr_compile(nxt_tstr_state_t *state, nxt_str_t *str, 63 nxt_tstr_flags_t flags) 64{ --- 18 unchanged lines hidden (view full) --- 83 p = nxt_cpymem(tstr->str.start, str->start, str->length); 84 85 if (strz) { 86 *p = '\0'; 87 } 88 89 tstr->flags = flags; 90 | 79 return state; 80} 81 82 83nxt_tstr_t * 84nxt_tstr_compile(nxt_tstr_state_t *state, nxt_str_t *str, 85 nxt_tstr_flags_t flags) 86{ --- 18 unchanged lines hidden (view full) --- 105 p = nxt_cpymem(tstr->str.start, str->start, str->length); 106 107 if (strz) { 108 *p = '\0'; 109 } 110 111 tstr->flags = flags; 112 |
91 p = nxt_memchr(str->start, '$', str->length); | 113 if (nxt_tstr_is_js(str)) { |
92 | 114 |
93 if (p != NULL) { 94 tstr->type = NXT_TSTR_VAR; | 115#if (NXT_HAVE_NJS) |
95 | 116 |
96 tstr->var = nxt_var_compile(&tstr->str, state->pool, state->var_fields); 97 if (nxt_slow_path(tstr->var == NULL)) { | 117 nxt_str_t tpl; 118 119 tstr->type = NXT_TSTR_JS; 120 121 nxt_tstr_str(tstr, &tpl); 122 123 tstr->u.js = nxt_js_add_tpl(state->jcf, &tpl, strz); 124 if (nxt_slow_path(tstr->u.js == NULL)) { |
98 return NULL; 99 } 100 | 125 return NULL; 126 } 127 |
128#endif 129 |
|
101 } else { | 130 } else { |
102 tstr->type = NXT_TSTR_CONST; | 131 p = memchr(str->start, '$', str->length); 132 133 if (p != NULL) { 134 tstr->type = NXT_TSTR_VAR; 135 136 tstr->u.var = nxt_var_compile(&tstr->str, state->pool, 137 state->var_fields); 138 if (nxt_slow_path(tstr->u.var == NULL)) { 139 return NULL; 140 } 141 142 } else { 143 tstr->type = NXT_TSTR_CONST; 144 } |
103 } 104 105 return tstr; 106} 107 108 109nxt_int_t 110nxt_tstr_test(nxt_tstr_state_t *state, nxt_str_t *str, u_char *error) 111{ | 145 } 146 147 return tstr; 148} 149 150 151nxt_int_t 152nxt_tstr_test(nxt_tstr_state_t *state, nxt_str_t *str, u_char *error) 153{ |
112 return nxt_var_test(str, state->var_fields, error); | 154 u_char *p; 155 156 if (nxt_tstr_is_js(str)) { 157#if (NXT_HAVE_NJS) 158 return nxt_js_test(state->jcf, str, error); 159 160#else 161 nxt_sprintf(error, error + NXT_MAX_ERROR_STR, 162 "Unit is built without support of njs: " 163 "\"--njs\" ./configure option is missing."); 164 return NXT_ERROR; 165#endif 166 167 } else { 168 p = memchr(str->start, '$', str->length); 169 170 if (p != NULL) { 171 return nxt_var_test(str, state->var_fields, error); 172 } 173 } 174 175 return NXT_OK; |
113} 114 115 | 176} 177 178 |
179nxt_int_t 180nxt_tstr_state_done(nxt_tstr_state_t *state, u_char *error) 181{ 182#if (NXT_HAVE_NJS) 183 if (!state->test) { 184 nxt_int_t ret; 185 186 ret = nxt_js_compile(state->jcf); 187 if (nxt_slow_path(ret != NXT_OK)) { 188 return NXT_ERROR; 189 } 190 } 191#endif 192 193 return NXT_OK; 194} 195 196 |
|
116nxt_bool_t 117nxt_tstr_is_const(nxt_tstr_t *tstr) 118{ 119 return (tstr->type == NXT_TSTR_CONST); 120} 121 122 123void --- 4 unchanged lines hidden (view full) --- 128 if (tstr->flags & NXT_TSTR_STRZ) { 129 str->length--; 130 } 131} 132 133 134nxt_int_t 135nxt_tstr_query_init(nxt_tstr_query_t **query_p, nxt_tstr_state_t *state, | 197nxt_bool_t 198nxt_tstr_is_const(nxt_tstr_t *tstr) 199{ 200 return (tstr->type == NXT_TSTR_CONST); 201} 202 203 204void --- 4 unchanged lines hidden (view full) --- 209 if (tstr->flags & NXT_TSTR_STRZ) { 210 str->length--; 211 } 212} 213 214 215nxt_int_t 216nxt_tstr_query_init(nxt_tstr_query_t **query_p, nxt_tstr_state_t *state, |
136 nxt_var_cache_t *cache, void *ctx, nxt_mp_t *mp) | 217 nxt_tstr_cache_t *cache, void *ctx, nxt_mp_t *mp) |
137{ 138 nxt_tstr_query_t *query; 139 140 query = *query_p; 141 142 if (*query_p == NULL) { 143 query = nxt_mp_zget(mp, sizeof(nxt_tstr_query_t)); 144 if (nxt_slow_path(query == NULL)) { --- 22 unchanged lines hidden (view full) --- 167 nxt_tstr_str(tstr, val); 168 return; 169 } 170 171 if (nxt_slow_path(query->failed)) { 172 return; 173 } 174 | 218{ 219 nxt_tstr_query_t *query; 220 221 query = *query_p; 222 223 if (*query_p == NULL) { 224 query = nxt_mp_zget(mp, sizeof(nxt_tstr_query_t)); 225 if (nxt_slow_path(query == NULL)) { --- 22 unchanged lines hidden (view full) --- 248 nxt_tstr_str(tstr, val); 249 return; 250 } 251 252 if (nxt_slow_path(query->failed)) { 253 return; 254 } 255 |
175 ret = nxt_var_interpreter(task, query->cache, tstr->var, val, query->ctx, 176 tstr->flags & NXT_TSTR_LOGGING); 177 if (nxt_slow_path(ret != NXT_OK)) { 178 query->failed = 1; 179 return; | 256 if (tstr->type == NXT_TSTR_VAR) { 257 ret = nxt_var_interpreter(task, &query->cache->var, tstr->u.var, val, 258 query->ctx, tstr->flags & NXT_TSTR_LOGGING); 259 260 if (nxt_slow_path(ret != NXT_OK)) { 261 query->failed = 1; 262 return; 263 } 264 265 } else { 266#if (NXT_HAVE_NJS) 267 ret = nxt_js_call(task, &query->cache->js, tstr->u.js, val, query->ctx); 268 269 if (nxt_slow_path(ret != NXT_OK)) { 270 query->failed = 1; 271 return; 272 } 273#endif |
180 } 181 182 if (tstr->flags & NXT_TSTR_STRZ) { 183 val->length--; 184 } 185 186#if (NXT_DEBUG) 187 nxt_str_t str; 188 189 nxt_tstr_str(tstr, &str); 190 | 274 } 275 276 if (tstr->flags & NXT_TSTR_STRZ) { 277 val->length--; 278 } 279 280#if (NXT_DEBUG) 281 nxt_str_t str; 282 283 nxt_tstr_str(tstr, &str); 284 |
191 nxt_debug(task, "tstr: \"%V\" -> \"%V\"", &str, val); | 285 nxt_debug(task, "tstr query: \"%V\", result: \"%V\"", &str, val); |
192#endif 193} 194 195 196void 197nxt_tstr_query_resolve(nxt_task_t *task, nxt_tstr_query_t *query, void *data, 198 nxt_work_handler_t ready, nxt_work_handler_t error) 199{ --- 24 unchanged lines hidden --- | 286#endif 287} 288 289 290void 291nxt_tstr_query_resolve(nxt_task_t *task, nxt_tstr_query_t *query, void *data, 292 nxt_work_handler_t ready, nxt_work_handler_t error) 293{ --- 24 unchanged lines hidden --- |