| #!/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 "$@" |