| /* |
| * 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 |