60 #include "amxo_parser.tab.h"
90 amxc_string_t* str_name = amxc_string_from_llist_it(it);
91 const char* name = amxc_string_get(str_name, 0);
92 amxc_var_t* option = amxc_var_get_path(&child->
config,
94 AMXC_VAR_FLAG_DEFAULT);
95 if(!amxc_var_is_null(option)) {
96 amxc_var_set_path(&parent->
config, name, option, AMXC_VAR_FLAG_UPDATE | AMXC_VAR_FLAG_AUTO_ADD);
103 const char* full_path) {
104 amxc_var_t* incstack = NULL;
105 if(amxc_var_get_key(pctx->
include_stack, full_path, AMXC_VAR_FLAG_DEFAULT) != NULL) {
112 incstack = amxc_var_add_key(
bool, pctx->
include_stack, full_path,
true);
119 const char* file_path,
122 amxc_string_t concat_path;
123 amxc_string_init(&concat_path, 0);
125 if((incdir != NULL) && (*incdir != 0)) {
126 amxc_string_setf(&concat_path,
"%s/%s", incdir, file_path);
128 amxc_string_setf(&concat_path,
"%s", file_path);
130 *full_path = realpath(amxc_string_get(&concat_path, 0), NULL);
131 if(*full_path != NULL) {
134 amxc_string_clean(&concat_path);
140 const char* file_path,
141 amxc_var_t** incstack,
145 const amxc_llist_t* incdirs = amxc_var_constcast(amxc_llist_t,
config);
146 amxc_string_t res_file_path;
149 amxc_string_init(&res_file_path, 0);
151 if(amxc_string_set_resolved(&res_file_path, file_path, &pctx->
config) > 0) {
152 file_path = amxc_string_get(&res_file_path, 0);
157 pctx->
status = amxd_status_file_not_found;
162 if(stat(*full_path, &statbuf) != 0) {
164 pctx->
status = amxd_status_file_not_found;
170 if(*incstack == NULL) {
171 pctx->
status = amxd_status_recursion;
179 amxc_string_clean(&res_file_path);
184 const char* full_path) {
198 if(pctx->
status == amxd_status_ok) {
199 pctx->
status = amxd_status_unknown_error;
208 const char* full_path) {
211 struct dirent** namelist;
215 amxc_string_init(&file, 0);
217 n = scandir(full_path, &namelist, NULL, alphasort);
219 pctx->
status = amxd_status_unknown_error;
224 for(
int i = 0; i < n; i++) {
230 if(namelist[i]->d_type == DT_DIR) {
234 len = strlen(namelist[i]->d_name);
235 if(strncmp(namelist[i]->d_name + len - 4,
".odl", 4) != 0) {
239 amxc_string_setf(&file,
"%s/%s", full_path, namelist[i]->d_name);
246 pctx->
status = amxd_status_ok;
252 amxc_string_clean(&file);
257 const amxc_llist_t* dirs,
258 const char* file_path,
262 if(file_path[0] !=
'/') {
263 amxc_string_t res_path;
264 amxc_string_init(&res_path, 0);
265 amxc_llist_for_each(it, dirs) {
266 amxc_var_t* var_dir = amxc_var_from_llist_it(it);
267 const char* dir = amxc_var_constcast(cstring_t, var_dir);
268 if(amxc_string_set_resolved(&res_path, dir, &parser->
config) > 0) {
269 dir = amxc_string_get(&res_path, 0);
275 amxc_string_reset(&res_path);
277 amxc_string_clean(&res_path);
278 when_null(*full_path, exit);
292 char* full_path = NULL;
293 amxc_var_t* incstack = NULL;
296 when_failed(retval, exit);
306 amxc_var_delete(&incstack);
313 char* full_path = NULL;
314 amxc_var_t* incstack = NULL;
318 when_failed(retval, exit);
320 stat(full_path, &statbuf);
322 if(S_ISDIR(statbuf.st_mode)) {
329 amxc_var_delete(&incstack);
PRIVATE void amxo_hooks_end_include(amxo_parser_t *parser, const char *file)
PRIVATE void amxo_hooks_start_include(amxo_parser_t *parser, const char *file)
static amxc_var_t * amxo_parser_can_include(amxo_parser_t *pctx, const char *full_path)
static int amxo_parser_include_file(amxo_parser_t *pctx, const char *full_path)
static int amxo_parser_include_dir(amxo_parser_t *pctx, const char *full_path)
bool amxo_parser_find(amxo_parser_t *parser, const amxc_llist_t *dirs, const char *file_path, char **full_path)
static void amxo_parser_push(amxo_parser_t *parent, amxo_parser_t *child)
static void amxo_parser_pop(amxo_parser_t *parent, amxo_parser_t *child)
static int amxo_parser_check(amxo_parser_t *pctx, const char *file_path, amxc_var_t **incstack, char **full_path)
static bool amxo_parser_exists(const char *incdir, const char *file_path, char **full_path)
int amxo_parser_include(amxo_parser_t *pctx, const char *file_path)
int amxo_parser_add_post_include(amxo_parser_t *pctx, const char *file_path)
PRIVATE int amxo_parser_parse_file_impl(amxo_parser_t *parser, const char *file_path, amxd_object_t *object)
PRIVATE void amxo_parser_msg(amxo_parser_t *parser, const char *format,...) __attribute__((format(printf
PRIVATE void amxo_parser_child_init(amxo_parser_t *parser)
amxc_var_t * amxo_parser_get_config(amxo_parser_t *parser, const char *path)
Gets a configuration option.
void amxo_parser_clean(amxo_parser_t *parser)
Cleans up the odl parser instance.
The ODL parser structure.
amxc_htable_t * resolvers
amxc_llist_t function_names
amxc_var_t * include_stack
amxc_llist_t * entry_points
amxc_llist_t global_config
amxc_var_t * post_includes
amxc_llist_t * sync_contexts