#include "mysql_priv.h"

int GTextReadStream::get_next_toc_type() const
{
  const char *cur = m_cur;
  while ((*cur)&&(strchr(" \t\r\n",*cur)))
  {
    cur++;
  }
  if (!(*cur))
  {
    return eostream;
  }

  if (((*cur>='a') && (*cur<='z')) || ((*cur>='A') && (*cur<='Z')) ||
      (*cur=='_'))
  {
    return word;
  }

  if (((*cur>='0') && (*cur<='9')) || (*cur=='-') || (*cur=='+') ||
      (*cur=='.'))
  {
    return numeric;
  }

  if (*cur == '(')
  {
    return l_bra;
  }
  
  if (*cur == ')')
  {
    return r_bra;
  }

  if (*cur == ',')
  {
    return comma;
  }

  return unknown;
}

const char *GTextReadStream::get_next_word(int *word_len)
{
  const char *cur = m_cur;
  while ((*cur)&&(strchr(" \t\r\n",*cur)))
  {
    cur++;
  }
  m_last_text_position = cur;

  if (!(*cur))
  {
    return 0;
  }

  const char *wd_start = cur;

  if (((*cur<'a') || (*cur>'z')) && ((*cur<'A') || (*cur>'Z')) && (*cur!='_'))
  {
    return NULL;
  }

  ++cur;

  while (((*cur>='a') && (*cur<='z')) || ((*cur>='A') && (*cur<='Z')) ||
	 (*cur=='_') || ((*cur>='0') && (*cur<='9')))
  {
    ++cur;
  }

  *word_len = cur - wd_start;

  m_cur = cur;

  return wd_start;
}

int GTextReadStream::get_next_number(double *d)
{
  const char *cur = m_cur;
  while ((*cur)&&(strchr(" \t\r\n",*cur)))
  {
    cur++;
  }

  m_last_text_position = cur;
  if (!(*cur))
  {
    set_error_msg("Numeric constant expected");
    return 1;
  }

  if (((*cur<'0') || (*cur>'9')) && (*cur!='-') && (*cur!='+') && (*cur!='.'))
  {
    set_error_msg("Numeric constant expected");
    return 1;
  }

  char *endptr;

  *d = strtod(cur, &endptr);

  if (endptr)
  {
    m_cur = endptr;
  }

  return 0;
}

char GTextReadStream::get_next_symbol()
{
  const char *cur = m_cur;
  while ((*cur)&&(strchr(" \t\r\n",*cur)))
  {
    cur++;
  }
  if (!(*cur))
  {
    return 0;
  }

  m_cur = cur + 1;
  m_last_text_position = cur;

  return *cur;
}

void GTextReadStream::set_error_msg(const char *msg)
{
  size_t len = strlen(msg);
  m_err_msg = (char *)my_realloc(m_err_msg, len + 1, MYF(MY_ALLOW_ZERO_PTR));
  memcpy(m_err_msg, msg, len + 1);
}