Skip to content

Commit

Permalink
init: ported Scan_Right_{String,Unicode} primitive function
Browse files Browse the repository at this point in the history
Since there are a number of level 1 libraries using the string
function, we have to port its primitive ones into HestiaKERNEL
library. Let's do this.

This patch ports Scan_Right_{String,Unicode} primitive function
into HestiaKERNEL library into init/ directory.

Co-authored-by: Shuralyov, Jean <[email protected]>
Co-authored-by: Galyna, Cory <[email protected]>
Co-authored-by: (Holloway) Chew, Kean Ho <[email protected]>
Signed-off-by: (Holloway) Chew, Kean Ho <[email protected]>
  • Loading branch information
4 people committed Nov 12, 2024
1 parent ddb7cb4 commit 6cb88bf
Show file tree
Hide file tree
Showing 7 changed files with 411 additions and 0 deletions.
33 changes: 33 additions & 0 deletions init/services/HestiaKERNEL/String/Scan_Right_String.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Copyright 2024 (Holloway) Chew, Kean Ho <[email protected]>
#
#
# Licensed under (Holloway) Chew, Kean Ho’s Liberal License (the "License").
# You must comply with the license to use the content. Get the License at:
#
# https://doi.org/10.5281/zenodo.13770769
#
# You MUST ensure any interaction with the content STRICTLY COMPLIES with
# the permissions and limitations set forth in the license.
. "${env:LIBS_HESTIA}\HestiaKERNEL\Unicode\Scan_Right_Unicode.ps1"
. "${env:LIBS_HESTIA}\HestiaKERNEL\Unicode\To_Unicode_From_String.ps1"




function HestiaKERNEL-Scan-Right-String {
param (
[string]$___input,
[string]$___target,
[int32]$___count,
[int32]$___ignore
)


# execute
$___content = HestiaKERNEL-To-Unicode-From-String $___input
$___chars = HestiaKERNEL-To-Unicode-From-String $___target


# report status
return HestiaKERNEL-Scan-Right-Unicode $___content $___chars $___count $___ignore
}
33 changes: 33 additions & 0 deletions init/services/HestiaKERNEL/String/Scan_Right_String.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
#!/bin/sh
# Copyright 2024 (Holloway) Chew, Kean Ho <[email protected]>
#
#
# Licensed under (Holloway) Chew, Kean Ho’s Liberal License (the "License").
# You must comply with the license to use the content. Get the License at:
#
# https://doi.org/10.5281/zenodo.13770769
#
# You MUST ensure any interaction with the content STRICTLY COMPLIES with
# the permissions and limitations set forth in the license.
. "${LIBS_HESTIA}/HestiaKERNEL/Unicode/Scan_Right_Unicode.sh"
. "${LIBS_HESTIA}/HestiaKERNEL/Unicode/To_Unicode_From_String.sh"




HestiaKERNEL_Scan_Right_String() {
#___input="$1"
#___target="$2"
#___count="$3"
#___ignore="$4"


# execute
___content="$(HestiaKERNEL_To_Unicode_From_String "$1")"
___chars="$(HestiaKERNEL_To_Unicode_From_String "$2")"
printf -- "%b" "$(HestiaKERNEL_Scan_Right_Unicode "$___content" "$___chars" "$3" "$4")"


# report status
return $?
}
104 changes: 104 additions & 0 deletions init/services/HestiaKERNEL/Unicode/Scan_Right_Unicode.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
# Copyright 2024 (Holloway) Chew, Kean Ho <[email protected]>
#
#
# Licensed under (Holloway) Chew, Kean Ho’s Liberal License (the "License").
# You must comply with the license to use the content. Get the License at:
#
# https://doi.org/10.5281/zenodo.13770769
#
# You MUST ensure any interaction with the content STRICTLY COMPLIES with
# the permissions and limitations set forth in the license.
. "${env:LIBS_HESTIA}\HestiaKERNEL\Unicode\Is_Unicode.ps1"
. "${env:LIBS_HESTIA}\HestiaKERNEL\Number\Is_Number.ps1"




