#!/bin/bash APP_SVNID='$HeadURL$ $LastChangedRevision$' . $(ade-config ade_share_prefix)/include/ade.sh || { echo "${0##*/}: INTERNAL ERROR: failed to load ade.sh" >&2; exit 3; } ADEASS_DEFINED_ERRORS=( "KEY=ADEASS_ERR_MISC; FMT=\"%s\"" ) adeass() { #local OPTVAL LISTPATHS RC TEMP local ERRSTACK_REF #local ISRELABELABLE_FLAG SANDPIT_DIR REF_FILE OUT_FILE DIR TEST_CMDS #local VERBOSELEVEL local -a DOLLARAT ERRSTACK_REF="$1" shift # Register application-specific errors ade_err_registerdefderrs ADEASS_DEFINED_ERRORS # Defaults for options OPT_FORMAT= OPT_MODULES= OPT_COMMENT_FLAG=false # Register adeass's options ade_opt_register "$ERRSTACK_REF" --longoptions=modules:,comment,format: --callback-template="adeass_opt_handler_%s" || return $? ade_msg_register "$ERRSTACK_REF" adeass_usage_help adeass_version adeass_listpaths || return $? # Process options ade_opt_process "$ERRSTACK_REF" NEW_DOLLAR_AT "$@" || return $? set -- "${NEW_DOLLAR_AT[@]}" # Process arguments [ "X$1" = X ] && ade_msg_usage_bad "$ERRSTACK_REF" # Sanity checks and derivations [ "X$OPT_FORMAT" != X ] || ade_msg_usage_bad "$ERRSTACK_REF" if { ! [[ $OPT_FORMAT =~ ^(man|cpp|shell|perl|python|make|encapsulated-make)$ ]]; }; then ade_err_error "$ERRSTACK_REF" ADEASS_ERR_MISC "$OPT_FORMAT: bad format" return $ADE_ERR_FAIL fi for MODULE in $OPT_MODULES; do if ! type -p $MODULE-config > /dev/null; then ade_err_error "$ERRSTACK_REF" ADEASS_ERR_MISC "$MODULE-config: not found (hint: is $MODULE a valid module name?)" return $ADE_ERR_FAIL fi done # Guts for FILE in "$@"; do if { ! [[ $FILE =~ \.ass$ ]]; }; then ade_err_error "$ERRSTACK_REF" ADEASS_ERR_MISC "$FILE: bad extension" return $ADE_ERR_FAIL fi if [ ! -f $FILE ]; then ade_err_error "$ERRSTACK_REF" ADEASS_ERR_MISC "$FILE: not found" return $ADE_ERR_FAIL fi { # " " required to get a non-blank line comment. ! $OPT_COMMENT_FLAG || comment "$ERRSTACK_REF" $OPT_FORMAT " " ! $OPT_COMMENT_FLAG || comment "$ERRSTACK_REF" $OPT_FORMAT "This file was auto-generated by $PROGNAME! Manual edits will be lost!" ! $OPT_COMMENT_FLAG || comment "$ERRSTACK_REF" $OPT_FORMAT " " for MODULE in $OPT_MODULES; do ! $OPT_COMMENT_FLAG || comment "$ERRSTACK_REF" $OPT_FORMAT "Beginning of output from '$MODULE-config --format=$OPT_FORMAT'" if ! $MODULE-config --format=$OPT_FORMAT; then ade_err_error "$ERRSTACK_REF" ADEASS_ERR_MISC "$MODULE-config failed; see above" return $ADE_ERR_FAIL fi ! $OPT_COMMENT_FLAG || comment "$ERRSTACK_REF" $OPT_FORMAT "End of output from '$MODULE-config --format=$OPT_FORMAT'" # .../lib/include/ade.man exists, but .../lib/include/. and # .../lib/include/ade. do not. So either we check if # it exists before catting it, or we discard stderr and return code. We do the # former. if [ -f $($MODULE-config --format=plain ${MODULE}_share_prefix)/include/$MODULE.$OPT_FORMAT ]; then ! $OPT_COMMENT_FLAG || comment "$ERRSTACK_REF" $OPT_FORMAT "Beginning of contents of $($MODULE-config --format=plain ${MODULE}_share_prefix)/include/$MODULE.$OPT_FORMAT" cat $($MODULE-config --format=plain ${MODULE}_share_prefix)/include/$MODULE.$OPT_FORMAT ! $OPT_COMMENT_FLAG || comment "$ERRSTACK_REF" $OPT_FORMAT "End of contents of $($MODULE-config --format=plain ${MODULE}_share_prefix)/include/$MODULE.$OPT_FORMAT" fi done cat $FILE } > ${FILE%.ass} done return $ADE_ERR_OK } comment() { local OPT_FORMAT TEXT ERRSTACK_REF ERRSTACK_REF=$1 OPT_FORMAT=$2 TEXT=$3 # Might be empty if [ "X$TEXT" = X ]; then echo elif [[ $OPT_FORMAT =~ ^(shell|perl|make|encapsulated-make)$ ]]; then echo "# $TEXT" elif [ $OPT_FORMAT = cpp ]; then echo "#pragma comment(user, \"$TEXT\")" elif [ $OPT_FORMAT = man ]; then echo ".\\\" $TEXT" elif [ $OPT_FORMAT = plain ]; then echo "$TEXT" else ade_err_internal "$ERRSTACK_REF" "comment: $OPT_FORMAT: invalid comment format" fi return $ADE_ERR_OK } adeass_opt_handler_modules() { local ERRSTACK_REF="$1"; shift OPT_MODULES="$OPT_MODULES${OPT_MODULES:+ }${1//,/ }" } adeass_opt_handler_format() { local ERRSTACK_REF="$1"; shift OPT_FORMAT=$1 ade_err_debug "$ERRSTACK_REF" 10 "adeass_opt_handler_format: OPT_FORMAT=$OPT_FORMAT" } adeass_opt_handler_comment() { local ERRSTACK_REF="$1"; shift OPT_COMMENT_FLAG=true } adeass_usage_help() { local ERRSTACK_REF="$1"; shift local USAGETEXT_REF="$1"; shift local PASSNO=$1; shift if [ $PASSNO = 1 ]; then eval "$USAGETEXT_REF=\" ...\"" elif [ $PASSNO = 2 ]; then eval "$USAGETEXT_REF=\"\ | --modules=[,...] modules to read | --format= output format | --comment enable comments\"" fi return $ADE_ERR_OK } adeass_listpaths() { local ERRSTACK_REF="$1"; shift local PATHLIST_REF=$1; shift eval "$PATHLIST_REF=\"\ \"" return $ADE_ERR_OK } adeass_version() { local ERRSTACK_REF="$1"; shift local VERSION_REF=$1; shift ade_smf_extractversionfromsvnstring "$ERRSTACK_REF" "$APP_SVNID" "$VERSION_REF" return $ADE_ERR_OK } ade_gep_main adeass "$@"