#!/bin/sh | |
die () { | |
echo "$@" >&2 | |
exit 1 | |
} | |
command_list () { | |
eval "grep -ve '^#' $exclude_programs" <"$1" | |
} | |
get_categories () { | |
tr ' ' '\012'| | |
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 "};" | |
} | |
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" |