#!/bin/sh die () { echo "$@" >&2 exit 1 } command_list () { eval "grep -ve '^#' $exclude_programs" <"$1" } get_categories () { tr ' ' '\n'| grep -v '^$' | sort | uniq } category_list () { command_list "$1" | cut -c 40- | get_categories } get_synopsis () { sed -n ' /^NAME/,/'"$1"'/H ${ x s/.*'"$1"' - \(.*\)/N_("\1")/ p }' "Documentation/$1.txt" } define_categories () { echo echo "/* Command categories */" bit=0 category_list "$1" | while read cat do echo "#define CAT_$cat (1UL << $bit)" bit=$(($bit+1)) done test "$bit" -gt 32 && die "Urgh.. too many categories?" } define_category_names () { echo echo "/* Category names */" echo "static const char *category_names[] = {" bit=0 category_list "$1" | while read cat do echo " \"$cat\", /* (1UL << $bit) */" bit=$(($bit+1)) done echo " NULL" echo "};" } print_command_list () { echo "static struct cmdname_help command_list[] = {" command_list "$1" | while read cmd rest do printf " { \"$cmd\", $(get_synopsis $cmd), 0" for cat in $(echo "$rest" | get_categories) do printf " | CAT_$cat" done echo " }," done echo "};" } print_config_list () { cat <<EOF static const char *config_name_list[] = { EOF grep -h '^[a-zA-Z].*\..*::$' Documentation/*config.txt Documentation/config/*.txt | sed '/deprecated/d; s/::$//; s/, */\n/g' | sort | while read line do echo " \"$line\"," done cat <<EOF NULL, }; EOF } exclude_programs= while test "--exclude-program" = "$1" do shift exclude_programs="$exclude_programs -e \"^$1 \"" shift done echo "/* Automatically generated by generate-cmdlist.sh */ struct cmdname_help { const char *name; const char *help; uint32_t category; }; " define_categories "$1" echo define_category_names "$1" echo print_command_list "$1" echo print_config_list