@@ -238,6 +238,58 @@ static void php_jv_dump(zval **return_value, jv x, int flags)
238
238
jv_free (x );
239
239
}
240
240
241
+ static int php_jq_arguments (jv * arguments , zval * variables )
242
+ {
243
+ if (variables == NULL ) {
244
+ return SUCCESS ;
245
+ }
246
+
247
+ zend_string * arg_key ;
248
+ zval * arg_val ;
249
+
250
+ ZEND_HASH_FOREACH_STR_KEY_VAL (Z_ARRVAL_P (variables ), arg_key , arg_val ) {
251
+ if (!arg_key ) {
252
+ continue ;
253
+ }
254
+
255
+ char * str_key = ZSTR_VAL (arg_key );
256
+ if (jv_object_has (jv_copy (* arguments ), jv_string (str_key ))) {
257
+ if (PHP_JQ_G (display_errors )) {
258
+ PHP_JQ_ERR (E_WARNING ,
259
+ "%s: variables key has already." , str_key );
260
+ }
261
+ continue ;
262
+ }
263
+
264
+ if (Z_TYPE_P (arg_val ) != IS_STRING ) {
265
+ if (PHP_JQ_G (display_errors )) {
266
+ PHP_JQ_ERR (E_WARNING ,
267
+ "%s: variables value should be a string." , str_key );
268
+ }
269
+ continue ;
270
+ }
271
+
272
+ char * str_val = Z_STRVAL_P (arg_val );
273
+ jv v ;
274
+ if (Z_STRLEN_P (arg_val ) > 1 && str_val [0 ] == '@' ) {
275
+ v = jv_parse (++ str_val );
276
+ if (!jv_is_valid (v )) {
277
+ jv_free (v );
278
+ zend_throw_error (zend_jq_exception_ce ,
279
+ "%s: invalid JSON text passed to variables." ,
280
+ str_key );
281
+ return FAILURE ;
282
+ }
283
+ } else {
284
+ v = jv_string (str_val );
285
+ }
286
+
287
+ * arguments = jv_object_set (* arguments , jv_string (str_key ), v );
288
+ } ZEND_HASH_FOREACH_END ();
289
+
290
+ return SUCCESS ;
291
+ }
292
+
241
293
static void php_jq_filter (zval * * return_value , jq_state * jq , jv json , int flags )
242
294
{
243
295
jv result ;
@@ -502,20 +554,23 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_jq_run_fromstring, 0, 0, 2)
502
554
ZEND_ARG_INFO (0 , text )
503
555
ZEND_ARG_INFO (0 , filter )
504
556
ZEND_ARG_INFO (0 , flags )
557
+ ZEND_ARG_INFO (0 , variables )
505
558
ZEND_END_ARG_INFO ()
506
559
ZEND_NS_METHOD (##PHP_JQ_NS , Run, fromString)
507
560
{
508
561
char * filter , * text ;
509
562
jq_state * state ;
510
- jv json ;
563
+ jv arguments , json ;
511
564
size_t filter_len , text_len ;
512
565
zend_long flags = 0 ;
566
+ zval * variables = NULL ;
513
567
514
- ZEND_PARSE_PARAMETERS_START (2 , 3 )
568
+ ZEND_PARSE_PARAMETERS_START (2 , 4 )
515
569
Z_PARAM_STRING (text , text_len )
516
570
Z_PARAM_STRING (filter , filter_len )
517
571
Z_PARAM_OPTIONAL
518
572
Z_PARAM_LONG (flags )
573
+ Z_PARAM_ARRAY (variables )
519
574
ZEND_PARSE_PARAMETERS_END ();
520
575
521
576
json = jv_parse_sized (text , text_len );
@@ -525,17 +580,26 @@ ZEND_NS_METHOD(##PHP_JQ_NS, Run, fromString)
525
580
RETURN_FALSE ;
526
581
}
527
582
583
+ arguments = jv_object ();
584
+ if (php_jq_arguments (& arguments , variables ) != SUCCESS ) {
585
+ jv_free (arguments );
586
+ jv_free (json );
587
+ RETURN_FALSE ;
588
+ }
589
+
528
590
filter [filter_len ] = 0 ;
529
591
530
592
state = php_jq_init ();
531
593
532
- if (!jq_compile (state , filter )) {
594
+ if (!jq_compile_args (state , filter , jv_copy (arguments ))) {
595
+ jv_free (arguments );
533
596
jv_free (json );
534
597
jq_teardown (& state );
535
598
zend_throw_error (zend_jq_exception_ce ,
536
599
"failed to compile filter string." );
537
600
RETURN_FALSE ;
538
601
}
602
+ jv_free (arguments );
539
603
540
604
php_jq_filter (& return_value , state , json , flags );
541
605
@@ -547,20 +611,23 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_jq_run_fromfile, 0, 0, 2)
547
611
ZEND_ARG_INFO (0 , file )
548
612
ZEND_ARG_INFO (0 , filter )
549
613
ZEND_ARG_INFO (0 , flags )
614
+ ZEND_ARG_INFO (0 , variables )
550
615
ZEND_END_ARG_INFO ()
551
616
ZEND_NS_METHOD (##PHP_JQ_NS , Run, fromFile)
552
617
{
553
618
char * file , * filter ;
554
619
jq_state * state ;
555
- jv json ;
620
+ jv arguments , json ;
556
621
size_t file_len , filter_len ;
557
622
zend_long flags = 0 ;
623
+ zval * variables = NULL ;
558
624
559
- ZEND_PARSE_PARAMETERS_START (2 , 3 )
625
+ ZEND_PARSE_PARAMETERS_START (2 , 4 )
560
626
Z_PARAM_STRING (file , file_len )
561
627
Z_PARAM_STRING (filter , filter_len )
562
628
Z_PARAM_OPTIONAL
563
629
Z_PARAM_LONG (flags )
630
+ Z_PARAM_ARRAY (variables )
564
631
ZEND_PARSE_PARAMETERS_END ();
565
632
566
633
if (php_jq_load_file (& json , file ) != SUCCESS ) {
@@ -573,17 +640,26 @@ ZEND_NS_METHOD(##PHP_JQ_NS, Run, fromFile)
573
640
RETURN_FALSE ;
574
641
}
575
642
643
+ arguments = jv_object ();
644
+ if (php_jq_arguments (& arguments , variables ) != SUCCESS ) {
645
+ jv_free (arguments );
646
+ jv_free (json );
647
+ RETURN_FALSE ;
648
+ }
649
+
576
650
state = php_jq_init ();
577
651
578
652
filter [filter_len ] = 0 ;
579
653
580
- if (!jq_compile (state , filter )) {
654
+ if (!jq_compile_args (state , filter , jv_copy (arguments ))) {
655
+ jv_free (arguments );
581
656
jv_free (json );
582
657
jq_teardown (& state );
583
658
zend_throw_error (zend_jq_exception_ce ,
584
659
"failed to compile filter string." );
585
660
RETURN_FALSE ;
586
661
}
662
+ jv_free (arguments );
587
663
588
664
php_jq_filter (& return_value , state , json , flags );
589
665
0 commit comments