# This a TAWK program that prints its arguments like the printf function # Convert string val to hex. Easy, cause TAWK has a built-in way to do it. function hex(val) { return 0+("0x" val) } # Convert string val to octal. function octal(val) { ret = 0; for (i = 1; length(val) >= i; i++) { ret = ret * 8 + (ord(substr(val,i,1)) - ord("0")) } return ret } BEGIN { # Check for too many arguments if (ARGC > 12) { print "printf: error: too many arguments" > stderr exit(2) } # Interpolate escape sequences in the format string. fmt = ARGV[1] # Temporarily turn \\ into an 0 char gsub(/\\\\/,"\x0",fmt) # A backslash gsub(/\\a/,"\a",fmt) # Audible alert, a "beep" gsub(/\\b/,"\b",fmt) # Back-space gsub(/\\f/,"\f",fmt) # Form-feed gsub(/\\n/,"\n",fmt) # New-line gsub(/\\r/,"\r",fmt) # Carriage Return gsub(/\\t/,"\t",fmt) # Tab gsub(/\\v/,"\v",fmt) # Vertical Tab gsub(/\\"/,"\"",fmt) # A quote character. Not really necessary. # This is a little harder. We need to turn \ddd into an octal char, # and \xdd into a hex char. start = 1; while (match(fmt,/\\[0-7]{1,3}/,start)) { substr(fmt,RSTART,RLENGTH) = sprintf("%c",octal(substr(fmt,RSTART+1,RLENGTH-1))) start = RSTART+1 } start = 1; while (match(fmt,/\\x[0-9a-fA-F]{1,2}/,start)) { substr(fmt,RSTART,RLENGTH) = sprintf("%c",hex(substr(fmt,RSTART+2,RLENGTH-2))) start = RSTART+1 } # Now turn 0 chars back into a single backslashs gsub(/\x0/,"\\",fmt) # And print it out WARNINGS = 0 # Turn off warning about too many args to printf printf fmt, ARGV[2], ARGV[3], ARGV[4], ARGV[5], ARGV[6], ARGV[7], ARGV[8], ARGV[9], ARGV[10], ARGV[11] }