diff options
author | Kristian Høgsberg <krh@bitplanet.net> | 2012-05-07 23:41:48 -0400 |
---|---|---|
committer | Kristian Høgsberg <krh@bitplanet.net> | 2012-05-07 23:41:48 -0400 |
commit | 375cb418f493669c8ffdd3c716b0c8bb11364def (patch) | |
tree | 9795bc425fb9ca4564ea2c54b7fd5cf0dc00e4a1 | |
parent | 5b0d8f09af4945dad30ac0374bd617f687774fea (diff) |
scanner: Generalize desc_dump() to handle hanging indents
-rw-r--r-- | src/scanner.c | 99 |
1 files changed, 65 insertions, 34 deletions
diff --git a/src/scanner.c b/src/scanner.c index c2aa599..45d67c7 100644 --- a/src/scanner.c +++ b/src/scanner.c @@ -22,6 +22,7 @@ */ #include <stdio.h> +#include <stdarg.h> #include <string.h> #include <errno.h> #include <ctype.h> @@ -155,26 +156,59 @@ static const char *indent(int n) } static void -desc_dump(char *src, int startcol) +desc_dump(const char *fmt, ...) { - int i, j, col = startcol; + va_list ap; + char buf[128], *desc, hang; + int col, i, j, k, startcol; + + va_start(ap, fmt); + vsnprintf(buf, sizeof buf, fmt, ap); + desc = va_arg(ap, char *); + va_end(ap); + + for (i = 0, col = 0; buf[i] != '*'; i++) { + if (buf[i] == '\t') + col = (col + 8) & ~7; + else + col++; + } + + printf("%s", buf); - for (i = 0; src[i]; i++) { - if (isspace(src[i])) - continue; + if (!desc) { + printf("(none)\n"); + return; + } + + startcol = col; + col += strlen(&buf[i]); + if (col - startcol > 2) + hang = '\t'; + else + hang = ' '; + + for (i = 0; desc[i]; ) { + k = i; + while (desc[i] && isspace(desc[i])) + i++; + if (!desc[i]) + break; j = i; - while (src[i] && !isspace(src[i])) + while (desc[i] && !isspace(desc[i])) i++; if (col + i - j > 72) { - printf("\n%s * ", indent(startcol)); + printf("\n%s*%c", indent(startcol), hang); col = startcol; } - col += printf("%s%.*s", - col > startcol ? " " : "", i - j, &src[j]); + if (col > startcol && k > 0) + col += printf(" "); + col += printf("%.*s", i - j, &desc[j]); } + putchar('\n'); } static void @@ -638,20 +672,19 @@ emit_enumerations(struct interface *interface) interface->uppercase_name, e->uppercase_name); if (desc) { - printf("/**\n" - " * %s_%s - %s\n", interface->name, - e->name, desc->summary); + printf("/**\n"); + desc_dump(" * %s_%s - ", + interface->name, e->name, desc->summary); wl_list_for_each(entry, &e->entry_list, link) { - printf(" * @%s_%s_%s: %s\n", - interface->uppercase_name, - e->uppercase_name, - entry->uppercase_name, - entry->summary); + desc_dump(" * @%s_%s_%s: ", + interface->uppercase_name, + e->uppercase_name, + entry->uppercase_name, + entry->summary); } if (desc->text) { - printf(" *\n" - " * "); - desc_dump(desc->text, 0); + printf(" *\n"); + desc_dump(" * ", desc->text); } printf(" */\n"); } @@ -680,16 +713,15 @@ emit_structs(struct wl_list *message_list, struct interface *interface) is_interface = message_list == &interface->request_list; if (interface->description) { struct description *desc = interface->description; - printf("/**\n" - " * %s - %s\n", interface->name, desc->summary); + printf("/**\n"); + desc_dump(" * %s - ", interface->name, desc->summary); wl_list_for_each(m, message_list, link) { struct description *mdesc = m->description; - printf(" * @%s: %s\n", m->name, mdesc ? mdesc->summary : - "(none)"); + desc_dump(" * @%s: ", + m->name, mdesc ? mdesc->summary : "(none)"); } - printf(" *\n" - " * "); - desc_dump(desc->text, 0); + printf(" *\n"); + desc_dump(" * ", desc->text); printf(" */\n"); } printf("struct %s_%s {\n", interface->name, @@ -699,16 +731,15 @@ emit_structs(struct wl_list *message_list, struct interface *interface) struct description *mdesc = m->description; printf("\t/**\n"); - printf("\t * %s - %s\n", m->name, mdesc ? mdesc->summary : - "(none)"); + desc_dump("\t * %s - ", + m->name, mdesc ? mdesc->summary : "(none)"); wl_list_for_each(a, &m->arg_list, link) { - printf("\t * @%s: %s\n", a->name, a->summary ? - a->summary : "(none)"); + desc_dump("\t * @%s: ", + a->name, a->summary ? a->summary : "(none)"); } if (mdesc) { - printf("\t * "); - desc_dump(mdesc->text, 8); - printf("\n"); + printf("\t *\n"); + desc_dump("\t * ", mdesc->text, 8, 0); } if (m->since > 1) { printf("\t * @since: %d\n", m->since); |