2013-12-15 19 views
3

我一直在尋找如何紅/系統掛接與Windows中的DLL,Linux的/ Android的的.so共享庫和C庫函數OS/X名爲.dylib,與#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 *,使其不再爲空。

作爲第一次嘗試,我所做的:

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!傳遞給它?

回答

7
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 

This Works。

+0

謝謝!雖然從LIBC的getline返回的行是檢索行的長度(不是字符串),但它可以工作,所以它將是一個整數...您可以編輯您的答案(我也可以)。但我會讓你這樣做。 :-) – HostileFork

+0

的確,謝謝,編輯。 –

2

在小紅文檔的一個世界,同一個實際Red/System Specification Document是非常有用的,這部分包含答案間接又如:

p: declare pointer! [byte!]   ;-- char *p; 

這將導致:

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

好的就是鏈接。我認爲我在這裏並沒有真正掌握的主要內容是Red/System的GET-WORD應用程序!意思是「地址 - 」。 – HostileFork

相關問題