/* parser.h - prototypes for the command line parser.  */
/*
 *  GRUB  --  GRand Unified Bootloader
 *  Copyright (C) 2005,2007,2009  Free Software Foundation, Inc.
 *
 *  GRUB 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, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  GRUB 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 GRUB.  If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef GRUB_PARSER_HEADER
#define GRUB_PARSER_HEADER	1

#include <grub/types.h>
#include <grub/err.h>
#include <grub/reader.h>

/* All the states for the command line.  */
typedef enum
  {
    GRUB_PARSER_STATE_TEXT = 1,
    GRUB_PARSER_STATE_ESC,
    GRUB_PARSER_STATE_QUOTE,
    GRUB_PARSER_STATE_DQUOTE,
    GRUB_PARSER_STATE_VAR,
    GRUB_PARSER_STATE_VARNAME,
    GRUB_PARSER_STATE_VARNAME2,
    GRUB_PARSER_STATE_QVAR,
    GRUB_PARSER_STATE_QVARNAME,
    GRUB_PARSER_STATE_QVARNAME2
  } grub_parser_state_t;

/* A single state transition.  */
struct grub_parser_state_transition
{
  /* The state that is looked up.  */
  grub_parser_state_t from_state;

  /* The next state, determined by FROM_STATE and INPUT.  */
  grub_parser_state_t to_state;

  /* The input that will determine the next state from FROM_STATE.  */
  char input;

  /* If set to 1, the input is valid and should be used.  */
  int keep_value;
};

/* Determines the state following STATE, determined by C.  */
grub_parser_state_t
EXPORT_FUNC (grub_parser_cmdline_state) (grub_parser_state_t state,
					 char c, char *result);

grub_err_t
EXPORT_FUNC (grub_parser_split_cmdline) (const char *cmdline,
					 grub_reader_getline_t getline_func,
					 void *getline_func_data,
					 int *argc, char ***argv);

struct grub_parser
{
  /* The next parser.  */
  struct grub_parser *next;

  /* The parser name.  */
  const char *name;

  /* Initialize the parser.  */
  grub_err_t (*init) (void);

  /* Clean up the parser.  */
  grub_err_t (*fini) (void);

  grub_err_t (*parse_line) (char *line,
			    grub_reader_getline_t getline_func,
			    void *getline_func_data);
};
typedef struct grub_parser *grub_parser_t;

grub_err_t grub_parser_execute (char *source);

grub_err_t
grub_rescue_parse_line (char *line,
			grub_reader_getline_t getline_func,
			void *getline_func_data);

#endif /* ! GRUB_PARSER_HEADER */
