]> rtime.felk.cvut.cz Git - rpp-test-sw.git/blob - rpp-test-sw/commands/doc/docgen.c
Generate command documentation also in LaTeX format
[rpp-test-sw.git] / rpp-test-sw / commands / doc / docgen.c
1 #include <stdio.h>
2 #include <cmdproc.h>
3 #include <string.h>
4 #include "commands/cmd.h"
5 #include <stdlib.h>
6
7 #define CMD_ARR_STACK_SIZE 4
8
9 enum disp_mode {
10         SHORT_HELP,     /* One line per command */
11         FULL_HELP,      /* One line and long desc for all commands */
12         WIKI_HELP,      /* Wiki-formated help for all commands */
13         COMMAND_HELP,       /* One line and long desc for a specific command */
14 };
15
16 void print_one_line(const cmd_des_t *des)
17 {
18         printf("%s - %s\n", des->name, des->help);
19 }
20
21 void print_long(const cmd_des_t *des)
22 {
23         print_one_line(des);
24         printf("%s", des->long_help);
25 }
26
27 void print_wiki(const cmd_des_t *des)
28 {
29         printf("## %s ##\n", des->name);
30         printf("%s\n", des->help);
31         printf("%s", des->long_help);
32 }
33
34 static int cmp_des(const void *p1, const void *p2)
35 {
36         const cmd_des_t *const *c1 = p1, *const *c2 = p2;
37
38         return strcmp((*c1)->name, (*c2)->name);
39
40 }
41
42 int main(int argc, char *argv[])
43 {
44         const cmd_des_t *des;
45         const cmd_des_t **des_arr = cmd_list_main;
46         cmd_des_t const **arr_stack[CMD_ARR_STACK_SIZE];
47         int arr_stack_sp = 0;
48         enum disp_mode mode = SHORT_HELP;
49
50         #define LEN 1000
51         const cmd_des_t *sorted_des[LEN];
52         int num = 0;
53
54         if (argc > 1) {
55                 if (strcmp(argv[1], "full") == 0)
56                         mode = FULL_HELP;
57                 else if (strcmp(argv[1], "wiki") == 0) {
58                         mode = WIKI_HELP;
59                         printf("This page is generated automatically by " __FILE__ " and is valid for version ");
60                         fflush(stdout);
61                         system("git describe --always");
62                         printf("\n");
63                 }
64                 else if (strcmp(argv[1], "pdfdoc") == 0) {
65                         mode = WIKI_HELP;
66                 }
67                 else
68                         mode = COMMAND_HELP;
69         }
70
71
72         while (1) {
73                 des = *(des_arr++);
74                 if (!des) {
75                         if (!arr_stack_sp) break;
76                         des_arr = arr_stack[--arr_stack_sp];
77                         continue;
78                 }
79                 if (des == CMD_DES_CONTINUE_AT_ID) {
80                         /* list continues at new address */
81                         des_arr = (const cmd_des_t **)*des_arr;
82                         continue;
83                 }
84                 if (des == CMD_DES_INCLUDE_SUBLIST_ID) {
85                         /* list includes commands from sublists */
86                         if (arr_stack_sp >= CMD_ARR_STACK_SIZE)
87                                 des_arr++;
88                         else {
89                                 arr_stack[arr_stack_sp++] = des_arr+1;
90                                 des_arr = (const cmd_des_t **)*des_arr;
91                                 continue;
92                         }
93                 }
94
95                 sorted_des[num++] = des;
96         }
97
98         qsort(sorted_des, num, sizeof(*sorted_des), cmp_des);
99
100         for (int i = 0; i < num; i++) {
101                 des = sorted_des[i];
102
103                 switch (mode) {
104                 case SHORT_HELP:
105                         print_one_line(des);
106                         break;
107                 case FULL_HELP:
108                         print_long(des);
109                         break;
110                 case WIKI_HELP:
111                         print_wiki(des);
112                         break;
113                 case COMMAND_HELP:
114                         if (strcmp(argv[1], des->name) == 0)
115                                 print_long(des);
116                 }
117         }
118
119         return 0;
120 }