-#!/bin/bash
-
-
-dump_array_member()
-{
- echo '{'
- echo ".name = \"$name_txt\","
- if test $line_handler -eq 0; then
- echo ".handler = com_$name_txt,"
- else
- echo ".line_handler = com_$name_txt,"
- fi
- if test -n "$perms_txt"; then
- echo ".perms = $perms_txt,"
- fi
- echo ".description = \"$desc_txt\","
- echo ".synopsis = \"$syn_txt\","
- echo ".help = "
- echo "$help_txt" | sed -e 's/^/\"/g' -e 's/$/\\n\"/g'
- echo '},'
-}
+#!/usr/bin/env bash
read_header()
{
---)
break
;;
- HC:)
- header_comment="$value"
- ;;
- CC:)
- c_file_comment="$value"
+ BN:)
+ base_name="$value"
;;
- FN:)
- file_name="$value"
+ SF:)
+ source_files="$value"
;;
- AT:)
- array_type="$value"
- ;;
- AN:)
- array_name="$value"
- ;;
- IN:)
- for i in $value; do
- includes="$includes
-#include \"$i.h\""
- done
- includes="$includes
-#include \"$file_name.h\""
+ SN:)
+ section_name="$value"
;;
+ TM:)
+ template_members="$value"
esac
done
- if test -z "$header_comment" -o -z "$c_file_comment" \
- -o -z "$file_name"; then
- echo "header error" 1&>2
- exit 1
- fi
}
read_one_command()
name_txt=""
desc_txt=""
- syn_txt=""
+ usage_txt=""
help_txt=""
perms_txt=""
- line_handler=0
- mkdir -p man/man1
+ template=0
+ template_name=""
+ template_prototype=""
while read key value; do
case "$key" in
---)
N:)
name_txt="$value"
;;
+ T:)
+ template_name="$value"
+ template=1
+ ;;
+ O:)
+ template_prototype="$value"
+ template=1
+ ;;
P:)
perms_txt="$value"
;;
D:)
desc_txt="$value"
;;
- L:)
- line_handler=1
- ;;
- S:)
- syn_txt="$value"
+ U:)
+ usage_txt="$value"
;;
H:)
help_txt="${value}"
;;
esac
done
- if test -n "$name_txt" -a -n "$desc_txt" -a -n "$syn_txt" \
- -a -n "$help_txt"; then
- ret=1
- return
+ if test $template -eq 0; then
+ if test -n "$name_txt" -a -n "$desc_txt" -a -n "$usage_txt" \
+ -a -n "$help_txt"; then
+ ret=1
+ return
+ fi
+ else
+ if test -n "$template_name" -a -n "$template_prototype" \
+ -a -n "$name_txt " -a -n "$template_members" \
+ -a -n "$desc_txt" -a -n "$usage_txt" \
+ -a -n "$help_txt"; then
+ ret=1
+ return
+ fi
fi
- if test -z "$name_txt" -a -z "$desc_txt" -a -z "$syn_txt" \
+ if test -z "$name_txt" -a -z "$desc_txt" -a -z "$usage_txt" \
-a -z "$help_txt"; then
ret=0
return
fi
ret=-1
- return
+ #return
echo "!ERROR!"
echo "N: $name_txt"
echo "D: $desc_txt"
- echo "S: $syn_txt"
+ echo "S: $usage_txt"
echo "P: $perms_txt"
echo "H: $help_txt"
+ echo "O: $template_prototype"
}
dump_man()
{
- echo "NAME"
- printf "\t$name_txt - $desc_txt\n"
- echo "SYNOPSIS"
- printf "\t$syn_txt\n"
- echo "DESCRIPTION"
- echo "$help_txt"
+ if test $template -eq 0; then
+ echo ".SS \"$name_txt\""
+ echo "$desc_txt"
+ echo
+ echo "\\fBUsage: \\fP$usage_txt"
+ else
+ for member in $template_members; do
+ local sed_cmd="sed -e s/@member@/$member/g"
+ local t_name_txt=$(echo $name_txt | $sed_cmd)
+ echo ".SS \"$t_name_txt\""
+ done
+ echo "$desc_txt" | sed -e "s/@member@/{$(echo $template_members | sed -e 's/ / | /g')}/g"
+ echo
+ echo "\\fBUsage: \\fP"
+ echo
+ echo ".nf"
+ for member in $template_members; do
+ local sed_cmd="sed -e s/@member@/$member/g"
+ local t_usage_txt=$(echo $usage_txt | $sed_cmd)
+ printf "\t$t_usage_txt\n"
+ done
+ echo ".fi"
+ fi
+ echo
+ echo "$help_txt" | sed -e 's/^ //'
+ echo
if test -n "$perms_txt"; then
- echo "PERMISSIONS"
+ echo -n "\\fBpermissions:\\fP "
if test "$perms_txt" = "0"; then
- printf "\t(none)\n"
+ echo "(none)"
else
- printf "\t$perms_txt\n"
+ echo "$perms_txt"
fi
fi
-
+ echo
}
com_man()
{
- local cn="$(grep ^codename Makefile.in)"
- local ver="$(grep ^AC_INIT configure.ac \
- | cut -f 2 -d ',')"
- cn=${cn#*=}
- ver=${ver# *[}
- ver=${ver%]}
- echo "r=paraslash-$ver (cn: $cn)"
- local n
- local txtdir=txt
- local mandir=man/man1
- local htmldir=html
- local pfx="$1"
- mkdir -p $txtdir $mandir $htmldir || exit 1
+ echo "[$section_name]"
+ echo
while : ; do
read_one_command
if test $ret -lt 0; then
if test $ret -eq 0; then
break
fi
- n=$pfx-$name_txt
- echo "pfx: $pfx, name: $n"
- dump_man > $txtdir/$n.txt
- txt2man -t "$n" -r "$r" < $txtdir/$n.txt \
- | sed -e 1d > $mandir/$n.1
- man2html $mandir/$n.1 > $htmldir/$n.html
+ dump_man
done
}
-com_c_file()
+make_proto()
{
- echo "/** \file $file_name.c $c_file_comment */"
- echo "$includes"
- echo "struct $array_type $array_name[] = {"
+ local regex='\(__noreturn \)*\(static \)*int com_'
+ local source_file match="" all_commands CR='
+'
+ if test -n "$prototype"; then
+ result="$prototype$CR"
+ return
+ fi
+ all_commands="$(cat $source_files | grep "$regex")"
+ result=
+ for source_file in $source_files; do
+ match=$(grep "$regex$name_txt(" <<< "$all_commands" | head -n 1 | sed -e 's/$/;/1')
+ if test -n "$match"; then
+ result="$result$match$CR"
+ break
+ fi
+ done
+}
+
+make_array_member()
+{
+ local TAB=' ' CR='
+'
+ local tmp
+
+ result="{.name = \"$name_txt\", .handler = com_$name_txt, "
+ if test -n "$perms_txt"; then
+ result="$result .perms = $perms_txt,"
+ fi
+ result="$result.description = \"$desc_txt\", .usage = \"$usage_txt\", \\$CR .help = "
+ tmp="$(printf "%s\n" "$help_txt" | sed -e 's/^/\"/g' -e 's/$/\\n\"/g' \
+ -e "s/$TAB/\\\t/g" -e's/$/\\/g')"
+ result="$result$tmp$CR}, \\$CR"
+}
+
+make_completion()
+{
+ local CR='
+'
+ result=" {.name = \"$name_txt\", .completer = ${name_txt}_completer}, \\$CR"
+}
+
+template_loop()
+{
+ local loop_result=
+
+ local t_name="$name_txt"
+ local t_perms="$perms_txt"
+ local t_desc="$desc_txt"
+ local t_usage="$usage_txt"
+ local t_help="$help_txt"
+ local t_source_files="$source_files"
+ local member
+ for member in $template_members; do
+ name_txt="${t_name//@member@/$member}"
+ perms_txt="${t_perms//@member@/$member}"
+ desc_txt="${t_desc//@member@/$member}"
+ usage_txt="${t_usage//@member@/$member}"
+ help_txt="${t_help//@member@/$member}"
+ prototype="${template_prototype//@member@/$member}"
+ result=
+ $1
+ loop_result="$loop_result$result"
+ done
+ result="$loop_result"
+ # reset global variables
+ name_txt="$t_name"
+ perms_txt="$t_perms"
+ desc_txt="$t_desc"
+ usage_txt="$t_usage"
+ help_txt="$t_help"
+ source_files="$t_source_files"
+}
+
+com_header()
+{
+ local array_members CR='
+'
+
while : ; do
read_one_command
if test $ret -lt 0; then
if test $ret -eq 0; then
break
fi
- dump_array_member
+ if test $template -eq 0; then
+ make_proto
+ printf "%s" "$result"
+ make_array_member
+ array_members="$array_members$result"
+ continue
+ fi
+ template_loop make_proto
+ printf "%s" "$result"
+ template_loop make_array_member
+ array_members="$array_members$result"
done
- echo '{.name = NULL}};'
+ array_members="$array_members{.name = NULL} \\$CR"
+ echo "#define DEFINE_$(tr 'a-z' 'A-Z' <<< "$base_name")_CMD_ARRAY $array_members"
}
-dump_proto()
+com_completion()
{
- echo '/**'
- echo " * $desc_txt"
- echo ' *'
- echo ' * \param fd the file descriptor to send output to'
- if test $line_handler -eq 0; then
- echo ' * \param argc the number of arguments'
- echo ' * \param argv the argument vector'
- else
- echo ' * \param cmdline the full command line'
- fi
- echo ' * '
- echo " * synopsis: $syn_txt"
- echo ' * '
- echo "$help_txt" | sed -e 's/^/ * /g'
- echo ' */'
- if test $line_handler -eq 0; then
- echo "int com_$name_txt(int fd, int argc, char **argv);"
- else
- echo "int com_$name_txt(int fd, char *cmdline);"
- fi
- echo
-}
-com_header()
-{
- echo "/** \file $file_name.h $header_comment */"
- echo
- echo "extern struct $array_type $array_name[];"
+ echo "#define $1 \\"
while : ; do
read_one_command
if test $ret -lt 0; then
if test $ret -eq 0; then
break
fi
- dump_proto
+ if test $template -eq 0; then
+ make_completion
+ printf "%s" "$result"
+ continue
+ fi
+ template_loop make_completion
+ printf "%s" "$result"
done
+ echo
}
read_header
arg="$1"
shift
case "$arg" in
- "c_file")
- com_c_file
- ;;
- "header")
+ "h")
com_header
;;
"man")
com_man $*
;;
+ "compl")
+ com_completion $*
+ ;;
esac