#!/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 .
set -u
VERSION='0.1.0'
output='out.sh'
make_executable=true
interpreter='/bin/sh'
entry_point='main'
die()
{
local fmt="${1}"
shift 1
printf "shld: ${fmt}\n" "${@}"
exit 2
}
link()
{
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
# Read input files.
for input in "${@}"; do
if ! cat "${input}" >&3; then
die 'Cannot read file "%s"' "${input}"
fi
done
# Add call to entry point.
if ${make_executable}; then
printf '\n%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 ...] ...\n' "${0}"
}
help()
{
usage
cat < Use as the the interpreter for your program, instead of
the default of "/bin/sh"
-e Use as the function for beginning execution of your
program, instead of the default of "main"
-o