function HestiaKERNEL-Scan-Right-Unicode {
param (
[uint32[]]$___content_unicode,
[uint32[]]$___target_unicode,
[int32]$___count,
[int32]$___ignore
)
$___scan_index = -1


# validate input
if (
($(HestiaKERNEL-Is-Unicode $___content_unicode) -ne ${env:HestiaKERNEL_ERROR_OK}) -or
($(HestiaKERNEL-Is-Unicode $___target_unicode) -ne ${env:HestiaKERNEL_ERROR_OK})
) {
return [uint32[]]@()
}

if (
("${___count}" -eq "") -or
($___count -le 0)
) {
$___count = -1
}

if (
("${___ignore}" -eq "") -or
($___ignore -le 0)
) {
$___ignore = -1
}

if ($___target_unicode.Length -gt $___content_unicode.Length) {
return [uint32[]]@()
}


# execute
[System.Collections.Generic.List[uint32]]$___list_index = @()
$___target_length = $___target_unicode.Length - 1
$___target_index = $___target_length
for ($___index = $___content_unicode.Length - 1; $___index -ge 0; $___index--) {
# get current character
$___current = $___content_unicode[$___index]


# get target character
$___target = $___target_unicode[$___target_index]


# bail if mismatched
if ($___current -ne $___target) {
$___scan_index = -1
$___target_index = $___target_length
continue
}
$___target_index -= 1


# it's a match - set $___scan_index if available
if ($___scan_index -lt 0) {
$___scan_index = $___index
}


# reset if target is fully scanned
if ($___target_index -lt 0) {
if ($___ignore -le 0) {
$___list_index.Add($___scan_index)
if ($___count -gt 0) {
$___count -= 1
if ($___count -le 0) {
break
}
}
} else {
$___ignore -= 1
}

$___scan_index = -1
$___target_index = $___target_length
}
}


# report status
return [uint32[]]$___list_index
}
145 changes: 145 additions & 0 deletions init/services/HestiaKERNEL/Unicode/Scan_Right_Unicode.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
# Copyright 2024 (Holloway) Chew, Kean Ho <[email protected]>
#
#
# Licensed under (Holloway) Chew, Kean Ho’s Liberal License (the "License").
# You must comply with the license to use the content. Get the License at:
#
# https://doi.org/10.5281/zenodo.13770769
#
# You MUST ensure any interaction with the content STRICTLY COMPLIES with
# the permissions and limitations set forth in the license.
. "${LIBS_HESTIA}/HestiaKERNEL/Errors/Error_Codes.sh"
. "${LIBS_HESTIA}/HestiaKERNEL/Unicode/Is_Unicode.sh"
. "${LIBS_HESTIA}/HestiaKERNEL/Number/Is_Number.sh"




