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