/* Free the memory reserved for CMD and all of it's children. */ void grub_script_free (struct grub_script *script) { if (!script) return; grub_script_mem_free (script->mem); grub_free (script); }
/* Parse the script passed in SCRIPT and return the parsed datastructure that is ready to be interpreted. */ struct grub_script * grub_script_parse (char *script, grub_reader_getline_t getline) { struct grub_script *parsed; struct grub_script_mem *membackup; struct grub_lexer_param *lexstate; struct grub_parser_param *parsestate; parsed = grub_script_create (0, 0); if (!parsed) return 0; parsestate = grub_zalloc (sizeof (*parsestate)); if (!parsestate) { grub_free (parsed); return 0; } /* Initialize the lexer. */ lexstate = grub_script_lexer_init (parsestate, script, getline); if (!lexstate) { grub_free (parsed); grub_free (parsestate); return 0; } parsestate->lexerstate = lexstate; membackup = grub_script_mem_record (parsestate); /* Parse the script. */ if (grub_script_yyparse (parsestate) || parsestate->err) { struct grub_script_mem *memfree; memfree = grub_script_mem_record_stop (parsestate, membackup); grub_script_mem_free (memfree); grub_script_lexer_fini (lexstate); grub_free (parsestate); grub_free (parsed); return 0; } parsed->mem = grub_script_mem_record_stop (parsestate, membackup); parsed->cmd = parsestate->parsed; parsed->children = parsestate->scripts; grub_script_lexer_fini (lexstate); grub_free (parsestate); return parsed; }
struct grub_script * grub_script_create (struct grub_script_cmd *cmd, struct grub_script_mem *mem) { struct grub_script *parsed; parsed = grub_malloc (sizeof (*parsed)); if (!parsed) { grub_script_mem_free (mem); grub_free (cmd); return 0; } parsed->mem = mem; parsed->cmd = cmd; return parsed; }
/* Free the memory reserved for CMD and all of it's children. */ void grub_script_free (struct grub_script *script) { struct grub_script *s; struct grub_script *t; if (! script) return; if (script->mem) grub_script_mem_free (script->mem); s = script->children; while (s) { t = s->next_siblings; grub_script_unref (s); s = t; } grub_free (script); }