commit b1f6afc9b5dd0b00f45d4b7f42cbfd442aafcfc2
parent 97d8e58aa0b3d1c1783ce9bf33db80d7ed084cd7
Author: Jan Pobrislo <ccx@webprojekty.cz>
Date: Tue, 8 Oct 2013 22:55:30 +0200
allow interleaving of awk expressions with queries
Diffstat:
| M | bin/aat.awk | | | 51 | +++++++++++++++++++++++++++++++++++++++++++++++++-- |
1 file changed, 49 insertions(+), 2 deletions(-)
diff --git a/bin/aat.awk b/bin/aat.awk
@@ -203,9 +203,56 @@ function expand_query( expanded) {
}
return "get("expanded")"
}
+function match_dbg(type, str) {
+ if(DEBUG) printf "<%s match: \"%s\">", type, \
+ substr(str, RSTART, RLENGTH) >"/dev/stderr"
+}
function aat_process(str) {
- expand_remaining = str
- return expand_query()
+ processed = ""
+ while(str) {
+ if(match(str, /^[0-9]x?[0-9a-fA-F.]+(e[-+][0-9]+)?/)) {
+ # number literal
+ match_dbg("number", str)
+ processed = processed "("substr(str, 1, RLENGTH)")"
+ str = substr(str, RLENGTH+1)
+ } else if(match(str, /^[a-zA-Z_.<>'][a-zA-Z0-9_.<>']*/)) {
+ # a query
+ match_dbg("query", str)
+ expand_remaining=substr(str, 1, RLENGTH)
+ str = substr(str, RLENGTH+1)
+ processed = processed expand_query()
+ } else if(match(str, /^\|[a-zA-Z]/)) {
+ # filters ahead
+ match_dbg("filter", str)
+ break
+ } else if(match(str, /^"/)) {
+ # literal string
+ match_dbg("string", str)
+ match(str, /^"([^"\\]|\\[^"])*"/)
+ processed = processed substr(str, 1, RLENGTH)
+ str = substr(str, RLENGTH+1)
+ } else if(match(str, /^ /)) {
+ # spaces are passed verbatim
+ match_dbg("space", str)
+ processed = processed " "
+ str = substr(str, 2)
+ } else {
+ # anything else is passed verbatim up to space or quote
+ if(match(str, /[ "]/)) {
+ if(DEBUG) printf "<* match: \"%s\">", \
+ substr(str, 1, RSTART-1) >"/dev/stderr"
+ processed = processed substr(str, 1, RSTART-1)
+ str = substr(str, RSTART)
+ } else {
+ if(DEBUG) printf "<* non-match: \"%s\">", \
+ str >"/dev/stderr"
+ processed = processed str
+ str = ""
+ }
+ }
+ }
+ # TODO filters
+ return processed
}
{ parse_line($0) }