コード例 #1
0
ファイル: theme_loader.c プロジェクト: flihp/grub2
static int
is_identifier_char (int c)
{
  return (c != -1
          && (grub_isalpha(c)
              || grub_isdigit(c)
              || c == '_'
              || c == '-'));
}
コード例 #2
0
ファイル: parser.c プロジェクト: jnbek/grub2-fedora
/* Determines the state following STATE, determined by C.  */
grub_parser_state_t
grub_parser_cmdline_state (grub_parser_state_t state, char c, char *result)
{
  struct grub_parser_state_transition *transition;
  struct grub_parser_state_transition default_transition;

  default_transition.to_state = state;
  default_transition.keep_value = 1;

  /* Look for a good translation.  */
  for (transition = state_transitions; transition->from_state; transition++)
    {
      if (transition->from_state != state)
	continue;
      /* An exact match was found, use it.  */
      if (transition->input == c)
	break;

      if (grub_isspace (transition->input) && !grub_isalpha (c)
	  && !grub_isdigit (c) && c != '_')
	break;

      /* A less perfect match was found, use this one if no exact
         match can be found.  */
      if (transition->input == 0)
	break;
    }

  if (!transition->from_state)
    transition = &default_transition;

  if (transition->keep_value)
    *result = c;
  else
    *result = 0;
  return transition->to_state;
}
コード例 #3
0
ファイル: partition.c プロジェクト: P4N74/radare2
grub_partition_t
grub_partition_probe (struct grub_disk *disk, const char *str)
{
  grub_partition_t part = 0;
  grub_partition_t curpart = 0;
  grub_partition_t tail;
  const char *ptr;

  part = tail = disk->partition;

  for (ptr = str; *ptr;)
    {
      grub_partition_map_t partmap;
      int num;
      const char *partname, *partname_end;

      partname = ptr;
      while (*ptr && grub_isalpha (*ptr))
	ptr++;
      partname_end = ptr;
      num = grub_strtoul (ptr, (char **) &ptr, 0) - 1;

      curpart = 0;
      /* Use the first partition map type found.  */
      FOR_PARTITION_MAPS(partmap)
      {
	if (partname_end != partname &&
	    (grub_strncmp (partmap->name, partname, partname_end - partname)
	     != 0 || partmap->name[partname_end - partname] != 0))
	  continue;

	disk->partition = part;
	curpart = grub_partition_map_probe (partmap, disk, num);
	disk->partition = tail;
	if (curpart)
	  break;

	if (grub_errno == GRUB_ERR_BAD_PART_TABLE)
	  {
	    /* Continue to next partition map type.  */
	    grub_errno = GRUB_ERR_NONE;
	    continue;
	  }

	break;
      }

      if (! curpart)
	{
	  while (part)
	    {
	      curpart = part->parent;
	      grub_free (part);
	      part = curpart;
	    }
	  return 0;
	}
      curpart->parent = part;
      part = curpart;
      if (! ptr || *ptr != ',')
	break;
      ptr++;
    }

  return part;
}
コード例 #4
0
ファイル: plan.c プロジェクト: 376473984/TrustedGRUB2
static grub_err_t
plan_partition_map_iterate (grub_disk_t disk,
			    grub_partition_iterate_hook_t hook,
			    void *hook_data)
{
  struct grub_partition p;
  int ptr = 0;
  grub_err_t err;

  p.partmap = &grub_plan_partition_map;
  p.msdostype = 0;

  for (p.number = 0; ; p.number++)
    {
      char sig[sizeof ("part ") - 1];
      char c;

      p.offset = (ptr >> GRUB_DISK_SECTOR_BITS) + 1;
      p.index = ptr & (GRUB_DISK_SECTOR_SIZE - 1);

      err = grub_disk_read (disk, 1, ptr, sizeof (sig), sig);
      if (err)
	return err;
      if (grub_memcmp (sig, "part ", sizeof ("part ") - 1) != 0)
	break;
      ptr += sizeof (sig);
      do
	{
	  err = grub_disk_read (disk, 1, ptr, 1, &c);
	  if (err)
	    return err;
	  ptr++;
	}
      while (grub_isdigit (c) || grub_isalpha (c));
      if (c != ' ')
	break;
      p.start = 0;
      while (1)
	{
	  err = grub_disk_read (disk, 1, ptr, 1, &c);
	  if (err)
	    return err;
	  ptr++;
	  if (!grub_isdigit (c))
	    break;
	  p.start = p.start * 10 + (c - '0');
	}
      if (c != ' ')
	break;
      p.len = 0;
      while (1)
	{
	  err = grub_disk_read (disk, 1, ptr, 1, &c);
	  if (err)
	    return err;
	  ptr++;
	  if (!grub_isdigit (c))
	    break;
	  p.len = p.len * 10 + (c - '0');
	}
      if (c != '\n')
	break;
      p.len -= p.start;
      if (hook (disk, &p, hook_data))
	return grub_errno;
    }
  if (p.number == 0)
    return grub_error (GRUB_ERR_BAD_PART_TABLE, "not a plan partition table");

  return GRUB_ERR_NONE;
}