HestiaKERNEL_Scan_Right_Unicode() {
#___content_unicode="$1"
#___target_unicode="$2"
#___count="$3"
#___ignore="$4"
___scan_index=-1


# validate input
if [ "$(HestiaKERNEL_Is_Unicode "$1")" -ne $HestiaKERNEL_ERROR_OK ]; then
printf -- ""
return $HestiaKERNEL_ERROR_ENTITY_EMPTY
fi

if [ "$(HestiaKERNEL_Is_Unicode "$2")" -ne $HestiaKERNEL_ERROR_OK ]; then
printf -- ""
return $HestiaKERNEL_ERROR_DATA_EMPTY
fi

___count=-1
if [ "$(HestiaKERNEL_Is_Number "$3")" -eq $HestiaKERNEL_ERROR_OK ]; then
___count="$3"
fi

___ignore=-1
if [ "$(HestiaKERNEL_Is_Number "$4")" -eq $HestiaKERNEL_ERROR_OK ]; then
___ignore="$4"
fi


# execute
___list_index=""
___content_unicode="$1"
___target_unicode="$2"
___index=0
___is_scanning=0
while [ ! "$___content_unicode" = "" ]; do
# get current character
___current="${___content_unicode##*, }"
___content_unicode="${___content_unicode%"$___current"}"
if [ "${___content_unicode#"${___content_unicode%?}"}" = " " ]; then
___content_unicode="${___content_unicode%, }"
fi


# continue the count
if [ $___is_scanning -ne 0 ]; then
___index=$(($___index + 1))
continue
fi


# get target character
___target="${___target_unicode##*, }"
___target_unicode="${___target_unicode%"$___target"}"
if [ "${___target_unicode#"${___target_unicode%?}"}" = " " ]; then
___target_unicode="${___target_unicode%, }"
fi


# bail if mismatched
if [ ! "$___current" = "$___target" ]; then
___scan_index=-1
___target_unicode="$2"
___index=$(($___index + 1))
continue
fi


# it's a match - set $___scan_index if available
if [ $___scan_index -lt 0 ]; then
___scan_index=$___index
fi


# reset if target is fully scanned
if [ "$___target_unicode" = "" ]; then
if [ $___ignore -le 0 ]; then
___list_index="${___scan_index}, ${___list_index}"
if [ $___count -gt 0 ]; then
___count=$(($___count - 1))
if [ $___count -le 0 ]; then
___is_scanning=1
___index=$(($___index + 1))
continue
fi
fi
else
___ignore=$(($___ignore - 1))
fi

___scan_index=-1
___target_unicode="$2"
fi


# more characters - increase index and continue
___index=$(($___index + 1))
done


# report early if the scan is negative
if [ "$___list_index" = "" ]; then
printf -- ""
return $HestiaKERNEL_ERROR_OK
fi


# convert right-to-left index back to left-to-right index for
# programming language's consistency
___list_output=""
___list_index="${___list_index%, }"
while [ ! "$___list_index" = "" ]; do
___current="${___list_index##*, }"
___list_index="${___list_index%"$___current"}"
if [ "${___list_index#"${___list_index%?}"}" = " " ]; then
___list_index="${___list_index%, }"
fi

___current="$(($___index - $___current - 1))"
___list_output="${___list_output}${___current}\n"
done


# report status
printf -- "%b" "${___list_output%"\n"}"
return $HestiaKERNEL_ERROR_OK
}
4 changes: 4 additions & 0 deletions init/services/HestiaKERNEL/Vanilla.sh.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ echo \" <<'RUN_AS_POWERSHELL' >/dev/null # " | Out-Null
. "${env:LIBS_HESTIA}\HestiaKERNEL\String\Is_Punctuation_String.ps1"
. "${env:LIBS_HESTIA}\HestiaKERNEL\String\Is_Whitespace_String.ps1"
. "${env:LIBS_HESTIA}\HestiaKERNEL\String\Scan_Left_String.ps1"
. "${env:LIBS_HESTIA}\HestiaKERNEL\String\Scan_Right_String.ps1"
. "${env:LIBS_HESTIA}\HestiaKERNEL\String\To_Lowercase_String.ps1"
. "${env:LIBS_HESTIA}\HestiaKERNEL\String\To_String_From_Unicode.ps1"
. "${env:LIBS_HESTIA}\HestiaKERNEL\String\To_Titlecase_String.ps1"
Expand All @@ -76,6 +77,7 @@ echo \" <<'RUN_AS_POWERSHELL' >/dev/null # " | Out-Null
. "${env:LIBS_HESTIA}\HestiaKERNEL\Unicode\Is_UTF.ps1"
. "${env:LIBS_HESTIA}\HestiaKERNEL\Unicode\Is_Whitespace_Unicode.ps1"
. "${env:LIBS_HESTIA}\HestiaKERNEL\Unicode\Scan_Left_Unicode.ps1"
. "${env:LIBS_HESTIA}\HestiaKERNEL\Unicode\Scan_Right_Unicode.ps1"
. "${env:LIBS_HESTIA}\HestiaKERNEL\Unicode\To_Lowercase_Unicode.ps1"
. "${env:LIBS_HESTIA}\HestiaKERNEL\Unicode\To_Titlecase_Unicode.ps1"
. "${env:LIBS_HESTIA}\HestiaKERNEL\Unicode\To_Unicode_From_String.ps1"
Expand Down Expand Up @@ -126,6 +128,7 @@ RUN_AS_POWERSHELL
. "${LIBS_HESTIA}/HestiaKERNEL/String/Is_Punctuation_String.sh"
. "${LIBS_HESTIA}/HestiaKERNEL/String/Is_Whitespace_String.sh"
. "${LIBS_HESTIA}/HestiaKERNEL/String/Scan_Left_String.sh"
. "${LIBS_HESTIA}/HestiaKERNEL/String/Scan_Right_String.sh"
. "${LIBS_HESTIA}/HestiaKERNEL/String/To_Lowercase_String.sh"
. "${LIBS_HESTIA}/HestiaKERNEL/String/To_String_From_Unicode.sh"
. "${LIBS_HESTIA}/HestiaKERNEL/String/To_Titlecase_String.sh"
Expand All @@ -151,6 +154,7 @@ RUN_AS_POWERSHELL
. "${LIBS_HESTIA}/HestiaKERNEL/Unicode/Is_UTF.sh"
. "${LIBS_HESTIA}/HestiaKERNEL/Unicode/Is_Whitespace_Unicode.sh"
. "${LIBS_HESTIA}/HestiaKERNEL/Unicode/Scan_Left_Unicode.sh"
. "${LIBS_HESTIA}/HestiaKERNEL/Unicode/Scan_Right_Unicode.sh"
. "${LIBS_HESTIA}/HestiaKERNEL/Unicode/To_Lowercase_Unicode.sh"
. "${LIBS_HESTIA}/HestiaKERNEL/Unicode/To_Titlecase_Unicode.sh"
. "${LIBS_HESTIA}/HestiaKERNEL/Unicode/To_Unicode_From_String.sh"
Expand Down
Loading

0 comments on commit 6cb88bf

Please sign in to comment.