This is the mail archive of the newlib@sources.redhat.com mailing list for the newlib project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[RFA] wcswidth and wcwidth


Hi,

attached is an implementation of wcswidth and wcwidth as described in SUSv3,
see http://www.opengroup.org/onlinepubs/007904975/functions/wcswidth.html
and http://www.opengroup.org/onlinepubs/007904975/functions/wcwidth.html

Since newlib doesn't have width tables for characters, all printable
characters are treated equally as having a width of 1, all control chars
have a width of 0.  Any other non-printable, non-control character is
treated as non-existant in the current locale, so wcwidth returns a
width of -1.

wcswidth is implemented using wcwidth.

Ok to commit?

Corinna

2003-04-03  Corinna Vinschen  <corinna at vinschen dot de>

	* libc/include/wchar.h: Add definitions for wcswidth and wcwidth.
	* libc/string/Makefile.am: Add wcswidth.c and wcwidth.c
	* libc/string/Makefile.in: Regenerated.
	* libc/string/wcswidth.c: New file.
	* libc/string/wcwidth.c: New file.
	* libc/string/wcstrings.tex: Add wcswidth and wcwidth.

Index: libc/include/wchar.h
===================================================================
RCS file: /cvs/src/src/newlib/libc/include/wchar.h,v
retrieving revision 1.9
diff -p -u -r1.9 wchar.h
--- libc/include/wchar.h	3 Apr 2003 08:26:07 -0000	1.9
+++ libc/include/wchar.h	3 Apr 2003 10:21:59 -0000
@@ -62,6 +62,8 @@ wchar_t	*_EXFUN(wcspbrk, (const wchar_t 
 wchar_t	*_EXFUN(wcsrchr, (const wchar_t *, wchar_t));
 size_t	_EXFUN(wcsspn, (const wchar_t *, const wchar_t *));
 wchar_t	*_EXFUN(wcsstr, (const wchar_t *, const wchar_t *));
+int	_EXFUN(wcswidth, (const wchar_t *, size_t));
+int	_EXFUN(wcwidth, (const wchar_t));
 wchar_t	*_EXFUN(wmemchr, (const wchar_t *, wchar_t, size_t));
 int	_EXFUN(wmemcmp, (const wchar_t *, const wchar_t *, size_t));
 wchar_t	*_EXFUN(wmemcpy, (wchar_t * , const wchar_t * , size_t));
Index: libc/string/Makefile.am
===================================================================
RCS file: /cvs/src/src/newlib/libc/string/Makefile.am,v
retrieving revision 1.11
diff -p -u -r1.11 Makefile.am
--- libc/string/Makefile.am	3 Apr 2003 08:26:07 -0000	1.11
+++ libc/string/Makefile.am	3 Apr 2003 10:21:59 -0000
@@ -61,6 +61,8 @@ GENERAL_SOURCES = \
 	wcsrchr.c \
 	wcsspn.c \
 	wcsstr.c \
+	wcswidth.c \
+	wcwidth.c \
 	wmemchr.c \
 	wmemcmp.c \
 	wmemcpy.c \
@@ -109,7 +111,8 @@ wcscat.def	wcschr.def	wcscmp.def	wcscoll
 wcscpy.def wcscspn.def \
 wcslcat.def	wcslcpy.def	wcslen.def	wcsncat.def wcsncmp.def \
 wcsncpy.def	wcspbrk.def	wcsrchr.def	wcsspn.def wcsstr.def \
-wmemchr.def	wmemcmp.def	wmemcpy.def	wmemmove.def wmemset.def
+wcswidth.def	wcwidth.def	wmemchr.def	wmemcmp.def wmemcpy.def \
+wmemmove.def	wmemset.def
 
 SUFFIXES = .def
 
Index: libc/string/Makefile.in
===================================================================
RCS file: /cvs/src/src/newlib/libc/string/Makefile.in,v
retrieving revision 1.15
diff -p -u -r1.15 Makefile.in
--- libc/string/Makefile.in	3 Apr 2003 08:26:07 -0000	1.15
+++ libc/string/Makefile.in	3 Apr 2003 10:21:59 -0000
@@ -167,6 +167,8 @@ GENERAL_SOURCES = \
 	wcsrchr.c \
 	wcsspn.c \
 	wcsstr.c \
+	wcswidth.c \
+	wcwidth.c \
 	wmemchr.c \
 	wmemcmp.c \
 	wmemcpy.c \
@@ -207,7 +209,8 @@ wcscat.def	wcschr.def	wcscmp.def	wcscoll
 wcscpy.def wcscspn.def \
 wcslcat.def	wcslcpy.def	wcslen.def	wcsncat.def wcsncmp.def \
 wcsncpy.def	wcspbrk.def	wcsrchr.def	wcsspn.def wcsstr.def \
-wmemchr.def	wmemcmp.def	wmemcpy.def	wmemmove.def wmemset.def
+wcswidth.def	wcwidth.def	wmemchr.def	wmemcmp.def wmemcpy.def \
+wmemmove.def	wmemset.def
 
 
 SUFFIXES = .def
@@ -246,9 +249,9 @@ LIBS = @LIBS@
 @USE_LIBTOOL_FALSE at wcslcpy dot $(OBJEXT) wcslen.$(OBJEXT) wcsncat.$(OBJEXT) \
 @USE_LIBTOOL_FALSE at wcsncmp dot $(OBJEXT) wcsncpy.$(OBJEXT) \
 @USE_LIBTOOL_FALSE at wcspbrk dot $(OBJEXT) wcsrchr.$(OBJEXT) wcsspn.$(OBJEXT) \
- at USE_LIBTOOL_FALSE@wcsstr.$(OBJEXT) wmemchr.$(OBJEXT) wmemcmp.$(OBJEXT) \
- at USE_LIBTOOL_FALSE@wmemcpy.$(OBJEXT) wmemmove.$(OBJEXT) \
- at USE_LIBTOOL_FALSE@wmemset.$(OBJEXT)
+ at USE_LIBTOOL_FALSE@wcsstr.$(OBJEXT) wcswidth.$(OBJEXT) wcwidth.$(OBJEXT) \
+ at USE_LIBTOOL_FALSE@wmemchr.$(OBJEXT) wmemcmp.$(OBJEXT) wmemcpy.$(OBJEXT) \
+ at USE_LIBTOOL_FALSE@wmemmove.$(OBJEXT) wmemset.$(OBJEXT)
 LTLIBRARIES =  $(noinst_LTLIBRARIES)
 
 @USE_LIBTOOL_TRUE at libstring_la_OBJECTS =  bcopy.lo bzero.lo index.lo \
@@ -263,8 +266,8 @@ LTLIBRARIES =  $(noinst_LTLIBRARIES)
 @USE_LIBTOOL_TRUE at wcscat dot lo wcschr.lo wcscmp.lo wcscoll.lo wcscpy.lo \
 @USE_LIBTOOL_TRUE at wcscspn dot lo wcslcat.lo wcslcpy.lo wcslen.lo wcsncat.lo \
 @USE_LIBTOOL_TRUE at wcsncmp dot lo wcsncpy.lo wcspbrk.lo wcsrchr.lo wcsspn.lo \
- at USE_LIBTOOL_TRUE@wcsstr.lo wmemchr.lo wmemcmp.lo wmemcpy.lo wmemmove.lo \
- at USE_LIBTOOL_TRUE@wmemset.lo
+ at USE_LIBTOOL_TRUE@wcsstr.lo wcswidth.lo wcwidth.lo wmemchr.lo wmemcmp.lo \
+ at USE_LIBTOOL_TRUE@wmemcpy.lo wmemmove.lo wmemset.lo
 CFLAGS = @CFLAGS@
 COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
 LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
Index: libc/string/wcstrings.tex
===================================================================
RCS file: /cvs/src/src/newlib/libc/string/wcstrings.tex,v
retrieving revision 1.2
diff -p -u -r1.2 wcstrings.tex
--- libc/string/wcstrings.tex	3 Apr 2003 08:26:07 -0000	1.2
+++ libc/string/wcstrings.tex	3 Apr 2003 10:21:59 -0000
@@ -27,6 +27,8 @@ declarations are in @file{wchar.h}.
 * wcsrchr::     Reverse search for wide-character in string
 * wcsspn::      Find initial match in wide-character string
 * wcsstr::      Find wide-character string segment
+* wcswidth::    Number of column positions of a wide-character string
+* wcwidth::     Number of column positions of a wide-character code
 @end menu
 
 @page
@@ -91,4 +93,10 @@ declarations are in @file{wchar.h}.
 
 @page
 @include string/wcsstr.def
+
+ at page
+ at include string/wcswidth.def
+
+ at page
+ at include string/wcwidth.def
 
Index: libc/string/wcswidth.c
===================================================================
RCS file: libc/string/wcswidth.c
diff -N libc/string/wcswidth.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ libc/string/wcswidth.c	3 Apr 2003 10:21:59 -0000
@@ -0,0 +1,56 @@
+/*
+FUNCTION
+	<<wcswidth>>---number of column positions of a wide-character string
+	
+INDEX
+	wcswidth
+
+ANSI_SYNOPSIS
+	#include <wchar.h>
+	int wcswidth(const wchar_t *<[pwcs]>, size_t <[n]>);
+
+TRAD_SYNOPSIS
+	#include <wchar.h>
+	int wcswidth(<[pwcs]>, <[n]>)
+	wchar_t *<[wc]>;
+	size_t <[n]>;
+
+DESCRIPTION
+	The <<wcswidth>> function shall determine the number of column
+	positions required for n wide-character codes (or fewer than n
+	wide-character codes if a null wide-character code is encountered
+	before n wide-character codes are exhausted) in the string pointed
+	to by pwcs.
+
+RETURNS
+	The <<wcswidth>> function either shall return 0 (if pwcs points to a
+	null wide-character code), or return the number of column positions
+	to be occupied by the wide-character string pointed to by pwcs, or
+	return -1 (if any of the first n wide-character codes in the
+	wide-character string pointed to by pwcs is not a printable
+	wide-character code).
+
+PORTABILITY
+<<wcswidth>> has been introduced in the Single UNIX Specification Volume 2
+<<wcswidth>> has been marked as extension in Single UNIX Specification Volume 3
+*/
+
+#include <_ansi.h>
+#include <wchar.h>
+
+int
+_DEFUN (wcswidth, (pwcs, n),
+	_CONST wchar_t *pwcs _AND
+	size_t n)
+
+{
+  int w, len = 0;
+  if (!pwcs || n == 0)
+    return 0;
+  do {
+    if ((w = wcwidth (*pwcs)) < 0)
+      return -1;
+    len += w;
+  } while (*pwcs++ || --n > 0);
+  return len;
+}
Index: libc/string/wcwidth.c
===================================================================
RCS file: libc/string/wcwidth.c
diff -N libc/string/wcwidth.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ libc/string/wcwidth.c	3 Apr 2003 10:21:59 -0000
@@ -0,0 +1,53 @@
+/*
+FUNCTION
+	<<wcwidth>>---number of column positions of a wide-character code
+	
+INDEX
+	wcwidth
+
+ANSI_SYNOPSIS
+	#include <wchar.h>
+	int wcwidth(const wchar_t <[wc]>);
+
+TRAD_SYNOPSIS
+	#include <wchar.h>
+	int wcwidth(<[wc]>)
+	wchar_t *<[wc]>;
+
+DESCRIPTION
+	The <<wcwidth>> function shall determine the number of column
+	positions required for the wide character wc. The application
+	shall ensure that the value of wc is a character representable
+	as a wchar_t, and is a wide-character code corresponding to a
+	valid character in the current locale.
+
+RETURNS
+	The <<wcwidth>> function shall either return 0 (if wc is a null
+	wide-character code), or return the number of column positions to
+	be occupied by the wide-character code wc, or return -1 (if wc
+	does not correspond to a printable wide-character code).
+
+	The current implementation of <<wcwidth>> simply sets the width
+	of all printable characters to 1 since newlib has no character
+	tables around.
+
+PORTABILITY
+<<wcwidth>> has been introduced in the Single UNIX Specification Volume 2
+<<wcwidth>> has been marked as extension in Single UNIX Specification Volume 3
+*/
+
+#include <_ansi.h>
+#include <wchar.h>
+#include <wctype.h>
+
+int
+_DEFUN (wcwidth, (wc),
+	_CONST wchar_t wc)
+
+{
+  if (iswprint (wc))
+    return 1;
+  if (iswcntrl (wc) || wc == L'\0')
+    return 0;
+  return -1;
+}

-- 
Corinna Vinschen
Cygwin Developer
Red Hat, Inc.
mailto:vinschen at redhat dot com


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]