17.9 Sommario
- Si possono scrivere estensioni (dette anche plug-in)
per
gawk
nel linguaggio C o C++ usando l’interfaccia di programmazione applicativa
(API) definita dagli sviluppatori di
gawk
.
- Le estensioni devono avere una licenza compatibile con la
GNU General Public License (GPL), e devono dichiararlo definendo un’apposita
variabile di nome
plugin_is_GPL_compatibile
.
- La comunicazione tra
gawk
e un’estensione è bidirezionale.
gawk
passa all’estensione una struttura (struct
) che contiene
vari campi di dati e puntatori a funzione. L’estensione può poi chiamare
funzioni all’interno di gawk
tramite dei puntatori a funzioni
per svolgere alcuni compiti.
- Uno di questi compiti è di “registrare” il nome e l’implementazione di
nuove funzioni a livello di
awk
con gawk
.
L’implementazione ha la forma di un puntatore del linguaggio C,
cui è associato un dato livello di versione.
Per convenzione, le funzioni di implementazione hanno nome
do_XXXX()
per una funzione a livello di awk
di nome
XXXX()
.
- L’API è definita in un file di intestazione di nome gawkapi.h.
Occorre includere alcuni file di intestazione standard prima di
includere tale intestazione nel codice sorgente.
- Vengono forniti dei puntatori a funzioni dell’API per i seguenti tipi di
operazioni:
- Allocare, riallocare, e liberare memoria
- Registrare funzioni (si possono registrare
funzioni di estensione,
funzioni ausiliarie di pulizia (callbacks),
una stringa di versione,
degli analizzatori di input,
dei processori di output,
e dei processori bidirezionali)
- Stampare messaggi fatali, non fatali, di avvertimento, e avvertimenti “lint”
- Aggiornare
ERRNO
o annullarlo
- Accedere a parametri, come pure convertire un parametro di tipo non definito
in un vettore
- Accedere alla tabella dei simboli (ricuperare il valore di una
variabile globale, crearne una nuova o modificarne una esistente)
- Creare e rilasciare valori nascosti; questo consente di usare in modo
efficiente lo stesso valore per più variabili e può migliorare di molto le
prestazioni del programma
- Manipolare vettori
(ricuperare, aggiungere, cancellare e modificare elementi;
ottenere il numero di elementi in un vettore;
creare un nuovo vettore;
svuotare un vettore;
e
appiattire un vettore per poterlo percorrere facilmente con un ciclo in
stile C, visitando tutti i suoi indici ed elementi)
- L’API definisce diversi tipi di dati standard per rappresentare
valori di variabili, elementi di vettore e vettori presenti in
awk
.
- L’API fornisce funzioni di servizio per definire dei valori.
Sono anche disponibili funzioni di gestione della memoria, per assicurare
la compatibilità fra memoria allocata da
gawk
e memoria allocata da
un’estensione.
- Tutta la memoria passata da
gawk
a un’estensione dev’essere
considerata come in sola lettura dall’estensione.
- Tutta la memoria passata da un’estensione a
gawk
deve
essere ottenuta dalle funzioni di allocazione della memoria previste
dall’API. gawk
è responsabile per la gestione di quella memoria e
la libera quando è il momento per farlo.
- L’API fornisce informazioni sulla versione di
gawk
in
esecuzione, in modo che un’estensione possa verificare la propria compatibilità
con la versione di gawk
da cui è stata caricata.
- È più facile iniziare a programmare una nuova estensione usando il
codice predefinito descritto in questo capitolo. Alcune macro nel
file di intestazione gawkapi.h rendono la cosa più agevole.
- La distribuzione di
gawk
comprende un numero di piccoli ma utili
esempi di estensione. Il progetto gawkextlib
include diverse altre
estensioni, di maggiori dimensioni.
Per chi desideri scrivere un’estensione e metterla a disposizione della
comunità degli utenti di gawk
, il progetto gawkextlib
è il posto adatto per farlo.