163 if (param_was_set_var_sym(right_name, right_sym))
164 return;
165
166 set_true_false_states(compare_id, state_name, NULL, true_state, false_state);
167 save_link_var_sym(left_name, left_sym, state_name);
168 save_link_var_sym(right_name, right_sym, state_name);
169 free:
170 free_string(left_name);
171 free_string(right_name);
172 }
173
174 static void print_return_comparison(int return_id, char *return_ranges, struct expression *expr)
175 {
176 struct sm_state *tmp;
177 struct string_list *links;
178 char *link;
179 struct sm_state *sm;
180 struct compare_data *data;
181 struct var_sym *left, *right;
182 int left_param, right_param;
183 static char left_buf[256];
184 static char right_buf[256];
185 static char info_buf[256];
186 const char *tmp_name;
187
188 FOR_EACH_MY_SM(link_id, __get_cur_stree(), tmp) {
189 links = tmp->state->data;
190 FOR_EACH_PTR(links, link) {
191 sm = get_sm_state(compare_id, link, NULL);
192 if (!sm)
193 continue;
194 data = sm->state->data;
195 if (!data || !data->comparison)
196 continue;
197 if (ptr_list_size((struct ptr_list *)data->left_vsl) != 1 ||
198 ptr_list_size((struct ptr_list *)data->right_vsl) != 1)
199 continue;
200 left = first_ptr_list((struct ptr_list *)data->left_vsl);
201 right = first_ptr_list((struct ptr_list *)data->right_vsl);
202 if (left->sym == right->sym &&
203 strcmp(left->var, right->var) == 0)
204 continue;
267 return 0;
268 }
269
270 if (**value != ' ') {
271 sm_perror("parsing comparison. %s", *value);
272 return 0;
273 }
274
275 (*value)++;
276 return 1;
277 }
278
279 static int split_op_param_key(char *value, int *op, int *param, char **key)
280 {
281 static char buf[256];
282 char *p;
283
284 if (!parse_comparison(&value, op))
285 return 0;
286
287 snprintf(buf, sizeof(buf), value);
288
289 p = buf;
290 if (*p++ != '$')
291 return 0;
292
293 *param = atoi(p);
294 if (*param < 0 || *param > 99)
295 return 0;
296 p++;
297 if (*param > 9)
298 p++;
299 p--;
300 *p = '$';
301 *key = p;
302
303 return 1;
304 }
305
306 static void db_return_comparison(struct expression *expr, int left_param, char *key, char *value)
307 {
340 right_name = get_variable_from_key(right_arg, right_key, &right_sym);
341 if (!right_name || !right_sym)
342 goto free;
343 if (get_param_num_from_sym(right_sym) < 0)
344 goto free;
345
346 add_var_sym(&left_vsl, left_name, left_sym);
347 add_var_sym(&right_vsl, right_name, right_sym);
348
349 add_comparison_var_sym(left_name, left_vsl, op, right_name, right_vsl);
350
351 free:
352 free_string(left_name);
353 free_string(right_name);
354 }
355
356 void register_param_compare_limit(int id)
357 {
358 compare_id = id;
359
360 add_merge_hook(compare_id, &merge_compare_states);
361 add_split_return_callback(&print_return_comparison);
362
363 select_return_states_hook(COMPARE_LIMIT, &db_return_comparison);
364 }
365
366 void register_param_compare_limit_links(int id)
367 {
368 link_id = id;
369
370 add_merge_hook(link_id, &merge_links);
371
372 }
373
|
163 if (param_was_set_var_sym(right_name, right_sym))
164 return;
165
166 set_true_false_states(compare_id, state_name, NULL, true_state, false_state);
167 save_link_var_sym(left_name, left_sym, state_name);
168 save_link_var_sym(right_name, right_sym, state_name);
169 free:
170 free_string(left_name);
171 free_string(right_name);
172 }
173
174 static void print_return_comparison(int return_id, char *return_ranges, struct expression *expr)
175 {
176 struct sm_state *tmp;
177 struct string_list *links;
178 char *link;
179 struct sm_state *sm;
180 struct compare_data *data;
181 struct var_sym *left, *right;
182 int left_param, right_param;
183 static char left_buf[248];
184 static char right_buf[248];
185 static char info_buf[256];
186 const char *tmp_name;
187
188 FOR_EACH_MY_SM(link_id, __get_cur_stree(), tmp) {
189 links = tmp->state->data;
190 FOR_EACH_PTR(links, link) {
191 sm = get_sm_state(compare_id, link, NULL);
192 if (!sm)
193 continue;
194 data = sm->state->data;
195 if (!data || !data->comparison)
196 continue;
197 if (ptr_list_size((struct ptr_list *)data->left_vsl) != 1 ||
198 ptr_list_size((struct ptr_list *)data->right_vsl) != 1)
199 continue;
200 left = first_ptr_list((struct ptr_list *)data->left_vsl);
201 right = first_ptr_list((struct ptr_list *)data->right_vsl);
202 if (left->sym == right->sym &&
203 strcmp(left->var, right->var) == 0)
204 continue;
267 return 0;
268 }
269
270 if (**value != ' ') {
271 sm_perror("parsing comparison. %s", *value);
272 return 0;
273 }
274
275 (*value)++;
276 return 1;
277 }
278
279 static int split_op_param_key(char *value, int *op, int *param, char **key)
280 {
281 static char buf[256];
282 char *p;
283
284 if (!parse_comparison(&value, op))
285 return 0;
286
287 snprintf(buf, sizeof(buf), "%s", value);
288
289 p = buf;
290 if (*p++ != '$')
291 return 0;
292
293 *param = atoi(p);
294 if (*param < 0 || *param > 99)
295 return 0;
296 p++;
297 if (*param > 9)
298 p++;
299 p--;
300 *p = '$';
301 *key = p;
302
303 return 1;
304 }
305
306 static void db_return_comparison(struct expression *expr, int left_param, char *key, char *value)
307 {
340 right_name = get_variable_from_key(right_arg, right_key, &right_sym);
341 if (!right_name || !right_sym)
342 goto free;
343 if (get_param_num_from_sym(right_sym) < 0)
344 goto free;
345
346 add_var_sym(&left_vsl, left_name, left_sym);
347 add_var_sym(&right_vsl, right_name, right_sym);
348
349 add_comparison_var_sym(left_name, left_vsl, op, right_name, right_vsl);
350
351 free:
352 free_string(left_name);
353 free_string(right_name);
354 }
355
356 void register_param_compare_limit(int id)
357 {
358 compare_id = id;
359
360 set_dynamic_states(compare_id);
361 add_merge_hook(compare_id, &merge_compare_states);
362 add_split_return_callback(&print_return_comparison);
363
364 select_return_states_hook(COMPARE_LIMIT, &db_return_comparison);
365 }
366
367 void register_param_compare_limit_links(int id)
368 {
369 link_id = id;
370
371 set_dynamic_states(link_id);
372 add_merge_hook(link_id, &merge_links);
373 }
374
|