160916893Sopenharmony_ci/* 260916893Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd. 360916893Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 460916893Sopenharmony_ci * you may not use this file except in compliance with the License. 560916893Sopenharmony_ci * You may obtain a copy of the License at 660916893Sopenharmony_ci * 760916893Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 860916893Sopenharmony_ci * 960916893Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1060916893Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1160916893Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1260916893Sopenharmony_ci * See the License for the specific language governing permissions and 1360916893Sopenharmony_ci * limitations under the License. 1460916893Sopenharmony_ci */ 1560916893Sopenharmony_ci 1660916893Sopenharmony_ci#include "str_util.h" 1760916893Sopenharmony_ci#include "i18n_memory_adapter.h" 1860916893Sopenharmony_ci#include "securec.h" 1960916893Sopenharmony_ci#include "types.h" 2060916893Sopenharmony_ci 2160916893Sopenharmony_cinamespace OHOS { 2260916893Sopenharmony_cinamespace I18N { 2360916893Sopenharmony_cistatic int g_i18nMaxMalloc = 4096; 2460916893Sopenharmony_ci 2560916893Sopenharmony_ciint ReplaceAndCountOff(std::string &content, const int index, const char *sign, const int off) 2660916893Sopenharmony_ci{ 2760916893Sopenharmony_ci if ((sign == nullptr) || (index < 0) || (static_cast<unsigned int>(index) > strlen(content.data()))) { 2860916893Sopenharmony_ci return off; 2960916893Sopenharmony_ci } 3060916893Sopenharmony_ci content = content.replace(index, 1, sign); 3160916893Sopenharmony_ci int signLen = strlen(sign); 3260916893Sopenharmony_ci return off + signLen - 1; 3360916893Sopenharmony_ci} 3460916893Sopenharmony_ci 3560916893Sopenharmony_civoid ArrayCopy(std::string *target, const int targetSize, const std::string *source, const int sourceSize) 3660916893Sopenharmony_ci{ 3760916893Sopenharmony_ci if (target == nullptr || source == nullptr || (sourceSize > targetSize)) { 3860916893Sopenharmony_ci return; 3960916893Sopenharmony_ci } 4060916893Sopenharmony_ci for (int i = 0; i < sourceSize; i++) { 4160916893Sopenharmony_ci target[i] = source[i]; 4260916893Sopenharmony_ci } 4360916893Sopenharmony_ci} 4460916893Sopenharmony_ci 4560916893Sopenharmony_cichar *NewArrayAndCopy(const char *source, const int len) 4660916893Sopenharmony_ci{ 4760916893Sopenharmony_ci if ((source == nullptr) || (len <= 0) || (len > g_i18nMaxMalloc)) { // 4096 is the max size that we could use 4860916893Sopenharmony_ci return nullptr; 4960916893Sopenharmony_ci } 5060916893Sopenharmony_ci char *out = reinterpret_cast<char *>(I18nMalloc(len + 1)); 5160916893Sopenharmony_ci if (out == nullptr) { 5260916893Sopenharmony_ci return nullptr; 5360916893Sopenharmony_ci } 5460916893Sopenharmony_ci errno_t rc = strcpy_s(out, len + 1, source); 5560916893Sopenharmony_ci if (rc != EOK) { 5660916893Sopenharmony_ci I18nFree(static_cast<void *>(out)); 5760916893Sopenharmony_ci return nullptr; 5860916893Sopenharmony_ci } 5960916893Sopenharmony_ci out[len] = '\0'; 6060916893Sopenharmony_ci return out; 6160916893Sopenharmony_ci} 6260916893Sopenharmony_ci 6360916893Sopenharmony_cichar *I18nNewCharString(const char *source, const int len) 6460916893Sopenharmony_ci{ 6560916893Sopenharmony_ci if ((source == nullptr) || (len <= 0) || len > g_i18nMaxMalloc) { // 4096 is the max size of allocation 6660916893Sopenharmony_ci return nullptr; 6760916893Sopenharmony_ci } 6860916893Sopenharmony_ci char *out = reinterpret_cast<char *>(I18nMalloc(len + 1)); 6960916893Sopenharmony_ci if (out == nullptr) { 7060916893Sopenharmony_ci return nullptr; 7160916893Sopenharmony_ci } 7260916893Sopenharmony_ci errno_t rc = memcpy_s(out, len + 1, source, len); 7360916893Sopenharmony_ci if (rc != EOK) { 7460916893Sopenharmony_ci I18nFree(static_cast<void *>(out)); 7560916893Sopenharmony_ci return nullptr; 7660916893Sopenharmony_ci } 7760916893Sopenharmony_ci out[len] = '\0'; 7860916893Sopenharmony_ci return out; 7960916893Sopenharmony_ci} 8060916893Sopenharmony_ci 8160916893Sopenharmony_cibool CleanCharArray(char *target, const int len) 8260916893Sopenharmony_ci{ 8360916893Sopenharmony_ci errno_t ret = memset_s(target, len, 0, len); 8460916893Sopenharmony_ci if (ret != EOK) { 8560916893Sopenharmony_ci return false; 8660916893Sopenharmony_ci } 8760916893Sopenharmony_ci return true; 8860916893Sopenharmony_ci} 8960916893Sopenharmony_ci 9060916893Sopenharmony_ciint LenCharArray(const char *target) 9160916893Sopenharmony_ci{ 9260916893Sopenharmony_ci if (target == nullptr) { 9360916893Sopenharmony_ci return 0; 9460916893Sopenharmony_ci } 9560916893Sopenharmony_ci return strlen(target); 9660916893Sopenharmony_ci} 9760916893Sopenharmony_ci 9860916893Sopenharmony_civoid Split(const std::string &src, std::string *dst, const int32_t size, const char &sep) 9960916893Sopenharmony_ci{ 10060916893Sopenharmony_ci if (dst == nullptr || size <= 0) { 10160916893Sopenharmony_ci return; 10260916893Sopenharmony_ci } 10360916893Sopenharmony_ci int32_t current = 0; 10460916893Sopenharmony_ci 10560916893Sopenharmony_ci std::string::size_type begin = 0; 10660916893Sopenharmony_ci std::string::size_type end = 0; 10760916893Sopenharmony_ci std::string::size_type srcSize = src.size(); 10860916893Sopenharmony_ci while (current < size) { 10960916893Sopenharmony_ci while ((end < srcSize) && (src[end] != sep)) { 11060916893Sopenharmony_ci ++end; 11160916893Sopenharmony_ci } 11260916893Sopenharmony_ci if (end >= srcSize) { 11360916893Sopenharmony_ci break; 11460916893Sopenharmony_ci } 11560916893Sopenharmony_ci dst[current++] = std::string(src, begin, end - begin); 11660916893Sopenharmony_ci ++end; // pass the sep 11760916893Sopenharmony_ci begin = end; 11860916893Sopenharmony_ci } 11960916893Sopenharmony_ci if (current < size && end > begin) { 12060916893Sopenharmony_ci dst[current++] = std::string(src, begin, end - begin); 12160916893Sopenharmony_ci } 12260916893Sopenharmony_ci} 12360916893Sopenharmony_ci 12460916893Sopenharmony_cibool CompareLocaleItem(const char *item, const char *other) 12560916893Sopenharmony_ci{ 12660916893Sopenharmony_ci if ((item == nullptr) && (other == nullptr)) { 12760916893Sopenharmony_ci return true; 12860916893Sopenharmony_ci } 12960916893Sopenharmony_ci if ((item != nullptr) && (other != nullptr) && (strcmp(item, other) == 0)) { 13060916893Sopenharmony_ci return true; 13160916893Sopenharmony_ci } 13260916893Sopenharmony_ci return false; 13360916893Sopenharmony_ci} 13460916893Sopenharmony_ci 13560916893Sopenharmony_ci/** 13660916893Sopenharmony_ci * split str with "_" 13760916893Sopenharmony_ci */ 13860916893Sopenharmony_cistd::string Parse(const char *str, int32_t count) 13960916893Sopenharmony_ci{ 14060916893Sopenharmony_ci if (str == nullptr || count < 0) { 14160916893Sopenharmony_ci return ""; 14260916893Sopenharmony_ci } 14360916893Sopenharmony_ci size_t length = strlen(str); 14460916893Sopenharmony_ci if (length == 0 || length > I18N_STRING_LENGTH_MAX) { 14560916893Sopenharmony_ci return ""; 14660916893Sopenharmony_ci } 14760916893Sopenharmony_ci int32_t tempCount = 0; 14860916893Sopenharmony_ci size_t ind = 0; 14960916893Sopenharmony_ci while ((ind < length) && (tempCount < count)) { 15060916893Sopenharmony_ci if (str[ind] == '_') { 15160916893Sopenharmony_ci ++tempCount; 15260916893Sopenharmony_ci } 15360916893Sopenharmony_ci ++ind; 15460916893Sopenharmony_ci } 15560916893Sopenharmony_ci if (tempCount < count) { 15660916893Sopenharmony_ci return ""; 15760916893Sopenharmony_ci } 15860916893Sopenharmony_ci size_t last = ind; 15960916893Sopenharmony_ci while (last < length) { 16060916893Sopenharmony_ci if (str[last] == '_') { 16160916893Sopenharmony_ci break; 16260916893Sopenharmony_ci } 16360916893Sopenharmony_ci ++last; 16460916893Sopenharmony_ci } 16560916893Sopenharmony_ci if (last == ind) { 16660916893Sopenharmony_ci return ""; 16760916893Sopenharmony_ci } 16860916893Sopenharmony_ci return std::string(str + ind, last - ind); 16960916893Sopenharmony_ci} 17060916893Sopenharmony_ci} // namespace I18N 17160916893Sopenharmony_ci} // namespace OHOS 172