QtInputMethod_GooglePinyin/googlepinyin/utf16char.cpp

183 lines
4.1 KiB
C++

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