struct psi_impl_arg *psi_impl_get_arg(struct psi_impl *impl, struct psi_impl_var* var) { size_t i = 0; struct psi_impl_arg *iarg; while (psi_plist_get(impl->func->args, i++, &iarg)) { if (zend_string_equals(var->name, iarg->var->name)) { return var->arg = iarg; } } return NULL; }
struct psi_decl_arg *psi_impl_get_temp_let_arg(struct psi_impl *impl, struct psi_decl_var* var) { size_t j = 0; struct psi_let_stmt *let = NULL; while (psi_plist_get(impl->stmts.let, j++, &let)) { if (let->exp->kind != PSI_LET_TMP) { continue; } if (!zend_string_equals(let->exp->var->name, var->name)) { continue; } return var->arg = let->exp->var->arg; } return NULL; }
struct psi_decl_arg *psi_impl_get_decl_arg(struct psi_impl *impl, struct psi_decl_var *var) { struct psi_return_stmt *ret; if (psi_plist_get(impl->stmts.ret, 0, &ret)) { if (ret->exp->args) { size_t i = 0; struct psi_decl_var *arg; while (psi_plist_get(ret->exp->args, i++, &arg)) { if (zend_string_equals(var->name, arg->name)) { return var->arg = arg->arg; } } } } return psi_decl_get_arg(impl->decl, var); }
static void yaf_dispatcher_get_call_parameters(zend_class_entry *request_ce, yaf_request_t *request, zend_function *fptr, zval **params, uint *count) /* {{{ */ { zval *args, *arg; zend_arg_info *arg_info; uint current; HashTable *params_ht; args = zend_read_property(request_ce, request, ZEND_STRL(YAF_REQUEST_PROPERTY_NAME_PARAMS), 1, NULL); params_ht = Z_ARRVAL_P(args); arg_info = fptr->common.arg_info; *params = safe_emalloc(sizeof(zval), fptr->common.num_args, 0); for (current = 0; current < fptr->common.num_args; current++, arg_info++) { if ((arg = zend_hash_find(params_ht, arg_info->name)) != NULL) { ZVAL_COPY_VALUE(&((*params)[current]), arg); (*count)++; } else { zend_string *key; arg = NULL; /* since we need search ignoring case, can't use zend_hash_find */ ZEND_HASH_FOREACH_STR_KEY_VAL(params_ht, key, arg) { if (key) { if (zend_string_equals(key, arg_info->name)) { /* return when we find first match, there is a trap * when multi different parameters in different case presenting in params_ht * only the first take affect */ ZVAL_COPY_VALUE(&((*params)[current]), arg); (*count)++; break; } } } ZEND_HASH_FOREACH_END(); if (NULL == arg) { break; } } } }
static int browser_reg_compare( zval *entry_zv, int num_args, va_list args, zend_hash_key *key) /* {{{ */ { browscap_entry *entry = Z_PTR_P(entry_zv); zend_string *agent_name = va_arg(args, zend_string *); browscap_entry **found_entry_ptr = va_arg(args, browscap_entry **); browscap_entry *found_entry = *found_entry_ptr; ALLOCA_FLAG(use_heap); zend_string *pattern_lc, *regex; const char *cur; int i; pcre *re; int re_options; pcre_extra *re_extra; /* Agent name too short */ if (ZSTR_LEN(agent_name) < browscap_get_minimum_length(entry)) { return 0; } /* Quickly discard patterns where the prefix doesn't match. */ if (zend_binary_strcasecmp( ZSTR_VAL(agent_name), entry->prefix_len, ZSTR_VAL(entry->pattern), entry->prefix_len) != 0) { return 0; } /* Lowercase the pattern, the agent name is already lowercase */ ZSTR_ALLOCA_ALLOC(pattern_lc, ZSTR_LEN(entry->pattern), use_heap); zend_str_tolower_copy(ZSTR_VAL(pattern_lc), ZSTR_VAL(entry->pattern), ZSTR_LEN(entry->pattern)); /* Check if the agent contains the "contains" portions */ cur = ZSTR_VAL(agent_name) + entry->prefix_len; for (i = 0; i < BROWSCAP_NUM_CONTAINS; i++) { if (entry->contains_len[i] != 0) { cur = zend_memnstr(cur, ZSTR_VAL(pattern_lc) + entry->contains_start[i], entry->contains_len[i], ZSTR_VAL(agent_name) + ZSTR_LEN(agent_name)); if (!cur) { ZSTR_ALLOCA_FREE(pattern_lc, use_heap); return 0; } cur += entry->contains_len[i]; } } /* See if we have an exact match, if so, we're done... */ if (zend_string_equals(agent_name, pattern_lc)) { *found_entry_ptr = entry; ZSTR_ALLOCA_FREE(pattern_lc, use_heap); return ZEND_HASH_APPLY_STOP; } regex = browscap_convert_pattern(entry->pattern, 0); re = pcre_get_compiled_regex(regex, &re_extra, &re_options); if (re == NULL) { ZSTR_ALLOCA_FREE(pattern_lc, use_heap); zend_string_release(regex); return 0; } if (pcre_exec(re, re_extra, ZSTR_VAL(agent_name), ZSTR_LEN(agent_name), 0, re_options, NULL, 0) == 0) { /* If we've found a possible browser, we need to do a comparison of the number of characters changed in the user agent being checked versus the previous match found and the current match. */ if (found_entry) { size_t i, prev_len = 0, curr_len = 0; zend_string *previous_match = found_entry->pattern; zend_string *current_match = entry->pattern; for (i = 0; i < ZSTR_LEN(previous_match); i++) { switch (ZSTR_VAL(previous_match)[i]) { case '?': case '*': /* do nothing, ignore these characters in the count */ break; default: ++prev_len; } } for (i = 0; i < ZSTR_LEN(current_match); i++) { switch (ZSTR_VAL(current_match)[i]) { case '?': case '*': /* do nothing, ignore these characters in the count */ break; default: ++curr_len; } } /* Pick which browser pattern replaces the least amount of characters when compared to the original user agent string... */ if (prev_len < curr_len) { *found_entry_ptr = entry; } } else { *found_entry_ptr = entry; } } ZSTR_ALLOCA_FREE(pattern_lc, use_heap); zend_string_release(regex); return 0; }