From 0eb95197bcf7b47e8bf2ee756a2840b776644620 Mon Sep 17 00:00:00 2001 From: yukkop Date: Wed, 1 Oct 2025 11:09:09 +0000 Subject: [PATCH] feat(package): `hemar`: continios work --- devshell/dev/default.nix | 2 +- devshell/dev/hemar.nix | 5 - devshell/dev/hemar/default.nix | 8 + devshell/dev/hemar/test.sh | 7 + package/hemar/hemar.sh | 150 ++++++++++++++++-- package/hemar/log.sh | 0 .../{plex.sh => plex/backend/env_var.sh} | 7 - package/hemar/plex/backend/file.sh | 67 ++++++++ package/hemar/plex/plex.sh | 18 +++ package/hemar/test.sh | 2 +- package/hemar/test/plex/time.sh | 6 +- 11 files changed, 244 insertions(+), 28 deletions(-) delete mode 100644 devshell/dev/hemar.nix create mode 100644 devshell/dev/hemar/default.nix create mode 100644 devshell/dev/hemar/test.sh create mode 100644 package/hemar/log.sh rename package/hemar/{plex.sh => plex/backend/env_var.sh} (89%) create mode 100644 package/hemar/plex/backend/file.sh create mode 100644 package/hemar/plex/plex.sh diff --git a/devshell/dev/default.nix b/devshell/dev/default.nix index bd9c4ba..a40cbf4 100644 --- a/devshell/dev/default.nix +++ b/devshell/dev/default.nix @@ -3,5 +3,5 @@ self, pkgs }: { - hemar = import ./hemar.nix { inherit self system pkgs; }; + hemar = import ./hemar { inherit self system pkgs; }; } diff --git a/devshell/dev/hemar.nix b/devshell/dev/hemar.nix deleted file mode 100644 index f4075bb..0000000 --- a/devshell/dev/hemar.nix +++ /dev/null @@ -1,5 +0,0 @@ -{ pkgs, ... }: pkgs.mkShell { - buildInputs = (with pkgs; [ - dash - ]); -} diff --git a/devshell/dev/hemar/default.nix b/devshell/dev/hemar/default.nix new file mode 100644 index 0000000..916a1f4 --- /dev/null +++ b/devshell/dev/hemar/default.nix @@ -0,0 +1,8 @@ +{ pkgs, ... }: pkgs.mkShell { + buildInputs = (with pkgs; [ + dash + (pkgs.writeShellScriptBin "letest" '' + ${pkgs.dash}/bin/dash ${./test.sh} "$@" + '') + ]); +} diff --git a/devshell/dev/hemar/test.sh b/devshell/dev/hemar/test.sh new file mode 100644 index 0000000..0a6764c --- /dev/null +++ b/devshell/dev/hemar/test.sh @@ -0,0 +1,7 @@ +#!/bin/dash + +ROOT_DIR="$(git rev-parse --show-toplevel 2>/dev/null || pwd)" + +if [ "${1:?}" = 'test' ]; then + dash "${ROOT_DIR}/package/hemar/test.sh" +fi diff --git a/package/hemar/hemar.sh b/package/hemar/hemar.sh index 1d5b827..f391098 100644 --- a/package/hemar/hemar.sh +++ b/package/hemar/hemar.sh @@ -1,17 +1,133 @@ #!/bin/dash -# 0 - text -# 1 - deside tag type -# 2 - interpolation -# 3 - section -# 4 - include -# 5 - compute -STAGE=0 -STAGE_BUFFER="$(mktemp)" -open_tag_flag=0 +# Syntax scheme: +# +# hemar +# elements +# +# elements +# element +# element ws elements +# +# element +# tag +# text +# +# text +# text-item +# text-item text +# +# text-item +# '0020' . '10FFFF' - '{' +# nopatern +# +# tag +# '{[' ws path ws ']}' +# '{[' ws loop-statement ws ']}' +# '{[' ws include-header ws ']}' +# '{[' ws "end" ws ']}' +# '{[' ws function ws ']}' +# +# # loop tag +# loop-statemant +# "for" string "in" path +# +# # include tag +# include-header +# "include" path +# +# # fucntion tag +# function +# "compute" language function-body +# "compute" - function-body +# +# language +# "dash" +# "plpgsql" +# +# function-body +# "" +# '0020' . '10FFFF', function-body +# +# function-character +# '0020' . '10FFFF' - ']' +# ncpatern +# +# # path +# path +# "." +# segmented-path +# +# segmented-path +# segment +# segment "." segmented-path +# +# segment +# string +# index +# +# index +# '\' digit +# '\' onenine digits +# '\' '-' digit +# '\' '-' onenine digits +# +# # types +# string +# character +# character string +# +# character +# '0020' . '10FFFF' - '"' - '\' - '.' - ']' +# '\' escape +# ncpatern +# +# escape +# '.' +# ']}' +# '"' +# '\' +# '/' +# 'b' +# 'f' +# 'n' +# 'r' +# 't' +# 'u' hex hex hex hex +# +# hex +# digit +# 'A' . 'F' +# 'a' . 'f' +# +# digits +# digit +# digit digits +# +# digit +# '0' +# onenine +# +# onenine +# '1' . '9' +# +# # paterns +# ws +# "" +# '0020' ws +# '000A' ws +# '000D' ws +# '0009' ws +# +# nopatern +# '{' '0020' . '10FFFF' - '[' +# +# ncpatern +# ']' '0020' . '10FFFF' - '}' -# data structure :) +# AST Plex: +# # Type = 0..=5 # # Text = string # just a text body @@ -44,9 +160,21 @@ open_tag_flag=0 # | Compute # } # -# Hemar = { +# AbstarctSyntaxTree (ATS) = { # e = [Element] # elements array #} +AST='' + +# 0 - text +# 1 - deside tag type +# 2 - interpolation +# 3 - section +# 4 - include +# 5 - compute +STAGE=0 +STAGE_BUFFER="$(mktemp)" +open_tag_flag=0 + # finds close pattern and store the char to the STAGE_BUFFER find_close_pattern() { char="${1:?}" diff --git a/package/hemar/log.sh b/package/hemar/log.sh new file mode 100644 index 0000000..e69de29 diff --git a/package/hemar/plex.sh b/package/hemar/plex/backend/env_var.sh similarity index 89% rename from package/hemar/plex.sh rename to package/hemar/plex/backend/env_var.sh index 0ec3b74..118609b 100644 --- a/package/hemar/plex.sh +++ b/package/hemar/plex/backend/env_var.sh @@ -1,12 +1,5 @@ #!/bin/dash -#data_size="$(eval printf '%s' "\$$structname" | wc -c)" -#if [ "$data_size" -ge "$(getconf ARG_MAX)" ]; then -# # TODO: handle large text -# echo "Data too large for an environment variable" -# exit 1 -#fi - plex_set() { local structname key val regex base esc_key regex esc temp structname=$1 key=$2 val=$3 diff --git a/package/hemar/plex/backend/file.sh b/package/hemar/plex/backend/file.sh new file mode 100644 index 0000000..7912e15 --- /dev/null +++ b/package/hemar/plex/backend/file.sh @@ -0,0 +1,67 @@ +#!/bin/dash + +PLEX_TEMP="$(mktemp -d)" + +plex_set() { + local plexfile key val regex base esc_key esc + plexfile="${PLEX_TEMP:?}${1:?}" key="${2:?}" val="${3:?}" + + # construct regex for ancestors + regex="^$key=" + + base=$key + while expr "$base" : '.*\.' >/dev/null; do + base=$(printf '%s\n' "$base" | sed 's/\.[^.]*$//') + esc=$(printf '%s\n' "$base" | sed 's/\./\\./g') + regex="$regex|^$esc=" + done + + # add descendants + esc_key="$(printf '%s\n' "$key" | sed 's/\./\\./g')" + regex="$regex|^${esc_key}\." + + # remove old + grep -v -E "$regex" "$plexfile" > "$plexfile.tmp" && mv "$plexfile.tmp" "$plexfile" + + # add new + printf '%s=%s\n' "$key" "$val" >> "$plexfile" +} + +plex_child() { + local plexfile key + plexfile="${PLEX_TEMP:?}${1:?}" key="${2:?}" + + grep "^$key\." "" | sed "s|^$key\.||" +} + +plex_val() { + local plexfile key + plexfile="${PLEX_TEMP:?}${1:?}" key="${2:?}" + grep "^$key=" | cut -d= -f2- "$plexfile" +} + +plex_fetch() { + local plexfile key temp + plexfile="${PLEX_TEMP:?}${1:?}" key="${2:?}" + + if temp="$(grep "^$key=" | cut -d= -f2- "$plexfile")"; then + printf '%s' "$temp" + else + grep "^$key\." "" | sed "s|^$key\.||" + fi +} + +plex_push() { + local plex prefix val max idx newidx kv + plex="${1:?}" prefix="${2:?}" val="${3:?}" + + # find max index + max=0 + for kv in $(plex_fetch "$plex" "$prefix"); do + idx=${kv%%=*} + [ "$idx" -gt "$max" ] 2>/dev/null && max=$idx + done + + newidx=$((max + 1)) + plex_set "$plex" "$prefix.$newidx" "$val" +} diff --git a/package/hemar/plex/plex.sh b/package/hemar/plex/plex.sh new file mode 100644 index 0000000..e0c05e1 --- /dev/null +++ b/package/hemar/plex/plex.sh @@ -0,0 +1,18 @@ +#!/bin/dash + +init_plex() { + local backend + backend=${1:?} + + case "$backend" in + env) + . ${WORKSPACE}/plex/backend/env_var.sh + ;; + file) + . ${WORKSPACE}/plex/backend/file.sh + ;; + *) + exit 1 + ;; + esac +} diff --git a/package/hemar/test.sh b/package/hemar/test.sh index de5a587..1a69c20 100644 --- a/package/hemar/test.sh +++ b/package/hemar/test.sh @@ -3,4 +3,4 @@ WORKSPACE="$(cd "$(dirname "$0")" && pwd)" #. "${WORKSPACE:?}/test/plex.sh" -. "${WORKSPACE:?}/test/time.sh" +. "${WORKSPACE:?}/test/plex/time.sh" diff --git a/package/hemar/test/plex/time.sh b/package/hemar/test/plex/time.sh index a9383ff..0bf6858 100644 --- a/package/hemar/test/plex/time.sh +++ b/package/hemar/test/plex/time.sh @@ -83,7 +83,7 @@ count="$WORD_CREATE_ACCURACY" set_word_length 8 i=0 start=$(date +%s) -while [ "$i" -lt "$count" ]; do +while [ "$i" -lt "${count:?}" ]; do new_word >/dev/null i=$((i + 1)) done @@ -94,11 +94,11 @@ bench_set 'Set element with depth 1 length 8' 1 "$BENCH_ACCURACY" "$wordtime" bench_set 'Set element with depth 2 length 8' 2 "$BENCH_ACCURACY" "$wordtime" bench_set 'Set element with depth 3 length 8' 3 "$BENCH_ACCURACY" "$wordtime" -count="$W" +count="$WORD_CREATE_ACCURACY" set_word_length 2 i=0 start=$(date +%s) -while [ "$i" -lt "$count" ]; do +while [ "$i" -lt "${count:?}" ]; do new_word >/dev/null i=$((i + 1)) done