Scrivere una libreria esterna alla quale viene passata una stringa e che ritorna una stringa

Da Gambas-it.org - Wikipedia.

Vediamo un esempio in cui il codice Gambas invoca una funzione esterna presente in una libreria, scritta da noi e che chiameremo ad esempio: libadhoc.c, ed alla quale passa una stringa. La funzione esterna a sua volta passerà alla funzione chiamante di Gambas una stringa.

Il codice Gambas, contenente anche la parte per la creazione del codice C della libreria esterna, sarà il seguente: Per passare una stringa ad una funzione esterna, bisognerà utilizzare la funzione alloc():

Private Extern riceve_passa(testo As Pointer) As String In "/tmp/libadhoc"


Public Sub Main()

 Dim s As String
 Dim po As Pointer

' Va a generare la libreria condivisa "libadhoc.so":
 Creaso()

' Per passare una stringa ad una funzione esterna, utilizzare 'alloc()':
 po = Alloc("Mu")
 
 s = riceve_passa(po)
   
 Print "---> "; s

' Dealloca l'area di memoria precedentemente riservata e si assicura che il Puntatore non punti ad un indirizzo di memoria rilevante:
 Free(po)
 po = 0

End

Private Procedure Creaso()

 File.Save("/tmp/libadhoc.c", "#include <string.h>\n\n" &
                              "char *r;\n" &
                              "char t[2] = \"ca\";\n\n" &
                              "char * riceve_passa(char * s) {\n\n" &
                              "   r = \"si\";\n" &
                              "   strcat(s,r);\n" &
                              "   strcat(s,t);\n\n" &
                              "   return s;\n}")

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

End