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