From: Lady Date: Sat, 3 Feb 2024 23:25:56 +0000 (-0500) Subject: Just manually parse hexadecimal in Awk X-Git-Tag: 0.5.2 X-Git-Url: https://git.ladys.computer/Shushe/commitdiff_plain/1b5b8657a480df45761bb47b2a6e8336d6504c9b?hp=eb3b42b3ee2ac34f01624d360b2ae3195151cfd4 Just manually parse hexadecimal in Awk The biggest performance bottleneck in this code was the fact that, for compatibility reasons, Awk was piping hexadecimal numbers to the shell in order to parse them. (Macintosh Awk can parse hexadecimal numbers in `printf`, but G·N·U Awk cannot.) Because the hexadecimal number is known to be two digits, it’s easy to just parse it in Awk directly, avoiding the shell pipe and considerably speeding up the program. --- diff --git a/GNUmakefile b/GNUmakefile index d0989c1..8306fc1 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -216,7 +216,7 @@ override silent := $(if $(VERBOSE),,@) override sedesc = $(subst /,[/],$(subst $$,\$$,$(subst *,\*,$(subst .,\.,$(subst [,\[,$(subst ^,\^,$(subst \,\\,$1))))))) # The command to use for percent‐decoding. -override perdeccmd := $(SED) 's/|/%7C/g;s/[\]/%5C/g;s/%[0-9A-Fa-f]\{2\}/|&|/g' | $(TR) '|' '\n' | $(SED) '/^%[0-9A-Fa-f]\{2\}$$/!s/%/|%25|/' | $(TR) '|' '\n' | $(AWK) '$$0!~/%/{printf "%s",$$0}/%/{sub("%","0x");cmd="$(XARGS) $(PRINTF) \"%04o\"";printf "%s","\\";printf "%s",$$0|cmd;close(cmd)}' | $(XARGS) -0 $(PRINTF) '%b' +override perdeccmd := $(SED) 's/|/%7C/g;s/[\]/%5C/g;s/%[0-9A-Fa-f]\{2\}/|&|/g' | $(TR) '|' '\n' | $(SED) '/^%[0-9A-Fa-f]\{2\}$$/!s/%/|%25|/' | $(TR) '|' '\n' | $(AWK) '$$0!~/%/{printf "%s",$$0}/%/{d="0123456789ABCDEF";v=substr(toupper($$0),2,2);printf "\\%04o",(index(d,substr(v,1,1))-1)*16+index(d,substr(v,2,1))-1}' | $(XARGS) -0 $(PRINTF) '%b' # (callable) Percent‐decode the given strings. #