aboutsummaryrefslogtreecommitdiff
path: root/wcsmbs/mbsrtowcs.c
diff options
context:
space:
mode:
Diffstat (limited to 'wcsmbs/mbsrtowcs.c')
-rw-r--r--wcsmbs/mbsrtowcs.c29
1 files changed, 28 insertions, 1 deletions
diff --git a/wcsmbs/mbsrtowcs.c b/wcsmbs/mbsrtowcs.c
index aa93426a5c..097e462110 100644
--- a/wcsmbs/mbsrtowcs.c
+++ b/wcsmbs/mbsrtowcs.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
+/* Copyright (C) 1996,1997,1998,1999,2000,2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.org>, 1996.
@@ -32,6 +32,16 @@
#endif
+#ifdef USE_IN_EXTENDED_LOCALE_MODEL
+size_t
+attribute_hidden
+__mbsrtowcs_l (dst, src, len, ps, l)
+ wchar_t *dst;
+ const char **src;
+ size_t len;
+ mbstate_t *ps;
+ __locale_t l;
+#else
/* This is the private state used if PS is NULL. */
static mbstate_t state;
@@ -41,6 +51,7 @@ __mbsrtowcs (dst, src, len, ps)
const char **src;
size_t len;
mbstate_t *ps;
+#endif
{
struct __gconv_step_data data;
size_t result;
@@ -52,14 +63,23 @@ __mbsrtowcs (dst, src, len, ps)
data.__invocation_counter = 0;
data.__internal_use = 1;
data.__flags = __GCONV_IS_LAST;
+#ifdef USE_IN_EXTENDED_LOCALE_MODEL
+ data.__statep = ps;
+#else
data.__statep = ps ?: &state;
+#endif
data.__trans = NULL;
+#ifdef USE_IN_EXTENDED_LOCALE_MODEL
+ /* Get the conversion function matching the locale. */
+ towc = wcsmbs_get_towc_func (l);
+#else
/* Make sure we use the correct function. */
update_conversion_ptrs ();
/* Get the structure with the function pointers. */
towc = __wcsmbs_gconv_fcts.towc;
+#endif
/* We have to handle DST == NULL special. */
if (dst == NULL)
@@ -140,6 +160,13 @@ __mbsrtowcs (dst, src, len, ps)
__set_errno (EILSEQ);
}
+#ifdef USE_IN_EXTENDED_LOCALE_MODEL
+ /* Free the conversion function data structures. */
+ wcsmbs_free_funcs (towc);
+#endif
+
return result;
}
+#ifndef USE_IN_EXTENDED_LOCALE_MODEL
weak_alias (__mbsrtowcs, mbsrtowcs)
+#endif