Arquivos
hhvm/hphp/runtime/base/intl_convert.cpp
T
Edwin Smith 721f89b890 Flatten directories under runtime/base
This moves runtime/base/*/* to runtime/base, and fixes paths.
2013-07-18 17:28:35 -07:00

113 linhas
3.8 KiB
C++

/*
+----------------------------------------------------------------------+
| HipHop for PHP |
+----------------------------------------------------------------------+
| Copyright (c) 2010-2013 Facebook, Inc. (http://www.facebook.com) |
| Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) |
+----------------------------------------------------------------------+
| This source file is subject to version 2.00 of the Zend license, |
| that is bundled with this package in the file LICENSE, and is |
| available through the world-wide-web at the following url: |
| http://www.zend.com/license/2_00.txt. |
| If you did not receive a copy of the Zend license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
*/
#include "hphp/runtime/base/intl_convert.h"
#include <stdlib.h>
namespace HPHP {
void intl_convert_utf8_to_utf16(UChar** target, int* target_len,
const char* src, int src_len,
UErrorCode* status) {
UChar* dst_buf = nullptr;
int32_t dst_len = 0;
/* If *target is NULL determine required destination buffer size
* (pre-flighting). Otherwise, attempt to convert source string;
* if *target buffer is not large enough it will be resized appropriately.
*/
*status = U_ZERO_ERROR;
u_strFromUTF8(*target, *target_len, &dst_len, src, src_len, status);
if (*status == U_ZERO_ERROR) {
/* String is converted successfuly */
(*target)[dst_len] = 0;
*target_len = dst_len;
return;
}
/* Bail out if an unexpected error occured.
* (U_BUFFER_OVERFLOW_ERROR means that *target buffer is not large enough).
* (U_STRING_NOT_TERMINATED_WARNING usually means that the input string
* is empty).
*/
if (*status != U_BUFFER_OVERFLOW_ERROR &&
*status != U_STRING_NOT_TERMINATED_WARNING) {
return;
}
// Allocate memory for the destination buffer (it will be zero-terminated).
dst_buf = (UChar *)malloc((dst_len + 1) * sizeof(UChar));
/* Convert source string from UTF-8 to UTF-16. */
*status = U_ZERO_ERROR;
u_strFromUTF8(dst_buf, dst_len+1, nullptr, src, src_len, status);
if (U_FAILURE(*status)) {
free(dst_buf);
return;
}
dst_buf[dst_len] = 0;
if (*target) free(*target);
*target = dst_buf;
*target_len = dst_len;
}
void intl_convert_utf16_to_utf8(char** target, int* target_len,
const UChar* src, int src_len,
UErrorCode* status) {
char* dst_buf = nullptr;
int32_t dst_len;
/* Determine required destination buffer size (pre-flighting). */
*status = U_ZERO_ERROR;
u_strToUTF8(nullptr, 0, &dst_len, src, src_len, status);
/* Bail out if an unexpected error occured.
* (U_BUFFER_OVERFLOW_ERROR means that *target buffer is not large enough).
* (U_STRING_NOT_TERMINATED_WARNING usually means that the input string
* is empty).
*/
if (*status != U_BUFFER_OVERFLOW_ERROR &&
*status != U_STRING_NOT_TERMINATED_WARNING) {
return;
}
// Allocate memory for the destination buffer (it will be zero-terminated).
dst_buf = (char *)malloc(dst_len + 1);
/* Convert source string from UTF-16 to UTF-8. */
*status = U_ZERO_ERROR;
u_strToUTF8(dst_buf, dst_len, nullptr, src, src_len, status);
if (U_FAILURE(*status)) {
free(dst_buf);
return;
}
/* U_STRING_NOT_TERMINATED_WARNING is OK for us => reset 'status'. */
*status = U_ZERO_ERROR;
dst_buf[dst_len] = 0;
*target = dst_buf;
*target_len = dst_len;
}
///////////////////////////////////////////////////////////////////////////////
}