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