You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
98 lines
1.5 KiB
98 lines
1.5 KiB
#!/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"
|
|
|