generate-cmdlist.shon commit for_each_*_object: take flag arguments as enum (a7ff6f5)
   1#!/bin/sh
   2
   3die () {
   4        echo "$@" >&2
   5        exit 1
   6}
   7
   8command_list () {
   9        grep -v '^#' "$1"
  10}
  11
  12get_categories () {
  13        tr ' ' '\n'|
  14        grep -v '^$' |
  15        sort |
  16        uniq
  17}
  18
  19category_list () {
  20        command_list "$1" |
  21        cut -c 40- |
  22        get_categories
  23}
  24
  25get_synopsis () {
  26        sed -n '
  27                /^NAME/,/'"$1"'/H
  28                ${
  29                        x
  30                        s/.*'"$1"' - \(.*\)/N_("\1")/
  31                        p
  32                }' "Documentation/$1.txt"
  33}
  34
  35define_categories () {
  36        echo
  37        echo "/* Command categories */"
  38        bit=0
  39        category_list "$1" |
  40        while read cat
  41        do
  42                echo "#define CAT_$cat (1UL << $bit)"
  43                bit=$(($bit+1))
  44        done
  45        test "$bit" -gt 32 && die "Urgh.. too many categories?"
  46}
  47
  48define_category_names () {
  49        echo
  50        echo "/* Category names */"
  51        echo "static const char *category_names[] = {"
  52        bit=0
  53        category_list "$1" |
  54        while read cat
  55        do
  56                echo "  \"$cat\", /* (1UL << $bit) */"
  57                bit=$(($bit+1))
  58        done
  59        echo "  NULL"
  60        echo "};"
  61}
  62
  63print_command_list () {
  64        echo "static struct cmdname_help command_list[] = {"
  65
  66        command_list "$1" |
  67        while read cmd rest
  68        do
  69                printf "        { \"$cmd\", $(get_synopsis $cmd), 0"
  70                for cat in $(echo "$rest" | get_categories)
  71                do
  72                        printf " | CAT_$cat"
  73                done
  74                echo " },"
  75        done
  76        echo "};"
  77}
  78
  79print_config_list () {
  80        cat <<EOF
  81static const char *config_name_list[] = {
  82EOF
  83        grep '^[a-zA-Z].*\..*::$' Documentation/config.txt |
  84        sed '/deprecated/d; s/::$//; s/,  */\n/g' |
  85        sort |
  86        while read line
  87        do
  88                echo "  \"$line\","
  89        done
  90        cat <<EOF
  91        NULL,
  92};
  93EOF
  94}
  95
  96echo "/* Automatically generated by generate-cmdlist.sh */
  97struct cmdname_help {
  98        const char *name;
  99        const char *help;
 100        uint32_t category;
 101};
 102"
 103define_categories "$1"
 104echo
 105define_category_names "$1"
 106echo
 107print_command_list "$1"
 108echo
 109print_config_list