#!/bin/sh
usage() {
cat <<EOF
Usage: $0 <input> <output>
Generate xlat header files from <input> (a file or dir of files) and write
the generated headers to <output>.
EOF
exit 1
}
gen_header() {
local input="$1" output="$2" name="$3"
echo "generating ${output}"
(
local defs="${0%/*}/../defs.h"
local prefix
if grep -x "extern const struct xlat ${name}\\[\\];" "${defs}" > /dev/null; then
prefix=
else
prefix='static '
fi
cat <<-EOF
/* Generated by $0 from $1; do not edit. */
${prefix}const struct xlat ${name}[] = {
EOF
local unconditional= unterminated= line
while read line; do
LC_COLLATE=C
case ${line} in
'#unconditional')
unconditional=1
;;
'#unterminated')
unterminated=1
;;
[A-Z_]*) # symbolic constants
local m="${line%%|*}"
[ -n "${unconditional}" ] ||
echo "#if defined(${m}) || (defined(HAVE_DECL_${m}) && HAVE_DECL_${m})"
echo " XLAT(${line}),"
[ -n "${unconditional}" ] ||
echo "#endif"
;;
'1<<'[A-Z_]*) # symbolic constants with shift
local m="${line#1<<}"
[ -n "${unconditional}" ] ||
echo "#if defined(${m}) || (defined(HAVE_DECL_${m}) && HAVE_DECL_${m})"
echo " { ${line}, \"${m}\" },"
[ -n "${unconditional}" ] ||
echo "#endif"
;;
[0-9]*) # numeric constants
echo " XLAT(${line}),"
;;
*) # verbatim lines
echo "${line}"
;;
esac
done < "${input}"
if [ -n "${unterminated}" ]; then
echo " /* this array should remain not NULL-terminated */"
else
echo " XLAT_END"
fi
echo "};"
) >"${output}"
}
gen_make() {
local output="$1"
local name
shift
echo "generating ${output}"
(
printf "XLAT_INPUT_FILES = "
printf 'xlat/%s.in ' "$@"
echo
printf "XLAT_HEADER_FILES = "
printf 'xlat/%s.h ' "$@"
echo
for name; do
printf '$(top_srcdir)/xlat/%s.h: $(top_srcdir)/xlat/%s.in $(top_srcdir)/xlat/gen.sh\n' \
"${name}" "${name}"
echo ' $(AM_V_GEN)$(top_srcdir)/xlat/gen.sh $< $@'
done
) >"${output}"
}
gen_git() {
local output="$1"
shift
echo "generating ${output}"
(
printf '/%s\n' .gitignore Makemodule.am
printf '/%s.h\n' "$@"
) >"${output}"
}
main() {
case $# in
0) set -- "${0%/*}" "${0%/*}" ;;
2) ;;
*) usage ;;
esac
local input="$1"
local output="$2"
local name
if [ -d "${input}" ]; then
local f names=
for f in "${input}"/*.in; do
[ -f "${f}" ] || continue
name=${f##*/}
name=${name%.in}
gen_header "${f}" "${output}/${name}.h" "${name}" &
names="${names} ${name}"
done
gen_git "${output}/.gitignore" ${names}
gen_make "${output}/Makemodule.am" ${names}
wait
else
name=${input##*/}
name=${name%.in}
gen_header "${input}" "${output}" "${name}"
fi
}
main "$@"