#!/bin/awk -f #!/opt/busybox/awk -f function sh_escape(arg){ return "'" gensub(/'/, "'\"'\"'", "g", arg) "'"; } function argsplit(line, args, LOCAL, c, n, ctx) { ctx="space"; n=0; while ( length(line) > 0 ) { c = substr(line, 1, 1); line = substr(line, 2); if (ctx == "space" ) if (c ~ /[ \t]/) ctx = "space"; else if (c ~ /\\/) { n++; ctx = "escbare"; } else if (c ~ /"/) { n++; ctx = "dquot"; } else if (c ~ /'/) { n++; ctx = "squot"; } else { n++; args[n] = c; ctx = "bare"; } else if (ctx == "bare") if (c ~ /[ \t]/) ctx = "space"; else if (c ~ /\\/) ctx = "escbare"; else if (c ~ /"/) ctx = "dquot"; else if (c ~ /'/) ctx = "squot"; else args[n] = args[n] c; else if (ctx == "dquot") if (c ~ /"/) ctx = "bare"; else if (c ~ /\\/) ctx = "escdquot"; else args[n] = args[n] c; else if (ctx == "squot") if (c ~ /'/) ctx = "bare"; else args[n] = args[n] c; else if (ctx == "escbare") { args[n] = args[n] c; ctx = "bare"; } else if (ctx == "escdquot") { args[n] = args[n] c; ctx = "dquot"; } } } function macro(call, LOCAL, line, args) { argsplit(call, args); call=""; for (n = 1; n in args; n++) call = call sh_escape(args[n]) " "; if (args[1] in MACROS) { oldRS=RS; oldORS=ORS; RS=""; ORS=""; line=""; "printf '%s' " sh_escape(file) " | " sh_escape(ENVIRON["MD_MACROS"]) "/" call | getline line; RS=oldRS; ORS=oldORS; return line; } else { return HTML("<<" call ">>"); } } BEGIN { if (ENVIRON["MD_MACROS"]) { AllowMacros = "true"; "cd " sh_escape(ENVIRON["MD_MACROS"]) "; printf '%s/' *" |getline macro_list; split(macro_list, MACROS, "/"); for (n in MACROS) { MACROS[MACROS[n]] = ""; delete MACROS[n]; } delete MACROS[""]; } }