static int is_identifier_char (int c) { return (c != -1 && (grub_isalpha(c) || grub_isdigit(c) || c == '_' || c == '-')); }
/* 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; }
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; }
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; }