// Copyright 2011 Google Inc. All Rights Reserved.
// Author: qianzhang@google.com (ken Zhang)
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "channel_buffer.h"

#include "utility.h"
#define sage_log(x) _sagelog x
void _sagelog(int type, int level, const char *cstr, ...);

static const char *delimiter = " \t,;\r\n:=|'\"#";

static int is_delimiter(char ch)
{
  int i;
  if (ch == 0)
    return 1;
  for (i = 0; delimiter[i]; i++)
    if (ch == delimiter[i])
      return 1;
  return 0;
}

// format name:zzz (or name=zzzz)
int get_string_by_name(char *p, const char *name, char *string, int max_len,
                       char **next)
{
  char *s, *e;
  e = p;

  while (e != NULL && *e) {
    s = strstr(e, name);
    if (s == NULL)
      return 0;
    // is a token name
    if (((s > p && is_delimiter(*(s - 1))) || s == p) &&
        is_delimiter(*(s + strlen(name)))) {
      s += (int)strlen(name);
      while (*s && (*s == ' ' || *s == '\t')) s++;  // skip white space
      if (*s == '=' || *s == ':') {
        s++;
        while (*s && (*s == ' ' || *s == '\t')) s++;  // skip white space
        if (*s) {
          int i = 0;
          while (i++ < max_len && *s && *s != ' ' && *s != '\t' && *s != '\n' &&
                 *s != '\r')
            *string++ = *s++;

          *string = 0x0;  // terminator
          if (next != NULL) {
            while (*s && *s != ' ' && *s != '\t' && *s != '\n' && *s != '\r')
              s++;
            *next = s;
          }
          return 1;
        }
      }
    }
    e = ++s;
  }
  return 0;
}

// format name:zzz (or name=zzzz)
int get_string_by_token(char *p, int num, char *string, int max_len,
                        char **next)
{
  int count = 0;
  char *s;
  s = p;
  if (s == NULL)
    return 0;
  while (*s) {
    while (*s && (*s == ' ' || *s == '\t' || *s == '\r' || *s == '\n'))
      s++;  // skip white space
    if (*s == 0)
      break;

    if (count++ != num) {
      while (*s && !(*s == ' ' || *s == '\t' || *s == ';' || *s == ',' ||
                     *s == '\r' || *s == '\n'))
        s++;  // skip a token
    } else {
      if (*s) {
        int i = 0;
        while (i++ < max_len && *s && !(*s == ' ' || *s == '\t' || *s == ';' ||
                                        *s == ',' || *s == '\r' || *s == '\n'))
          *string++ = *s++;

        *string = 0x0;  // terminator
        if (next != NULL) {
          while (*s && !(*s == ' ' || *s == '\t' || *s == '\r' || *s == '\n'))
            s++;
          *next = s;
        }
        return 1;
      }
    }
    if (*s)
      s++;
  }
  return 0;
}

// format name:"zzz" (or name="zzzz")
int get_quote_string_by_name(char *p, const char *name, char *string,
                             int max_len, char **next)
{
  char *s, *e;
  e = p;

  while (e != NULL && *e) {
    s = strstr(e, name);
    if (s == NULL)
      return 0;
    // is a token name
    if (((s > p && is_delimiter(*(s - 1))) || s == p) &&
        is_delimiter(*(s + strlen(name)))) {
      s += (int)strlen(name);
      while (*s && (*s == ' ' || *s == '\t')) s++;  // skip white space
      if (*s == '=' || *s == ':') {
        s++;
        while (*s && (*s == ' ' || *s == '\t')) s++;  // skip white space
        if (*s == '\"') {
          int i = 0;
          s++;
          while (i++ < max_len && *s && *s != '\"') *string++ = *s++;

          *string = 0x0;  // terminator

          if (next != NULL) {
            while (*s && *s != '\"') s++;
            *next = s + 1;
          }
          return 1;
        } else
          return 0;
      }
    }
    e = ++s;
  }
  return 0;
}

int get_int_val_by_name(char *p, const char *name, int *val, char **next)
{
  char *s, *e;
  e = p;
  while (e != NULL && *e) {
    s = strstr(e, name);
    if (s == NULL)
      return 0;
    // is a token name
    if (((s > p && is_delimiter(*(s - 1))) || s == p) &&
        is_delimiter(*(s + strlen(name)))) {
      s += strlen(name);
      while (*s && (*s == ' ' || *s == '\t')) s++;  // skip white space
      if (*s == '=' || *s == ':') {
        s++;
        while (*s && (*s == ' ' || *s == '\t')) s++;  // skip white space
        if (*s) {
          *val = atoi(s);
          if (*val < 0 && *s == '-')
            s++;
          while (*s >= '0' && *s <= '9') s++;
          if (next != NULL)
            *next = s;
          return 1;
        }
      }
    }
    e = ++s;
  }
  return 0;
}
struct channel_list_t *_create_channel_list(int num)
{
  if (num <= 0)
    return NULL;
  struct channel_list_t *cl = malloc(sizeof(struct channel_list_t));
  if (cl == NULL)
    return NULL;
  cl->num = num;
  cl->channel_num = 0;
  cl->ce = malloc(sizeof(struct channel_entry_t) * num);
  if (cl->ce == NULL) {
    free(cl);
    return NULL;
  }
  memset(cl->ce, 0x0, sizeof(struct channel_entry_t) * num);
  return cl;
}

void _release_channel_list(struct channel_list_t *cl)
{
  if (cl) {
    if (cl->ce)
      free(cl->ce);
    free(cl);
  }
}

struct channel_list_t *_joint_channel_list(struct channel_list_t *cl1,
                                           struct channel_list_t *cl2)
{
  int i, n, channel_num;
  if (cl1 == NULL)
    return cl2;
  if (cl2 == NULL)
    return cl1;

  channel_num = cl1->channel_num + cl2->channel_num;
  if (channel_num < cl1->num) {
    n = 0;
    for (i = cl1->channel_num; i < channel_num; i++) cl1->ce[i] = cl2->ce[n++];
    cl2->channel_num = channel_num;
    _release_channel_list(cl2);
    return cl1;
  } else if (channel_num < cl2->num) {
    n = 0;
    for (i = cl2->channel_num; i < channel_num; i++) cl2->ce[i] = cl1->ce[n++];
    cl2->channel_num = channel_num;
    _release_channel_list(cl1);
    return cl2;
  } else {
    struct channel_list_t *cl = _create_channel_list(channel_num);
    for (i = 0; i < cl1->channel_num; i++) cl->ce[i] = cl1->ce[i];
    for (n = 0; n < cl2->channel_num; n++) cl->ce[i++] = cl2->ce[n];
    _release_channel_list(cl1);
    _release_channel_list(cl2);
    cl->channel_num = channel_num;
    return cl;
  }
  return NULL;
}
