abspaths.awk (1481B)
1 function die(msg) { 2 print msg >>"/dev/stderr" 3 exit 1 4 } 5 6 function s(re, t, str) { 7 gsub(re, t, str) 8 return str 9 } 10 11 function get(arg, m, fmt, exe, exe_path) { 12 # print "get(\""arg"\")" >>"/dev/stderr" 13 m = match(arg, ":") 14 if(!m) { 15 die("invalid token in " FILENAME ":" FNR) 16 } 17 fmt = substr(arg, 1, m-1) 18 exe = substr(arg, m+1) 19 # k = "prog_" exe 20 # print "exe=\""exe"\" -> \""k"\" -> \"" ENVIRON[k] "\"" >>"/dev/stderr" 21 exe_path = ENVIRON["prog_" exe] 22 if(!length(exe_path)) { 23 die("program '"exe"' wan't specified, used by " FILENAME ":" FNR) 24 } 25 if(fmt == "shebang") { 26 return exe_path 27 } else if(fmt == "shquote") { 28 if(exe_path !~ "[^-+,_./:@0-9A-Za-z]") { 29 return exe_path 30 } 31 return "'" s("'", "'\\''", exe_path) "'" 32 } else if(fmt == "elquote") { 33 if(exe_path !~ "[^][!%&'()*+,_./:;<=>?@^|0-9A-Za-z-]") { 34 return exe_path 35 } 36 return "\"" s("\"", "\\\"", s("\\", "\\\\", exe_path)) "\"" 37 } else { 38 die("unknown format '"exe"', used by " FILENAME ":" FNR) 39 } 40 } 41 42 function parse_line(line, m, pre, tok) { 43 while(length(line)) { 44 m = match(line, /[ -~]*/) 45 if(!m) { break } 46 pre = substr(line, 1, m-1) 47 tok = substr(line, m+1, RLENGTH-2) 48 line = substr(line, m+RLENGTH) 49 printf("%s%s", pre, get(tok)) 50 } 51 print line 52 } 53 { parse_line($0) } 54 55 # BEGIN { 56 # for(k in ENVIRON) { 57 # printf "%s=\"%s\"\n", k, ENVIRON[k] 58 # } 59 # print "--- begin ---" 60 # } 61 # END { 62 # print "--- end ---" 63 # for(k in ENVIRON) { 64 # printf "%s=\"%s\"\n", k, ENVIRON[k] 65 # } 66 # }