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