summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--man2html/man2html.c37
1 files changed, 35 insertions, 2 deletions
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];
@@ -522,6 +523,26 @@ 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;
char b[5];
@@ -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<words; i++) if (wordlist[i]) free(wordlist[i]);
*sl='\n';
} else if (mandoc_command &&