Use wcwidth to exactly determine how much space a character took
authorPetr Machata <pmachata@redhat.com>
Mon, 11 Nov 2013 15:08:42 +0000 (16:08 +0100)
committerChanho Park <chanho61.park@samsung.com>
Fri, 22 Aug 2014 11:38:24 +0000 (20:38 +0900)
- So far we assumed it's one character worth of screen real-estaty per
  character written, but combining and wide characters can change
  this.

lens_default.c

index 1e57587..958114f 100644 (file)
@@ -21,6 +21,8 @@
  * 02110-1301 USA
  */
 
+#define _XOPEN_SOURCE /* For wcwidth from wchar.h.  */
+
 #include <ctype.h>
 #include <stdlib.h>
 #include <assert.h>
 #include <stdarg.h>
 #include <stdio.h>
 #include <string.h>
+#include <wchar.h>
 
 #include "bits.h"
-#include "proc.h"
-#include "lens_default.h"
-#include "value.h"
 #include "expr.h"
+#include "lens_default.h"
+#include "options.h"
+#include "output.h"
 #include "type.h"
-#include "common.h"
+#include "value.h"
 #include "zero.h"
 
 #define READER(NAME, TYPE)                                             \
@@ -587,7 +590,11 @@ format_wchar(FILE *stream, struct value *value, struct value_dict *arguments)
                return print_char(stream, buf[0]);
 
        buf[c] = 0;
-       return fprintf(stream, "%s", buf) >= 0 ? 1 : -1;
+       if (fprintf(stream, "%s", buf) < 0)
+               return -1;
+
+       c = wcwidth(wc);
+       return c >= 0 ? c : 0;
 }
 
 static int