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

@When[backend == "cjnative"]
func getCommandLineArgsFromRuntime(): CPointer<CPointer<UInt8>> {
    unsafe {
        let argv = CJ_MRT_GetCommandLineArgs()
        if (argv.isNull()) {
            return argv
        } else {
            return argv + 1
        }
    }
}

func getCommandLineArgs(): Array<String> {
    let argv = getCommandLineArgsFromRuntime()
    if (argv.isNull()) {
        return Array<String>()
    }

    var argc: Int64 = 0
    while (true) {
        let cstr: CPointer<UInt8> = unsafe { argv.read(argc) }
        if (cstr.isNull()) {
            break
        }
        argc++
    }

    let args: Array<String> = Array<String>(argc, repeat: String())
    for (argIndex in 0..argc) {
        let cstr: CPointer<UInt8> = unsafe { argv.read(argIndex) }

        let cstrLen: Int64 = unsafe { Int64(strlen(cstr)) }
        let arg: Array<UInt8> = Array<UInt8>(cstrLen, repeat: 0)
        for (charIndex in 0..cstrLen) {
            arg[charIndex] = unsafe { UInt8(cstr.read(charIndex)) }
        }
        args[argIndex] = String.fromUtf8(arg)
    }
    return args
}