Precedente: Processori di output, Su: Funzioni di registrazione [Contenuti][Indice]
Un processore bidirezionale combina un analizzatore di input e
un processore di output per un I/O
bidirezionale usando l’operatore ‘|&’ (vedi la sezione Ridirigere l’output di print
e printf
).
Le strutture awk_input_parser_t
e awk_output_buf_t
sono usate nella maniera già descritta precedentemente.
Un processore bidirezionale è rappresentato dalla struttura seguente:
typedef struct awk_two_way_processor { const char *nome; /* nome del processore bidirezionale */ awk_bool_t (*can_take_two_way)(const char *nome); awk_bool_t (*take_control_of)(const char *nome, awk_input_buf_t *inbuf, awk_output_buf_t *outbuf); awk_const struct awk_two_way_processor *awk_const next; /* per gawk */ } awk_two_way_processor_t;
I campi sono i seguenti:
const char *nome;
Il nome del processore bidirezionale.
awk_bool_t (*can_take_two_way)(const char *nome);
La funzione puntata da questo campo dovrebbe restituire true se
vuole gestire l’I/O bidirezionale per questo nome-file.
La funzione non dovrebbe modificare alcuno stato (valori di variabili, etc.)
all’interno di gawk
.
awk_bool_t (*take_control_of)(const char *nome,
awk_input_buf_t *inbuf,
awk_output_buf_t *outbuf);
La funzione puntata da questo campo dovrebbe riempire le strutture
awk_input_buf_t
e awk_output_buf_t
puntate da inbuf
e
outbuf
, rispettivamente. Queste strutture sono già state descritte
in precedenza.
awk_const struct two_way_processor *awk_const next;
Questa struttura è per uso di gawk
;
per questo motivo è marcata awk_const
in modo che l’estensione non
possa modificarla.
Come per l’analizzatore di input e il processore di output, vanno fornite le
funzione “sì, ci penso io” e “per questo, fai tu”,
XXX_can_take_two_way()
e XXX_take_control_of()
.
Il processore bidirezionale va registrato usando la seguente funzione:
void register_two_way_processor(awk_two_way_processor_t *two_way_processor);
Registra il processore bidirezionale puntato da two_way_processor
con
gawk
.