diff options
Diffstat (limited to 'roff_escape.c')
-rw-r--r-- | roff_escape.c | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/roff_escape.c b/roff_escape.c index 3c38ced7..20e5267a 100644 --- a/roff_escape.c +++ b/roff_escape.c @@ -73,6 +73,7 @@ roff_escape(const char *buf, const int ln, const int aesc, int maxl; /* expected length of the argument */ int argl; /* actual length of the argument */ int c, i; /* for \[char...] parsing */ + int valid_A; /* for \A parsing */ enum mandoc_esc rval; /* return value */ enum mandocerr err; /* diagnostic code */ char esc_name; @@ -181,12 +182,12 @@ roff_escape(const char *buf, const int ln, const int aesc, /* Quoted arguments */ + case 'A': case 'B': case 'w': rval = ESCAPE_EXPAND; term = '\b'; break; - case 'A': case 'D': case 'H': case 'L': @@ -301,6 +302,7 @@ roff_escape(const char *buf, const int ln, const int aesc, /* Advance to the end of the argument. */ + valid_A = 1; iendarg = iarg; while (maxl > 0) { if (buf[iendarg] == '\0') { @@ -319,11 +321,20 @@ roff_escape(const char *buf, const int ln, const int aesc, break; } if (buf[iendarg] == buf[iesc]) { - if (roff_escape(buf, ln, iendarg, - &sesc, &sarg, &sendarg, &send) == ESCAPE_EXPAND) + switch (roff_escape(buf, ln, iendarg, + &sesc, &sarg, &sendarg, &send)) { + case ESCAPE_EXPAND: goto out_sub; + case ESCAPE_UNDEF: + break; + default: + valid_A = 0; + break; + } iendarg = iend = send; } else { + if (buf[iendarg] == ' ' || buf[iendarg] == '\t') + valid_A = 0; if (maxl != INT_MAX) maxl--; iend = ++iendarg; @@ -342,6 +353,10 @@ roff_escape(const char *buf, const int ln, const int aesc, buf[iarg] == '.' && buf[iarg + 1] == 'T') rval = ESCAPE_DEVICE; break; + case 'A': + if (valid_A == 0) + iendarg = iarg; + break; case 'O': switch (buf[iarg]) { case '0': |