summaryrefslogtreecommitdiffstats
path: root/research/research2.sh
diff options
context:
space:
mode:
Diffstat (limited to 'research/research2.sh')
-rw-r--r--research/research2.sh111
1 files changed, 111 insertions, 0 deletions
diff --git a/research/research2.sh b/research/research2.sh
new file mode 100644
index 0000000..9908495
--- /dev/null
+++ b/research/research2.sh
@@ -0,0 +1,111 @@
+#!/bin/sh
+
+################################################################################
+# shld
+################################################################################
+__last_tu=''
+
+static()
+{
+ local arg=
+ local var=
+ local val=
+ local exp=
+
+ for arg in "${@}"; do
+ case "${arg}" in
+ *=*)
+ var="${arg%%=*}"
+ val="$(printf "${arg#*=}" | \
+ sed "s|'|'\\\\''|g")"
+ ;;
+ *)
+ var="${arg}"
+ val=''
+ ;;
+ esac
+ # Sanitize variable name.
+ case "${var}" in
+ [!A-Za-z_]* | *[!0-9A-Za-z_]*)
+ printf 'Syntax error: %s %s\n' \
+ 'illegal static variable name:' \
+ "${var}" >&2
+ ;;
+ esac
+ # Set up static variable assignments to be evaluated on scope
+ # change.
+ exp="__${__tu}_static_var_vals="
+ exp="${exp}\"\${__${__tu}_static_var_vals} ${var}='${val}'\""
+ eval "${exp}"
+ # Set up list of static variables to be cleaned up on scope
+ # change.
+ exp="__${__tu}_static_vars=\"\${__${__tu}_static_vars} ${var}\""
+ eval "${exp}"
+ # Set up static variables for current scope.
+ eval "${var}='${val}'"
+ done
+
+ # Clean up static variables from previous scope.
+ if ! [ "x${__last_tu}" = 'x' ]; then
+ eval "unset \${__${__last_tu}_static_vars}"
+ fi
+ __last_tu="${__tu}"
+}
+
+__set_up_static_vars()
+{
+ local tu="${1}"
+
+ # Clean up static variables from previous scope.
+ if ! [ "x${__last_tu}" = 'x' ]; then
+ eval "unset \${__${__last_tu}_static_vars}"
+ fi
+ __last_tu="${tu}"
+
+ # Set up static variables for specified scope.
+ eval "$(eval printf '%s' "\"$(eval printf '%s' \
+ "'\${__${tu}_static_var_vals}'")\"")"
+}
+
+################################################################################
+# TU 0
+################################################################################
+__tu='tu0'
+__tu0_locals=''
+
+static static_var0='tu0 static_var0'
+
+tu0_fn0()
+{ __set_up_static_vars 'tu0'
+ echo "tu0"
+ echo "\tstatic_var0: $static_var0"
+ echo "\tstatic_var1: $static_var1"
+}
+
+################################################################################
+# TU 1
+################################################################################
+__tu='tu1'
+__tu1_locals=''
+
+static static_var0='tu1 static_var0'
+static static_var1='tu1 static_var1'
+
+tu1_fn0()
+{ __set_up_static_vars 'tu1'
+ echo "tu1"
+ echo "\tstatic_var0: $static_var0"
+ echo "\tstatic_var1: $static_var1"
+}
+
+################################################################################
+# TU 2
+################################################################################
+main()
+{
+ tu0_fn0
+ tu1_fn0
+ tu0_fn0
+}
+
+main "${@}"