From fec5a7281b3824cb952aa0bb76bbbaa41eaafdf9 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Thu, 20 Nov 2014 13:11:10 -0500 Subject: Implement spec2 and file2 entirely in Make. This removes the need for memoization. --- Makefile | 47 ++++++++++++++++++----------------------------- utils/file2 | 18 ------------------ utils/spec2 | 18 ------------------ 3 files changed, 18 insertions(+), 65 deletions(-) delete mode 100755 utils/file2 delete mode 100755 utils/spec2 diff --git a/Makefile b/Makefile index 16a5605..357b35f 100644 --- a/Makefile +++ b/Makefile @@ -20,21 +20,6 @@ WGET = wget all: package -# memoization ################################################################## - -# How to use: Define 2 variables (the type you would pass to $(call): -# `_NAME_main` and `_NAME_hash`. Now, `_NAME_main` is the function getting -# memoized, and _NAME_hash is a function that hashes the function arguments -# into a string suitable for a variable name. -# -# Then, define the final function like: -# -# NAME = $(foreach func,NAME,$(memoized)) - -_main = $(_$(func)_main) -_hash = _memoized_$(_$(func)_hash) -memoized = $(if $($(_hash)),,$(eval $(_hash) := _ $(_main)))$(call rest,$($(_hash))) - # utilities #################################################################### # murl = "mangled url" @@ -42,22 +27,26 @@ memoized = $(if $($(_hash)),,$(eval $(_hash) := _ $(_main)))$(call rest,$($(_has # file = type/murl/extra # base = type/murl -_spec2_main = $(shell utils/spec2 $1 '$2') -_file2_main = $(shell utils/file2 $1 '$2') - -_spec2_hash = spec2$1_$(subst =,^3D,$(subst :,^3A,$(subst ^,^5E,$2))) -_file2_hash = file2$1_$2 - -# There's another level of indirection, because $2 is a list, and each item -# needs to be memoized separately -_spec2_memo = $(foreach func,spec2,$(memoized)) -_file2_memo = $(foreach func,file2,$(memoized)) +_url2murl = $(subst %,^25,$(subst /,^2F,$(subst :,^3A,$(subst =,^3D,$(subst ^,^5E,$1))))) +_murl2url = $(subst ^,^5E,$(subst =,^3D,$(subst :,^3A,$(subst /,^2F,$(subst %,^25,$1))))) + +_spec2type = $(word 1,$1) +_spec2url = $(word 2,$1) +_spec2extra = $(call merge,|,$(wordlist 3,$(words $1),$1)) +_spec2murl = $(call _url2murl,$(_spec2url)) +_spec2base = $(_spec2type)/$(_spec2murl) +_spec2file = $(_spec2type)/$(_spec2murl)/$(_spec2extra) +spec2 = $(foreach i,$2,$(call _spec2$1,$(subst |, ,$i))) + +_file2type = $(word 1,$1) +_file2murl = $(word 2,$1) +_file2extra = $(call merge,/,$(wordlist 3,$(words $1),$1)) +_file2url = $(call _murl2url,$(_file2murl)) +_file2base = $(_file2type)/$(_file2murl) +_file2spec = $(_file2type)|$(_file2url)|$(_file2extra) +file2 = $(foreach i,$2,$(call _file2$(1),$(subst /, ,$i))) name2 = $(call spec2,$1,$(foreach name,$2,$($(name)))) -#spec2 = $(shell utils/spec2 $1 $(foreach a,$2,'$a')) -#file2 = $(shell utils/file2 $1 $(foreach a,$2,'$a')) -spec2 = $(foreach spec,$2,$(call _spec2_memo,$1,$(spec))) -file2 = $(foreach file,$2,$(call _file2_memo,$1,$(file))) specs_for = $(strip $(foreach t,$1,$(filter $t|%,$(if $2,$2,$(specs))))) diff --git a/utils/file2 b/utils/file2 deleted file mode 100755 index 9b635b7..0000000 --- a/utils/file2 +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env bash - -want=$1; shift -for file in "$@"; do - IFS=/ read -r type murl extra <<<"$file" - - url=$murl - url=${url//^25/%} - url=${url//^2F//} - url=${url//^3A/:} - url=${url//^3D/=} - url=${url//^5E/^} - - base=$type/$murl - spec="$type|$url|$extra" - - printf '%s\n' "${!want}" -done diff --git a/utils/spec2 b/utils/spec2 deleted file mode 100755 index 4d43ba5..0000000 --- a/utils/spec2 +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env bash - -want=$1; shift -for spec in "$@"; do - IFS='|' read -r type url extra <<<"$spec" - - murl=$url - murl=${murl//^/^5E} - murl=${murl//=/^3D} - murl=${murl//:/^3A} - murl=${murl//\//^2F} - murl=${murl//%/^25} - - base=$type/$murl - file=$type/$murl/$extra - - printf '%s\n' "${!want}" -done -- cgit v1.2.2