Let's not use tabs but spaces instead. This way the formatting will be consistent no matter how big tab skips are. Moreover, at the same time, reformat the code a bit to be more readable. Signed-off-by: Michal Privoznik <mprivozn@xxxxxxxxxx> --- tools/generate-api-docs.c | 449 +++++++++++++++++++++++----------------------- 1 file changed, 224 insertions(+), 225 deletions(-) diff --git a/tools/generate-api-docs.c b/tools/generate-api-docs.c index 1d9737e..d6e144c 100644 --- a/tools/generate-api-docs.c +++ b/tools/generate-api-docs.c @@ -3,307 +3,306 @@ #include <stdlib.h> #include <stdarg.h> #include <string.h> +#include <stdbool.h> typedef struct func_t { - char *name; - int private; - char *desc; - char *version; - int num_args; - char **args; - char *returns; + char *name; + int private; + char *desc; + char *version; + int num_args; + char **args; + char *returns; } func_t; func_t *functions = NULL; void bail_error(const char *fmt, ...) { - va_list ap; - char tmp[64] = { 0 }; + va_list ap; + char tmp[64] = { 0 }; - va_start(ap, fmt); - vsnprintf(tmp, sizeof(tmp), fmt, ap); - va_end(ap); + va_start(ap, fmt); + vsnprintf(tmp, sizeof(tmp), fmt, ap); + va_end(ap); - fprintf(stderr, "Error: %s\n", tmp); - exit(1); + fprintf(stderr, "Error: %s\n", tmp); + exit(1); } char *ltrim_string(char *str) { - while (*str++ == ' ') ; - if (*str == '\t') - while (*str++ == '\t') - if (*str != '\t') break; - return str; + while (*str++ == ' ') ; + if (*str == '\t') + while (*str++ == '\t') + if (*str != '\t') break; + return str; } void parse_comment(char *line, int func_num, int *arg_num) { - char *ltrimmed = ltrim_string(line); + char *ltrimmed = ltrim_string(line); - if (strncmp(ltrimmed, "Function name:", 14) == 0) { - functions[func_num].name = strdup( ltrim_string( ltrimmed + 14) ); - functions[func_num].private = 0; - } - else - if (strncmp(ltrimmed, "Private function name:", 22) == 0) { - functions[func_num].name = strdup( ltrim_string( ltrimmed + 22) ); - functions[func_num].private = 1; - } - else - if (strncmp(ltrimmed, "Since version:", 14) == 0) { - functions[func_num].version = strdup( ltrim_string( ltrimmed + 14) ); - } - else - if (strncmp(ltrimmed, "Description:", 12) == 0) { - functions[func_num].desc = strdup( ltrim_string( ltrimmed + 12) ); - } - else - if (strncmp(ltrimmed, "Arguments:", 10) == 0) { - char *str = ltrim_string(ltrimmed + 11); - if (arg_num == NULL) - return; + if (strncmp(ltrimmed, "Function name:", 14) == 0) { + functions[func_num].name = strdup( ltrim_string( ltrimmed + 14) ); + functions[func_num].private = 0; + } + else if (strncmp(ltrimmed, "Private function name:", 22) == 0) { + functions[func_num].name = strdup( ltrim_string( ltrimmed + 22) ); + functions[func_num].private = 1; + } + else if (strncmp(ltrimmed, "Since version:", 14) == 0) { + functions[func_num].version = strdup( ltrim_string( ltrimmed + 14) ); + } + else if (strncmp(ltrimmed, "Description:", 12) == 0) { + functions[func_num].desc = strdup( ltrim_string( ltrimmed + 12) ); + } + else if (strncmp(ltrimmed, "Arguments:", 10) == 0) { + char *str = ltrim_string(ltrimmed + 11); + if (arg_num == NULL) + return; - functions[func_num].num_args = 1; - functions[func_num].args = malloc( sizeof(char *) ); - functions[func_num].args[0] = malloc( (strlen(str) + 1) * sizeof(char) ); - strcpy(functions[func_num].args[0], str); + functions[func_num].num_args = 1; + functions[func_num].args = malloc( sizeof(char *) ); + functions[func_num].args[0] = malloc( (strlen(str) + 1) * sizeof(char) ); + strcpy(functions[func_num].args[0], str); - *arg_num = 1; - } - else - if (strncmp(ltrimmed, "Returns:", 8) == 0) { - char *str = ltrim_string(ltrimmed + 7); + *arg_num = 1; + } + else if (strncmp(ltrimmed, "Returns:", 8) == 0) { + char *str = ltrim_string(ltrimmed + 7); - functions[func_num].returns = malloc( (strlen(str) + 1) * sizeof(char)); - strcpy(functions[func_num].returns, str); - } - else - if ((arg_num != NULL) && (*arg_num > 0)) { - functions[func_num].num_args++; - functions[func_num].args = realloc( functions[func_num].args, - functions[func_num].num_args * sizeof(char *)); - functions[func_num].args[functions[func_num].num_args-1] = malloc( - (strlen(ltrimmed) + 1) * sizeof(char) ); - strcpy(functions[func_num].args[functions[func_num].num_args-1], ltrimmed); + functions[func_num].returns = malloc( (strlen(str) + 1) * sizeof(char)); + strcpy(functions[func_num].returns, str); + } + else if ((arg_num != NULL) && (*arg_num > 0)) { + functions[func_num].num_args++; + functions[func_num].args = realloc( functions[func_num].args, + functions[func_num].num_args * sizeof(char *)); + functions[func_num].args[functions[func_num].num_args-1] = malloc((strlen(ltrimmed) + 1) * sizeof(char) ); + strcpy(functions[func_num].args[functions[func_num].num_args-1], ltrimmed); - *arg_num = *arg_num + 1; - } + *arg_num = *arg_num + 1; + } } char *get_lpart(char *str) { - if (!str || strcmp(str, "None") == 0) - return str; - char *new = strdup(str); - char *tmp = strchr(str, ':'); - if (!tmp) - return str; + if (!str || strcmp(str, "None") == 0) + return str; + char *new = strdup(str); + char *tmp = strchr(str, ':'); + if (!tmp) + return str; - new[ strlen(new) - strlen(tmp) ] = 0; + new[ strlen(new) - strlen(tmp) ] = 0; - return new; + return new; } char *get_rpart(char *str) { - if (!str || strcmp(str, "None") == 0) - return str; - char *tmp = strchr(str, ':'); + if (!str || strcmp(str, "None") == 0) + return str; + char *tmp = strchr(str, ':'); - if (!tmp) - return str; + if (!tmp) + return str; - return (++tmp); + return (++tmp); } void free_functions(int function_number) { - int i, j; + int i, j; - for (i = 0; i <= function_number; i++) { - for (j = 0; j < functions[i].num_args; j++) - free(functions[i].args[j]); - free(functions[i].name); - free(functions[i].desc); - free(functions[i].returns); - } - free(functions); + for (i = 0; i <= function_number; i++) { + for (j = 0; j < functions[i].num_args; j++) + free(functions[i].args[j]); + free(functions[i].name); + free(functions[i].desc); + free(functions[i].returns); + } + free(functions); } int count_functions(int num_funcs, int private) { - int i, num = 0; + int i, num = 0; - for (i = 0; i < num_funcs; i++) - if ((functions[i].name != NULL) && (functions[i].private == private)) - num++; + for (i = 0; i < num_funcs; i++) + if ((functions[i].name != NULL) && (functions[i].private == private)) + num++; - return num; + return num; } int main(int argc, char *argv[]) { - char line[1024] = { 0 }; - short in_comment = 0; - int function_number = -1; - int arg_number = 0; - int private = 0; - int idx = 1; - FILE *fp; + char line[1024] = { 0 }; + bool in_comment = false; + int function_number = -1; + int arg_number = 0; + int private = 0; + int idx = 1; + int i, j; + FILE *fp; - if (argc < 3) { - fprintf(stderr, "Syntax: %s [-p|--private] source-file output-in-file\n", argv[0]); - return 1; - } + if (argc < 3) { + fprintf(stderr, "Syntax: %s [-p|--private] source-file output-in-file\n", argv[0]); + return 1; + } - if ((strcmp(argv[1], "-p") == 0) || (strcmp(argv[1], "--private") == 0)) { - if (argc < 4) { - fprintf(stderr, "Syntax: %s [-p|--private] source-file output-in-file\n", argv[0]); - return 1; - } + if ((strcmp(argv[1], "-p") == 0) || (strcmp(argv[1], "--private") == 0)) { + if (argc < 4) { + fprintf(stderr, "Syntax: %s [-p|--private] source-file output-in-file\n", argv[0]); + return 1; + } - private = 1; - idx++; - } + private = 1; + idx++; + } - if (access(argv[idx], R_OK) != 0) - bail_error("Cannot open file %s", argv[1]); + if (access(argv[idx], R_OK) != 0) + bail_error("Cannot open file %s", argv[1]); - fp = fopen(argv[idx], "r"); - if (fp == NULL) - bail_error("Error while opening %s", argv[1]); + if (!(functions = (func_t *)malloc(sizeof(func_t)))) + bail_error("Out of memory"); - functions = (func_t *)malloc( sizeof(func_t) ); - while (!feof(fp)) { - fgets(line, sizeof(line), fp); + if (!(fp = fopen(argv[idx], "r"))) + bail_error("Error while opening %s", argv[1]); - /* Strip new line characters */ - if (line[strlen(line) - 1] == '\n') - line[strlen(line) - 1] = 0; + while (true) { + memset(line, 0, sizeof(line)); - if (strcmp(line, "/*") == 0) { - function_number++; - in_comment = 1; - functions = (func_t *) realloc( functions, sizeof(func_t) * (function_number + 1) ); - functions[function_number].name = NULL; - functions[function_number].num_args = 0; - } - else - if (strcmp(line, "*/") == 0) - in_comment = 0; - else - if (in_comment) - parse_comment( line, function_number, &arg_number ); - memset(line, 0, sizeof(line)); - } - fclose(fp); + if (!fgets(line, sizeof(line), fp)) { + if (feof(fp)) + break; + bail_error("Unable to read form %s", argv[1]); + } - int i, j; - fp = fopen(argv[idx+1], "w"); - if (!fp) { - free_functions(function_number); - bail_error("Cannot write %s", argv[2]); - } + /* Strip new line characters */ + if (line[strlen(line) - 1] == '\n') + line[strlen(line) - 1] = 0; - fprintf(fp, "<?xml version=\"1.0\"?>\n<html>\n <body>\n"); + if (strcmp(line, "/*") == 0) { + function_number++; + in_comment = 1; + if (!(functions = (func_t *) realloc(functions, + sizeof(func_t) * (function_number + 1)))) + bail_error("Out of memory"); + functions[function_number].name = NULL; + functions[function_number].num_args = 0; + } else { + if (strcmp(line, " */") == 0) + in_comment = 0; + else if (in_comment) + parse_comment(line, function_number, &arg_number); + } + } + fclose(fp); - fprintf(fp,"<h1>%s API Reference guide</h1>\n\n <h3>Functions</h3>\n\n <!-- Links -->\n", (private == 0) ? "PHP" : "Developer's"); - fprintf(fp, "<pre>Total number of functions: %d. Functions supported are:<br /><br />\n", count_functions(function_number, private)); - for (i = 0; i <= function_number; i++) { - if ((functions[i].name != NULL) && (functions[i].private == private)) { - fprintf(fp, "\t<code class=\"docref\">%s</code>(", functions[i].name); + if (!(fp = fopen(argv[idx+1], "w"))) { + free_functions(function_number); + bail_error("Cannot write %s", argv[2]); + } - for (j = 0; j < functions[i].num_args; j++) { - if (strcmp(functions[i].args[j], "None") != 0) { - char *new = get_lpart(functions[i].args[j]); - char *part; - int decrement; + fprintf(fp, "<?xml version=\"1.0\"?>\n<html>\n <body>\n"); - if (new[0] == '@') - new++; + fprintf(fp,"<h1>%s API Reference guide</h1>\n\n <h3>Functions</h3>\n\n <!-- Links -->\n", (private == 0) ? "PHP" : "Developer's"); + fprintf(fp, "<pre>Total number of functions: %d. Functions supported are:<br /><br />\n", count_functions(function_number, private)); + for (i = 0; i <= function_number; i++) { + if ((functions[i].name != NULL) && (functions[i].private == private)) { + fprintf(fp, "\t<code class=\"docref\">%s</code>(", functions[i].name); - part = strchr(new, ' '); - decrement = (part != NULL) ? strlen( part ) : 0; + for (j = 0; j < functions[i].num_args; j++) { + if (strcmp(functions[i].args[j], "None") != 0) { + char *new = get_lpart(functions[i].args[j]); + char *part; + int decrement; - if (j > 0) - fprintf(fp, ", "); + if (new[0] == '@') + new++; - new[ strlen(new) - decrement ] = 0; - fprintf(fp, "$%s", new); - } - } + part = strchr(new, ' '); + decrement = (part != NULL) ? strlen( part ) : 0; - fprintf(fp, ")<br />\n"); - } - } + if (j > 0) + fprintf(fp, ", "); - fprintf(fp, "</pre>\n"); + new[ strlen(new) - decrement ] = 0; + fprintf(fp, "$%s", new); + } + } - for (i = 0; i <= function_number; i++) { - if ((functions[i].name != NULL) && (functions[i].private == private)) { - fprintf(fp, "<h3><a name=\"%s\"><code>%s</code></a></h3>\n", functions[i].name, functions[i].name); - fprintf(fp, "<pre class=\"programlisting\">%s(", functions[i].name); + fprintf(fp, ")<br />\n"); + } + } - for (j = 0; j < functions[i].num_args; j++) { - if (strcmp(functions[i].args[j], "None") != 0) { - char *new = get_lpart(functions[i].args[j]); - char *part; - int decrement; + fprintf(fp, "</pre>\n"); - if (new[0] == '@') - new++; + for (i = 0; i <= function_number; i++) { + if ((functions[i].name != NULL) && (functions[i].private == private)) { + fprintf(fp, "<h3><a name=\"%s\"><code>%s</code></a></h3>\n", functions[i].name, functions[i].name); + fprintf(fp, "<pre class=\"programlisting\">%s(", functions[i].name); - part = strchr(new, ' '); - decrement = (part != NULL) ? strlen( part ) : 0; + for (j = 0; j < functions[i].num_args; j++) { + if (strcmp(functions[i].args[j], "None") != 0) { + char *new = get_lpart(functions[i].args[j]); + char *part; + int decrement; - if (j > 0) - fprintf(fp, ", "); + if (new[0] == '@') + new++; - new[ strlen(new) - decrement ] = 0; - fprintf(fp, "$%s", new); - } - } + part = strchr(new, ' '); + decrement = (part != NULL) ? strlen( part ) : 0; - fprintf(fp, ")</pre>\n"); - fprintf(fp, "<p>[Since version %s]</p>\n", functions[i].version); - fprintf(fp, "<p>%s.</p>", functions[i].desc); - fprintf(fp, "<div class=\"variablelist\">\n"); - fprintf(fp, "\t<table border=\"0\">\n"); - fprintf(fp, "\t\t<col align=\"left\" />\n"); - fprintf(fp, "\t\t<tbody>\n"); + if (j > 0) + fprintf(fp, ", "); - for (j = 0; j < functions[i].num_args; j++) { - if (strcmp(functions[i].args[j], "None") != 0) { - fprintf(fp, "\t\t <tr>\n"); - fprintf(fp, "\t\t <td>\n"); - fprintf(fp, "\t\t\t<span class=\"term\"><i><tt>%s</tt></i>:</span>\n", get_lpart(functions[i].args[j]) ); - fprintf(fp, "\t\t </td>\n"); - fprintf(fp, "\t\t <td>\n"); - fprintf(fp, "\t\t\t%s\n", get_rpart(functions[i].args[j])); - fprintf(fp, "\t\t </td>\n"); - fprintf(fp, "\t\t </tr>\n"); - } - } + new[ strlen(new) - decrement ] = 0; + fprintf(fp, "$%s", new); + } + } - fprintf(fp, "\t\t <tr>\n"); - fprintf(fp, "\t\t <td>\n"); - fprintf(fp, "\t\t\t<span class=\"term\"><i><tt>Returns</tt></i>:</span>\n"); - fprintf(fp, "\t\t </td>\n"); - fprintf(fp, "\t\t <td>\n"); - fprintf(fp, "\t\t\t%s\n", functions[i].returns); - fprintf(fp, "\t\t </td>\n"); - fprintf(fp, "\t\t </tr>\n"); - fprintf(fp, "\t\t</tbody>\n"); - fprintf(fp, "\t</table>\n"); - fprintf(fp, "</div>\n"); - } - } - fclose(fp); + fprintf(fp, ")</pre>\n"); + fprintf(fp, "<p>[Since version %s]</p>\n", functions[i].version); + fprintf(fp, "<p>%s.</p>", functions[i].desc); + fprintf(fp, "<div class=\"variablelist\">\n"); + fprintf(fp, "\t<table border=\"0\">\n"); + fprintf(fp, "\t\t<col align=\"left\" />\n"); + fprintf(fp, "\t\t<tbody>\n"); - free_functions(function_number); - printf("Documentation has been generated successfully\n"); - return 0; + for (j = 0; j < functions[i].num_args; j++) { + if (strcmp(functions[i].args[j], "None") != 0) { + fprintf(fp, "\t\t <tr>\n"); + fprintf(fp, "\t\t <td>\n"); + fprintf(fp, "\t\t\t<span class=\"term\"><i><tt>%s</tt></i>:</span>\n", get_lpart(functions[i].args[j]) ); + fprintf(fp, "\t\t </td>\n"); + fprintf(fp, "\t\t <td>\n"); + fprintf(fp, "\t\t\t%s\n", get_rpart(functions[i].args[j])); + fprintf(fp, "\t\t </td>\n"); + fprintf(fp, "\t\t </tr>\n"); + } + } + + fprintf(fp, "\t\t <tr>\n"); + fprintf(fp, "\t\t <td>\n"); + fprintf(fp, "\t\t\t<span class=\"term\"><i><tt>Returns</tt></i>:</span>\n"); + fprintf(fp, "\t\t </td>\n"); + fprintf(fp, "\t\t <td>\n"); + fprintf(fp, "\t\t\t%s\n", functions[i].returns); + fprintf(fp, "\t\t </td>\n"); + fprintf(fp, "\t\t </tr>\n"); + fprintf(fp, "\t\t</tbody>\n"); + fprintf(fp, "\t</table>\n"); + fprintf(fp, "</div>\n"); + } + } + fclose(fp); + + free_functions(function_number); + printf("Documentation has been generated successfully\n"); + return 0; } - -- 2.3.6 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list