Beispiel #1
0
/* 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);
}
Beispiel #2
0
/* 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;
}
Beispiel #3
0
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;
}
Beispiel #4
0
/* 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);
}