X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=command_util.sh;h=e33e0769d9cbc2230bf02b70813d5435f2447430;hb=767c8054c268a011c3be4f8c756b44eab999820f;hp=ea952e5b1283589d16bff19717ba39b20964648c;hpb=6aa6fcd54de730b4dfc75ca60f8c21009d60da0d;p=paraslash.git diff --git a/command_util.sh b/command_util.sh index ea952e5b..e33e0769 100755 --- a/command_util.sh +++ b/command_util.sh @@ -1,25 +1,28 @@ -#!/bin/bash +#!/usr/bin/env bash - -dump_array_member() +read_header() { - 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 '},' -} + local key value i + while read key value; do + case "$key" in + ---) + break + ;; + BN:) + base_name="$value" + ;; + SF:) + source_files="$value" + ;; + SN:) + section_name="$value" + ;; + TM:) + template_members="$value" + esac + done +} read_one_command() { @@ -27,11 +30,12 @@ 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 ---) @@ -40,17 +44,22 @@ read_one_command() 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}" @@ -66,61 +75,81 @@ ${line# }" ;; 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 @@ -129,17 +158,90 @@ com_man() 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 +} + +make_proto() +{ + 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 } -com_array() +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 @@ -148,21 +250,26 @@ com_array() 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 + 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() { - if test $line_handler -eq 0; then - echo "int com_$name_txt(int, int, char **);" - else - echo "int com_$name_txt(int, char *);" - fi -} -com_proto() -{ + echo "#define $1 \\" while : ; do read_one_command if test $ret -lt 0; then @@ -171,20 +278,28 @@ com_proto() 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 - "array") - com_array - ;; - "proto") - com_proto + "h") + com_header ;; "man") com_man $* ;; + "compl") + com_completion $* + ;; esac