/*
 * Copyright (c) 2015 BalaBit
 * Copyright (c) 2015 Tibor Benke
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 * As an additional exemption you are allowed to compile & link against the
 * OpenSSL libraries as published by the OpenSSL project. See the file
 * COPYING for details.
 *
 */

%code top {
#include "native-parser.h"

}


%code {

#include "cfg-parser.h"
#include "parser.h"
#include "syslog-names.h"
#include "messages.h"
#include "plugin.h"
#include "cfg-grammar-internal.h"

#include <string.h>

}

%define api.prefix {native_}

/* this parameter is needed in order to instruct bison to use a complete
 * argument list for yylex/yyerror */

%lex-param {CfgLexer *lexer}
%parse-param {CfgLexer *lexer}
%parse-param {LogParser **instance}
%parse-param {gpointer arg}

/* INCLUDE_DECLS */

%token KW_OPTION

%type <ptr> native
%type <ptr> native_parser
%%

start
  : native
    {
      *instance = $1;
      if (yychar != NATIVE_EMPTY)
        cfg_lexer_unput_token(lexer, &yylval);
      YYACCEPT;
    }
  ;

native
  : LL_CONTEXT_PARSER native_parser { $$ = $2; }
  ;

native_parser
  : LL_IDENTIFIER '(' native_parser_params ')' { $$ = *instance; free($1); }
  ;

native_parser_params
  : {
      *instance = native_parser_new(configuration);

      if (!*instance)
       {
         msg_error("Cannot create the Native parser, aborting");
         YYERROR;
       }
    }
    native_parser_options
  ;

native_parser_options
  : native_parser_option native_parser_options
  |
  ;

native_parser_option
  : KW_OPTION '(' string string ')'
    {
      CHECK_ERROR(native_parser_set_option(*instance, $3, $4), @1, "Failed to set configuration option for native-parser: option(%s, %s)", $3, $4);

      free($3);
      free($4);
    }
    ;

/* INCLUDE_RULES */

%%

