Imported from ../bash-2.0.tar.gz.
This commit is contained in:
226
examples/scripts.noah/string.bash
Normal file
226
examples/scripts.noah/string.bash
Normal file
@@ -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}" -o "${3}" -le "0" ]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
if [ ${3} -ge ${#1} -a ${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
|
||||
Reference in New Issue
Block a user