Author: bdonlan
Date: 2004-12-30 00:56:38 -0500 (Thu, 30 Dec 2004)
New Revision: 474

Modified:
   trunk/
   trunk/clients/ncurses/lineio.c
   trunk/clients/ncurses/lineio.h
Log:
 [EMAIL PROTECTED]:  bdonlan | 2004-12-30T05:41:36.819372Z
 Add vim modeline
 [EMAIL PROTECTED]:  bdonlan | 2004-12-30T05:52:54.211039Z
 doh. lineio_conn not _callback
 [EMAIL PROTECTED]:  bdonlan | 2004-12-30T05:56:19.875905Z
 Preliminary buffered output implementation, and some stubs




Property changes on: trunk
___________________________________________________________________
Name: svk:merge
   - 1f59643a-e6e5-0310-bc24-f7d4c744f460:/haver/local/trunk:10209
27e50396-46e3-0310-8b22-ae223a1f35ce:/local:212
edfcd8bd-4ce7-0310-a97e-bb1efd40edf3:/local:238
   + 1f59643a-e6e5-0310-bc24-f7d4c744f460:/haver/local/trunk:10213
27e50396-46e3-0310-8b22-ae223a1f35ce:/local:212
edfcd8bd-4ce7-0310-a97e-bb1efd40edf3:/local:238

Modified: trunk/clients/ncurses/lineio.c
===================================================================
--- trunk/clients/ncurses/lineio.c      2004-12-30 05:36:41 UTC (rev 473)
+++ trunk/clients/ncurses/lineio.c      2004-12-30 05:56:38 UTC (rev 474)
@@ -1,7 +1,9 @@
+/* vim: set ts=4 sw=4 expandtab si ai sta tw=104: */
+
 struct lineio_conn {
-       char *outbuf = NULL;
+       char *outbuf;
        size_t outbuf_used, outbuf_len;
-       char *inbuf = NULL;
+       char *inbuf;
        size_t inbuf_used, inbuf_len;
 
        lineio_callback *cb;
@@ -16,4 +18,89 @@
 #include <stdlib.h>
 #include <unistd.h>
 
+static void lineio_evcallback(int fd, int mode, void *baton);
 
+lineio_conn *lineio_attach(
+               int fd, lineio_callback *cb, void *baton
+               )
+{
+       lineio_conn *conn = mymalloc(sizeof *conn);
+       conn->outbuf_used = conn->inbuf_used = 0;
+       conn->inbuf_len = conn->outbuf_len = 32;
+       conn->inbuf = mymalloc(conn->inbuf_len);
+       conn->outbuf = mymalloc(conn->outbuf_len);
+       
+       conn->cb = cb;
+       conn->baton = baton;
+       conn->fd = fd;
+
+       event_addfd(
+                       fd,
+                       EVENT_FD_READABLE | EVENT_FD_ERROR,
+                       lineio_evcallback,
+                       conn
+                       );
+}
+
+static void lineio_evcallback(int fd, int mode, void *baton) {
+       lineio_conn *conn = baton;
+       assert(conn->fd == fd);
+       if (mode & EVENT_FD_READABLE) {
+               /* FIXME: Line buffering. This is a test hack */
+               ssize_t dlen = read(fd, conn->inbuf, conn->inbuf_len - 1);
+               if (dlen <= 0) {
+                       /* badness */
+                       abort();
+               }
+               conn->inbuf[dlen] = 0;
+               conn->cb(conn, fd, conn->baton, LINEIO_GOTLINE, conn->inbuf);
+       }
+       if (mode & EVENT_FD_WRITABLE) {
+               if (conn->outbuf_used) {
+                       ssize_t dlen = write(fd, conn->outbuf, 
conn->outbuf_used);
+                       if (dlen <= 0) {
+                               /* badness */
+                               abort();
+                       }
+                       assert(dlen <= conn->outbuf_used);
+                       if (conn->outbuf_used > dlen) {
+                               memmove(conn->outbuf, conn->outbuf + dlen,
+                                               conn->outbuf_used - dlen);
+                       }
+                       conn->outbuf_used -= dlen;
+               } else {
+                       event_addfd(
+                                       fd, EVENT_FD_READABLE | EVENT_FD_ERROR,
+                                       lineio_callback, conn);
+               }
+       }
+       if (mode & EVENT_FD_ERROR) {
+               /* badness */
+               abort();
+       }
+}
+
+int lineio_printf(lineio_conn *conn, char *fmt, ...) {
+       int elen;
+       va_list ap;
+
+       va_start(ap, fmt);
+       elen = vsnprintf(NULL, 0, fmt, ap);
+       if (conn->outbuf_len < conn->outbuf_used + elen) {
+               conn->outbuf_len = elen + conn->outbuf_used;
+               conn->outbuf = myrealloc(conn->outbuf, conn->outbuf_len);
+       }
+       elen = vsnprintf(
+                       conn->outbuf + conn->outbuf_used,
+                       conn->outbuf_len - conn->outbuf_used,
+                       fmt, ap
+                       );
+       conn->outbuf_used += elen;
+
+       event_addfd(
+                       conn->fd,
+                       EVENT_FD_READABLE | EVENT_FD_WRITABLE | EVENT_FD_ERROR,
+                       lineio_evcallback,
+                       conn);
+       return elen;
+}

Modified: trunk/clients/ncurses/lineio.h
===================================================================
--- trunk/clients/ncurses/lineio.h      2004-12-30 05:36:41 UTC (rev 473)
+++ trunk/clients/ncurses/lineio.h      2004-12-30 05:56:38 UTC (rev 474)
@@ -18,6 +18,6 @@
 
 lineio_conn *lineio_attach(int fd, lineio_callback *cb, void *baton);
 void lineio_detatch(lineio_conn *conn);
-int lineio_printf(lineio_callback *cb, char *fmt, ...);
+int lineio_printf(lineio_conn *conn, char *fmt, ...);
 
 #endif


Reply via email to