/*
 * Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.
 * This source file is part of the Cangjie project, licensed under Apache-2.0
 * with Runtime Library Exception.
 *
 * See https://cangjie-lang.cn/pages/LICENSE for license information.
 */

package std.core

@FastNative
foreign func CJ_CORE_Float64ToHash(x: Float64): Int64

@FastNative
foreign func CJ_CORE_Float32ToHash(x: Float32): Int64

// print
@FastNative
foreign func CJ_CORE_PrintUTF8(c: CPointer<UInt8>, len: Int64, newLine: Bool, flush: Bool): Int64

@FastNative
foreign func CJ_CORE_ErrorPrintUTF8(c: CPointer<UInt8>, len: Int64, newLine: Bool, flush: Bool): Int64

@FastNative
foreign func CJ_CORE_PrintBool(b: Bool, newLine: Bool, flush: Bool): Unit

@FastNative
foreign func CJ_CORE_PrintChar(c: UInt32, newLine: Bool, flush: Bool): Unit

@FastNative
foreign func CJ_CORE_PrintFloat(f: Float64, newLine: Bool, flush: Bool): Unit

@FastNative
foreign func CJ_CORE_PrintSigned(i: Int64, newLine: Bool, flush: Bool): Unit

@FastNative
foreign func CJ_CORE_PrintUnsigned(i: UInt64, newLine: Bool, flush: Bool): Unit

foreign func CJ_CONSOLE_Readline(): CPointer<StructureString>

@FastNative
foreign func CJ_CONSOLE_ClearstdInerr(): Unit
// string
@FastNative
foreign func memcpy_s(dest: CPointer<UInt8>, destMax: UIntNative, src: CPointer<UInt8>, count: UIntNative): Int32

@FastNative
foreign func strlen(str: CPointer<UInt8>): UIntNative

@FastNative
foreign func CJ_CORE_StringMemcmp(str1: CPointer<UInt8>, str2: CPointer<UInt8>, n: UIntNative): Int64

@FastNative
foreign func CJ_CORE_StringSize(str: CPointer<UInt8>, len: Int64): Int64

@FastNative
foreign func CJ_CORE_Float64ToCPointer(num: Float64): CPointer<UInt8>

@FastNative
foreign func CJ_CORE_IndexOfString(orgStr: CPointer<UInt8>, subStr: CPointer<UInt8>, orgSize: Int64, subSize: Int64,
    start: Int64): Int64

@FastNative
foreign func CJ_CORE_LastIndexOfString(orgStr: CPointer<UInt8>, subStr: CPointer<UInt8>, orgSize: Int64, subSize: Int64,
    start: Int64): Int64

@FastNative
foreign func CJ_CORE_CountString(orgStr: CPointer<UInt8>, subStr: CPointer<UInt8>, orgSize: Int64, subSize: Int64): Int64

@FastNative
foreign func CJ_CORE_CountAndIndexString(orgStr: CPointer<UInt8>, subStr: CPointer<UInt8>, orgSize: Int64,
    subSize: Int64): CPointer<Int64>

@FastNative
foreign func CJ_CORE_CanUseSIMD(): Bool

@When[backend == "cjnative"]
@FastNative
foreign func CJ_MRT_GetCommandLineArgs(): CPointer<CPointer<UInt8>>

@C
struct StructureString {
    let buffer: CPointer<UInt8> = CPointer<UInt8>()
    let length: UIntNative = 0
}

@FastNative
foreign func CJ_CORE_Abort(): Unit