summaryrefslogtreecommitdiff
path: root/jni/share/utf16char.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'jni/share/utf16char.cpp')
-rw-r--r--jni/share/utf16char.cpp182
1 files changed, 182 insertions, 0 deletions
diff --git a/jni/share/utf16char.cpp b/jni/share/utf16char.cpp
new file mode 100644
index 0000000..fadb6cf
--- /dev/null
+++ b/jni/share/utf16char.cpp
@@ -0,0 +1,182 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdlib.h>
+#include "../include/utf16char.h"
+
+namespace ime_pinyin {
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ char16* utf16_strtok(char16 *utf16_str, size_t *token_size,
+ char16 **utf16_str_next) {
+ if (NULL == utf16_str || NULL == token_size || NULL == utf16_str_next) {
+ return NULL;
+ }
+
+ // Skip the splitters
+ size_t pos = 0;
+ while ((char16)' ' == utf16_str[pos] || (char16)'\n' == utf16_str[pos]
+ || (char16)'\t' == utf16_str[pos])
+ pos++;
+
+ utf16_str += pos;
+ pos = 0;
+
+ while ((char16)'\0' != utf16_str[pos] && (char16)' ' != utf16_str[pos]
+ && (char16)'\n' != utf16_str[pos]
+ && (char16)'\t' != utf16_str[pos]) {
+ pos++;
+ }
+
+ char16 *ret_val = utf16_str;
+ if ((char16)'\0' == utf16_str[pos]) {
+ *utf16_str_next = NULL;
+ if (0 == pos)
+ return NULL;
+ } else {
+ *utf16_str_next = utf16_str + pos + 1;
+ }
+
+ utf16_str[pos] = (char16)'\0';
+ *token_size = pos;
+
+ return ret_val;
+ }
+
+ int utf16_atoi(const char16 *utf16_str) {
+ if (NULL == utf16_str)
+ return 0;
+
+ int value = 0;
+ int sign = 1;
+ size_t pos = 0;
+
+ if ((char16)'-' == utf16_str[pos]) {
+ sign = -1;
+ pos++;
+ }
+
+ while ((char16)'0' <= utf16_str[pos] &&
+ (char16)'9' >= utf16_str[pos]) {
+ value = value * 10 + static_cast<int>(utf16_str[pos] - (char16)'0');
+ pos++;
+ }
+
+ return value*sign;
+ }
+
+ float utf16_atof(const char16 *utf16_str) {
+ // A temporary implemetation.
+ char char8[256];
+ if (utf16_strlen(utf16_str) >= 256) return 0;
+
+ utf16_strcpy_tochar(char8, utf16_str);
+ return atof(char8);
+ }
+
+ size_t utf16_strlen(const char16 *utf16_str) {
+ if (NULL == utf16_str)
+ return 0;
+
+ size_t size = 0;
+ while ((char16)'\0' != utf16_str[size])
+ size++;
+ return size;
+ }
+
+ int utf16_strcmp(const char16* str1, const char16* str2) {
+ size_t pos = 0;
+ while (str1[pos] == str2[pos] && (char16)'\0' != str1[pos])
+ pos++;
+
+ return static_cast<int>(str1[pos]) - static_cast<int>(str2[pos]);
+ }
+
+ int utf16_strncmp(const char16 *str1, const char16 *str2, size_t size) {
+ size_t pos = 0;
+ while (pos < size && str1[pos] == str2[pos] && (char16)'\0' != str1[pos])
+ pos++;
+
+ if (pos == size)
+ return 0;
+
+ return static_cast<int>(str1[pos]) - static_cast<int>(str2[pos]);
+ }
+
+ // we do not consider overlapping
+ char16* utf16_strcpy(char16 *dst, const char16 *src) {
+ if (NULL == src || NULL == dst)
+ return NULL;
+
+ char16* cp = dst;
+
+ while ((char16)'\0' != *src) {
+ *cp = *src;
+ cp++;
+ src++;
+ }
+
+ *cp = *src;
+
+ return dst;
+ }
+
+ char16* utf16_strncpy(char16 *dst, const char16 *src, size_t size) {
+ if (NULL == src || NULL == dst || 0 == size)
+ return NULL;
+
+ if (src == dst)
+ return dst;
+
+ char16* cp = dst;
+
+ if (dst < src || (dst > src && dst >= src + size)) {
+ while (size-- && (*cp++ = *src++))
+ ;
+ } else {
+ cp += size - 1;
+ src += size - 1;
+ while (size-- && (*cp-- == *src--))
+ ;
+ }
+ return dst;
+ }
+
+ // We do not handle complicated cases like overlapping, because in this
+ // codebase, it is not necessary.
+ char* utf16_strcpy_tochar(char *dst, const char16 *src) {
+ if (NULL == src || NULL == dst)
+ return NULL;
+
+ char* cp = dst;
+
+ while ((char16)'\0' != *src) {
+ *cp = static_cast<char>(*src);
+ cp++;
+ src++;
+ }
+ *cp = *src;
+
+ return dst;
+ }
+
+#ifdef __cplusplus
+}
+#endif
+} // namespace ime_pinyin