1e509ee18Sopenharmony_ci/*
2e509ee18Sopenharmony_ci * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3e509ee18Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4e509ee18Sopenharmony_ci * you may not use this file except in compliance with the License.
5e509ee18Sopenharmony_ci * You may obtain a copy of the License at
6e509ee18Sopenharmony_ci *
7e509ee18Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8e509ee18Sopenharmony_ci *
9e509ee18Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10e509ee18Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11e509ee18Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12e509ee18Sopenharmony_ci * See the License for the specific language governing permissions and
13e509ee18Sopenharmony_ci * limitations under the License.
14e509ee18Sopenharmony_ci */
15e509ee18Sopenharmony_ci
16e509ee18Sopenharmony_ci#include "common/log_wrapper.h"
17e509ee18Sopenharmony_ci
18e509ee18Sopenharmony_ci#include <string>
19e509ee18Sopenharmony_ci#ifdef ANDROID_PLATFORM
20e509ee18Sopenharmony_ci#include <android/log.h>
21e509ee18Sopenharmony_ci#else
22e509ee18Sopenharmony_ci#include <thread>
23e509ee18Sopenharmony_ci#include "securec.h"
24e509ee18Sopenharmony_ci#endif
25e509ee18Sopenharmony_ci
26e509ee18Sopenharmony_cinamespace OHOS::ArkCompiler::Toolchain {
27e509ee18Sopenharmony_civoid StripString(const std::string& prefix, std::string& str)
28e509ee18Sopenharmony_ci{
29e509ee18Sopenharmony_ci    for (auto pos = str.find(prefix, 0); pos != std::string::npos; pos = str.find(prefix, pos)) {
30e509ee18Sopenharmony_ci        str.erase(pos, prefix.size());
31e509ee18Sopenharmony_ci    }
32e509ee18Sopenharmony_ci}
33e509ee18Sopenharmony_ci
34e509ee18Sopenharmony_cistd::string StripFormatString(const char* fmt)
35e509ee18Sopenharmony_ci{
36e509ee18Sopenharmony_ci    std::string newFmt(fmt);
37e509ee18Sopenharmony_ci    StripString("{public}", newFmt);
38e509ee18Sopenharmony_ci    StripString("{private}", newFmt);
39e509ee18Sopenharmony_ci    return newFmt;
40e509ee18Sopenharmony_ci}
41e509ee18Sopenharmony_ci
42e509ee18Sopenharmony_ci#ifdef ANDROID_PLATFORM
43e509ee18Sopenharmony_ciconst char* tag = "ArkCompiler";
44e509ee18Sopenharmony_civoid StdLog::PrintLog(LogLevel level, const char* fmt, ...)
45e509ee18Sopenharmony_ci{
46e509ee18Sopenharmony_ci    std::string formatted = StripFormatString(fmt);
47e509ee18Sopenharmony_ci    va_list args;
48e509ee18Sopenharmony_ci    va_start(args, fmt);
49e509ee18Sopenharmony_ci#pragma clang diagnostic push
50e509ee18Sopenharmony_ci#pragma clang diagnostic ignored "-Wformat-nonliteral"
51e509ee18Sopenharmony_ci    __android_log_vprint(static_cast<int>(level), tag, formatted.c_str(), args);
52e509ee18Sopenharmony_ci#pragma clang diagnostic pop
53e509ee18Sopenharmony_ci    va_end(args);
54e509ee18Sopenharmony_ci}
55e509ee18Sopenharmony_ci#else
56e509ee18Sopenharmony_ci#ifndef ENABLE_HILOG
57e509ee18Sopenharmony_ciconstexpr int32_t MAX_BUFFER_SIZE = 100;
58e509ee18Sopenharmony_civoid StdLog::PrintLog(LogLevel level, const char* fmt, ...)
59e509ee18Sopenharmony_ci{
60e509ee18Sopenharmony_ci    std::string formatted = StripFormatString(fmt);
61e509ee18Sopenharmony_ci    va_list args;
62e509ee18Sopenharmony_ci    va_start(args, fmt);
63e509ee18Sopenharmony_ci
64e509ee18Sopenharmony_ci    char buf[MAX_BUFFER_SIZE];
65e509ee18Sopenharmony_ci    if (vsnprintf_s(buf, sizeof(buf), sizeof(buf) - 1, formatted.c_str(), args) < 0 && errno == EINVAL) {
66e509ee18Sopenharmony_ci        return;
67e509ee18Sopenharmony_ci    }
68e509ee18Sopenharmony_ci    va_end(args);
69e509ee18Sopenharmony_ci
70e509ee18Sopenharmony_ci    char timeBuf[MAX_BUFFER_SIZE];
71e509ee18Sopenharmony_ci    const char* domainTag = "[ArkCompiler Debugger]";
72e509ee18Sopenharmony_ci    std::string levelTag;
73e509ee18Sopenharmony_ci    switch (level) {
74e509ee18Sopenharmony_ci        case LogLevel::FATAL:
75e509ee18Sopenharmony_ci            levelTag = "[FATAL]";
76e509ee18Sopenharmony_ci            break;
77e509ee18Sopenharmony_ci        case LogLevel::ERROR:
78e509ee18Sopenharmony_ci            levelTag = "[ERROR]";
79e509ee18Sopenharmony_ci            break;
80e509ee18Sopenharmony_ci        case LogLevel::WARN:
81e509ee18Sopenharmony_ci            levelTag = "[WARN]";
82e509ee18Sopenharmony_ci            break;
83e509ee18Sopenharmony_ci        case LogLevel::INFO:
84e509ee18Sopenharmony_ci            levelTag = "[INFO]";
85e509ee18Sopenharmony_ci            break;
86e509ee18Sopenharmony_ci        case LogLevel::DEBUG:
87e509ee18Sopenharmony_ci            levelTag = "[DEBUG]";
88e509ee18Sopenharmony_ci            break;
89e509ee18Sopenharmony_ci        default:
90e509ee18Sopenharmony_ci            levelTag = "[DEFAULT]";
91e509ee18Sopenharmony_ci            break;
92e509ee18Sopenharmony_ci    }
93e509ee18Sopenharmony_ci
94e509ee18Sopenharmony_ci    if (snprintf_s(timeBuf, sizeof(timeBuf), sizeof(timeBuf) - 1, "%s %s %d",
95e509ee18Sopenharmony_ci            domainTag, levelTag.c_str(), std::this_thread::get_id()) < 0) {
96e509ee18Sopenharmony_ci        return;
97e509ee18Sopenharmony_ci    }
98e509ee18Sopenharmony_ci
99e509ee18Sopenharmony_ci    printf("%s %s\r\n", timeBuf, buf);
100e509ee18Sopenharmony_ci}
101e509ee18Sopenharmony_ci#endif
102e509ee18Sopenharmony_ci#endif
103e509ee18Sopenharmony_ci} // namespace OHOS::ArkCompiler::Toolchain