Example #1
0
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;
}
Example #2
0
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;
}