diff options
Diffstat (limited to 'examples/scripts.noah/string.bash')
-rw-r--r-- | examples/scripts.noah/string.bash | 226 |
1 files changed, 226 insertions, 0 deletions
diff --git a/examples/scripts.noah/string.bash b/examples/scripts.noah/string.bash new file mode 100644 index 0000000..d80ebe8 --- /dev/null +++ b/examples/scripts.noah/string.bash @@ -0,0 +1,226 @@ +# string.bash --- bash emulation of string(3) library routines +# Author: Noah Friedman <friedman@prep.ai.mit.edu> +# Created: 1992-07-01 +# Last modified: 1993-09-29 +# Public domain + +# Conversion to bash v2 syntax done by Chet Ramey + +# Commentary: +# Code: + +#:docstring strcat: +# Usage: strcat s1 s2 +# +# Strcat appends the value of variable s2 to variable s1. +# +# Example: +# a="foo" +# b="bar" +# strcat a b +# echo $a +# => foobar +# +#:end docstring: + +###;;;autoload +function strcat () +{ + local s1_val s2_val + + s1_val=${!1} # indirect variable expansion + s2_val=${!2} + eval "$1"=\'"${s1_val}${s2_val}"\' +} + +#:docstring strncat: +# Usage: strncat s1 s2 $n +# +# Line strcat, but strncat appends a maximum of n characters from the value +# of variable s2. It copies fewer if the value of variabl s2 is shorter +# than n characters. Echoes result on stdout. +# +# Example: +# a=foo +# b=barbaz +# strncat a b 3 +# echo $a +# => foobar +# +#:end docstring: + +###;;;autoload +function strncat () +{ + local s1="$1" + local s2="$2" + local -i n="$3" + local s1_val s2_val + + s1_val=${!s1} # indirect variable expansion + s2_val=${!s2} + + if [ ${#s2_val} -gt ${n} ]; then + s2_val=${s2_val:0:$n} # substring extraction + fi + + eval "$s1"=\'"${s1_val}${s2_val}"\' +} + +#:docstring strcmp: +# Usage: strcmp $s1 $s2 +# +# Strcmp compares its arguments and returns an integer less than, equal to, +# or greater than zero, depending on whether string s1 is lexicographically +# less than, equal to, or greater than string s2. +#:end docstring: + +###;;;autoload +function strcmp () +{ + [ "$1" = "$2" ] && return 0 + + [ "${1}" '<' "${2}" ] > /dev/null && return -1 + + return 1 +} + +#:docstring strncmp: +# Usage: strncmp $s1 $s2 $n +# +# Like strcmp, but makes the comparison by examining a maximum of n +# characters (n less than or equal to zero yields equality). +#:end docstring: + +###;;;autoload +function strncmp () +{ + if [ -z "${3}" ] || [ "${3}" -le "0" ]; then + return 0 + fi + + if [ ${3} -ge ${#1} ] && [ ${3} -ge ${#2} ]; then + strcmp "$1" "$2" + return $? + else + s1=${1:0:$3} + s2=${2:0:$3} + strcmp $s1 $s2 + return $? + fi +} + +#:docstring strlen: +# Usage: strlen s +# +# Strlen returns the number of characters in string literal s. +#:end docstring: + +###;;;autoload +function strlen () +{ + eval echo "\${#${1}}" +} + +#:docstring strspn: +# Usage: strspn $s1 $s2 +# +# Strspn returns the length of the maximum initial segment of string s1, +# which consists entirely of characters from string s2. +#:end docstring: + +###;;;autoload +function strspn () +{ + # Unsetting IFS allows whitespace to be handled as normal chars. + local IFS= + local result="${1%%[!${2}]*}" + + echo ${#result} +} + +#:docstring strcspn: +# Usage: strcspn $s1 $s2 +# +# Strcspn returns the length of the maximum initial segment of string s1, +# which consists entirely of characters not from string s2. +#:end docstring: + +###;;;autoload +function strcspn () +{ + # Unsetting IFS allows whitspace to be handled as normal chars. + local IFS= + local result="${1%%[${2}]*}" + + echo ${#result} +} + +#:docstring strstr: +# Usage: strstr s1 s2 +# +# Strstr echoes a substring starting at the first occurrence of string s2 in +# string s1, or nothing if s2 does not occur in the string. If s2 points to +# a string of zero length, strstr echoes s1. +#:end docstring: + +###;;;autoload +function strstr () +{ + # if s2 points to a string of zero length, strstr echoes s1 + [ ${#2} -eq 0 ] && { echo "$1" ; return 0; } + + # strstr echoes nothing if s2 does not occur in s1 + case "$1" in + *$2*) ;; + *) return 1;; + esac + + # use the pattern matching code to strip off the match and everything + # following it + first=${1/$2*/} + + # then strip off the first unmatched portion of the string + echo "${1##$first}" +} + +#:docstring strtok: +# Usage: strtok s1 s2 +# +# Strtok considers the string s1 to consist of a sequence of zero or more +# text tokens separated by spans of one or more characters from the +# separator string s2. The first call (with a non-empty string s1 +# specified) echoes a string consisting of the first token on stdout. The +# function keeps track of its position in the string s1 between separate +# calls, so that subsequent calls made with the first argument an empty +# string will work through the string immediately following that token. In +# this way subsequent calls will work through the string s1 until no tokens +# remain. The separator string s2 may be different from call to call. +# When no token remains in s1, an empty value is echoed on stdout. +#:end docstring: + +###;;;autoload +function strtok () +{ + : +} + +#:docstring strtrunc: +# Usage: strtrunc $n $s1 {$s2} {$...} +# +# Used by many functions like strncmp to truncate arguments for comparison. +# Echoes the first n characters of each string s1 s2 ... on stdout. +#:end docstring: + +###;;;autoload +function strtrunc () +{ + n=$1 ; shift + for z; do + echo "${z:0:$n}" + done +} + +provide string + +# string.bash ends here |