feat(package): hemar: continios work

This commit is contained in:
2025-10-01 11:09:09 +00:00
parent 38bf9151eb
commit 0eb95197bc
11 changed files with 244 additions and 28 deletions

View File

@@ -3,5 +3,5 @@
self, self,
pkgs pkgs
}: { }: {
hemar = import ./hemar.nix { inherit self system pkgs; }; hemar = import ./hemar { inherit self system pkgs; };
} }

View File

@@ -1,5 +0,0 @@
{ pkgs, ... }: pkgs.mkShell {
buildInputs = (with pkgs; [
dash
]);
}

View File

@@ -0,0 +1,8 @@
{ pkgs, ... }: pkgs.mkShell {
buildInputs = (with pkgs; [
dash
(pkgs.writeShellScriptBin "letest" ''
${pkgs.dash}/bin/dash ${./test.sh} "$@"
'')
]);
}

View File

@@ -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

View File

@@ -1,17 +1,133 @@
#!/bin/dash #!/bin/dash
# 0 - text # Syntax scheme:
# 1 - deside tag type #
# 2 - interpolation # hemar
# 3 - section # elements
# 4 - include #
# 5 - compute # elements
STAGE=0 # element
STAGE_BUFFER="$(mktemp)" # element ws elements
open_tag_flag=0 #
# 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 # Type = 0..=5
# #
# Text = string # just a text body # Text = string # just a text body
@@ -44,9 +160,21 @@ open_tag_flag=0
# | Compute # | Compute
# } # }
# #
# Hemar = { # AbstarctSyntaxTree (ATS) = {
# e = [Element] # elements array # 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 # finds close pattern and store the char to the STAGE_BUFFER
find_close_pattern() { find_close_pattern() {
char="${1:?}" char="${1:?}"

0
package/hemar/log.sh Normal file
View File

View File

@@ -1,12 +1,5 @@
#!/bin/dash #!/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() { plex_set() {
local structname key val regex base esc_key regex esc temp local structname key val regex base esc_key regex esc temp
structname=$1 key=$2 val=$3 structname=$1 key=$2 val=$3

View File

@@ -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"
}

View File

@@ -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
}

View File

@@ -3,4 +3,4 @@
WORKSPACE="$(cd "$(dirname "$0")" && pwd)" WORKSPACE="$(cd "$(dirname "$0")" && pwd)"
#. "${WORKSPACE:?}/test/plex.sh" #. "${WORKSPACE:?}/test/plex.sh"
. "${WORKSPACE:?}/test/time.sh" . "${WORKSPACE:?}/test/plex/time.sh"

View File

@@ -83,7 +83,7 @@ count="$WORD_CREATE_ACCURACY"
set_word_length 8 set_word_length 8
i=0 i=0
start=$(date +%s) start=$(date +%s)
while [ "$i" -lt "$count" ]; do while [ "$i" -lt "${count:?}" ]; do
new_word >/dev/null new_word >/dev/null
i=$((i + 1)) i=$((i + 1))
done 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 2 length 8' 2 "$BENCH_ACCURACY" "$wordtime"
bench_set 'Set element with depth 3 length 8' 3 "$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 set_word_length 2
i=0 i=0
start=$(date +%s) start=$(date +%s)
while [ "$i" -lt "$count" ]; do while [ "$i" -lt "${count:?}" ]; do
new_word >/dev/null new_word >/dev/null
i=$((i + 1)) i=$((i + 1))
done done