Precedente: , Su: Funzioni di registrazione   [Contenuti][Indice]


17.4.5.6 Registrare un processore bidirezionale

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.