/*
   Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; version 2 of the License.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA */

/*
  Char classes for lexical scanners
*/


#ifndef SQL_LEX_CHARS_INCLUDED
#define SQL_LEX_CHARS_INCLUDED

#include "my_global.h"

enum __attribute__((__packed__)) my_lex_states
{
  MY_LEX_START, MY_LEX_CHAR, MY_LEX_IDENT,
  MY_LEX_IDENT_SEP, MY_LEX_IDENT_START,
  MY_LEX_REAL, MY_LEX_HEX_NUMBER, MY_LEX_BIN_NUMBER,
  MY_LEX_CMP_OP, MY_LEX_LONG_CMP_OP, MY_LEX_STRING, MY_LEX_COMMENT, MY_LEX_END,
  MY_LEX_OPERATOR_OR_IDENT, MY_LEX_NUMBER_IDENT, MY_LEX_INT_OR_REAL,
  MY_LEX_REAL_OR_POINT, MY_LEX_BOOL, MY_LEX_EOL, MY_LEX_ESCAPE,
  MY_LEX_LONG_COMMENT, MY_LEX_END_LONG_COMMENT, MY_LEX_SEMICOLON,
  MY_LEX_SET_VAR, MY_LEX_USER_END, MY_LEX_HOSTNAME, MY_LEX_SKIP,
  MY_LEX_USER_VARIABLE_DELIMITER, MY_LEX_SYSTEM_VAR,
  MY_LEX_IDENT_OR_KEYWORD,
  MY_LEX_IDENT_OR_HEX, MY_LEX_IDENT_OR_BIN, MY_LEX_IDENT_OR_NCHAR,
  MY_LEX_STRING_OR_DELIMITER
};


enum __attribute__((__packed__)) hint_lex_char_classes
{
  HINT_CHR_ASTERISK,                    // [*]
  HINT_CHR_AT,                          // [@]
  HINT_CHR_BACKQUOTE,                   // [`]
  HINT_CHR_CHAR,                        // default state
  HINT_CHR_DIGIT,                       // [[:digit:]]
  HINT_CHR_DOUBLEQUOTE,                 // ["]
  HINT_CHR_EOF,                         // pseudo-class
  HINT_CHR_IDENT,                       // [_$[:alpha:]]
  HINT_CHR_MB,                          // multibyte character
  HINT_CHR_NL,                          // \n
  HINT_CHR_SLASH,                       // [/]
  HINT_CHR_SPACE                        // [[:space:]] excluding \n
};


struct lex_state_maps_st
{
  enum my_lex_states main_map[256];
  enum hint_lex_char_classes hint_map[256];
};

C_MODE_START
typedef struct lex_state_maps_st lex_state_maps_st;
typedef struct charset_info_st charset_info_st;

my_bool init_state_maps(struct charset_info_st *cs);
C_MODE_END

#endif /* SQL_LEX_CHARS_INCLUDED */

