abspaths2.awk (1998B)
1 #!/bin/awk -f 2 3 function die(msg) { 4 print msg >>"/dev/stderr" 5 exit 1 6 } 7 8 function s(re, t, str) { 9 gsub(re, t, str) 10 return str 11 } 12 13 function set_prog(i, m, name, path) { 14 if(ARGV[i] == "no_paths") { 15 no_paths = 1 16 return 17 } 18 m = match(ARGV[i], "=") 19 if(!m) { 20 die("invalid argument: #"i" '"arg"'") 21 } 22 name = substr(ARGV[i], 1, m-1) 23 path = substr(ARGV[i], m+1) 24 paths[name] = path 25 # print "paths[\""name"\"] = \""path"\"" >>"/dev/stderr" 26 } 27 28 function get(arg, m, fmt, exe, exe_path) { 29 # print "get(\""arg"\")" >>"/dev/stderr" 30 m = match(arg, ":") 31 if(!m) { 32 die("invalid token in " FILENAME ":" FNR) 33 } 34 fmt = substr(arg, 1, m-1) 35 exe = substr(arg, m+1) 36 # print "exe=\""exe"\" -> \"" paths[exe] "\" " (exe in paths) >>"/dev/stderr" 37 if(!(exe in paths)) { 38 die("program '"exe"' wasn't specified, used by " FILENAME ":" FNR) 39 } 40 exe_path = paths[exe] 41 # print "length(\"" exe_path "\") = " length(exe_path) >>"/dev/stderr" 42 if(no_paths && fmt != "shebang") { 43 exe_path = s(".*/", "", length(exe_path) ? exe_path : exe) 44 } 45 if(!length(exe_path)) { 46 die("program '"exe"' wasn't found, used by " FILENAME ":" FNR) 47 } 48 if(fmt == "shebang") { 49 return exe_path 50 } else if(fmt == "shquote") { 51 if(exe_path !~ "[^-+,_./:@0-9A-Za-z]") { 52 return exe_path 53 } 54 return "'" s("'", "'\\''", exe_path) "'" 55 } else if(fmt == "elquote") { 56 if(exe_path !~ "[^][!%&'()*+,_./:;<=>?@^|0-9A-Za-z-]") { 57 return exe_path 58 } 59 return "\"" s("\"", "\\\"", s("\\", "\\\\", exe_path)) "\"" 60 } else { 61 die("unknown format '"exe"', used by " FILENAME ":" FNR) 62 } 63 } 64 65 function parse_line(line, m, pre, tok) { 66 while(length(line)) { 67 m = match(line, /[ -~]*/) 68 if(!m) { break } 69 pre = substr(line, 1, m-1) 70 tok = substr(line, m+1, RLENGTH-2) 71 line = substr(line, m+RLENGTH) 72 printf("%s%s", pre, get(tok)) 73 } 74 print line 75 } 76 77 BEGIN { 78 for(i=2; i<ARGC; i++) { 79 set_prog(i) 80 # ARGV[i] = "" 81 } 82 ARGC = 2 83 } 84 85 { parse_line($0) } 86 87 # BEGIN { 88 # print "--- begin ---" 89 # } 90 # END { 91 # print "--- end ---" 92 # }