]> git.cameronkatri.com Git - mandoc.git/blobdiff - roff_escape.c
Rudimentary implementation of the \A escape sequence, following groff
[mandoc.git] / roff_escape.c
index 3c38ced711a2c77e95fd4d7028fc67a3d8668708..20e5267a59f287167072e4d671956f4eadd0ef65 100644 (file)
@@ -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':