Index: ossp-pkg/sio/sio_sio.c RCS File: /v/ossp/cvs/ossp-pkg/sio/sio_sio.c,v co -q -kk -p'1.1' '/v/ossp/cvs/ossp-pkg/sio/sio_sio.c,v' | diff -u /dev/null - -L'ossp-pkg/sio/sio_sio.c' 2>/dev/null --- ossp-pkg/sio/sio_sio.c +++ - 2025-05-20 13:37:47.628272381 +0200 @@ -0,0 +1,163 @@ +#include +#include +#include +#include + +#include "al.h" +#include "sio.h" + +typedef struct { + sio_t *upstream; + al_label_t label; + al_label_t data_label; + al_label_t eof_label; + al_label_t error_label; + char eof; +} private_t; + +/* + * create stage + * + * allocate private instance data + */ +static +sio_rc_t siosio_init(sio_t *sio, void **up) +{ + private_t *my; + + my = (private_t *)malloc(sizeof(private_t)); + if (my == NULL) + return SIO_ERR_MEM; + + my->upstream = NULL; + my->label = NULL; + my->eof = '\0'; + + sio_label(sio, SIO_LN_DATA, &my->data_label); + sio_label(sio, SIO_LN_ERROR, &my->error_label); + sio_label(sio, SIO_LN_EOF, &my->eof_label); + + *up = my; + + return SIO_OK; +} + +/* + * configure stage + * + * pass two void pointers + */ +static +sio_rc_t siosio_configure(sio_t *sio, void *u, void *obj, void *val) +{ + private_t *my = (private_t *)u; + const char *name = (const char *)obj; + + if (!strcmp(name, "upstream")) { + my->upstream = (sio_t *)val; + } else if (!strcmp(name, "label")) { + my->label = (al_label_t)val; + } else { + return SIO_ERR_ARG; + } + + return SIO_OK; +} + +/* + * destroy stage + */ +static +sio_rc_t siosio_cleanup(sio_t *sio, void *u) +{ + private_t *my = (private_t *)u; + + free(my); + + return SIO_OK; +} + +static +sio_rc_t siosio_openr(sio_t *sio, al_t *al, void *u) +{ + private_t *my = (private_t *)u; + + if (my->upstream == NULL || + my->label == NULL) + return SIO_ERR_ARG; + + return SIO_OK; +} + +static +sio_rc_t siosio_closer(sio_t *sio, al_t *al, void *u) +{ + return SIO_OK; +} + +static +sio_rc_t siosio_openw(sio_t *sio, al_t *al, void *u) +{ + private_t *my = (private_t *)u; + + if (my->upstream == NULL || + my->label == NULL) + return SIO_ERR_ARG; + + return SIO_OK; +} + +static +sio_rc_t siosio_closew(sio_t *sio, al_t *al, void *u) +{ + return SIO_OK; +} + +static +sio_rc_t siosio_input(sio_t *sio, al_t *al, void *u) +{ + private_t *my = (private_t *)u; + + if (al_bytes(al) == 0) { + sio_input(my->upstream, al, SIZE_T_MAX, my->label); + if (al_bytes(al) > 0) { + if (my->label != my->data_label) + al_setlabel(al, 0, al_bytes(al), my->label, my->data_label); + } else + al_append_bytes(al, &my->eof, sizeof(my->eof), my->eof_label); + } + + return SIO_SCHED_DOWN; +} + +static +sio_rc_t siosio_output(sio_t *sio, al_t *al, void *u) +{ + private_t *my = (private_t *)u; + + if (al_bytes(al) > 0) { + /* recolor data */ + if (my->label != my->data_label) + al_setlabel(al, 0, al_bytes(al), my->data_label, my->label); + /* send out */ + /* XXX error handling ? */ + sio_output(my->upstream, al); + } + + return SIO_SCHED_DOWN; +} + +sio_module_t sio_module_sio = { + "sio", + siosio_init, + siosio_configure, + siosio_cleanup, + siosio_openr, + siosio_closer, + siosio_openw, + siosio_closew, + siosio_input, + siosio_output, + NULL +}; +