+/* Return the number of columns required to display a localised string */
+static int strncols(const char *str)
+{
+ int i, wlen, ncols = 0;
+ wchar_t *wstr;
+
+ wlen = mbstowcs(NULL, str, 0);
+ if (wlen <= 0)
+ return wlen;
+
+ wstr = malloc(sizeof(wchar_t) * wlen + 1);
+ if (!wstr)
+ return -1;
+
+ wlen = mbstowcs(wstr, str, wlen);
+ if (wlen <= 0) {
+ free(wstr);
+ return wlen;
+ }
+
+ /* Processing each character individually lets us use the same
+ * check for all languages */
+ for (i = 0; i < wlen; i++) {
+ ncols += wcwidth(wstr[i]);
+ }
+
+ free(wstr);
+ return ncols;
+}
+