summaryrefslogtreecommitdiffstats
path: root/builtin.c
diff options
context:
space:
mode:
authorpkoppstein <pkoppstein@gmail.com>2014-10-06 14:37:57 -0400
committerWilliam Langford <wlangfor@gmail.com>2014-10-06 21:32:07 -0400
commit85f0e30c817631c2c76d8b5e35443509283c638e (patch)
treed3070a6e78bea7fb1c72c2fab8be589d7ddd8e09 /builtin.c
parent1796a716eaebb12caa0cb3441a1e50a180f5f754 (diff)
fix sub (#586); add gsub/3; add transpose/0.
Signed-off-by: William Langford <wlangfor@gmail.com>
Diffstat (limited to 'builtin.c')
-rw-r--r--builtin.c31
1 files changed, 22 insertions, 9 deletions
diff --git a/builtin.c b/builtin.c
index 6f668942..7ca0f817 100644
--- a/builtin.c
+++ b/builtin.c
@@ -1051,17 +1051,19 @@ static const char* const jq_builtins[] = {
"def sub($re; s):"
" . as $in"
" | [match($re)]"
- " | .[0]"
- " | . as $r"
- // # create the \"capture\" object:
- " | reduce ( $r | .captures | .[] | select(.name != null) | { (.name) : .string } ) as $pair"
- " ({}; . + $pair)"
- " | if . == {} then $in | .[0:$r.offset]+s+.[$r.offset+$r.length:]"
- " else (. | s)"
+ " | if length == 0 then $in"
+ " else .[0]"
+ " | . as $r"
+ // # create the \"capture\" object:
+ " | reduce ( $r | .captures | .[] | select(.name != null) | { (.name) : .string } ) as $pair"
+ " ({}; . + $pair)"
+ " | if . == {} then $in | .[0:$r.offset]+s+.[$r.offset+$r.length:]"
+ " else (. | s)"
+ " end"
" end ;",
//
// repeated substitution of re (which may contain named captures)
- "def gsub($re; s):"
+ "def gsub($re; s; flags):"
// # _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
" def _stredit(edits; s):"
@@ -1076,7 +1078,8 @@ static const char* const jq_builtins[] = {
" else (if $l == 0 then \"\" else ($in | _stredit(edits[0:$l]; s)) end) + (. | s)"
" end"
" end ;"
- " [match($re;\"g\")] as $edits | _stredit($edits; s) ;",
+ " [match($re; flags + \"g\")] as $edits | _stredit($edits; s) ;",
+ "def gsub($re; s): gsub($re; s; \"\");"
//#######################################################################
// range/3, with a `by` expression argument
@@ -1096,6 +1099,16 @@ static const char* const jq_builtins[] = {
"def first: .[0];",
"def last: .[-1];",
"def nth($n): .[$n];",
+ // # transpose a possibly jagged matrix, quickly;
+ // # rows are padded with nulls so the result is always rectangular.
+ "def transpose:"
+ " if . == [] then []"
+ " else . as $in"
+ " | (map(length) | max) as $max"
+ " | length as $length"
+ " | reduce range(0; $max) as $j"
+ " ([]; . + [reduce range(0;$length) as $i ([]; . + [ $in[$i][$j] ] )] )"
+ " end;",
};
#undef LIBM_DD