// clang-format off

#line 1 "wkt.rl"
/*
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
  distributed with this work for additional information
  regarding copyright ownership.  The ASF licenses this file
  to you under the Apache License, Version 2.0 (the
  "License"); you may not use this file except in compliance
  with the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
*/

#include "wkt.hpp"

#include "string.hpp"

#include <stdlib.h>

#line 18 "wkt.cpp"
static const char _wkt_actions[] = { 0,  1, 0,  1, 1,  1, 2,  1, 5,  1, 6,  1, 7,  1,
                                     8,  1, 9,  1, 10, 1, 11, 1, 12, 1, 13, 1, 14, 1,
                                     15, 1, 16, 1, 17, 1, 18, 2, 2,  3, 2,  2, 4 };

static const char _wkt_key_offsets[] = {
  0,  2,  6,  8,  9,  10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
  21, 22, 23, 24, 25, 26, 27, 40, 43, 47, 49, 54, 56, 57, 58
};

static const char _wkt_trans_keys[] = { 48, 57, 43, 45,  48, 57, 48, 57, 80,  84, 89, 78,
                                        69, 83, 84, 82,  73, 78, 71, 73, 76,  78, 84, 89,
                                        71, 79, 78, 9,   32, 40, 41, 44, 46,  69, 76, 80,
                                        43, 45, 48, 57,  46, 48, 57, 69, 101, 48, 57, 48,
                                        57, 46, 69, 101, 48, 57, 48, 57, 77,  73, 79, 0 };

static const char _wkt_single_lengths[] = { 0, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
                                            1, 1, 1, 1, 1, 1, 9, 1, 2, 0, 3, 0, 1, 1, 1 };

static const char _wkt_range_lengths[] = { 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                                           0, 0, 0, 0, 0, 0, 2, 1, 1, 1, 1, 1, 0, 0, 0 };

static const char _wkt_index_offsets[] = { 0,  2,  6,  8,  10, 12, 14, 16, 18, 20,
                                           22, 24, 26, 28, 30, 33, 35, 37, 39, 41,
                                           43, 45, 57, 60, 64, 66, 71, 73, 75, 77 };

static const char _wkt_trans_targs[] = {
  23, 21, 2,  2,  24, 21, 24, 21, 4,  21, 5,  21, 21, 21, 7,  21, 8,  21, 9,  21, 10, 21,
  11, 21, 12, 21, 13, 21, 21, 21, 15, 17, 21, 16, 21, 21, 21, 18, 21, 19, 21, 20, 21, 21,
  21, 21, 21, 21, 21, 21, 26, 27, 28, 29, 22, 25, 21, 0,  25, 21, 1,  1,  23, 21, 24, 21,
  0,  1,  1,  25, 21, 23, 21, 3,  21, 6,  21, 14, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 0
};

static const char _wkt_trans_actions[] = {
  5,  33, 0,  0,  0,  29, 0,  29, 0,  31, 0,  31, 13, 31, 0,  31, 0,  31, 0,  31, 0,  31,
  0,  31, 0,  31, 0,  31, 9,  31, 0,  0,  31, 0,  31, 7,  31, 0,  31, 0,  31, 0,  31, 11,
  31, 21, 21, 15, 17, 19, 0,  5,  5,  5,  38, 35, 23, 0,  35, 27, 0,  0,  5,  25, 0,  25,
  0,  0,  0,  35, 25, 5,  27, 0,  27, 0,  27, 0,  27, 33, 29, 29, 31, 31, 31, 31, 31, 31,
  31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 27, 25, 25, 25, 27, 27, 27, 27, 0
};

static const char _wkt_to_state_actions[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                                              0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 };

static const char _wkt_from_state_actions[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                                                0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0 };

static const char _wkt_eof_trans[] = { 80,  82,  82,  100, 100, 100, 100, 100, 100, 100,
                                       100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
                                       100, 0,   108, 104, 104, 104, 108, 108, 108, 108 };

static const int wkt_start = 21;
static const int wkt_first_final = 21;
static const int wkt_error = -1;

static const int wkt_en_main = 21;

#line 17 "wkt.rl"

