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.

Per passare una stringa ad una funzione esterna, bisognerà utilizzare la funzione Alloc().
Nel seguente codice Gambas, contenente anche la parte per la creazione del codice C della libreria esterna, si riceverà una stringa per "valore":

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

In quest'altro caso si otterrà la stringa dal passaggio per "indirizzo" della variabile di tipo "Puntatore" alla libreria esterna:

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


Public Sub Main()

 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")

 riceve_passa(po)

 Print "---> "; String@(po)

' 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" &
                              "void riceve_passa(char * s) {\n\n" &
                              "   r = \"si\";\n" &
                              "   strcat(s,r);\n" &
                              "   strcat(s,t);\n\n}")

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

End