#!/bin/sh | |
die () { | |
echo "$@" >&2 | |
exit 1 | |
} | |
command_list () { | |
grep -v '^#' "$1" | |
} | |
get_categories () { | |
tr ' ' '\n'| | |
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 "};" | |
} | |
print_config_list () { | |
cat <<EOF | |
static const char *config_name_list[] = { | |
EOF | |
grep -h '^[a-zA-Z].*\..*::$' Documentation/*config.txt Documentation/config/*.txt | | |
sed '/deprecated/d; s/::$//; s/, */\n/g' | | |
sort | | |
while read line | |
do | |
echo " \"$line\"," | |
done | |
cat <<EOF | |
NULL, | |
}; | |
EOF | |
} | |
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" | |
echo | |
print_config_list |