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.