Scrivere una libreria esterna che ritorna un puntatore ad un buffer di tipo char

Da Gambas-it.org - Wikipedia.

Di seguito è mostrato un esempio, nel quale la funzione esterna della libreria in C ritorna un Puntatore ad una variabile di tipo "char" mediante un proprio parametro. In particolare, la funzione, presente nella libreria C esterna da noi scritta, apre un semplice file (che supponiamo contenga otto valori esadecimali corrispondenti ad alcuni caratteri ASCII stampabili) e copia i valori, in esso contenuti, all'interno di una variabile buffer di tipo char.
Il codice Gambas raccoglierà i valori del buffer attraverso il parametro della funzione stessa che invoca la corrispondente funzione esterna.
Il buffer di tipo char, passato dalla libreria C, viene recuperato e rappresentato nel codice Gambas da una variabile di tipo Puntatore, che andrà poi dereferenziato al fine di recuperare i valori passati.

Library "/tmp/buff"

Private Extern prova(p As Pointer) As Integer


Public Sub Main()

 Dim n As Integer
 Dim po As Pointer
 Dim st As Stream
 Dim bb As Byte[]
' Dim i As Integer

 Creaso()

' Allochiamo sufficiente memoria, e comunque in quantità almeno pari ai valori presenti nel file da leggere:
 po = Alloc(SizeOf(gb.Byte), 8)

 n = prova(po)

 Print "Letti "; n; " byte dal file.\n"

 bb = New Byte[n]

' Il puntatore, contenente i valori provenienti dal buffer di tipo "char" della libreria C, viene dereferenziato con i "Memory Stream":
 st = Memory po For Read
 bb.Read(st, 0, 8)  
' Qualora il vettore contenga soltanto valori corrispondenti a caratteri ASCII stampabili, si potranno vedere tali caratteri mediante la funzione ".ToString" del vettore di tipo "Byte[]":
 Print bb.ToString()
   
' Nel caso in cui il vettore, invece, non contenga soltanto caratteri ASCII stampabili, si potrà usare un ciclo:
 ' For i = 0 To bb.Max
 '   Print bb[i]
 ' Next
  
' Va in chiusura:
 st.Close
 Free(po)
 po = 0

End

Private Procedure Creaso()

 File.Save("/tmp/buff.c", "#include <stdio.h>\n\n" &
                          "int prova(char * buffer) {\n\n" &
                          "   int n;\n" &
                          "   FILE *fl;\n\n" &
                          "   fl = fopen(\"/tmp/file_da_leggere\", \"rb\");\n\n" &
                          "   n = fread(buffer, 1, 8, fl);\n\n" &
                          "   return n;\n\n}")

 Shell "gcc -o /tmp/buff.so /tmp/buff.c -shared -fPIC" Wait

End