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