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^0 X-Git-Url: https://git.ladys.computer/Shushe/commitdiff_plain/cd1e51dfa7c2883a9dccaee37dda45ce17223186 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. #