4 # Copyright 2022 Paul Hänsch
6 # Permission to use, copy, modify, and/or distribute this software for any
7 # purpose with or without fee is hereby granted, provided that the above
8 # copyright notice and this permission notice appear in all copies.
10 # THE SOFTWARE IS PROVIDED “AS IS” AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
13 # SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
16 # IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 function sh_escape(arg){
19 return "'" gensub(/'/, "'\"'\"'", "g", arg) "'";
22 function argsplit(line, args, LOCAL, c, n, ctx) {
25 while ( length(line) > 0 ) {
26 c = substr(line, 1, 1);
27 line = substr(line, 2);
29 if (c ~ /[ \t]/) ctx = "space";
30 else if (c ~ /\\/) { n++; ctx = "escbare"; }
31 else if (c ~ /"/) { n++; ctx = "dquot"; }
32 else if (c ~ /'/) { n++; ctx = "squot"; }
33 else { n++; args[n] = c; ctx = "bare"; }
34 else if (ctx == "bare")
35 if (c ~ /[ \t]/) ctx = "space";
36 else if (c ~ /\\/) ctx = "escbare";
37 else if (c ~ /"/) ctx = "dquot";
38 else if (c ~ /'/) ctx = "squot";
39 else args[n] = args[n] c;
40 else if (ctx == "dquot")
41 if (c ~ /"/) ctx = "bare";
42 else if (c ~ /\\/) ctx = "escdquot";
43 else args[n] = args[n] c;
44 else if (ctx == "squot")
45 if (c ~ /'/) ctx = "bare";
46 else args[n] = args[n] c;
47 else if (ctx == "escbare") {
51 else if (ctx == "escdquot") {
58 function macro(call, LOCAL, line, args) {
62 for (n = 1; n in args; n++) call = call sh_escape(args[n]) " ";
64 if (args[1] in MACROS) {
66 RS=""; ORS=""; line="";
67 "printf '%s' " sh_escape(file) " | " sh_escape(ENVIRON["MD_MACROS"]) "/" call | getline line;
71 return HTML("<<" call ">>");
76 if (ENVIRON["MD_MACROS"]) {
78 "cd " sh_escape(ENVIRON["MD_MACROS"]) "; printf '%s/' *" |getline macro_list;
79 split(macro_list, MACROS, "/");
80 for (n in MACROS) { MACROS[MACROS[n]] = ""; delete MACROS[n]; }