]> rtime.felk.cvut.cz Git - rpp-test-sw.git/blob - rpp-test-sw/commands/doc/docgen.c
d7ae3a7a0d63b6bb1c901e3910044fe34d6389cd
[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
65                         mode = COMMAND_HELP;
66         }
67
68
69         while (1) {
70                 des = *(des_arr++);
71                 if (!des) {
72                         if (!arr_stack_sp) break;
73                         des_arr = arr_stack[--arr_stack_sp];
74                         continue;
75                 }
76                 if (des == CMD_DES_CONTINUE_AT_ID) {
77                         /* list continues at new address */
78                         des_arr = (const cmd_des_t **)*des_arr;
79                         continue;
80                 }
81                 if (des == CMD_DES_INCLUDE_SUBLIST_ID) {
82                         /* list includes commands from sublists */
83                         if (arr_stack_sp >= CMD_ARR_STACK_SIZE)
84                                 des_arr++;
85                         else {
86                                 arr_stack[arr_stack_sp++] = des_arr+1;
87                                 des_arr = (const cmd_des_t **)*des_arr;
88                                 continue;
89                         }
90                 }
91
92                 sorted_des[num++] = des;
93         }
94
95         qsort(sorted_des, num, sizeof(*sorted_des), cmp_des);
96
97         for (int i = 0; i < num; i++) {
98                 des = sorted_des[i];
99
100                 switch (mode) {
101                 case SHORT_HELP:
102                         print_one_line(des);
103                         break;
104                 case FULL_HELP:
105                         print_long(des);
106                         break;
107                 case WIKI_HELP:
108                         print_wiki(des);
109                         break;
110                 case COMMAND_HELP:
111                         if (strcmp(argv[1], des->name) == 0)
112                                 print_long(des);
113                 }
114         }
115
116         return 0;
117 }