Successivo: , Precedente: , Su: Descrizione dell'API delle estensioni   [Contenuti][Indice]


16.4.3 Funzioni per allocare memoria e macro di servizio

L’API fornisce alcune funzioni per effettuare allocazioni di memoria che possono essere passate a gawk, e anche un certo numero di macro che possono tornare utili. Questa sottosezione le presenta come prototipi di funzione, nel modo con cui il codice dell’estensione potrebbe usarle:

void *gawk_malloc(size_t size);

Chiama la versione corretta di malloc() per allocare memoria, che può in seguito essere messa a disposizione di gawk.

void *gawk_calloc(size_t nmemb, size_t size);

Chiama la versione corretta di calloc() per allocare memoria che che può in seguito essere messa a disposizione di gawk.

void *gawk_realloc(void *ptr, size_t size);

Chiama la versione corretta di realloc() per allocare memoria che può in seguito essere messa a disposizione di gawk.

void gawk_free(void *ptr);

Chiama la versione corretta di free() per liberare memoria che era stata allocata con gawk_malloc(), gawk_calloc() o gawk_realloc().

L’API deve fornire queste funzioni perché è possibile che un’estensione sia stata compilata e costruita usando una versione diversa della libreria C rispetto a quella usata per il programma eseguibile gawk.107 Se gawk usasse la propria versione di free() per liberare della memoria acquisita tramite una differente versione di malloc(), il risultato sarebbe molto probabilmente differente da quello atteso.

Due macro di utilità possono essere usate per allocare memoria tramite gawk_malloc() e gawk_realloc(). Se l’allocazione non riesce, gawk termina l’esecuzione con un messaggio di errore fatale. Queste macro dovrebbero essere usate come se fossero dei richiami a procedure che non restituiscono un codice di ritorno:

#define emalloc(pointer, type, size, message) …

Gli argomenti per questa macro sono i seguenti:

pointer

La variabile di tipo puntatore che punterà alla memoria allocata.

type

Il tipo della variabile puntatore. Questo è usato per definire il tipo quando si chiama gawk_malloc().

size

Il numero totale di byte da allocare.

message

Un messaggio da anteporre all’eventuale messaggio di errore fatale. Questo è solitamente il nome della funzione che sta usando la macro.

Per esempio, si potrebbe allocare il valore di una stringa così:

awk_value_t risultato;
char *message;
const char greet[] = "non v'allarmate!";

emalloc(message, char *, sizeof(greet), "myfunc");
strcpy(message, greet);
make_malloced_string(message, strlen(message), & risultato);
#define erealloc(pointer, type, size, message) …

Questo è simile a emalloc(), ma chiama gawk_realloc() invece che gawk_malloc(). Gli argomenti sono gli stessi della macro emalloc().


Note a piè di pagina

(107)

Questo succede più spesso nei sistemi MS-Windows, ma può capitare anche in sistemi di tipo Unix.


Successivo: , Precedente: , Su: Descrizione dell'API delle estensioni   [Contenuti][Indice]