version 1.273, 2015/08/29 20:26:04 |
version 1.274, 2015/08/29 21:37:20 |
Line 3080 roff_userdef(ROFF_ARGS) |
|
Line 3080 roff_userdef(ROFF_ARGS) |
|
{ |
{ |
const char *arg[9], *ap; |
const char *arg[9], *ap; |
char *cp, *n1, *n2; |
char *cp, *n1, *n2; |
int i; |
int i, ib, ie; |
size_t asz, rsz; |
size_t asz, rsz; |
|
|
/* |
/* |
Line 3114 roff_userdef(ROFF_ARGS) |
|
Line 3114 roff_userdef(ROFF_ARGS) |
|
continue; |
continue; |
if (*cp++ != '$') |
if (*cp++ != '$') |
continue; |
continue; |
i = *cp - '1'; |
if (*cp == '*') { /* \\$* inserts all arguments */ |
if (0 > i || 8 < i) |
ib = 0; |
continue; |
ie = r->argc - 1; |
|
} else { /* \\$1 .. \\$9 insert one argument */ |
|
ib = ie = *cp - '1'; |
|
if (ib < 0 || ib > 8) |
|
continue; |
|
} |
cp -= 2; |
cp -= 2; |
|
|
/* |
/* |
Line 3124 roff_userdef(ROFF_ARGS) |
|
Line 3129 roff_userdef(ROFF_ARGS) |
|
* taking escaping of quotes into account. |
* taking escaping of quotes into account. |
*/ |
*/ |
|
|
asz = 0; |
asz = ie > ib ? ie - ib : 0; /* for blanks */ |
for (ap = arg[i]; *ap != '\0'; ap++) { |
for (i = ib; i <= ie; i++) { |
asz++; |
for (ap = arg[i]; *ap != '\0'; ap++) { |
if (*ap == '"') |
asz++; |
asz += 3; |
if (*ap == '"') |
|
asz += 3; |
|
} |
} |
} |
if (asz != 3) { |
if (asz != 3) { |
|
|
Line 3169 roff_userdef(ROFF_ARGS) |
|
Line 3176 roff_userdef(ROFF_ARGS) |
|
/* Copy the expanded argument, escaping quotes. */ |
/* Copy the expanded argument, escaping quotes. */ |
|
|
n2 = cp; |
n2 = cp; |
for (ap = arg[i]; *ap != '\0'; ap++) { |
for (i = ib; i <= ie; i++) { |
if (*ap == '"') { |
for (ap = arg[i]; *ap != '\0'; ap++) { |
memcpy(n2, "\\(dq", 4); |
if (*ap == '"') { |
n2 += 4; |
memcpy(n2, "\\(dq", 4); |
} else |
n2 += 4; |
*n2++ = *ap; |
} else |
|
*n2++ = *ap; |
|
} |
|
if (i < ie) |
|
*n2++ = ' '; |
} |
} |
} |
} |
|
|