lnstools

Linux namespace tools
git clone https://ccx.te2000.cz/git/lnstools
Log | Files | Refs | README

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 # }