#!/bin/sh die () { echo "$@" >&2 exit 1 } command_list () { while read cmd rest do case "$cmd" in "#"* | '') # Ignore comments and allow empty lines continue ;; *) case "$exclude_programs" in *":$cmd:"*) ;; *) echo "$cmd $rest" ;; esac esac done <"$1" } category_list () { echo "$1" | cut -d' ' -f2- | tr ' ' '\012' | grep -v '^$' | LC_ALL=C sort -u } define_categories () { echo echo "/* Command categories */" bit=0 echo "$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 echo "$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[] = {" echo "$1" | while read cmd rest do synopsis= while read line do case "$line" in "$cmd - "*) synopsis=${line#$cmd - } break ;; esac done <"Documentation/$cmd.txt" printf '\t{ "%s", N_("%s"), 0' "$cmd" "$synopsis" printf " | CAT_%s" $rest echo " }," done echo "};" } exclude_programs=: while test "--exclude-program" = "$1" do shift exclude_programs="$exclude_programs$1:" shift done commands="$(command_list "$1")" categories="$(category_list "$commands")" echo "/* Automatically generated by generate-cmdlist.sh */ struct cmdname_help { const char *name; const char *help; uint32_t category; }; " define_categories "$categories" echo define_category_names "$categories" echo print_command_list "$commands"