/*============================================================================
  CMake - Cross Platform Makefile Generator
  Copyright 2012 Stephen Kelly <steveire@gmail.com>

  Distributed under the OSI-approved BSD License (the "License");
  see accompanying file Copyright.txt for details.

  This software is distributed WITHOUT ANY WARRANTY; without even the
  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  See the License for more information.
============================================================================*/
#include "cmGeneratorExpressionLexer.h"

cmGeneratorExpressionLexer::cmGeneratorExpressionLexer()
  : SawBeginExpression(false)
  , SawGeneratorExpression(false)
{
}

static void InsertText(const char* upto, const char* c,
                       std::vector<cmGeneratorExpressionToken>& result)
{
  if (upto != c) {
    result.push_back(cmGeneratorExpressionToken(
      cmGeneratorExpressionToken::Text, upto, c - upto));
  }
}

std::vector<cmGeneratorExpressionToken> cmGeneratorExpressionLexer::Tokenize(
  const std::string& input)
{
  std::vector<cmGeneratorExpressionToken> result;

  const char* c = input.c_str();
  const char* upto = c;

  for (; *c; ++c) {
    switch (*c) {
      case '$':
        if (c[1] == '<') {
          InsertText(upto, c, result);
          result.push_back(cmGeneratorExpressionToken(
            cmGeneratorExpressionToken::BeginExpression, c, 2));
          upto = c + 2;
          ++c;
          SawBeginExpression = true;
        }
        break;
      case '>':
        InsertText(upto, c, result);
        result.push_back(cmGeneratorExpressionToken(
          cmGeneratorExpressionToken::EndExpression, c, 1));
        upto = c + 1;
        SawGeneratorExpression = SawBeginExpression;
        break;
      case ':':
        InsertText(upto, c, result);
        result.push_back(cmGeneratorExpressionToken(
          cmGeneratorExpressionToken::ColonSeparator, c, 1));
        upto = c + 1;
        break;
      case ',':
        InsertText(upto, c, result);
        result.push_back(cmGeneratorExpressionToken(
          cmGeneratorExpressionToken::CommaSeparator, c, 1));
        upto = c + 1;
        break;
      default:
        break;
    }
  }
  InsertText(upto, c, result);

  return result;
}
