blob: 6ea15deea8bf09422c48a9686fdcf3ecaeac30c9 [file] [log] [blame]
/* ----------------------------------------------------------------------------
* Copyright CEA/DAM/DIF (2007)
* contributeur : Thomas LEIBOVICI
* This program 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 3 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
* 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 Street, Fifth Floor, Boston, MA 02110-1301 USA
* ---------------------------------------
#include <unistd.h>
#include <stdint.h>
#include <stdbool.h>
#include <stdio.h>
#include "gsh_list.h"
* @brief Configuration parser data structures
* and linkage betweek the parser, analyse.c and config_parsing.c
* Parse tree node.
/* Config nodes are either terminals or non-terminals.
* BLOCK and STMT are non-terminals.
* ROOT is a special case BLOCK (root of tree...)
* TERM is a value/token terminal.
enum node_type { TYPE_ROOT = 1, TYPE_BLOCK, TYPE_STMT, TYPE_TERM};
struct config_node {
struct glist_head node;
char *filename; /* pointer to filename in file list */
int linenumber;
bool found; /* use accounting private in do_block_load */
enum node_type type; /* switches union contents */
union { /* sub_nodes are always struct config_node */
struct { /* TYPE_TERM */
enum term_type type;
char *op_code;
char *varvalue;
} term;
struct { /* TYPE_BLOCK | TYPE_STMT */
char *name; /* name */
struct config_node *parent;
struct glist_head sub_nodes;
} nterm;
* File list
* Every config_node points to a pathname in this list
struct file_list {
struct file_list *next;
char *pathname;
* Symbol table
* Every token the scanner keeps goes here. It is a linear
* list but we don't need much more than that. What we do
* need is an accounting of all that memory so we can free it
* when the parser barfs and leaves stuff on its FSM stack.
struct token_tab {
struct token_tab *next;
char token[];
* Parse tree root
* A parse tree consists of several blocks,
* each block consists of variables definitions
* and subblocks.
* All storage allocated into the parse tree is here
struct bufstack; /* defined in conf_lex.l */
struct config_root {
struct config_node root;
char *conf_dir;
struct file_list *files;
struct token_tab *tokens;
* parser/lexer linkage
struct parser_state {
struct config_root *root_node;
void *scanner;
struct bufstack *curbs;
char *current_file;
int block_depth; /* block/subblock nesting level */
struct config_error_type *err_type;
char *save_token(char *token, bool esc, struct parser_state *st);
int ganesha_yyparse(struct parser_state *st);
int ganeshun_yy_init_parser(char *srcfile,
struct parser_state *st);
void ganeshun_yy_cleanup_parser(struct parser_state *st);
* Error reporting
void config_error(FILE *fp, const char *filename, int linenum,
char *format, va_list args);
* Displays the content of parse tree.
void print_parse_tree(FILE * output, struct config_root *tree);
* Free resources of parse tree
void free_parse_tree(struct config_root *tree);
#endif /* CONFPARSER_H */