first version upgrade
[devspec.git] / devspec.en_US / project / recutils / src / rec-sex-parser.c
blob7a639cefaa24a44dcb277cdbbf708013dd66b205
1 /* -*- mode: C -*-
3 * File: rec-sex-parser.c
4 * Date: Tue Jan 12 18:01:37 2010
6 * GNU recutils - Sexy parser
8 */
10 /* Copyright (C) 2010-2019 Jose E. Marchesi */
12 /* This program is free software: you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation, either version 3 of the License, or
15 * (at your option) any later version.
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
22 * You should have received a copy of the GNU General Public License
23 * along with this program. If not, see <http://www.gnu.org/licenses/>.
26 #include <config.h>
28 #include <stdlib.h>
29 #include <string.h>
30 #include <stdio.h>
32 #include <rec-sex-parser.h>
33 #include "rec-sex-tab.h"
34 /*#include "rec-sex-lex.h" */
37 * Data types
40 struct rec_sex_parser_s
42 char *in; /* String to be parsed. */
43 size_t index; /* Index in in_str. */
44 void *scanner; /* Flex scanner. */
45 bool case_insensitive;
47 rec_sex_ast_t ast;
51 * Public functions
54 rec_sex_parser_t
55 rec_sex_parser_new (void)
57 rec_sex_parser_t new;
59 new = malloc (sizeof (struct rec_sex_parser_s));
60 if (new)
62 new->in = NULL;
63 new->index = 0;
64 new->case_insensitive = false;
66 /* Initialize the sexy scanner. */
67 sexlex_init (&(new->scanner));
68 sexset_extra (new, new->scanner);
71 return new;
74 void *
75 rec_sex_parser_scanner (rec_sex_parser_t parser)
77 return parser->scanner;
80 void
81 rec_sex_parser_destroy (rec_sex_parser_t parser)
83 if (parser->scanner)
85 sexlex_destroy (parser->scanner);
88 free (parser->in);
89 free (parser);
92 rec_sex_ast_t
93 rec_sex_parser_ast (rec_sex_parser_t parser)
95 return parser->ast;
98 void
99 rec_sex_parser_set_ast (rec_sex_parser_t parser,
100 rec_sex_ast_t ast)
102 parser->ast = ast;
105 bool
106 rec_sex_parser_case_insensitive (rec_sex_parser_t parser)
108 return parser->case_insensitive;
111 void
112 rec_sex_parser_set_case_insensitive (rec_sex_parser_t parser,
113 bool case_insensitive)
115 parser->case_insensitive = case_insensitive;
118 void
119 rec_sex_parser_set_in (rec_sex_parser_t parser,
120 const char *str)
122 if (parser->in)
124 free (parser->in);
125 parser->in = NULL;
128 parser->in = strdup (str);
129 parser->index = 0;
133 rec_sex_parser_getc (rec_sex_parser_t parser)
135 int res;
137 res = -1;
138 if ((parser->in)
139 && (parser->index < strlen (parser->in)))
141 res = parser->in[parser->index++];
144 return res;
147 bool
148 rec_sex_parser_run (rec_sex_parser_t parser,
149 const char *expr)
151 int res;
153 rec_sex_parser_set_in (parser, expr);
154 if (!sexparse (parser))
156 res = true;
158 else
160 /* Parse error. */
161 res = false;
164 return res;
167 void
168 rec_sex_parser_print_ast (rec_sex_parser_t parser)
170 rec_sex_ast_print (parser->ast);
173 /* End of rec-sex-parser.c */