Asprintf ()

Da Gambas-it.org - Wikipedia.

La funzione esterna asprintf(), dichiarata nel file header "/usr/include/stdio.h":

int asprintf (char **__restrict __ptr, const char *__restrict __fmt, ...)

è simile alla funzione esterna "sprintf( )", con la differenza, però, che la asprintf( ) calcola da sé la lunghezza della stringa, alloca la necessaria e corrispondente quantità di memoria, e vi scrive la stringa di valori.
Ciò comporta che non è necessario allocare preliminarmente alcuna quantità di memoria mediante la funzione esterna malloc( ) o la funzione esterna calloc( ), né è necessario eventualmente mutare la quantità di memoria allocata mediante la funzione esterna realloc( ).
Va notato che il primo parametro è un Puntatore di Puntatore.

In ogni caso è necessario, dopo il suo uso liberare la memoria, precedentemente allocata, mediante la funzione esterna free( ).


Volendo utilizzare tale funzione in Gambas, bisognerà dichiararla con Extern, nonché bisognerà dichiarare la libreria di C: libc.so.6, nella quale essa è contenuta:

Private Extern asprintf(__s As Pointer, __format As String, valore As ...) As Integer


Mostriamo un semplice esempio, nel quale viene passata alla variabile di tipo Puntatore, varie stringhe aventi diverse dimensioni.

Library "libc:6"

' int asprintf (char **__restrict __ptr, const char *__restrict __fmt, ...)
' Allocates a string large enough to hold the output including the terminating null byte, and return a pointer to it via the first argument.
Private Extern asprintf(__ptr As Pointer, __format As String, s As String) As Integer

' void free(void *__ptr)
' Free a block allocated by `malloc', `realloc' or `calloc'.
Private Extern free_C(__ptr As Pointer) Exec "free"


Public Sub Main()
 
  Dim t As String
  Dim p As Pointer
  
  t = "a"
  asprintf(VarPtr(p), "%s", t)
  Print String@(p)
   
  t = "bb"
  asprintf(VarPtr(p), "%s", t)
  Print String@(p)
   
  t = "cccc"
  asprintf(VarPtr(p), "%s", t)
  Print String@(p)
   
  t = "dddd eeee"
  asprintf(VarPtr(p), "%s", t)
  Print String@(p)
   
  t = "cccc"
  asprintf(VarPtr(p), "%s", t)
  Print String@(p)
   
  t = "bb"
  asprintf(VarPtr(p), "%s", t)
  Print String@(p)
   
  t = "a"
  asprintf(VarPtr(p), "%s", t)
  Print String@(p)
      
' Liberiamo la memoria precedentemente allocata:
  Free(p)
  
End


Riferimenti