diff options
Diffstat (limited to 'eshtrans')
-rw-r--r-- | eshtrans/join.sh | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/eshtrans/join.sh b/eshtrans/join.sh new file mode 100644 index 0000000..e40bf45 --- /dev/null +++ b/eshtrans/join.sh @@ -0,0 +1,83 @@ +#buf="$(cat "${0}")" +buf="$(cat 'backend/codegen.esh')" +#buf="$(cat 'frontend/lexer.esh')" + +eval "$(printf '%s' "${buf}" | awk -v FS='' -v j=0 \ + -v squote="'" -v esc_squote="'\\\\''" ' + { + for (i = 1; i <= NF; ++i) { + sub(squote, esc_squote, $i); + printf("lbufv_%d=" squote "%s" squote "\n", + j++, $i); + }; + printf("lbufv_%d=" squote "\n" squote "\n", j++); + } + ')" + +test_printf() +{ + foo() + { + i=0 + while [ ${i} -le ${#buf} ]; do + c=$(eval "printf '%sx' \"\${lbufv_${i}}\"") + printf '%s' "${c%x}" + i=$((${i} + 1)) + done + } + out="$(foo)" +} + +test_concat() +{ + foo() + { + i=0 + s='' + while [ ${i} -le ${#buf} ]; do + c=$(eval "printf '%sx' \"\${lbufv_${i}}\"") + s="${s}${c%x}" + i=$((${i} + 1)) + done + printf '%s' "${s}" + } + out="$(foo)" +} + +test_bc() +{ + foo() + { + eval "printf '%s' \"$(printf '${lbufv_%d}' $(printf \ + 'for (i = 0; i <= %d; ++i) i\n' ${#buf} | bc))\"" + } + out="$(foo)" +} + +test_awk() +{ + foo() + { + eval "printf '%s' \"$(printf '${lbufv_%d}' $(awk \ + -v end=${#buf} \ + 'BEGIN { for (i = 0; i <= end; ++i) print(i); }'))\"" + } + out="$(foo)" +} + +if [ ${#} -eq 1 ]; then + test_${1} + if ! [ "x${buf}" = "x${out}" ]; then + printf 'Error: bad output:\n' + printf '%s' "${out}" | sed 's/^/\t/' + fi +else + i=0 + while [ ${i} -lt 3 ]; do + for f in printf concat bc awk; do + printf '%s:\n' "${f}" + time -p sh "${0}" "${f}" 2>&1 | sed 's/^/\t/' + done + i=$((${i} + 1)) + done +fi |