$OpenBSD: patch-util_c,v 1.10 2015/10/30 14:12:42 bentley Exp $
--- util.c.orig	Thu Nov 21 08:54:45 2013
+++ util.c	Thu Oct 29 01:08:52 2015
@@ -38,13 +38,16 @@
 
 #include <ctype.h>
 #include <fts.h>
+#include <limits.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <wchar.h>
 
 #include "ls.h"
 #include "extern.h"
 
+#ifdef SMALL
 int
 putname(char *name)
 {
@@ -55,11 +58,85 @@ putname(char *name)
 	return len;
 }
 
+size_t
+strwidth(char *s)
+{
+	return strlen(s);
+}
+#else
+int
+putname(char *name)
+{
+	int len;
+	wchar_t wc;
+	size_t n;
+	mbstate_t mbs;
+	int w;
+
+	len = 0;
+	bzero(&mbs, sizeof(mbs));
+	while (*name) {
+		n = mbrtowc(&wc, name, MB_CUR_MAX, &mbs);
+		if (n == 0)
+			break;
+		if (n == (size_t)-1 || n == (size_t)-2) {
+			/* Filename encoding doesn't match locale encoding.
+			 * Fall back to printing single bytes. */
+			while (*name) {
+				putchar((!isprint(*name) && f_nonprint)
+				    ? '?' : *name);
+				len++;
+				name++;
+			}
+			return len;
+		}
+		name += n;
+		if (!iswprint(wc) && f_nonprint) {
+			putchar('?');
+			len++;
+		} else {
+			putwchar(wc);
+			w = wcwidth(wc);
+			if (w > 0)
+				len += w;
+		}
+	}
+	return len;
+}
+
+size_t
+strwidth(char *s)
+{
+	int width, n;
+	wchar_t wc;
+
+	width = 0;
+	while ((n = mbtowc(&wc, s, MB_LEN_MAX)) != 0) {
+		if (n == -1) {
+			width++;
+			s++;
+		} else if (iswprint(wc)) {
+			width += wcwidth(wc);
+			s += n;
+		} else {
+			width++;
+			s += n;
+		}
+	}
+	
+	return width;
+}
+#endif
+
 void
 usage(void)
 {
 	(void)fprintf(stderr,
+#ifdef COLORLS
+	    "usage: %s [-1AaCcdFfGgHhikLlmnopqRrSsTtux] [file ...]\n",
+#else
 	    "usage: %s [-1AaCcdFfgHhikLlmnopqRrSsTtux] [file ...]\n",
+#endif
 	    __progname);
 	exit(1);
 }
