]> git.tuebingen.mpg.de Git - paraslash.git/blob - command_util.sh
875b5e6957f7509a15352cdfc6a9c7239402a448
[paraslash.git] / command_util.sh
1 #!/usr/bin/env bash
2
3
4 read_header()
5 {
6         local key value i
7
8         while read key value; do
9                 case "$key" in
10                 ---)
11                         break
12                         ;;
13                 OF:)
14                         output_file="$value"
15                         array_name=${value%command_list}cmds
16                         ;;
17                 SF:)
18                         source_files="$value"
19                         ;;
20                 AT:)
21                         array_type="$value"
22                         ;;
23                 SI:)
24                         for i in $value; do
25                                 system_includes="$system_includes
26 #include <$i.h>"
27                         done
28                         ;;
29                 IN:)
30                         for i in $value; do
31                                 includes="$includes
32 #include \"$i.h\""
33                         done
34                         includes="$includes
35 #include \"$output_file.h\""
36                         ;;
37                 SN:)
38                         section_name="$value"
39                         ;;
40                 TM:)
41                         template_members="$value"
42                 esac
43         done
44         if test -z "$output_file"; then
45                 echo "header error" 1&>2
46                 exit 1
47         fi
48 }
49
50 read_one_command()
51 {
52         local line
53
54         name_txt=""
55         desc_txt=""
56         usage_txt=""
57         help_txt=""
58         perms_txt=""
59         template=0
60         template_name=""
61         template_prototype=""
62         mkdir -p man/man1
63         while read key value; do
64                 case "$key" in
65                 ---)
66                         break
67                         ;;
68                 N:)
69                         name_txt="$value"
70                         ;;
71                 T:)
72                         template_name="$value"
73                         template=1
74                         ;;
75                 O:)
76                         template_prototype="$value"
77                         template=1
78                         ;;
79                 P:)
80                         perms_txt="$value"
81                         ;;
82                 D:)
83                         desc_txt="$value"
84                         ;;
85                 U:)
86                         usage_txt="$value"
87                         ;;
88                 H:)
89                         help_txt="${value}"
90                         while read line; do
91                                 if test "$line" = "---"; then
92                                         break;
93                                 fi
94                                 line=${line#H:}
95                                 help_txt="$help_txt
96 ${line# }"
97                         done
98                         break
99                         ;;
100                 esac
101         done
102         if test $template -eq 0; then
103                 if test -n "$name_txt" -a -n "$desc_txt" -a -n "$usage_txt" \
104                                 -a -n "$help_txt"; then
105                         ret=1
106                         return
107                 fi
108         else
109                 if test -n "$template_name" -a -n "$template_prototype" \
110                                 -a -n "$name_txt " -a -n "$template_members" \
111                                 -a -n "$desc_txt" -a -n "$usage_txt" \
112                                 -a -n "$help_txt"; then
113                         ret=1
114                         return
115                 fi
116         fi
117         if test -z "$name_txt" -a -z "$desc_txt" -a -z "$usage_txt" \
118                         -a -z "$help_txt"; then
119                 ret=0
120                 return
121         fi
122         ret=-1
123         #return
124         echo "!ERROR!"
125         echo "N: $name_txt"
126         echo "D: $desc_txt"
127         echo "S: $usage_txt"
128         echo "P: $perms_txt"
129         echo "H: $help_txt"
130         echo "O: $template_prototype"
131 }
132
133 dump_man()
134 {
135         if test $template -eq 0; then
136                 echo ".SS \"$name_txt\""
137                 echo "$desc_txt"
138                 echo
139                 echo "\\fBUsage: \\fP$usage_txt"
140         else
141                 for member in $template_members; do
142                         local sed_cmd="sed -e s/@member@/$member/g"
143                         local t_name_txt=$(echo $name_txt | $sed_cmd)
144                         echo ".SS \"$t_name_txt\""
145                 done
146                 echo "$desc_txt" | sed -e "s/@member@/{$(echo $template_members | sed -e 's/ / | /g')}/g"
147                 echo
148                 echo "\\fBUsage: \\fP"
149                 echo
150                 echo ".nf"
151                 for member in $template_members; do
152                         local sed_cmd="sed -e s/@member@/$member/g"
153                         local t_usage_txt=$(echo $usage_txt | $sed_cmd)
154                         printf "\t$t_usage_txt\n"
155                 done
156                 echo ".fi"
157         fi
158         echo
159         echo "$help_txt" | sed -e 's/^  //'
160         echo
161         if test -n "$perms_txt"; then
162                 echo -n "\\fBpermissions:\\fP "
163                 if test "$perms_txt" = "0"; then
164                         echo "(none)"
165                 else
166                         echo "$perms_txt"
167                 fi
168         fi
169         echo
170 }
171
172
173 com_man()
174 {
175         echo "[$section_name]"
176         echo
177         while : ; do
178                 read_one_command
179                 if test $ret -lt 0; then
180                         exit 1
181                 fi
182                 if test $ret -eq 0; then
183                         break
184                 fi
185                 dump_man
186         done
187 }
188
189 make_proto()
190 {
191         local source_file match="" CR='
192 '
193         if test -n "$prototype"; then
194                 result="$prototype$CR"
195                 return
196         fi
197         result=
198         for source_file in $source_files; do
199                 match=$(grep "^\(__noreturn \)*int com_$name_txt(" $source_file | head -n 1 | sed -e 's/$/;/1')
200                 if test -n "$match"; then
201                         result="$result$match$CR"
202                         break
203                 fi
204         done
205 }
206
207 make_array_member()
208 {
209         local TAB='     ' CR='
210 '
211         local tmp
212
213         result="{.name = \"$name_txt\", .handler = com_$name_txt, "
214         if test -n "$perms_txt"; then
215                 result="$result .perms = $perms_txt,"
216         fi
217         result="$result.description = \"$desc_txt\", .usage = \"$usage_txt\", \\$CR .help = "
218         tmp="$(printf "%s\n" "$help_txt" | sed -e 's/^/\"/g' -e 's/$/\\n\"/g' \
219                 -e "s/$TAB/\\\t/g" -e's/$/\\/g')"
220         result="$result$tmp$CR}, \\$CR"
221 }
222
223 make_completion()
224 {
225         local CR='
226 '
227         result="  {.name = \"$name_txt\", .completer = ${name_txt}_completer}, \\$CR"
228 }
229
230 template_loop()
231 {
232         local loop_result=
233
234         local t_name="$name_txt"
235         local t_perms="$perms_txt"
236         local t_desc="$desc_txt"
237         local t_usage="$usage_txt"
238         local t_help="$help_txt"
239         local t_source_files="$source_files"
240         local member
241         for member in $template_members; do
242                 local sed_cmd="sed -e s/@member@/$member/g"
243                 #echo "sed_cmd: $sed_cmd"
244                 name_txt=$(echo "$t_name" | $sed_cmd)
245                 #name_txt="$tname"
246                 perms_txt=$(echo "$t_perms" | $sed_cmd)
247                 desc_txt=$(echo "$t_desc" | $sed_cmd)
248                 usage_txt=$(echo "$t_usage" | $sed_cmd)
249                 help_txt=$(printf "%s\n" "$t_help" | $sed_cmd)
250                 prototype=$(echo "$template_prototype" | $sed_cmd)
251                 $1
252                 loop_result="$loop_result$result"
253         done
254         result="$loop_result"
255 }
256
257 com_c_file()
258 {
259         echo "$system_includes"
260         echo "$includes"
261         echo "struct $array_type $array_name[] = {"
262         while : ; do
263                 read_one_command
264                 if test $ret -lt 0; then
265                         exit 1
266                 fi
267                 if test $ret -eq 0; then
268                         break
269                 fi
270                 if test $template -eq 0; then
271                         make_array_member
272                         printf "%s" "$result"
273                         continue
274                 fi
275                 template_loop make_array_member
276                 printf "%s" "$result"
277         done
278         echo '{.name = NULL}};'
279 }
280
281 com_header()
282 {
283         echo "extern struct $array_type $array_name[];"
284         while : ; do
285                 read_one_command
286                 if test $ret -lt 0; then
287                         exit 1
288                 fi
289                 if test $ret -eq 0; then
290                         break
291                 fi
292                 if test $template -eq 0; then
293                         make_proto
294                         printf "%s" "$result"
295                         continue
296                 fi
297                 template_loop make_proto
298                 printf "%s" "$result"
299         done
300 }
301
302 com_completion()
303 {
304
305         echo "#define $1 \\"
306         while : ; do
307                 read_one_command
308                 if test $ret -lt 0; then
309                         exit 1
310                 fi
311                 if test $ret -eq 0; then
312                         break
313                 fi
314                 if test $template -eq 0; then
315                         make_completion
316                         printf "%s" "$result"
317                         continue
318                 fi
319                 template_loop make_completion
320                 printf "%s" "$result"
321         done
322         echo
323 }
324
325 read_header
326 arg="$1"
327 shift
328 case "$arg" in
329         "c")
330                 com_c_file
331                 ;;
332         "h")
333                 com_header
334                 ;;
335         "man")
336                 com_man $*
337                 ;;
338         "compl")
339                 com_completion $*
340                 ;;
341 esac