mirror of
				https://github.com/stedolan/jq.git
				synced 2024-05-11 05:55:39 +00:00 
			
		
		
		
	Make regexp builtins and range/3 use #524 too
This commit is contained in:
		
							
								
								
									
										45
									
								
								builtin.c
									
									
									
									
									
								
							
							
						
						
									
										45
									
								
								builtin.c
									
									
									
									
									
								
							| @@ -975,19 +975,19 @@ static const char* const jq_builtins[] = { | |||||||
|   "def flatten($x): reduce .[] as $i ([]; if $i | type == \"array\" and $x > 0 then . + ($i | flatten($x-1)) else . + [$i] end);", |   "def flatten($x): reduce .[] as $i ([]; if $i | type == \"array\" and $x > 0 then . + ($i | flatten($x-1)) else . + [$i] end);", | ||||||
|   "def range($x): range(0;$x);", |   "def range($x): range(0;$x);", | ||||||
|   "def match(re; mode): _match_impl(re; mode; false)|.[];", |   "def match(re; mode): _match_impl(re; mode; false)|.[];", | ||||||
|   "def match(val): (val|type) as $vt | if $vt == \"string\" then match(val; null)" |   "def match($val): ($val|type) as $vt | if $vt == \"string\" then match($val; null)" | ||||||
|   "   elif $vt == \"array\" and (val | length) > 1 then match(val[0]; val[1])" |   "   elif $vt == \"array\" and ($val | length) > 1 then match($val[0]; $val[1])" | ||||||
|   "   elif $vt == \"array\" and (val | length) > 0 then match(val[0]; null)" |   "   elif $vt == \"array\" and ($val | length) > 0 then match($val[0]; null)" | ||||||
|   "   else error( $vt + \" not a string or array\") end;", |   "   else error( $vt + \" not a string or array\") end;", | ||||||
|   "def test(re; mode): _match_impl(re; mode; true);", |   "def test(re; mode): _match_impl(re; mode; true);", | ||||||
|   "def test(val): (val|type) as $vt | if $vt == \"string\" then test(val; null)" |   "def test($val): ($val|type) as $vt | if $vt == \"string\" then test($val; null)" | ||||||
|   "   elif $vt == \"array\" and (val | length) > 1 then test(val[0]; val[1])" |   "   elif $vt == \"array\" and ($val | length) > 1 then test($val[0]; $val[1])" | ||||||
|   "   elif $vt == \"array\" and (val | length) > 0 then test(val[0]; null)" |   "   elif $vt == \"array\" and ($val | length) > 0 then test($val[0]; null)" | ||||||
|   "   else error( $vt + \" not a string or array\") end;", |   "   else error( $vt + \" not a string or array\") end;", | ||||||
|   "def capture(re; mods): match(re; mods) | reduce ( .captures | .[] | select(.name != null) | { (.name) : .string } ) as $pair ({}; . + $pair);", |   "def capture(re; mods): match(re; mods) | reduce ( .captures | .[] | select(.name != null) | { (.name) : .string } ) as $pair ({}; . + $pair);", | ||||||
|   "def capture(val): (val|type) as $vt | if $vt == \"string\" then capture(val; null)" |   "def capture($val): ($val|type) as $vt | if $vt == \"string\" then capture($val; null)" | ||||||
|   "   elif $vt == \"array\" and (val | length) > 1 then capture(val[0]; val[1])" |   "   elif $vt == \"array\" and ($val | length) > 1 then capture($val[0]; $val[1])" | ||||||
|   "   elif $vt == \"array\" and (val | length) > 0 then capture(val[0]; null)" |   "   elif $vt == \"array\" and ($val | length) > 0 then capture($val[0]; null)" | ||||||
|   "   else error( $vt + \" not a string or array\") end;", |   "   else error( $vt + \" not a string or array\") end;", | ||||||
|   "def scan(re):" |   "def scan(re):" | ||||||
|   "  match(re; \"g\")" |   "  match(re; \"g\")" | ||||||
| @@ -998,26 +998,26 @@ static const char* const jq_builtins[] = { | |||||||
|   // |   // | ||||||
|   // If input is an array, then emit a stream of successive subarrays of length n (or less), |   // If input is an array, then emit a stream of successive subarrays of length n (or less), | ||||||
|   // and similarly for strings. |   // and similarly for strings. | ||||||
|   "def nwise(a; n): if a|length <= n then a else a[0:n] , nwise(a[n:]; n) end;", |   "def nwise(a; $n): if a|length <= $n then a else a[0:$n] , nwise(a[$n:]; $n) end;", | ||||||
|   "def nwise(n): nwise(.; n);", |   "def nwise($n): nwise(.; $n);", | ||||||
|   // |   // | ||||||
|   // splits/1 produces a stream; split/1 is retained for backward compatibility. |   // splits/1 produces a stream; split/1 is retained for backward compatibility. | ||||||
|   "def splits(re; flags): . as $s" |   "def splits($re; flags): . as $s" | ||||||
|      //  # multiple occurrences of "g" are acceptable |      //  # multiple occurrences of "g" are acceptable | ||||||
|   "  | [ match(re; \"g\" + flags) | (.offset, .offset + .length) ]" |   "  | [ match($re; \"g\" + flags) | (.offset, .offset + .length) ]" | ||||||
|   "  | [0] + . +[$s|length]" |   "  | [0] + . +[$s|length]" | ||||||
|   "  | nwise(2)" |   "  | nwise(2)" | ||||||
|   "  | $s[.[0]:.[1] ] ;", |   "  | $s[.[0]:.[1] ] ;", | ||||||
|   "def splits(re): splits(re; null);", |   "def splits($re): splits($re; null);", | ||||||
|   // |   // | ||||||
|   // split emits an array for backward compatibility |   // split emits an array for backward compatibility | ||||||
|   "def split(re; flags): [ splits(re; flags) ];", |   "def split($re; flags): [ splits($re; flags) ];", | ||||||
|   "def split(re): [ splits(re; null) ];", |   "def split($re): [ splits($re; null) ];", | ||||||
|   // |   // | ||||||
|   // If s contains capture variables, then create a capture object and pipe it to s |   // If s contains capture variables, then create a capture object and pipe it to s | ||||||
|   "def sub(re; s):" |   "def sub($re; s):" | ||||||
|   "  . as $in" |   "  . as $in" | ||||||
|   "  | [match(re)]" |   "  | [match($re)]" | ||||||
|   "  | .[0]" |   "  | .[0]" | ||||||
|   "  | . as $r" |   "  | . as $r" | ||||||
|      //  # create the \"capture\" object: |      //  # create the \"capture\" object: | ||||||
| @@ -1028,7 +1028,7 @@ static const char* const jq_builtins[] = { | |||||||
|   "    end ;", |   "    end ;", | ||||||
|   // |   // | ||||||
|   // repeated substitution of re (which may contain named captures) |   // repeated substitution of re (which may contain named captures) | ||||||
|   "def gsub(re; s):" |   "def gsub($re; s):" | ||||||
|   //   # _stredit(edits;s) - s is the \"to\" string, which might contain capture variables, |   //   # _stredit(edits;s) - s is the \"to\" string, which might contain capture variables, | ||||||
|   //   # so if an edit contains captures, then create the capture object and pipe it to s |   //   # so if an edit contains captures, then create the capture object and pipe it to s | ||||||
|   "   def _stredit(edits; s):" |   "   def _stredit(edits; s):" | ||||||
| @@ -1043,14 +1043,11 @@ static const char* const jq_builtins[] = { | |||||||
|   "         else (if $l == 0 then \"\" else ($in | _stredit(edits[0:$l]; s)) end) + (. | s)" |   "         else (if $l == 0 then \"\" else ($in | _stredit(edits[0:$l]; s)) end) + (. | s)" | ||||||
|   "         end" |   "         end" | ||||||
|   "     end ;" |   "     end ;" | ||||||
|   "  [match(re;\"g\")] as $edits | _stredit($edits; s) ;", |   "  [match($re;\"g\")] as $edits | _stredit($edits; s) ;", | ||||||
|  |  | ||||||
|   //####################################################################### |   //####################################################################### | ||||||
|   // range/3, with a `by` expression argument |   // range/3, with a `by` expression argument | ||||||
|   "def range(init; upto; by): " |   "def range($init; $upto; $by): " | ||||||
|   "    init as $init |" |  | ||||||
|   "    upto as $upto |" |  | ||||||
|   "    by as $by |" |  | ||||||
|   "    def _range: " |   "    def _range: " | ||||||
|   "        if ($by > 0 and . < $upto) or ($by < 0 and . > $upto) then ., ((.+$by)|_range) else . end; " |   "        if ($by > 0 and . < $upto) or ($by < 0 and . > $upto) then ., ((.+$by)|_range) else . end; " | ||||||
|   "    if $by == 0 then $init else $init|_range end | select(($by > 0 and . < $upto) or ($by < 0 and . > $upto));", |   "    if $by == 0 then $init else $init|_range end | select(($by > 0 and . < $upto) or ($by < 0 and . > $upto));", | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user