From ddf03b6151931ec010d247443df9f86663431afe Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Sun, 14 Sep 2014 07:35:56 -0700 Subject: Implementing \$* argument expansion. --- man2html/man2html.c | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) (limited to 'man2html') diff --git a/man2html/man2html.c b/man2html/man2html.c index 6565b30..98f7993 100644 --- a/man2html/man2html.c +++ b/man2html/man2html.c @@ -52,6 +52,7 @@ static char *scan_troff(char *c, int san, char **result); static char *scan_troff_mandoc(char *c, int san, char **result); static char **argument=NULL; +int nargs; static char charb[5]; @@ -521,6 +522,26 @@ int intresult=0; static int skip_escape=0; static int single_escape=0; +static char * +cat_args(int argc, char **argv) +{ + int i; + size_t needed; + char *out, *ptr; + + for (needed = 1 + (argc > 1 ? argc - 1 : argc), i = 0; + i < argc; + needed += strlen(argv[i]), i++) + ; /* empty */ + + ptr = out = xmalloc(needed); + + for (*ptr = 0, i = 0; i < argc; i++) + ptr += sprintf(ptr, "%s%s", argv[i], (i < argc - 1) ? " " : ""); + + return out; +} + static char * scan_escape(char *c) { char *h=NULL; @@ -539,8 +560,16 @@ scan_escape(char *c) { case '$': if (argument) { c++; - i=(*c -'1'); - if (!(h=argument[i])) h=""; + if (isdigit(*c)) { + i=(*c -'1'); + if (i >= nargs) + abort(); + if (!(h=argument[i])) h=""; + } else if (*c == '*') { + h = cat_args(nargs, argument); /* This is leaked; oh well! */ + } else { + abort(); + } } break; case 'z': @@ -2751,6 +2780,7 @@ scan_request(char *c) { while (owndef && owndef->nr!=i) owndef=owndef->next; if (owndef) { char **oldargument; + int oldnargs; int deflen; int onff; sl=fill_words(c+j, wordlist, SIZE(wordlist), &words, '\n'); @@ -2772,7 +2802,9 @@ scan_request(char *c) { owndef->st[deflen+1]='a'; for (i=0; (owndef->st[deflen+2+i] = owndef->st[i]); i++); oldargument=argument; + oldnargs=nargs; argument=wordlist; + nargs=words; onff=newline_for_fun; if (mandoc_command) scan_troff_mandoc(owndef->st+deflen+2, 0, NULL); @@ -2780,6 +2812,7 @@ scan_request(char *c) { scan_troff(owndef->st+deflen+2, 0, NULL); newline_for_fun=onff; argument=oldargument; + nargs=oldnargs; for (i=0; i