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