# Default callbacks.
# Mawk must always define all callbacks.
# Gawk and busybox awk must define callbacks when STREAM=1 only.
# More info in FAQ.md#5.
# cb_parse_array_empty - parse an empty JSON array.
# Called in JSON.awk's main loop when STREAM=0 only.
# This example returns the standard representation of an empty array.
function cb_parse_array_empty(jpath) {
# print "parse_array_empty("jpath")" >"/dev/stderr"
return "[]"
}
# cb_parse_object_empty - parse an empty JSON object.
# Called in JSON.awk's main loop when STREAM=0 only.
# This example returns the standard representation of an empty object.
function cb_parse_object_empty(jpath) {
# print "parse_object_empty("jpath")" >"/dev/stderr"
return "{}"
}
# cb_parse_array_enter - begin parsing an array.
# Called in JSON.awk's main loop when STREAM=0 only.
# Use this function to initialize or output other values involved in
# processing each new JSON array.
function cb_parse_array_enter(jpath) {
# print "cb_parse_array_enter("jpath") token("TOKEN")" >"/dev/stderr"
if ("" != jpath)
;
}
# cb_parse_array_exit - end parsing an array.
# Called in JSON.awk's main loop when STREAM=0 only.
# If status == 0 then global CB_VALUE holds the JSON text of the parsed array.
function cb_parse_array_exit(jpath, status) {
# print "cb_parse_array_exit("jpath") status("status") token("TOKEN") value("CB_VALUE")" >"/dev/stderr"
}
# cb_parse_object_enter - begin parsing an object.
# Called in JSON.awk's main loop when STREAM=0 only.
# Use this function to initialize or output other values involved in
# processing each new JSON object.
function cb_parse_object_enter(jpath) {
# print "cb_parse_object_enter("jpath") token("TOKEN")" >"/dev/stderr"
if ("" != jpath)
;
}
# cb_parse_object_exit - end parsing an object.
# Called in JSON.awk's main loop when STREAM=0 only.
# If status == 0 then global CB_VALUE holds the JSON text of the parsed object.
function cb_parse_object_exit(jpath, status) {
# print "cb_parse_object_exit("jpath") status("status") token("TOKEN") value("CB_VALUE")" >"/dev/stderr"
}
# cb_append_jpath_component - format jpath components
# Called in JSON.awk's main loop when STREAM=0 only.
# This example formats jpaths exactly as JSON.awk does when STREAM=1.
function cb_append_jpath_component (jpath, component) {
# print "cb_append_jpath_component("jpath") ("jpath") component("component")" >"/dev/stderr"
return (jpath != "" ? jpath "," : "") component
}
# cb_append_jpath_value - format a jpath / value pair
# Called in JSON.awk's main loop when STREAM=0 only.
# This example formats the jpath / value pair exactly as JSON.awk does when
# STREAM=1.
function cb_append_jpath_value (jpath, value, x) {
if(match(jpath, /,"window"$/)) {
if(value != "null") {
i3_win[value] = substr(jpath, 0, RSTART-1)
#printf("i3_win['%s']='%s'\n", value, substr(jpath, RSTART-1))
}
} else if(match(jpath, /,"window_properties","[^"]*"$/)) {
x = substr(jpath, 0, RSTART-1)
match(jpath, /"[^"]*"$/)
#printf("i3_prop['%s','%s']='%s'\n", x, substr(jpath, RSTART+1, RLENGTH-2), value)
i3_prop[x, substr(jpath, RSTART+1, RLENGTH-2)] = value
}
# print "cb_append_jpath_value("jpath") ("jpath") value("value")" >"/dev/stderr"
return sprintf("[%s]\t%s", jpath, value)
}
function tabprint(s) {
gsub("[\r\n\t]", "_", s)
printf("\t%s", s)
}
END {
for(wid in i3_win) {
printf("0x%x", wid)
tabprint(i3_prop[i3_win[wid], "machine"])
tabprint(i3_prop[i3_win[wid], "class"])
tabprint(i3_prop[i3_win[wid], "instance"])
tabprint(i3_prop[i3_win[wid], "title"])
printf("\n")
}
}
# cb_jpaths - process cb_append_jpath_value outputs
# Called in JSON.awk's main loop when STREAM=0 only.
# This example illustrates printing jpaths to stdout as JSON.awk does when STREAM=1.
# See also cb_parse_array_enter and cb_parse_object_enter.
function cb_jpaths (ary, size, i) {
return
# When BRIEF mode is off by default JSON.awk prints the whole input JSON
# text as the last output line. This code block shows how to avoid that.
if (0 == BRIEF) {
# Don't print the last line, which contains the whole input,
# unless it's a simple value or an empty array/object.
if (match(ary[size], /\t[[{][[:space:]]*[^]}]/)) {
if (index(ary[size], "\t") == RSTART) {
size -= 1
}
}
}
# Print ary - array of size jpaths and their values.
for(i=1; i <= size; i++) {
print ary[i]
}
}
# cb_fails - process all error messages at once after parsing
# has completed. Called in JSON.awk's END action when STREAM=0 only.
# This example illustrates printing parsing errors to stdout,
function cb_fails (ary, size, k) {
# Print ary - associative array of parsing failures.
# ary's keys are the size input file names that JSON.awk read.
for(k in ary) {
print "cb_fails: invalid input file:", k
print FAILS[k]
}
}
# cb_fail1 - process a single parse error as soon as it is
# encountered. Called in JSON.awk's main loop when STREAM=0 only.
# Return non-zero to let JSON.awk also print the message to stderr.
# This example illustrates printing the error message to stdout only.
function cb_fail1 (message) {
print "cb_fail1: invalid input file:", FILENAME
print message
}