PHP_METHOD(JsonPath, find) { char *path; #if PHP_MAJOR_VERSION < 7 int path_len; #else size_t path_len; #endif zval *z_array; HashTable *arr; if (zend_parse_parameters(ZEND_NUM_ARGS()TSRMLS_CC, "as", &z_array, &path, &path_len) == FAILURE) { return; } array_init(return_value); lex_token lex_tok[100]; char lex_tok_values[100][100]; int lex_tok_count = 0; char *p = path; char buffer[100]; lex_token *ptr = lex_tok; while ((*ptr = scan(&p, buffer, sizeof(buffer))) != LEX_NOT_FOUND) { switch (*ptr) { case LEX_NODE: case LEX_LITERAL: strcpy(lex_tok_values[lex_tok_count], buffer); break; default: lex_tok_values[lex_tok_count][0] = '\0'; break; } ptr++; lex_tok_count++; } operator tok[100]; int tok_count = 0; int *int_ptr = &tok_count; build_parse_tree(lex_tok, lex_tok_values, lex_tok_count, tok, int_ptr); operator * tok_ptr_start; operator * tok_ptr_end; tok_ptr_start = &tok[0]; tok_ptr_end = &tok[tok_count - 1]; iterate(z_array, tok_ptr_start, tok_ptr_end, return_value); if (zend_hash_num_elements(HASH_OF(return_value)) == 0) { convert_to_boolean(return_value); RETURN_FALSE; } return; }
PHP_METHOD(JsonPath, find) { char *path; #if PHP_MAJOR_VERSION < 7 int path_len; #else size_t path_len; #endif zval *z_array; HashTable *arr; if (zend_parse_parameters(ZEND_NUM_ARGS()TSRMLS_CC, "as", &z_array, &path, &path_len) == FAILURE) { return; } array_init(return_value); lex_token lex_tok[PARSE_BUF_LEN]; char lex_tok_values[PARSE_BUF_LEN][PARSE_BUF_LEN]; int lex_tok_count = 0; char *p = path; char buffer[PARSE_BUF_LEN]; lex_token *ptr = lex_tok; lex_error err; while ((*ptr = scan(&p, buffer, sizeof(buffer), &err)) != LEX_NOT_FOUND) { switch (*ptr) { case LEX_NODE: case LEX_LITERAL: strcpy(lex_tok_values[lex_tok_count], buffer); break; case LEX_ERR: snprintf(err.msg, sizeof(err.msg), "%s at position %d", err.msg, (err.pos - path)); zend_throw_exception(spl_ce_RuntimeException, err.msg, 0 TSRMLS_CC); return; default: lex_tok_values[lex_tok_count][0] = '\0'; break; } ptr++; lex_tok_count++; } operator tok[100]; int tok_count = 0; int *int_ptr = &tok_count; parse_error p_err; if (!build_parse_tree(lex_tok, lex_tok_values, lex_tok_count, tok, int_ptr, &p_err)) { zend_throw_exception(spl_ce_RuntimeException, p_err.msg, 0 TSRMLS_CC); } operator * tok_ptr_start; operator * tok_ptr_end; tok_ptr_start = &tok[0]; tok_ptr_end = &tok[tok_count - 1]; iterate(z_array, tok_ptr_start, tok_ptr_end, return_value TSRMLS_CC); operator * fr = tok_ptr_start; while (fr <= tok_ptr_end) { if (fr->filter_type == FLTR_EXPR) { efree((void *)fr->expressions); } fr++; } if (zend_hash_num_elements(HASH_OF(return_value)) == 0) { convert_to_boolean(return_value); RETURN_FALSE; } return; }