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

Reply via email to