如何创建一个Red/System绑定到一个指针指针的函数?

 雅芳07866 发布于 2023-02-10 12:43

我正在研究Red/System如何与Windows DLL,Linux/Android .so共享库和OS/X .dylib中的C库函数挂钩,#import语法如下:

#import [
    "libc.so.6" cdecl [

        allocate: "malloc" [
            size [integer!]
            return: [byte-ptr!]
        ]

        free: "free" [
            block [byte-ptr!]
        ]

        /* ... */
]

适用于所有基本类型,但是当函数需要指向指针的指针时,您会怎么做?例如,如果你试图绑定到getline()具有原型的东西:

ssize_t getline(char **lineptr, size_t *n, FILE *stream);

调用它的一种方法(我想称之为...的方式)是传入的lineptr不是预分配的缓冲区,而是null.在这种情况下,getline为您分配缓冲区并修改char*,使其不再为null.

作为第一次尝试,我做了:

getline: "getline" [
    lineptr [byte-ptr!]       ;-- char **
    n [pointer! [integer!]]   ;-- size_t *
    stream [byte-ptr!]        ;-- FILE *
    return: [integer!]        ;-- ssize_t
]

但由于没有类似的东西pointer! [c-string!],我不知道怎么称呼它.我可以获取c-string!局部变量的地址并以byte-ptr!某种方式传递它吗?

1 个回答
  • Red/System [
        Title: "derp"
    ]
    
    #import [
        LIBC-file cdecl [
            _fdopen: "fdopen" [
                fd   [integer!]
                type [c-string!]
    
                return: [pointer! [byte!]]
            ]
    
            _getline: "getline" [
                line   [pointer! [integer!]]
                n      [pointer! [integer!]]
                stream [pointer! [byte!]]
    
                return: [integer!]
            ]
        ]
    ]
    
    getline: func [
        stream  [pointer! [byte!]]
        return: [c-string!]
    
        /local
            line [integer!]
            n    [integer!]
    ] [
        line: 0
        n:    0
    
        _getline :line :n stream
        as c-string! line
    ]
    
    stream: _fdopen 0 "r"
    line:  getline stream
    
    print line
    

    这有效.

    2023-02-10 12:46 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有