WktLexer::Token WktLexer::next_token() {
  Token token = TK_INVALID;

  const char* p = position_;
  const char* pe = end_;
  const char* ts;
  const char* te;
  const char* eof = pe;
  int cs, act;

  // Avoid unused variable warning
  (void)wkt_first_final;
  (void)wkt_error;
  (void)wkt_en_main;

  if (p == eof) return TK_EOF;

#line 151 "wkt.cpp"
  {
    cs = wkt_start;
    ts = 0;
    te = 0;
    act = 0;
  }

#line 159 "wkt.cpp"
  {
    int _klen;
    unsigned int _trans;
    const char* _acts;
    unsigned int _nacts;
    const char* _keys;

    if (p == pe) goto _test_eof;
  _resume:
    _acts = _wkt_actions + _wkt_from_state_actions[cs];
    _nacts = (unsigned int)*_acts++;
    while (_nacts-- > 0) {
      switch (*_acts++) {
        case 1:
#line 1 "NONE"
        {
          ts = p;
        } break;
#line 178 "wkt.cpp"
      }
    }

    _keys = _wkt_trans_keys + _wkt_key_offsets[cs];
    _trans = _wkt_index_offsets[cs];

    _klen = _wkt_single_lengths[cs];
    if (_klen > 0) {
      const char* _lower = _keys;
      const char* _mid;
      const char* _upper = _keys + _klen - 1;
      while (1) {
        if (_upper < _lower) break;

        _mid = _lower + ((_upper - _lower) >> 1);
        if ((*p) < *_mid)
          _upper = _mid - 1;
        else if ((*p) > *_mid)
          _lower = _mid + 1;
        else {
          _trans += (unsigned int)(_mid - _keys);
          goto _match;
        }
      }
      _keys += _klen;
      _trans += _klen;
    }

    _klen = _wkt_range_lengths[cs];
    if (_klen > 0) {
      const char* _lower = _keys;
      const char* _mid;
      const char* _upper = _keys + (_klen << 1) - 2;
      while (1) {
        if (_upper < _lower) break;

        _mid = _lower + (((_upper - _lower) >> 1) & ~1);
        if ((*p) < _mid[0])
          _upper = _mid - 2;
        else if ((*p) > _mid[1])
          _lower = _mid + 2;
        else {
          _trans += (unsigned int)((_mid - _keys) >> 1);
          goto _match;
        }
      }
      _trans += _klen;
    }

  _match:
  _eof_trans:
    cs = _wkt_trans_targs[_trans];

    if (_wkt_trans_actions[_trans] == 0) goto _again;

    _acts = _wkt_actions + _wkt_trans_actions[_trans];
    _nacts = (unsigned int)*_acts++;
    while (_nacts-- > 0) {
      switch (*_acts++) {
        case 2:
#line 1 "NONE"
        {
          te = p + 1;
        } break;
        case 3:
#line 49 "wkt.rl"
        {
          act = 8;
        } break;
        case 4:
#line 57 "wkt.rl"
        {
          act = 10;
        } break;
        case 5:
#line 42 "wkt.rl"
        {
          te = p + 1;
          {
            token = TK_TYPE_POINT;
            {
              p++;
              goto _out;
            }
          }
        } break;
        case 6:
#line 43 "wkt.rl"
        {
          te = p + 1;
          {
            token = TK_TYPE_LINESTRING;
            {
              p++;
              goto _out;
            }
          }
        } break;
        case 7:
#line 44 "wkt.rl"
        {
          te = p + 1;
          {
            token = TK_TYPE_POLYGON;
            {
              p++;
              goto _out;
            }
          }
        } break;
        case 8:
#line 45 "wkt.rl"
        {
          te = p + 1;
          {
            token = TK_EMPTY;
            {
              p++;
              goto _out;
            }
          }
        } break;
        case 9:
#line 46 "wkt.rl"
        {
          te = p + 1;
          {
            token = TK_OPEN_PAREN;
            {
              p++;
              goto _out;
            }
          }
        } break;
        case 10:
#line 47 "wkt.rl"
        {
          te = p + 1;
          {
            token = TK_CLOSE_PAREN;
            {
              p++;
              goto _out;
            }
          }
        } break;
        case 11:
#line 48 "wkt.rl"
        {
          te = p + 1;
          {
            token = TK_COMMA;
            {
              p++;
              goto _out;
            }
          }
        } break;
        case 12:
#line 56 "wkt.rl"
        {
          te = p + 1;
          { /* Skip */
          }
        } break;
        case 13:
#line 57 "wkt.rl"
        {
          te = p + 1;
          {
            token = TK_INVALID;
            {
              p++;
              goto _out;
            }
          }
        } break;
        case 14:
#line 49 "wkt.rl"
        {
          te = p;
          p--;
          {
            if (!skip_number_) {
              number_ = atof(datastax::String(ts, te).c_str());
            }
            token = TK_NUMBER;
            {
              p++;
              goto _out;
            }
          }
        } break;
        case 15:
#line 57 "wkt.rl"
        {
          te = p;
          p--;
          {
            token = TK_INVALID;
            {
              p++;
              goto _out;
            }
          }
        } break;
        case 16:
#line 49 "wkt.rl"
        {
          { p = ((te)) - 1; }
          {
            if (!skip_number_) {
              number_ = atof(datastax::String(ts, te).c_str());
            }
            token = TK_NUMBER;
            {
              p++;
              goto _out;
            }
          }
        } break;
        case 17:
#line 57 "wkt.rl"
        {
          { p = ((te)) - 1; }
          {
            token = TK_INVALID;
            {
              p++;
              goto _out;
            }
          }
        } break;
        case 18:
#line 1 "NONE"
        {
          switch (act) {
            case 8: {
              { p = ((te)) - 1; }
              if (!skip_number_) {
                number_ = atof(datastax::String(ts, te).c_str());
              }
              token = TK_NUMBER;
              {
                p++;
                goto _out;
              }
            } break;
            case 10: {
              { p = ((te)) - 1; }
              token = TK_INVALID;
              {
                p++;
                goto _out;
              }
            } break;
          }
        } break;
#line 337 "wkt.cpp"
      }
    }

  _again:
    _acts = _wkt_actions + _wkt_to_state_actions[cs];
    _nacts = (unsigned int)*_acts++;
    while (_nacts-- > 0) {
      switch (*_acts++) {
        case 0:
#line 1 "NONE"
        {
          ts = 0;
        } break;
#line 350 "wkt.cpp"
      }
    }

    if (++p != pe) goto _resume;
  _test_eof : {}
    if (p == eof) {
      if (_wkt_eof_trans[cs] > 0) {
        _trans = _wkt_eof_trans[cs] - 1;
        goto _eof_trans;
      }
    }

  _out : {}
  }

#line 62 "wkt.rl"

  position_ = p;

  return token;
}
