New module 'wcsnrtombs'.
[gnulib.git] / m4 / wcsrtombs.m4
1 # wcsrtombs.m4 serial 2
2 dnl Copyright (C) 2008 Free Software Foundation, Inc.
3 dnl This file is free software; the Free Software Foundation
4 dnl gives unlimited permission to copy and/or distribute it,
5 dnl with or without modifications, as long as this notice is preserved.
6
7 AC_DEFUN([gl_FUNC_WCSRTOMBS],
8 [
9   AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
10
11   AC_REQUIRE([AC_TYPE_MBSTATE_T])
12   AC_CHECK_FUNCS_ONCE([wcsrtombs])
13   if test $ac_cv_func_wcsrtombs = no; then
14     HAVE_WCSRTOMBS=0
15   else
16     gl_WCSRTOMBS_TERMINATION
17     gl_WCSRTOMBS_NULL
18     case "$gl_cv_func_wcsrtombs_termination" in
19       *yes) ;;
20       *) AC_DEFINE([WCSRTOMBS_TERMINATION_BUG], [1],
21            [Define if the wcsrtombs function may set the source pointer to NULL without NUL-terminating the destination.])
22          REPLACE_WCSRTOMBS=1 ;;
23     esac
24     case "$gl_cv_func_wcsrtombs_null" in
25       *yes) ;;
26       *) AC_DEFINE([WCSRTOMBS_NULL_ARG_BUG], [1],
27            [Define if the wcsrtombs function has the NULL destination argument bug.])
28          REPLACE_WCSRTOMBS=1 ;;
29     esac
30   fi
31   if test $HAVE_WCSRTOMBS = 0 || test $REPLACE_WCSRTOMBS = 1; then
32     gl_REPLACE_WCHAR_H
33     AC_LIBOBJ([wcsrtombs])
34     AC_LIBOBJ([wcsrtombs-state])
35     gl_PREREQ_WCSRTOMBS
36   fi
37 ])
38
39 dnl Test whether the wcsrtombs implementation stores a non-NULL source pointer
40 dnl as long as it has not written the final NUL byte to the destination string.
41 dnl The OSF/1 5.1 implementation stores a NULL pointer already after storing
42 dnl the last non-NUL character, even if there is no more room for the
43 dnl terminating NUL character.
44 dnl Result is gl_cv_func_wcsrtombs_termination.
45
46 AC_DEFUN([gl_WCSRTOMBS_TERMINATION],
47 [
48   AC_REQUIRE([AC_PROG_CC])
49   AC_REQUIRE([gt_LOCALE_FR])
50   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
51   AC_CACHE_CHECK([whether wcsrtombs updates the source pointer correctly],
52     [gl_cv_func_wcsrtombs_termination],
53     [
54       dnl Initial guess, used when cross-compiling or when no suitable locale
55       dnl is present.
56 changequote(,)dnl
57       case "$host_os" in
58               # Guess no on OSF/1.
59         osf*) gl_cv_func_wcsrtombs_termination="guessing no" ;;
60               # Guess yes otherwise.
61         *)    gl_cv_func_wcsrtombs_termination="guessing yes" ;;
62       esac
63 changequote([,])dnl
64       if test $LOCALE_FR != none; then
65         AC_TRY_RUN([
66 #include <locale.h>
67 #include <stdlib.h>
68 #include <wchar.h>
69 int main ()
70 {
71   if (setlocale (LC_ALL, "$LOCALE_FR") != NULL)
72     {
73       const char original[] = "B\374\337er";
74       wchar_t input[10];
75
76       if (mbstowcs (input, original, 10) == 5)
77         {
78           const wchar_t *src = input;
79           char output[5];
80           wcsrtombs (output, &src, 5, NULL);
81           if (src != input + 5)
82             return 1;
83         }
84     }
85   return 0;
86 }],
87           [gl_cv_func_wcsrtombs_termination=yes],
88           [gl_cv_func_wcsrtombs_termination=no],
89           [])
90       fi
91     ])
92 ])
93
94 dnl Test whether the wcsrtombs implementation supports a NULL argument
95 dnl correctly. This is not the case on HP-UX 11.11 and OSF/1 5.1: These
96 dnl implementations updates the source pointer also if the destination argument
97 dnl is NULL.
98 dnl Result is gl_cv_func_wcsrtombs_null.
99
100 AC_DEFUN([gl_WCSRTOMBS_NULL],
101 [
102   AC_REQUIRE([AC_PROG_CC])
103   AC_REQUIRE([gt_LOCALE_FR])
104   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
105   AC_CACHE_CHECK([whether wcsrtombs supports a NULL argument correctly],
106     [gl_cv_func_wcsrtombs_null],
107     [
108       dnl Initial guess, used when cross-compiling or when no suitable locale
109       dnl is present.
110 changequote(,)dnl
111       case "$host_os" in
112                       # Guess no on HP-UX and OSF/1.
113         hpux* | osf*) gl_cv_func_wcsrtombs_null="guessing no" ;;
114                       # Guess yes otherwise.
115         *)            gl_cv_func_wcsrtombs_null="guessing yes" ;;
116       esac
117 changequote([,])dnl
118       if test $LOCALE_FR != none; then
119         AC_TRY_RUN([
120 #include <locale.h>
121 #include <stdlib.h>
122 #include <wchar.h>
123 int main ()
124 {
125   if (setlocale (LC_ALL, "$LOCALE_FR") != NULL)
126     {
127       const char original[] = "B\374\337er";
128       wchar_t input[10];
129
130       if (mbstowcs (input, original, 10) == 5)
131         {
132           const wchar_t *src = input;
133           wcsrtombs (NULL, &src, 10, NULL);
134           if (src != input)
135             return 1;
136         }
137     }
138   return 0;
139 }],
140           [gl_cv_func_wcsrtombs_null=yes],
141           [gl_cv_func_wcsrtombs_null=no],
142           [])
143       fi
144     ])
145 ])
146
147 # Prerequisites of lib/wcsrtombs.c.
148 AC_DEFUN([gl_PREREQ_WCSRTOMBS], [
149   :
150 ])