/* Copyright (C) 1996-2000,2005,2007 Free Software Foundation, Inc.
   This file is part of the GNU C Library.
   Contributed by Ulrich Drepper <drepper@gnu.org>, 1996.

   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, or
   (at your option) any later version.

   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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */

#ifndef _TOKEN_H
#define _TOKEN_H

enum token_t
{
  tok_none = 0,

  tok_eof,
  tok_eol,
  tok_bsymbol,
  tok_ident,
  tok_ellipsis2,
  tok_ellipsis3,
  tok_ellipsis4,
  tok_ellipsis2_2,
  tok_ellipsis4_2,
  tok_semicolon,
  tok_comma,
  tok_open_brace,
  tok_close_brace,
  tok_charcode,
  tok_ucs4,
  tok_number,
  tok_minus1,
  tok_string,
  tok_include,

  tok_escape_char,
  tok_comment_char,
  tok_charmap,
  tok_end,
  tok_g0esc,
  tok_g1esc,
  tok_g2esc,
  tok_g3esc,
  tok_escseq,
  tok_addset,

  tok_charids,

  tok_code_set_name,
  tok_mb_cur_max,
  tok_mb_cur_min,
  tok_charconv,
  tok_width,
  tok_width_variable,
  tok_width_default,
  tok_repertoiremap,

  tok_lc_ctype,
  tok_copy,
  /* Keep the following entries up to the next comment in this order!  */
  tok_upper,
  tok_lower,
  tok_alpha,
  tok_digit,
  tok_xdigit,
  tok_space,
  tok_print,
  tok_graph,
  tok_blank,
  tok_cntrl,
  tok_punct,
  tok_alnum,
  /* OK, shuffling allowed again.  */
  tok_outdigit,
  tok_charclass,
  tok_class,
  tok_toupper,
  tok_tolower,
  tok_map,
  tok_translit_start,
  tok_translit_end,
  tok_translit_ignore,
  tok_default_missing,
  tok_lc_collate,
  tok_coll_weight_max,
  tok_section_symbol,
  tok_collating_element,
  tok_collating_symbol,
  tok_symbol_equivalence,
  tok_script,
  tok_order_start,
  tok_order_end,
  tok_from,
  tok_forward,
  tok_backward,
  tok_position,
  tok_undefined,
  tok_ignore,
  tok_reorder_after,
  tok_reorder_end,
  tok_reorder_sections_after,
  tok_reorder_sections_end,
  tok_define,
  tok_undef,
  tok_ifdef,
  tok_ifndef,
  tok_else,
  tok_elifdef,
  tok_elifndef,
  tok_endif,
  tok_lc_monetary,
  tok_int_curr_symbol,
  tok_currency_symbol,
  tok_mon_decimal_point,
  tok_mon_thousands_sep,
  tok_mon_grouping,
  tok_positive_sign,
  tok_negative_sign,
  tok_int_frac_digits,
  tok_frac_digits,
  tok_p_cs_precedes,
  tok_p_sep_by_space,
  tok_n_cs_precedes,
  tok_n_sep_by_space,
  tok_p_sign_posn,
  tok_n_sign_posn,
  tok_int_p_cs_precedes,
  tok_int_p_sep_by_space,
  tok_int_n_cs_precedes,
  tok_int_n_sep_by_space,
  tok_int_p_sign_posn,
  tok_int_n_sign_posn,
  tok_duo_int_curr_symbol,
  tok_duo_currency_symbol,
  tok_duo_int_frac_digits,
  tok_duo_frac_digits,
  tok_duo_p_cs_precedes,
  tok_duo_p_sep_by_space,
  tok_duo_n_cs_precedes,
  tok_duo_n_sep_by_space,
  tok_duo_int_p_cs_precedes,
  tok_duo_int_p_sep_by_space,
  tok_duo_int_n_cs_precedes,
  tok_duo_int_n_sep_by_space,
  tok_duo_p_sign_posn,
  tok_duo_n_sign_posn,
  tok_duo_int_p_sign_posn,
  tok_duo_int_n_sign_posn,
  tok_uno_valid_from,
  tok_uno_valid_to,
  tok_duo_valid_from,
  tok_duo_valid_to,
  tok_conversion_rate,
  tok_lc_numeric,
  tok_decimal_point,
  tok_thousands_sep,
  tok_grouping,
  tok_lc_time,
  tok_abday,
  tok_day,
  tok_abmon,
  tok_mon,
  tok_d_t_fmt,
  tok_d_fmt,
  tok_t_fmt,
  tok_am_pm,
  tok_t_fmt_ampm,
  tok_era,
  tok_era_year,
  tok_era_d_fmt,
  tok_era_d_t_fmt,
  tok_era_t_fmt,
  tok_alt_digits,
  tok_week,
  tok_first_weekday,
  tok_first_workday,
  tok_cal_direction,
  tok_timezone,
  tok_date_fmt,
  tok_lc_messages,
  tok_yesexpr,
  tok_noexpr,
  tok_yesstr,
  tok_nostr,
  tok_lc_paper,
  tok_height,
  tok_lc_name,
  tok_name_fmt,
  tok_name_gen,
  tok_name_mr,
  tok_name_mrs,
  tok_name_miss,
  tok_name_ms,
  tok_lc_address,
  tok_postal_fmt,
  tok_country_name,
  tok_country_post,
  tok_country_ab2,
  tok_country_ab3,
  tok_country_num,
  tok_country_car,
  tok_country_isbn,
  tok_lang_name,
  tok_lang_ab,
  tok_lang_term,
  tok_lang_lib,
  tok_lc_telephone,
  tok_tel_int_fmt,
  tok_tel_dom_fmt,
  tok_int_select,
  tok_int_prefix,
  tok_lc_measurement,
  tok_measurement,
  tok_lc_identification,
  tok_title,
  tok_source,
  tok_address,
  tok_contact,
  tok_email,
  tok_tel,
  tok_fax,
  tok_language,
  tok_territory,
  tok_audience,
  tok_application,
  tok_abbreviation,
  tok_revision,
  tok_date,
  tok_category,

  tok_error
};


struct keyword_t
{
  const char *name;
  enum token_t token;
  int symname_or_ident;

  /* Only for locdef file.  */
  int locale;
  enum token_t base;
  enum token_t group;
  enum token_t list;
};


#endif /* token.h */
