// 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;    
}



