void dyad_vwritef(dyad_Stream *stream, const char *fmt, va_list args) { char buf[512]; char *str; char f[] = "%_"; FILE *fp; int c; while (*fmt) { if (*fmt == '%') { fmt++; switch (*fmt) { case 'r': fp = va_arg(args, FILE*); if (fp == NULL) { str = "(null)"; goto writeStr; } while ((c = fgetc(fp)) != EOF) { dyad_vectorPush(&stream->writeBuffer, c); } break; case 'c': dyad_vectorPush(&stream->writeBuffer, va_arg(args, int)); break; case 's': str = va_arg(args, char*); if (str == NULL) str = "(null)"; writeStr: while (*str) { dyad_vectorPush(&stream->writeBuffer, *str++); } break; case 'b': str = va_arg(args, char*); c = va_arg(args, int); while (c--) { dyad_vectorPush(&stream->writeBuffer, *str++); } break; default: f[1] = *fmt; switch (*fmt) { case 'f': case 'g': sprintf(buf, f, va_arg(args, double)); break; case 'd': case 'i': sprintf(buf, f, va_arg(args, int)); break; case 'x': case 'X': sprintf(buf, f, va_arg(args, unsigned)); break; case 'p': sprintf(buf, f, va_arg(args, void*)); break; default : buf[0] = *fmt; buf[1] = '\0'; } str = buf; goto writeStr; } } else {
void dyad_write(dyad_Stream *stream, void *data, int size) { char *p = data; while (size--) { dyad_vectorPush(&stream->writeBuffer, *p++); } stream->flags |= DYAD_FLAG_WRITTEN; }
void dyad_addListener( dyad_Stream *stream, int event, dyad_Callback callback, void *udata ) { dyad_Listener listener; listener.event = event; listener.callback = callback; listener.udata = udata; dyad_vectorPush(&stream->listeners, listener); }
void dyad_vwritef(dyad_Stream *stream, const char *fmt, va_list args) { char buf[64]; char *str; char f[] = "%_"; FILE *fp; int c; while (*fmt) { if (*fmt == '%') { fmt++; switch (*fmt) { case 'f': case 'g': case 'd': case 'i': case 'x': case 'X': case 'p': f[1] = *fmt; vsprintf(buf, (const char*) f, args); str = buf; goto writeStr; case 'r': fp = va_arg(args, FILE*); while ((c = fgetc(fp)) != EOF) { dyad_vectorPush(&stream->writeBuffer, c); } break; case 'c': dyad_vectorPush(&stream->writeBuffer, va_arg(args, int)); break; case 's': { str = va_arg(args, char*); if (str == NULL) str = "(null)"; writeStr: while (*str) { dyad_vectorPush(&stream->writeBuffer, *str++); } break; } default: dyad_vectorPush(&stream->writeBuffer, *fmt); } } else {
static void dyad_handleReceivedData(dyad_Stream *stream) { for (;;) { /* Receive data */ dyad_Event e; char data[8192]; int size = recv(stream->sockfd, data, sizeof(data) - 1, 0); if (size <= 0) { if (size == 0 || errno != EWOULDBLOCK) { /* Handle disconnect */ dyad_close(stream); return; } else { /* No more data */ return; } } data[size] = 0; /* Update status */ stream->bytesReceived += size; stream->lastActivity = dyad_getTime(); /* Emit data event */ e = dyad_createEvent(DYAD_EVENT_DATA); e.msg = "received data"; e.data = data; e.size = size; dyad_emitEvent(stream, &e); /* Check stream state in case it was closed during one of the data event * handlers. */ if (stream->state != DYAD_STATE_CONNECTED) { return; } /* Handle line event */ if (dyad_hasListenerForEvent(stream, DYAD_EVENT_LINE)) { int i, start; char *buf; for (i = 0; i < size; i++) { dyad_vectorPush(&stream->lineBuffer, data[i]); } start = 0; buf = stream->lineBuffer.data; for (i = 0; i < stream->lineBuffer.length; i++) { if (buf[i] == '\n') { dyad_Event e; buf[i] = '\0'; e = dyad_createEvent(DYAD_EVENT_LINE); e.msg = "received line"; e.data = &buf[start]; e.size = i - start; /* Check and strip carriage return */ if (e.size > 0 && e.data[e.size - 1] == '\r') { e.data[--e.size] = '\0'; } dyad_emitEvent(stream, &e); start = i + 1; /* Check stream state in case it was closed during one of the line * event handlers. */ if (stream->state != DYAD_STATE_CONNECTED) { return; } } } if (start == stream->lineBuffer.length) { dyad_vectorClear(&stream->lineBuffer); } else { dyad_vectorSplice(&stream->lineBuffer, 0, start); } } } }