Fix bug 161288:
authorMatthias Clasen <mclasen@redhat.com>
Mon, 18 Dec 2006 14:38:07 +0000 (14:38 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Mon, 18 Dec 2006 14:38:07 +0000 (14:38 +0000)
2006-12-18  Matthias Clasen  <mclasen@redhat.com>

        Fix bug 161288:

        * configure.in: Check for wcslen.

        * glib/gnulib/vasnprintf.c: Handle wcslen missing.

ChangeLog
configure.in
glib/gnulib/vasnprintf.c

index b014992..9d2cd95 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
 2006-12-18  Matthias Clasen  <mclasen@redhat.com>
 
+       Fix bug 161288:
+
+       * configure.in: Check for wcslen.
+
+       * glib/gnulib/vasnprintf.c: Handle wcslen missing.
+
+2006-12-18  Matthias Clasen  <mclasen@redhat.com>
+
        * glib/gkeyfile.c: Accept '@' in locale names.
 
        * glib/gkeyfile.c: Tighten up the check for allowed
index 94e7901..e4b9189 100644 (file)
@@ -917,7 +917,7 @@ gt_TYPE_WINT_T
 AC_TYPE_SIZE_T
 AC_CHECK_TYPES(ptrdiff_t)
 jm_AC_TYPE_INTMAX_T
-AC_CHECK_FUNCS(snprintf)
+AC_CHECK_FUNCS([snprintf wcslen])
 AC_FUNC_SNPRINTF_C99
 
 # Check if bcopy can be used for overlapping copies, if memmove isn't found.
index e279fc0..c31075f 100644 (file)
 #include <float.h>     /* DBL_MAX_EXP, LDBL_MAX_EXP */
 #include "printf-parse.h"
 
+#ifdef HAVE_WCHAR_T
+# ifdef HAVE_WCSLEN
+#  define local_wcslen wcslen
+# else
+   /* Solaris 2.5.1 has wcslen() in a separate library libw.so. To avoid
+      a dependency towards this library, here is a local substitute.
+      Define this substitute only once, even if this file is included
+      twice in the same compilation unit.  */
+#  ifndef local_wcslen_defined
+#   define local_wcslen_defined 1
+static size_t
+local_wcslen (const wchar_t *s)
+{
+  const wchar_t *ptr;
+
+  for (ptr = s; *ptr != (wchar_t) 0; ptr++)
+    ;
+  return ptr - s;
+}
+#  endif
+# endif
+#endif
+
 /* For those losing systems which don't have 'alloca' we have to add
    some additional code emulating it.  */ 
 #ifdef HAVE_ALLOCA 
@@ -549,7 +572,7 @@ vasnprintf (char *resultbuf, size_t *lengthp, const char *format, va_list args)
 # ifdef HAVE_WCHAR_T
                      if (type == TYPE_WIDE_STRING)
                        tmp_length =
-                         wcslen (a.arg[dp->arg_index].a.a_wide_string)
+                         local_wcslen (a.arg[dp->arg_index].a.a_wide_string)
                          * MB_CUR_MAX;
                      else
 # endif