diff options
-rwxr-xr-x | tools/shld.sh | 166 | ||||
-rwxr-xr-x | tools/shpp.sh | 173 |
2 files changed, 0 insertions, 339 deletions
diff --git a/tools/shld.sh b/tools/shld.sh deleted file mode 100755 index 41751d3..0000000 --- a/tools/shld.sh +++ /dev/null @@ -1,166 +0,0 @@ -#!/bin/sh -# -# Shell command language linker -# -# Copyright (C) 2015 Patrick "P. J." McDermott -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. - -set -u - -VERSION='0.2.0' - -die() -{ - local fmt="${1}" - shift 1 - - printf "shld: ${fmt}\n" "${@}" >&2 - exit 2 -} - -link() -{ - local make_executable="${1}" - local interpreter="${2}" - local entry_point="${3}" - local output="${4}" - shift 4 - local input= - - # Open output file. - if ! exec 3>"${output}~"; then - die 'Cannot open file "%s"' "${output}~" - fi - - # Write magic number and interpreter path. - if ${make_executable}; then - printf '#!%s\n' "${interpreter}" >&3 - fi - - # Write __init() function. - cat >&3 <<-'EOF' - __init_funcs='' - __init() - { - __init_funcs="${__init_funcs} ${1}" - } - EOF - - # Read input files. - for input in "${@}"; do - if ! cat "${input}" >&3; then - die 'Cannot read file "%s"' "${input}" - fi - done - - # Add call to init functions. - cat >&3 <<-'EOF' - for __func in ${__init_funcs}; do - ${__func} - done - EOF - - # Add call to entry point. - if ${make_executable}; then - printf '%s "${@}"\n' "${entry_point}" >&3 - fi - - # Close output file, make it executable, and set its name. - exec 3>&- - if ${make_executable}; then - if ! chmod a+x "${output}~"; then - die 'Cannot set mode of file "%s"' "${output}~" - fi - fi - if ! mv "${output}~" "${output}"; then - die 'Cannot rename file to "%s"' "${output}" - fi -} - -usage() -{ - printf 'Usage: %s [option ...] <file>...\n' "${0}" -} - -help() -{ - usage - cat <<EOF -Options: - -h Display this information - -V Display linker version information - -I <interp> Make an executable and use <interp> as the interpreter for your - program, instead of the default of "/bin/sh" - -e <entry> Make an executable and use <entry> as the function for beginning - execution of your program, instead of the default of "main" - -o <output> Use <output> as the name of the program produced by shld, instead - of the default of "out.sh" -EOF -} - -version() -{ - cat <<EOF -shld ${VERSION} -Copyright (C) 2015 Patrick "P. J." McDermott -License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>. -This is free software: you are free to change and redistribute it. -There is NO WARRANTY, to the extent permitted by law. -EOF -} - -main() -{ - local opt= - local make_executable=false - local interpreter='/bin/sh' - local entry_point='main' - local output='out.sh' - - while getopts 'hVI:e:o:' opt; do - case "${opt}" in - 'h') - help - exit - ;; - 'V') - version - exit - ;; - 'I') - interpreter="${OPTARG}" - make_executable=true - ;; - 'e') - entry_point="${OPTARG}" - make_executable=true - ;; - 'o') - output="${OPTARG}" - ;; - esac - done - shift $(($OPTIND - 1)) - - if [ ${#} -lt 1 ]; then - usage >&2 - exit 1 - fi - - link "${make_executable}" "${interpreter}" "${entry_point}" \ - "${output}" "${@}" -} - -main "${@}" diff --git a/tools/shpp.sh b/tools/shpp.sh deleted file mode 100755 index fc23a52..0000000 --- a/tools/shpp.sh +++ /dev/null @@ -1,173 +0,0 @@ -#!/bin/sh -# -# Shell command language preprocessor -# -# Copyright (C) 2015 Patrick "P. J." McDermott -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. - -set -u - -VERSION='0.1.0' -FS="$(printf '\034')" - -die() -{ - local fmt="${1}" - shift 1 - - printf "shpp: ${fmt}\n" "${@}" >&2 - exit 2 -} - -error() -{ - local fmt="${1}" - shift 1 - - printf "shpp: ${fmt}\n" "${@}" >&2 -} - -preprocess() -{ - local vars="${1}" - local input="${2}" - local output="${3}" - local def= - local var= - local val= - - # Open output file. - if [ "x${output}" = 'x-' ]; then - if ! exec 3>&1; then - die 'Cannot duplicate output file descriptor' - fi - else - if ! exec 3>"${outfile}~"; then - die 'Cannot open file "%s"' "${output}~" - fi - fi - - IFS="${FS}" - for def in ${vars}; do - case "${def}" in - *=*) - var="${def%%=*}" - val="${def#*=}" - ;; - *) - var="${def%%=*}" - val='true' - ;; - esac - case "${var}" in - *[!A-Za-z0-9_]*) - error 'Invalid variable name "%s"' "${var}" - continue - ;; - [0-9]*) - error 'Invalid variable name "%s"' "${var}" - continue - ;; - esac - printf "%s='" "${var}" >&3 - printf '%s' "${val}" | sed "s/'/'\\\\''/g" >&3 - printf "'\n" >&3 - done - unset IFS - - # Read input file. - if ! cat "${input}" >&3; then - die 'Cannot read file "%s"' "${input}" - fi - - # Close output file, make it executable, and set its name. - if ! [ "x${output}" = 'x-' ]; then - exec 3>&- - if ! mv "${output}~" "${output}"; then - die 'Cannot rename file to "%s"' "${output}" - fi - fi -} - -usage() -{ - printf 'Usage: %s [option ...] <infile> [<outfile>]\n' "${0}" -} - -help() -{ - usage - cat <<EOF -Options: - -h Display this information - -V Display preprocessor version information - -D <var>[=<val>] Predefine <var> as a variable with value <val> (default - "true") -EOF -} - -version() -{ - cat <<EOF -shpp ${VERSION} -Copyright (C) 2015 Patrick "P. J." McDermott -License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>. -This is free software: you are free to change and redistribute it. -There is NO WARRANTY, to the extent permitted by law. -EOF -} - -main() -{ - local opt= - local vars= - local infile= - local outfile= - - while getopts 'hVD:' opt; do - case "${opt}" in - 'h') - help - exit - ;; - 'V') - version - exit - ;; - 'D') - vars="${vars}${OPTARG}${FS}" - ;; - esac - done - shift $(($OPTIND - 1)) - - case ${#} in - 1) - infile="${1}" - outfile='-' - ;; - 2) - infile="${1}" - outfile="${2}" - ;; - *) - usage >&2 - exit 1 - esac - - preprocess "${vars}" "${infile}" "${outfile}" -} - -main "${@}" |