示例#1
0
文件: dyad.c 项目: shanfl/dyad
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 {
示例#2
0
文件: dyad.c 项目: shanfl/dyad
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;
}
示例#3
0
文件: dyad.c 项目: shanfl/dyad
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);
}
示例#4
0
文件: dyad.c 项目: alexraescu/dyad
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 {
示例#5
0
文件: dyad.c 项目: shanfl/dyad
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);
      }
    }
  }
}