1 : /*
2 : +----------------------------------------------------------------------+
3 : | PHP Version 5 |
4 : +----------------------------------------------------------------------+
5 : | This source file is subject to version 3.01 of the PHP license, |
6 : | that is bundled with this package in the file LICENSE, and is |
7 : | available through the world-wide-web at the following url: |
8 : | http://www.php.net/license/3_01.txt |
9 : | If you did not receive a copy of the PHP license and are unable to |
10 : | obtain it through the world-wide-web, please send a note to |
11 : | license@php.net so we can mail you a copy immediately. |
12 : +----------------------------------------------------------------------+
13 : | Authors: Vadim Savchuk <vsavchuk@productengine.com> |
14 : | Dmitry Lakhtyuk <dlakhtyuk@productengine.com> |
15 : +----------------------------------------------------------------------+
16 : */
17 :
18 : #ifdef HAVE_CONFIG_H
19 : #include "config.h"
20 : #endif
21 :
22 : #include <php.h>
23 :
24 : #include "intl_common.h"
25 : #include "intl_convert.h"
26 :
27 : /* {{{ intl_convert_utf8_to_utf16
28 : * Convert given string from UTF-8 to UTF-16 to *target buffer.
29 : *
30 : * It *target is NULL then we allocate a large enough buffer,
31 : * store the converted string into it, and make target point to it.
32 : *
33 : * Otherwise, if *target is non-NULL, we assume that it points to a
34 : * dynamically allocated buffer of *target_len bytes length.
35 : * In this case the buffer will be used to store the converted string to,
36 : * and may be resized (made larger) if needed.
37 : *
38 : * @param target Where to place the result.
39 : * @param target_len Result length.
40 : * @param source String to convert.
41 : * @param source_len Length of the source string.
42 : * @param status Conversion status.
43 : *
44 : * @return void This function does not return anything.
45 : */
46 : void intl_convert_utf8_to_utf16(
47 : UChar** target, int* target_len,
48 : const char* src, int src_len,
49 : UErrorCode* status )
50 2066 : {
51 2066 : UChar* dst_buf = NULL;
52 2066 : int32_t dst_len = 0;
53 :
54 : /* If *target is NULL determine required destination buffer size (pre-flighting).
55 : * Otherwise, attempt to convert source string; if *target buffer is not large enough
56 : * it will be resized appropriately.
57 : */
58 2066 : *status = U_ZERO_ERROR;
59 :
60 2066 : u_strFromUTF8( *target, *target_len, &dst_len, src, src_len, status );
61 :
62 2066 : if( *status == U_ZERO_ERROR )
63 : {
64 : /* String is converted successfuly */
65 108 : (*target)[dst_len] = 0;
66 108 : *target_len = dst_len;
67 108 : return;
68 : }
69 :
70 : /* Bail out if an unexpected error occured.
71 : * (U_BUFFER_OVERFLOW_ERROR means that *target buffer is not large enough).
72 : * (U_STRING_NOT_TERMINATED_WARNING usually means that the input string is empty).
73 : */
74 1958 : if( *status != U_BUFFER_OVERFLOW_ERROR && *status != U_STRING_NOT_TERMINATED_WARNING )
75 3 : return;
76 :
77 : /* Allocate memory for the destination buffer (it will be zero-terminated). */
78 1955 : dst_buf = eumalloc( dst_len + 1 );
79 :
80 : /* Convert source string from UTF-8 to UTF-16. */
81 1955 : *status = U_ZERO_ERROR;
82 1955 : u_strFromUTF8( dst_buf, dst_len+1, NULL, src, src_len, status );
83 1955 : if( U_FAILURE( *status ) )
84 : {
85 0 : efree( dst_buf );
86 0 : return;
87 : }
88 :
89 1955 : dst_buf[dst_len] = 0;
90 :
91 1955 : if( *target )
92 0 : efree( *target );
93 :
94 1955 : *target = dst_buf;
95 1955 : *target_len = dst_len;
96 : }
97 : /* }}} */
98 :
99 : /* {{{ intl_convert_utf16_to_utf8
100 : * Convert given string from UTF-16 to UTF-8.
101 : *
102 : * @param target Where to place the result.
103 : * @param target_len Result length.
104 : * @param source String to convert.
105 : * @param source_len Length of the source string.
106 : * @param status Conversion status.
107 : *
108 : * @return void This function does not return anything.
109 : */
110 : void intl_convert_utf16_to_utf8(
111 : char** target, int* target_len,
112 : const UChar* src, int src_len,
113 : UErrorCode* status )
114 2048 : {
115 2048 : char* dst_buf = NULL;
116 : int32_t dst_len;
117 :
118 : /* Determine required destination buffer size (pre-flighting). */
119 2048 : *status = U_ZERO_ERROR;
120 2048 : u_strToUTF8( NULL, 0, &dst_len, src, src_len, status );
121 :
122 : /* Bail out if an unexpected error occured.
123 : * (U_BUFFER_OVERFLOW_ERROR means that *target buffer is not large enough).
124 : * (U_STRING_NOT_TERMINATED_WARNING usually means that the input string is empty).
125 : */
126 2048 : if( *status != U_BUFFER_OVERFLOW_ERROR && *status != U_STRING_NOT_TERMINATED_WARNING )
127 1 : return;
128 :
129 : /* Allocate memory for the destination buffer (it will be zero-terminated). */
130 2047 : dst_buf = emalloc( dst_len+1 );
131 :
132 : /* Convert source string from UTF-8 to UTF-16. */
133 2047 : *status = U_ZERO_ERROR;
134 2047 : u_strToUTF8( dst_buf, dst_len, NULL, src, src_len, status );
135 2047 : if( U_FAILURE( *status ) )
136 : {
137 0 : efree( dst_buf );
138 0 : return;
139 : }
140 :
141 : /* U_STRING_NOT_TERMINATED_WARNING is OK for us => reset 'status'. */
142 2047 : *status = U_ZERO_ERROR;
143 :
144 2047 : dst_buf[dst_len] = 0;
145 2047 : *target = dst_buf;
146 2047 : *target_len = dst_len;
147 : }
148 : /* }}} */
149 :
150 : /*
151 : * Local variables:
152 : * tab-width: 4
153 : * c-basic-offset: 4
154 : * End:
155 : * vim600: noet sw=4 ts=4 fdm=marker
156 : * vim<600: noet sw=4 ts=4
157 : */
|