Changeset: d42c9c6d92c1 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=d42c9c6d92c1 Modified Files: clients/mapiclient/mclient.c common/stream/callback.c common/stream/stream.h Branch: makelibstreamgreatagain Log Message:
Port callback_stream write support from default branch diffs (86 lines): diff --git a/clients/mapiclient/mclient.c b/clients/mapiclient/mclient.c --- a/clients/mapiclient/mclient.c +++ b/clients/mapiclient/mclient.c @@ -2237,7 +2237,7 @@ doFile(Mapi mid, stream *fp, bool useins init_readline(mid, language, save_history); rl.s = fp; rl.buf = NULL; - if ((fp = callback_stream(&rl, myread, NULL, mydestroy, mnstr_name(fp))) == NULL) { + if ((fp = callback_stream(&rl, myread, NULL, NULL, mydestroy, mnstr_name(fp))) == NULL) { fprintf(stderr,"Malloc for doFile failed"); exit(2); } diff --git a/common/stream/callback.c b/common/stream/callback.c --- a/common/stream/callback.c +++ b/common/stream/callback.c @@ -23,6 +23,7 @@ struct cbstream { void (*destroy)(void *); void (*close)(void *); ssize_t (*read)(void *, void *, size_t, size_t); + ssize_t (*write)(void *, const void *, size_t, size_t); }; static void @@ -54,9 +55,18 @@ cb_read(stream *restrict s, void *restri return cb->read(cb->private, buf, elmsize, cnt); } +static ssize_t +cb_write(stream *restrict s, const void *restrict buf, size_t elmsize, size_t cnt) +{ + struct cbstream *cb = s->stream_data.p; + + return cb->write(cb->private, buf, elmsize, cnt); +} + stream * callback_stream(void *restrict private, ssize_t (*read)(void *restrict private, void *restrict buf, size_t elmsize, size_t cnt), + ssize_t (*write)(void *restrict private, const void *restrict buf, size_t elmsize, size_t cnt), void (*close)(void *private), void (*destroy)(void *private), const char *restrict name) @@ -64,6 +74,9 @@ callback_stream(void *restrict private, stream *s; struct cbstream *cb; + if ((write && read) || (!write && !read)) + return NULL; + s = create_stream(name); if (s == NULL) return NULL; @@ -77,10 +90,13 @@ callback_stream(void *restrict private, .private = private, .destroy = destroy, .read = read, + .write = write, .close = close, }; + s->readonly = (read != NULL); s->stream_data.p = cb; - s->read = cb_read; + s->read = read ? cb_read : NULL; + s->write = write ? cb_write : NULL; s->destroy = cb_destroy; s->close = cb_close; return s; diff --git a/common/stream/stream.h b/common/stream/stream.h --- a/common/stream/stream.h +++ b/common/stream/stream.h @@ -262,13 +262,14 @@ stream_export void bstream_destroy(bstre stream_export ssize_t bstream_read(bstream *s, size_t size); // tablet.c, tokenizer.c stream_export ssize_t bstream_next(bstream *s); // all over -/* Callback stream is a read-only stream where the read function is +/* Callback stream is a stream where the read and write functions are * provided by the caller. close and destroy are also provided. The * private pointer is passed on to the callback functions when they * are invoked. */ stream_export stream *callback_stream( void *restrict priv, ssize_t (*read)(void *restrict priv, void *restrict buf, size_t elmsize, size_t cnt), + ssize_t (*write)(void *restrict priv, const void *restrict buf, size_t elmsize, size_t cnt), void (*close)(void *priv), void (*destroy)(void *priv), const char *restrict name); // used in mclient.c, for readline _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list