Slightly improve \w width measurements:
authorschwarze <schwarze@openbsd.org>
Thu, 22 Jan 2015 22:50:31 +0000 (22:50 +0000)
committerschwarze <schwarze@openbsd.org>
Thu, 22 Jan 2015 22:50:31 +0000 (22:50 +0000)
Count special characters with the same width as ASCII characters
and treat all other escape sequences as if they had a width of 0.
Certainly not perfect, but a bit better.
For example, GNU RCS ci(1) needs this; reported by naddy@.

usr.bin/mandoc/roff.c

index 75f45c4..6e38f63 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: roff.c,v 1.124 2015/01/21 02:16:11 schwarze Exp $ */
+/*     $OpenBSD: roff.c,v 1.125 2015/01/22 22:50:31 schwarze Exp $ */
 /*
  * Copyright (c) 2010, 2011, 2012, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2015 Ingo Schwarze <schwarze@openbsd.org>
@@ -1002,8 +1002,9 @@ roff_res(struct roff *r, struct buf *buf, int ln, int pos)
 
                /* Advance to the end of the name. */
 
+               naml = 0;
                arg_complete = 1;
-               for (naml = 0; maxl == 0 || naml < maxl; naml++, cp++) {
+               while (maxl == 0 || naml < maxl) {
                        if (*cp == '\0') {
                                mandoc_msg(MANDOCERR_ESC_BAD, r->parse,
                                    ln, (int)(stesc - buf->buf), stesc);
@@ -1014,6 +1015,23 @@ roff_res(struct roff *r, struct buf *buf, int ln, int pos)
                                cp++;
                                break;
                        }
+                       if (*cp++ != '\\' || stesc[1] != 'w') {
+                               naml++;
+                               continue;
+                       }
+                       switch (mandoc_escape(&cp, NULL, NULL)) {
+                       case ESCAPE_SPECIAL:
+                               /* FALLTHROUGH */
+                       case ESCAPE_UNICODE:
+                               /* FALLTHROUGH */
+                       case ESCAPE_NUMBERED:
+                               /* FALLTHROUGH */
+                       case ESCAPE_OVERSTRIKE:
+                               naml++;
+                               break;
+                       default:
+                               break;
+                       }
                }
 
                /*