diff options
Diffstat (limited to 'examples/scripts.noah')
-rw-r--r-- | examples/scripts.noah/PERMISSION | 29 | ||||
-rw-r--r-- | examples/scripts.noah/README | 26 | ||||
-rw-r--r-- | examples/scripts.noah/aref.bash | 44 | ||||
-rw-r--r-- | examples/scripts.noah/bash.sub.bash | 28 | ||||
-rw-r--r-- | examples/scripts.noah/bash_version.bash | 42 | ||||
-rw-r--r-- | examples/scripts.noah/meta.bash | 37 | ||||
-rw-r--r-- | examples/scripts.noah/mktmp.bash | 66 | ||||
-rw-r--r-- | examples/scripts.noah/number.bash | 185 | ||||
-rw-r--r-- | examples/scripts.noah/prompt.bash | 40 | ||||
-rw-r--r-- | examples/scripts.noah/remap_keys.bash | 71 | ||||
-rw-r--r-- | examples/scripts.noah/require.bash | 182 | ||||
-rw-r--r-- | examples/scripts.noah/send_mail.bash | 140 | ||||
-rw-r--r-- | examples/scripts.noah/shcat.bash | 49 | ||||
-rw-r--r-- | examples/scripts.noah/source.bash | 63 | ||||
-rw-r--r-- | examples/scripts.noah/string.bash | 226 | ||||
-rw-r--r-- | examples/scripts.noah/stty.bash | 64 | ||||
-rw-r--r-- | examples/scripts.noah/y_or_n_p.bash | 78 |
17 files changed, 0 insertions, 1370 deletions
diff --git a/examples/scripts.noah/PERMISSION b/examples/scripts.noah/PERMISSION deleted file mode 100644 index f415c48..0000000 --- a/examples/scripts.noah/PERMISSION +++ /dev/null @@ -1,29 +0,0 @@ -From friedman@cli.com Thu May 25 12:19:06 1995 -Flags: 10 -Return-Path: friedman@cli.com -Received: from po.cwru.edu (root@po.CWRU.Edu [129.22.4.2]) by odin.INS.CWRU.Edu with ESMTP (8.6.10+cwru/CWRU-2.1-ins) - id MAA08685; Thu, 25 May 1995 12:19:05 -0400 (from friedman@cli.com for <chet@odin.INS.CWRU.Edu>) -Received: from cli.com (cli.com [192.31.85.1]) by po.cwru.edu with SMTP (8.6.10+cwru/CWRU-2.3) - id MAA11299; Thu, 25 May 1995 12:19:00 -0400 (from friedman@cli.com for <chet@po.cwru.edu>) -Received: from tepui.cli.com by cli.com (4.1/SMI-4.1) - id AA27213; Thu, 25 May 95 11:18:25 CDT -Received: by tepui.cli.com (4.1) id AA16031; Thu, 25 May 95 11:18:23 CDT -Message-Id: <9505251618.AA16031@tepui.cli.com> -From: friedman@gnu.ai.mit.edu (Noah Friedman) -To: chet@po.cwru.edu -Subject: Bash scripts -Reply-To: friedman@gnu.ai.mit.edu -In-Reply-To: <chet@odin.ins.cwru.edu> Thu, 25 May 1995 11:19:59 -0400 -References: <9505251519.AA06424.SM@odin.INS.CWRU.Edu> -Date: Thu, 25 May 95 11:18:21 CST - ->Hi. I snagged some of your bash functions from your home directory on ->the FSF machines (naughty, I know), and I was wondering if you'd let ->me distribute them with bash-2.0. Thanks. - -Sure. I think there's a later copy in -~ftp/friedman/shell-inits/init-4.89.tar.gz. There are also some elisp and -es frobs in that file. - -It should serve as a pretty good example of how to get carried away. :-) - diff --git a/examples/scripts.noah/README b/examples/scripts.noah/README deleted file mode 100644 index 95272d7..0000000 --- a/examples/scripts.noah/README +++ /dev/null @@ -1,26 +0,0 @@ -This collection of scripts was originally written for older versions -of bash by Noah Friedman (friedman@gnu.ai.mit.edu). The conversion -to bash v2 syntax was done by Chet Ramey. - -These scripts are as-is; there is no copyright associated with -any of them. They exist simply as examples of bash scripting. - -Here's a description of what's in this directory: - -aref.bash Pseudo-arrays and substring indexing examples. -bash.sub.bash Library functions used by require.bash. -bash_version.bash A function to slice up $BASH_VERSION. -meta.bash Enable and disable eight-bit readline input. -mktmp.bash Make a temporary file with a unique name. -number.bash A fun hack to translate numerals into English. -PERMISSION Permissions to use the scripts in this directory. -prompt.bash A way to set PS1 to some predefined strings. -README README -remap_keys.bash A front end to 'bind' to redo readline bindings. -require.bash Lisp-like require/provide library functions for bash. -send_mail.bash Replacement SMTP client written in bash. -shcat.bash Bash replacement for 'cat(1)'. -source.bash Replacement for source that uses current directory. -string.bash The string(3) functions at the shell level. -stty.bash Front-end to stty(1) that changes readline bindings too. -y_or_n_p.bash Prompt for a yes/no/quit answer. diff --git a/examples/scripts.noah/aref.bash b/examples/scripts.noah/aref.bash deleted file mode 100644 index 9b221b8..0000000 --- a/examples/scripts.noah/aref.bash +++ /dev/null @@ -1,44 +0,0 @@ -# aref.bash --- pseudo-array manipulating routines -# Author: Noah Friedman <friedman@prep.ai.mit.edu> -# Created 1992-07-01 -# Last modified: 1993-02-03 -# Public domain - -# Conversion to bash v2 syntax done by Chet Ramey - -# Commentary: -# Code: - -#:docstring aref: -# Usage: aref NAME INDEX -# -# In array NAME, access element INDEX (0-origin) -#:end docstring: - -###;;;autoload -function aref () -{ - local name="$1" - local index="$2" - - set -- ${!name} - [ $index -ge 1 ] && shift $index - echo $1 -} - -#:docstring string_aref: -# Usage: aref STRING INDEX -# -# Echo the INDEXth character in STRING (0-origin) on stdout. -#:end docstring: - -###;;;autoload -function string_aref () -{ - local stuff=${1:$2} - echo ${stuff:0:1} -} - -provide aref - -# aref.bash ends here diff --git a/examples/scripts.noah/bash.sub.bash b/examples/scripts.noah/bash.sub.bash deleted file mode 100644 index 2504459..0000000 --- a/examples/scripts.noah/bash.sub.bash +++ /dev/null @@ -1,28 +0,0 @@ -# bash.sub.bash --- stub for standalone shell scripts using bash library -# Author: Noah Friedman <friedman@prep.ai.mit.edu> -# Created: 1992-07-13 -# Last modified: 1993-09-29 -# Public domain - -#:docstring bash.sub: -# Standard subroutines for bash scripts wishing to use "require" to load -# libraries. -# -# Usage: In each directory where a bash script that uses this script -# exists, place a copy of this script. Then, at the top of such scripts, -# put the command -# -# source ${0%/*}/bash.sub || exit 1 -# -# Then you can use `require' to load packages. -# -#:end docstring: - -default_FPATH="~friedman/etc/init/bash/functions/lib" - -source "${default_FPATH}/feature" -REQUIRE_FAILURE_FATAL=t - -FPATH="${FPATH-${default_FPATH}}" - -# bash.sub.bash ends here diff --git a/examples/scripts.noah/bash_version.bash b/examples/scripts.noah/bash_version.bash deleted file mode 100644 index 4ea737b..0000000 --- a/examples/scripts.noah/bash_version.bash +++ /dev/null @@ -1,42 +0,0 @@ -# bash_version.bash --- get major and minor components of bash version number -# Author: Noah Friedman <friedman@prep.ai.mit.edu> -# Created: 1993-01-26 -# Last modified: 1993-01-26 -# Public domain - -# Converted to bash v2 syntax by Chet Ramey - -# Commentary: -# Code: - -#:docstring bash_version: -# Usage: bash_version {major|minor} -# -# Echo the major or minor number of this version of bash on stdout, or -# just echo $BASH_VERSION if no argument is given. -#:end docstring: - -###;;;autoload -function bash_version () -{ - local major minor - - case "$1" in - major) echo "${BASH_VERSION/.*/}" ;; - minor) major="${BASH_VERSION/.*/}" - minor="${BASH_VERSION#${major}.}" - echo "${minor%%.*}" ;; - patchlevel) minor="${BASH_VERSION#*.*.}" - echo "${minor%(*}" ;; - version) minor=${BASH_VERSION/#*.*./} - echo ${BASH_VERSION/%.$minor/} ;; - release) echo ${BASH_VERSION%(*} ;; - build) minor="${BASH_VERSION#*.*.*(}" - echo ${minor%)} ;; - *) echo "${BASH_VERSION}" ;; - esac -} - -provide bash_version - -# bash_version.bash ends here diff --git a/examples/scripts.noah/meta.bash b/examples/scripts.noah/meta.bash deleted file mode 100644 index 6121726..0000000 --- a/examples/scripts.noah/meta.bash +++ /dev/null @@ -1,37 +0,0 @@ -# meta.bash --- meta key frobnications -# Author: Noah Friedman <friedman@prep.ai.mit.edu> -# Created: 1992-06-28 -# Last modified: 1993-01-26 -# Public domain - -# Commentary: -# Code: - -#:docstring meta: -# Usage: meta [on|off] -# -# An argument of "on" will make bash use the 8th bit of any input from -# a terminal as a "meta" bit, i.e bash will be able to use a real meta -# key. -# -# An argument of "off" causes bash to disregard the 8th bit, which is -# assumed to be used for parity instead. -#:end docstring: - -function meta () -{ - case "$1" in - on) bind 'set input-meta On' - bind 'set output-meta on' - bind 'set convert-meta off' ;; - off) bind 'set input-meta Off' - bind 'set output-meta off' - bind 'set convert-meta on' ;; - *) echo "Usage: meta [on|off]" 1>&2 ; return 1 ;; - esac - return 0 -} - -provide meta - -# meta.bash ends here diff --git a/examples/scripts.noah/mktmp.bash b/examples/scripts.noah/mktmp.bash deleted file mode 100644 index 3ea43ad..0000000 --- a/examples/scripts.noah/mktmp.bash +++ /dev/null @@ -1,66 +0,0 @@ -# mktmp.bash -# Author: Noah Friedman <friedman@prep.ai.mit.edu> -# Created: 1993-02-03 -# Last modified: 1993-02-03 -# Public domain - -# Conversion to bash v2 syntax done by Chet Ramey - -# Commentary: -# Code: - -#:docstring mktmp: -# Usage: mktmp [template] {createp} -# -# Generate a unique filename from TEMPLATE by appending a random number to -# the end. -# -# If optional 2nd arg CREATEP is non-null, file will be created atomically -# before returning. This is to avoid the race condition that in between -# the time that the temporary name is returned and the caller uses it, -# someone else creates the file. -#:end docstring: - -###;;;autoload -function mktmp () -{ - local template="$1" - local tmpfile="${template}${RANDOM}" - local createp="$2" - local noclobber_status - - case "$-" in - *C*) noclobber_status=set;; - esac - - if [ "${createp:+set}" = "set" ]; then - # Version which creates file atomically through noclobber test. - set -o noclobber - (> "${tmpfile}") 2> /dev/null - while [ $? -ne 0 ] ; do - # Detect whether file really exists or creation lost because of - # some other permissions problem. If the latter, we don't want - # to loop forever. - if [ ! -e "${tmpfile}" ]; then - # Trying to create file again creates stderr message. - echo -n "mktmp: " 1>&2 - > "${tmpfile}" - return 1 - fi - tmpfile="${template}${RANDOM}" - (> "${tmpfile}") 2> /dev/null - done - test "${noclobber_status}" != "set" && set +o noclobber - else - # Doesn't create file, so it introduces race condition for caller. - while [ -e "${tmpfile}" ]; do - tmpfile="${template}${RANDOM}" - done - fi - - echo "${tmpfile}" -} - -provide mktmp - -# mktmp.bash ends here diff --git a/examples/scripts.noah/number.bash b/examples/scripts.noah/number.bash deleted file mode 100644 index 37b62b6..0000000 --- a/examples/scripts.noah/number.bash +++ /dev/null @@ -1,185 +0,0 @@ -# number.bash -# Author: Noah Friedman <friedman@prep.ai.mit.edu> -# Created: 1993-02-22 -# Last modified: 1993-04-01 -# Public domain - -# Conversion to bash v2 syntax done by Chet Ramey - -# Commentary: -# Code: - -#:docstring number: -# Usage: number [number] -# -# Converts decimal integers to english notation. Spaces and commas are -# optional. Numbers 67 digits and larger will overflow this script. -# -# E.g: number 99,000,000,000,000,454 -# => ninety-nine quadrillion four hundred fifty-four -# -#:end docstring: - -function number () -{ - local result - local val1 - local val2 - local val3 - local d1 - local d2 - local d3 - - case "$*" in - *[!0-9,.]* ) - echo "number: invalid character in argument." 1>&2 - return 1 - ;; - *.* ) - echo "number: fractions not supported (yet)." 1>&2 - return 1 - ;; - esac - - result='' - - eval set - "`echo ${1+\"$@\"} | sed -n -e ' - s/[, ]//g;s/^00*/0/g;s/\(.\)\(.\)\(.\)$/\"\1 \2 \3\"/; - :l - /[0-9][0-9][0-9]/{ - s/\([^\" ][^\" ]*\)\([^\" ]\)\([^\" ]\)\([^\" ]\)/\1\"\2 \3 \4\"/g; - t l - } - /^[0-9][0-9][0-9]/s/\([^\" ]\)\([^\" ]\)\([^\" ]\)/\"\1 \2 \3\"/; - /^[0-9][0-9]/s/\([^\" ]\)\([^\" ]\)/\"\1 \2\"/; - /^[0-9]/s/^\([^\" ][^\" ]*\)/\"\1\"/g;s/\"\"/\" \"/g;p;'`" - - while test $# -ne 0 ; do - eval `set - $1; - d3='' d2='' d1='' - case $# in - 1 ) d1=$1 ;; - 2 ) d2=$1 d1=$2 ;; - 3 ) d3=$1 d2=$2 d1=$3 ;; - esac - echo "d3=\"${d3}\" d2=\"${d2}\" d1=\"${d1}\""` - - val1='' val2='' val3='' - - case "${d3}" in - '1' ) val3='one' ;; - '2' ) val3='two' ;; - '3' ) val3='three' ;; - '4' ) val3='four' ;; - '5' ) val3='five' ;; - '6' ) val3='six' ;; - '7' ) val3='seven' ;; - '8' ) val3='eight' ;; - '9' ) val3='nine' ;; - esac - - case "${d2}" in - '1' ) val2='teen' ;; - '2' ) val2='twenty' ;; - '3' ) val2='thirty' ;; - '4' ) val2='forty' ;; - '5' ) val2='fifty' ;; - '6' ) val2='sixty' ;; - '7' ) val2='seventy' ;; - '8' ) val2='eighty' ;; - '9' ) val2='ninety' ;; - esac - - case "${val2}" in - 'teen') - val2='' - case "${d1}" in - '0') val1='ten' ;; - '1') val1='eleven' ;; - '2') val1='twelve' ;; - '3') val1='thirteen' ;; - '4') val1='fourteen' ;; - '5') val1='fifteen' ;; - '6') val1='sixteen' ;; - '7') val1='seventeen' ;; - '8') val1='eighteen' ;; - '9') val1='nineteen' ;; - esac - ;; - 0 ) : ;; - * ) - if test ".${val2}" != '.' && test ".${d1}" != '.0' ; then - val2="${val2}-" - fi - case "${d1}" in - '0') val2="${val2} " ;; - '1') val1='one' ;; - '2') val1='two' ;; - '3') val1='three' ;; - '4') val1='four' ;; - '5') val1='five' ;; - '6') val1='six' ;; - '7') val1='seven' ;; - '8') val1='eight' ;; - '9') val1='nine' ;; - esac - ;; - esac - - if test ".${val3}" != '.' ; then - result="${result}${val3} hundred " - fi - - if test ".${val2}" != '.' ; then - result="${result}${val2}" - fi - - if test ".${val1}" != '.' ; then - result="${result}${val1} " - fi - - if test ".${d1}${d2}${d3}" != '.000' ; then - case $# in - 0 | 1 ) ;; - 2 ) result="${result}thousand " ;; - 3 ) result="${result}million " ;; - 4 ) result="${result}billion " ;; - 5 ) result="${result}trillion " ;; - 6 ) result="${result}quadrillion " ;; - 7 ) result="${result}quintillion " ;; - 8 ) result="${result}sextillion " ;; - 9 ) result="${result}septillion " ;; - 10 ) result="${result}octillion " ;; - 11 ) result="${result}nonillion " ;; - 12 ) result="${result}decillion " ;; - 13 ) result="${result}undecillion " ;; - 14 ) result="${result}duodecillion " ;; - 15 ) result="${result}tredecillion " ;; - 16 ) result="${result}quattuordecillion " ;; - 17 ) result="${result}quindecillion " ;; - 18 ) result="${result}sexdecillion " ;; - 19 ) result="${result}septendecillion " ;; - 20 ) result="${result}octodecillion " ;; - 21 ) result="${result}novemdecillion " ;; - 22 ) result="${result}vigintillion " ;; - * ) - echo "Error: number too large (66 digits max)." 1>&2 - return 1 - ;; - esac - fi - - shift - done - - set - ${result} - case "$*" in - '') set - 'zero' ;; - esac - - echo ${1+"$@"} -} - -provide number - -# number.bash ends here diff --git a/examples/scripts.noah/prompt.bash b/examples/scripts.noah/prompt.bash deleted file mode 100644 index 3dc25a9..0000000 --- a/examples/scripts.noah/prompt.bash +++ /dev/null @@ -1,40 +0,0 @@ -# prompt.bash -# Author: Noah Friedman <friedman@prep.ai.mit.edu> -# Created: 1992-01-15 -# Public domain - -# $Id: prompt.bash,v 1.2 1994/10/18 16:34:35 friedman Exp $ - -# Commentary: -# Code: - -#:docstring prompt: -# Usage: prompt [chars] -# -# Various preformatted prompt strings selected by argument. For a -# list of available arguments and corresponding formats, do -# `type prompt'. -#:end docstring: - -###;;;autoload -function prompt () -{ - case "$1" in - d) PS1='$(dirs) \$ ' ;; - n) PS1='\$ ' ;; - hsw) PS1='\h[$SHLVL]: \w \$ ' ;; - hw) PS1='\h: \w \$ ' ;; - sh) PS1='[$SHLVL] \h\$ ' ;; - sw) PS1='[$SHLVL] \w \$ ' ;; - uh) PS1='\u@\h\$ ' ;; - uhsHw) PS1='\u@\h[$SHLVL]:\#: \w \$ ' ;; - uhsw) PS1='\u@\h[$SHLVL]: \w \$ ' ;; - uhw) PS1='\u@\h: \w \$ ' ;; - uw) PS1='(\u) \w \$ ' ;; - w) PS1='\w \$ ' ;; - esac -} - -provide prompt - -# prompt.bash ends here diff --git a/examples/scripts.noah/remap_keys.bash b/examples/scripts.noah/remap_keys.bash deleted file mode 100644 index aa7c463..0000000 --- a/examples/scripts.noah/remap_keys.bash +++ /dev/null @@ -1,71 +0,0 @@ -# remap_keybindings.bash -# Author: Noah Friedman <friedman@prep.ai.mit.edu> -# Created: 1992-01-11 -# Last modified: 1993-02-03 -# Public domain - -# Conversion to bash v2 syntax done by Chet Ramey - -# Commentary: -# Code: - -#:docstring remap_keybindings: -# Usage: remap_keybindings old_function new_function -# -# Clear all readline keybindings associated with OLD_FUNCTION (a Readline -# function) rebinding them to NEW_FUNCTION (`self-insert' by default) -# -# This requires bash version 1.10 or newer, since previous versions did not -# implement the `bind' builtin. -#:end docstring: - -###;;;autoload -function remap_keybindings () -{ - local unbind_function="$1" - local bind_function="${2:-'self-insert'}" - local bind_output - local arg - - # If they're the same thing, the work has already been done. :-) - if [ "${unbind_function}" = "${bind_function}" ]; then - return 0 - fi - - while : ; do - bind_output="$(bind -q ${unbind_function} 2> /dev/null)" - - case "${bind_output}" in - "${unbind_function} can be invoked via"* ) ;; - "" ) return 1 ;; # probably bad argument to bind - *) return 0 ;; # unbound - esac - - # Format of bind_output is like: - # 'quoted-insert can be invoked via "\C-q", "\C-v".' - # 'self-insert can be invoked via " ", "!", """, "$", "%", ...' - set -- ${bind_output} - shift 5 - - for arg in "$@" ; do - # strip off trailing `.' or `,' - arg=${arg%.}; - arg=${arg%,}; - - case ${arg} in - ..) - # bind -q didn't provide whole list of key bindings; jump - # to top loop to get more - continue 2 ; - ;; - *) - bind "${arg}: ${bind_function}" - ;; - esac - done - done -} - -provide remap_keybindings - -# remap_keybindings.bash ends here diff --git a/examples/scripts.noah/require.bash b/examples/scripts.noah/require.bash deleted file mode 100644 index f38040a..0000000 --- a/examples/scripts.noah/require.bash +++ /dev/null @@ -1,182 +0,0 @@ -# require.bash -# Author: Noah Friedman <friedman@prep.ai.mit.edu> -# Created: 1992-07-08 -# Last modified: 1993-09-29 -# Public domain - -# Commentary: - -# These functions provide an interface based on the lisp implementation for -# loading libraries when they are needed and eliminating redundant loading. -# The basic idea is that each "package" (or set of routines, even if it is -# only one function) registers itself with a symbol that marks a "feature" -# as being "provided". If later you "require" a given feature, you save -# yourself the trouble of explicitly loading it again. -# -# At the bottom of each package, put a "provide foobar", so when another -# package has a "require foobar", it gets loaded and registered as a -# "feature" that won't need to get loaded again. (See warning below for -# reasons why provide should be put at the end.) -# -# The list of provided features are kept in the `FEATURES' variable, which -# is not exported. Care should be taken not to munge this in the shell. -# The search path comes from a colon-separated `FPATH' variable. It has no -# default value and must be set by the user. -# -# Require uses `fpath_search', which works by scanning all of FPATH for a -# file named the same as the required symbol but with a `.bash' appended to -# the name. If that is found, it is loaded. If it is not, FPATH is -# searched again for a file name the same as the feature (i.e. without any -# extension). Fpath_search may be useful for doing library filename -# lookups in other functions (such as a `load' or `autoload' function). -# -# Warning: Because require ultimately uses the builtin `source' command to -# read in files, it has no way of undoing the commands contained in the -# file if there is an error or if no provide statement appeared (this -# differs from the lisp implementation of require, which normally undoes -# most of the forms that were loaded if the require fails). Therefore, to -# minize the number of problems caused by requiring a faulty package (such -# as syntax errors in the source file) it is better to put the provide at -# the end of the file, rather than at the beginning. - -# Code: - -# Exporting this variable would cause considerable lossage, since none of -# the functions are exported (or at least, they're not guaranteed to be) -export -n FEATURES - -#:docstring : -# Null function. Provided only so that one can put page breaks in source -# files without any ill effects. -#:end docstring: -# -# (\\014 == C-l) -eval "function $(echo -e \\014) () { : }" - - -#:docstring featurep: -# Usage: featurep argument -# -# Returns 0 (true) if argument is a provided feature. Returns 1 (false) -# otherwise. -#:end docstring: - -###;;;autoload -function featurep () -{ - local feature="$1" - - case " ${FEATURES} " in - *" ${feature} "* ) return 0 ;; - esac - - return 1 -} - - -#:docstring provide: -# Usage: provide symbol ... -# -# Register a list of symbols as provided features -#:end docstring: - -###;;;autoload -function provide () -{ - local feature - - for feature in "$@" ; do - if ! featurep "${feature}" ; then - FEATURES="${FEATURES} ${feature}" - fi - done - - return 0 -} - - -#:docstring require: -# Usage: require feature {file} -# -# Load FEATURE if it is not already provided. Note that require does not -# call `provide' to register features. The loaded file must do that -# itself. If the package does not explicitly do a `provide' after being -# loaded, require will complain about the feature not being provided on -# stderr. -# -# Optional argument FILE means to try to load FEATURE from FILE. If no -# file argument is given, require searches through FPATH (see fpath_search) -# for the appropriate file. -# -# If the variable REQUIRE_FAILURE_FATAL is set, require will cause the -# current shell invocation to exit, rather than merely return. This may be -# useful for a shell script that vitally depends on a package. -# -#:end docstring: - -###;;;autoload -function require () -{ - local feature="$1" - local path="$2" - local file - - if ! featurep "${feature}" ; then - file=$(fpath_search "${feature}" "${path}") && source "${file}" - - if ! featurep "${feature}" ; then - echo "require: ${feature}: feature was not provided." 1>&2 - if [ "${REQUIRE_FAILURE_FATAL+set}" = "set" ]; then - exit 1 - fi - return 1 - fi - fi - - return 0 -} - -#:docstring fpath_search: -# Usage: fpath_search filename {path ...} -# -# Search $FPATH for `filename' or, if `path' (a list) is specified, search -# those directories instead of $FPATH. First the path is searched for an -# occurrence of `filename.bash, then a second search is made for just -# `filename'. -#:end docstring: - -###;;;autoload -function fpath_search () -{ - local name="$1" - local path="$2" - local suffix=".bash" - local file - - if [ -z "${path}" ]; then path="${FPATH}"; fi - - for file in "${name}${suffix}" "${name}" ; do - set -- $(IFS=':' - set -- ${path} - for p in "$@" ; do - echo -n "${p:-.} " - done) - - while [ $# -ne 0 ]; do - test -f "${1}/${file}" && { file="${1}/${file}"; break 2 } - shift - done - done - - if [ $# -eq 0 ]; then - echo "fpath_search: ${name}: file not found in fpath" 1>&2 - return 1 - fi - - echo "${file}" - return 0 -} - -provide require - -# require.bash ends here diff --git a/examples/scripts.noah/send_mail.bash b/examples/scripts.noah/send_mail.bash deleted file mode 100644 index 24a1220..0000000 --- a/examples/scripts.noah/send_mail.bash +++ /dev/null @@ -1,140 +0,0 @@ -# send_mail.bash -# Author: Noah Friedman <friedman@prep.ai.mit.edu> -# Created: 1992-07-02 -# Public domain - -# Commentary: - -# TODO: implement Fcc headers (see emacs manual) - -# Code: - -#:docstring send_mail: -# Usage: send_mail -# -# This function serves as a simple replacement for sendmail as a client -# interface on those systems where it is not available. It does assume -# that one can talk to an SMTP mailer on port 25 either on the local host -# or on the host specified by the MAILHOST environment variable. If you -# have access to sendmail, it's better to use 'sendmail -t' instead of this -# script (which probably isn't as robust). -# -# Message is read from stdin, and headers are parsed to determine -# recipients. -#:end docstring: - -###;;;autoload -function send_mail () -{ - # Need gawk, since several extensions are taken advantage of (like - # IGNORECASE for regexps). - local awk="${GAWK_LOCATION:-gawk}" - local DefaultFrom="${USER:-${LOGNAME}}" - local From - local To - local Cc - local Bcc - local tmpfile="/tmp/send_mail$$" - - while [ -e "${tmpfile}" ]; do - tmpfile="/tmp/send_mail${RANDOM}" - done - - # Lines consisting only of dots need one more dot appended. SMTP - # servers eat one of the dots (and if only 1 dot appears, it signifies - # the end of the message). - sed '/^\.\.*/s/^\(\.\.*\)$/\1./' > "${tmpfile}" - - # Parse mail headers in message to extract recipients list. - # This doesn't affect what the user sees---it's only used to generate - # the rcpt-to lines for SMTP. - eval $(${awk} -f - "${tmpfile}" <<- '__EOF__' - # Try to extract email address from amidst random data - function parse_address (data) - { - # From: "real name" <foobar@host> - # From: "" <foobar@host> - if (match(data, /^\"[^\"]*\"[ \t]*<.*>/)) { - data_idx = match(data, /^\"[^\"]*\"[ \t]*</) - data = substr(data, RSTART + RLENGTH); - if (data_idx = match(data, ">.*")) - data = substr(data, 1, RSTART - 1); - return data - } - # From: real name <foobar@host> - if (match(data, /<.*>/)) { - data_idx = match(data, /</) - data = substr(data, RSTART + RLENGTH); - if (data_idx = match(data, ">")) - data = substr(data, 1, RSTART - 1); - return data - } - # From: foobar@host (real name) - if (match(data, /\(.*\)/)) { - data_idx = match(data, /\(/); - data = substr(data, 1, RSTART - 1); - return data - } - # (hopefully) From: foobar@host - return data - } - - BEGIN { IGNORECASE = 1; } - - # Blank line signifies end of headers, so we can stop looking. - /^$/ { exit(0) } - - /^from:|^to:|^cc:|^bcc:/ { - header_idx = match($0, /^[^:]*:/) - if (header_idx) { - # Capitalize header name - header_firstchar = toupper(substr($0, RSTART, 1)); - header_rest = tolower(substr($0, RSTART + 1, RLENGTH - 2)); - header = header_firstchar header_rest - - $0 = substr($0, RSTART + RLENGTH + 1); - addresses = "" - # parse addresses - while ($0) { - # Strip leading whitespace - if (idx = match($0, /[ \t]*/)) - $0 = substr($0, RSTART + RLENGTH); - - # Find everything up to a nonquoted comma - # FIXME: doesnt handle quoting yet - if (idx = match($0, /,/)) { - data = substr($0, 1, RSTART); - $0 = substr($0, RSTART + 1); - } else { - data = $0 - $0 = "" - } - addresses = addresses " " parse_address(data) - } - - printf("%s='%s'\n", header, addresses); - } - } - __EOF__) - - # Not sure if an address is *required* after the HELO.. every sendmail - # I tried talking to didn't seem to care. Some sendmails don't care - # if there's a HELO at all. - cat <<- __EOF__ | telnet ${MAILHOST:-localhost} 25 > /dev/null 2>&1 - HELO - mail from: ${From:-${DefaultFrom}} - $(for name in ${To} ${Cc} ${Bcc} ; do - echo "rcpt to: ${name}" - done) - data - $(cat "${tmpfile}") - . - quit - __EOF__ - - rm -f "${tmpfile}" -} - -provide send_mail - -# send_mail.bash ends here diff --git a/examples/scripts.noah/shcat.bash b/examples/scripts.noah/shcat.bash deleted file mode 100644 index 5d9e96d..0000000 --- a/examples/scripts.noah/shcat.bash +++ /dev/null @@ -1,49 +0,0 @@ -# shcat.bash -# Author: Noah Friedman <friedman@prep.ai.mit.edu> -# Created: 1992-07-17 -# Last modified: 1993-09-29 -# Public domain - -# Conversion to bash v2 syntax done by Chet Ramey - -# Commentary: -# Code: - -#:docstring shcat: -# Usage: shcat {file1} {file2} {...} -# -# Like `cat', only this is all inline bash. -#:end docstring: - -###;;;autoload -function shcat () -{ - local IFS="" - local line - local file - local exitstat=0 - - if [ $# -eq 0 ]; then - while read -r line; do - echo "${line}" - done - return 0 - else - for file in "$@" ; do - if [ -r "${file}" ]; then - while read -r line; do - echo "${line}" - done < "${file}" - else - # This will cause the error to be printed on stderr - < "${file}" - exitstat=1 - fi - done - return ${exitstat} - fi -} - -provide shcat - -# shcat.bash ends here diff --git a/examples/scripts.noah/source.bash b/examples/scripts.noah/source.bash deleted file mode 100644 index 2b36489..0000000 --- a/examples/scripts.noah/source.bash +++ /dev/null @@ -1,63 +0,0 @@ -# source.bash -# Author: Noah Friedman <friedman@prep.ai.mit.edu> -# Created: 1992-05-17 -# Last modified: 1993-09-29 -# Public domain - -# Commentary: -# Code: - -#:docstring source: -# Usage: source file ... -# -# Source forces file arguments to be considered in the current directory -# only, unless there is an absolute path starting with `/'. I think it's -# bad that the builtin "source" searches PATH, because PATH normally -# contains directories with binary files that aren't useful for bash to -# read and most people don't put "." first in their path. -# -# This "source" is capable of reading more than one file at a time. Return -# value is number of failed source attempts. -#:end docstring: - -# This function is not hygienic, but there's not much we can do about -# variable name conflicts here. - -###;;;autoload -function source () -{ - local -i _source_failure_count=0 - local _source_file - - for _source_file ; do - # Check first part of each filename. If it's not `/', `./', or - # `../' then prepend "./" to the path to force the builtin `source' - # not to go searching through PATH to find the file. - case "${_source_file}" in - /*|./*|../* ) ;; - * ) _source_file="./${_source_file}" ;; - esac - - builtin source "${_source_file}" || - _source_failure_count="_source_failure_count + 1" - - done - - return ${_source_failure_count} -} - -#:docstring .: -# See "source" -#:end docstring: - -# So that `.' will call function definition of `source' instead of builtin - -###;;;autoload -function . () -{ - source "$@" -} - -provide source - -# source.bash ends here diff --git a/examples/scripts.noah/string.bash b/examples/scripts.noah/string.bash deleted file mode 100644 index d80ebe8..0000000 --- a/examples/scripts.noah/string.bash +++ /dev/null @@ -1,226 +0,0 @@ -# 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 diff --git a/examples/scripts.noah/stty.bash b/examples/scripts.noah/stty.bash deleted file mode 100644 index 611d970..0000000 --- a/examples/scripts.noah/stty.bash +++ /dev/null @@ -1,64 +0,0 @@ -# stty.bash -# Author: Noah Friedman <friedman@prep.ai.mit.edu> -# Created: 1992-01-11 -# Last modified: 1993-09-29 -# Public domain - -# Conversion to bash v2 syntax done by Chet Ramey - -# Commentary: -# Code: - -require remap_keybindings - -#:docstring stty: -# Track changes to certain keybindings with stty, and make those changes -# reflect in bash's readline bindings as well. -# -# This requires bash version 1.10 or newer, since previous versions did not -# implement the `bind' builtin. -#:end docstring: - -###;;;autoload -function stty () -{ - local erase="backward-delete-char" - local kill="unix-line-discard" - local werase="backward-kill-word" - local lnext="quoted-insert" - local readline_function="" - local key="" - local stty_command="" - - while [ $# -gt 0 ]; do - case "$1" in - erase | kill | werase | lnext ) - key=$(echo "${2}" | cat -v | sed 's/\^/\\C-/') - readline_function=$(eval echo \$${1}) - - # Get rid of any current bindings; the whole point of this - # function is to make the distinction between readline - # bindings and particular cbreak characters transparent; old - # readline keybindings shouldn't hang around. - # could use bind -r here instead of binding to self-insert - remap_keybindings "${readline_function}" "self-insert" - - # Bind new key to appropriate readline function - bind "\"${key}\": ${readline_function}" - - stty_command="${stty_command} ${1} ${2}" - shift 2 - ;; - *) - stty_command="${stty_command} ${1}" - shift - ;; - esac - done - - command stty ${stty_command} -} - -provide stty - -# stty.bash ends here diff --git a/examples/scripts.noah/y_or_n_p.bash b/examples/scripts.noah/y_or_n_p.bash deleted file mode 100644 index 2674a29..0000000 --- a/examples/scripts.noah/y_or_n_p.bash +++ /dev/null @@ -1,78 +0,0 @@ -# y_or_n_p.bash -# Author: Noah Friedman <friedman@prep.ai.mit.edu> -# Created: 1992-06-18 -# Last modified: 1993-03-01 -# Public domain - -# Conversion to bash v2 syntax done by Chet Ramey - -# Commentary: -# Code: - -#:docstring y_or_n_p: -# Usage: y_or_n_p QUERY -# -# Print QUERY on stderr, then read stdin for a y-or-n response. Actually, -# user may type anything they like, but first character must be a `y', `n', -# `q', or `!', otherwise the question is repeated until such an answer is -# obtained. -# -# If user typed `y', y_or_n_p returns 0. -# -# If user typed `n', y_or_n_p returns 1. -# -# If user typed `!', y_or_n_p returns 2. This is an indication to the -# caller that no more queries should be made. Assume `y' for all the rest. -# -# If user typed `q', y_or_n_p returns 3. This is an indication to the -# caller that no more queries should be made. Assume `n' for all the rest. -# -#:end docstring: - -###;;;autoload -function y_or_n_p () -{ - local ans - - [ ! -t 0 ] && return 1 - - while read -p "$*" -e ans ; do - case "${ans}" in - y* | Y* ) return 0 ;; - n* | N* ) return 1 ;; - \! ) return 2 ;; - q* | Q* ) return 3 ;; - *) echo "Please answer one of \`y', \`n', \`q', or \`"\!"'" 1>&2 ;; - esac - done -} - -#:docstring yes_or_no_p: -# Usage: yes_or_no_p QUERY -# -# Like y_or_n_p, but require a full `yes', `no', `yes!', or `quit' response. -#:end docstring: - -###;;;autoload -function yes_or_no_p () -{ - local ans - - [ ! -t 0 ] && return 3 - - while read -p "$*" -e ans; do - ans="$(echo ${ans} | tr '[A-Z]' '[a-z]')" - - case "${ans}" in - yes ) return 0 ;; - no ) return 1 ;; - yes\! ) return 2 ;; - quit ) return 3 ;; - *) echo "Please answer \`yes', \`no', \`yes"\!"', or \`quit'" 1>&2 ;; - esac - done -} - -provide y_or_n_p - -# y_or_n_p.bash ends here |