for (; argc; argc--, args++)
{
- char *p, c;
+ const char *p;
+ char c;
int m1, ofs, n, cur_mask;
p = args[0];
static grub_err_t
parse_args (int argc, char *argv[], int *byte, int *bit)
{
- char *rest;
+ const char *rest;
if (argc != 1)
return grub_error (GRUB_ERR_BAD_ARGUMENT, "address required");
}
else
{
- char *end;
+ const char *end;
unsigned tempo;
struct note note;
int i;
{
grub_uint32_t manufacturer[3], max_cpuid, a, b, c, features, addr;
grub_uint64_t value;
- char *ptr;
+ const char *ptr;
char buf[sizeof("1122334455667788")];
/*
{
grub_uint32_t manufacturer[3], max_cpuid, a, b, c, features, addr;
grub_uint64_t value;
- char *ptr;
+ const char *ptr;
/*
* The CPUID instruction should be used to determine whether MSRs
int argc, char **args)
{
grub_err_t err;
- char *ptr, *ptr2;
+ const char *ptr, *ptr2;
grub_uint8_t *ptro;
struct pbkdf2_password *pass;
if (ctxt->state[0].set)
{
ptr = ctxt->state[0].arg;
- ctx.pciid_check_value |= (grub_strtoul (ptr, (char **) &ptr, 16) & 0xffff);
+ ctx.pciid_check_value |= (grub_strtoul (ptr, &ptr, 16) & 0xffff);
if (grub_errno == GRUB_ERR_BAD_NUMBER)
{
grub_errno = GRUB_ERR_NONE;
if (*ptr != ':')
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("missing `%c' symbol"), ':');
ptr++;
- ctx.pciid_check_value |= (grub_strtoul (ptr, (char **) &ptr, 16) & 0xffff)
- << 16;
+ ctx.pciid_check_value |= (grub_strtoul (ptr, &ptr, 16) & 0xffff) << 16;
if (grub_errno == GRUB_ERR_BAD_NUMBER)
grub_errno = GRUB_ERR_NONE;
else
if (ctxt->state[1].set)
{
const char *optr;
-
+
ptr = ctxt->state[1].arg;
optr = ptr;
- ctx.bus = grub_strtoul (ptr, (char **) &ptr, 16);
+ ctx.bus = grub_strtoul (ptr, &ptr, 16);
if (grub_errno == GRUB_ERR_BAD_NUMBER)
{
grub_errno = GRUB_ERR_NONE;
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("missing `%c' symbol"), ':');
ptr++;
optr = ptr;
- ctx.device = grub_strtoul (ptr, (char **) &ptr, 16);
+ ctx.device = grub_strtoul (ptr, &ptr, 16);
if (grub_errno == GRUB_ERR_BAD_NUMBER)
{
grub_errno = GRUB_ERR_NONE;
if (*ptr == '.')
{
ptr++;
- ctx.function = grub_strtoul (ptr, (char **) &ptr, 16);
+ ctx.function = grub_strtoul (ptr, &ptr, 16);
if (grub_errno)
return grub_errno;
ctx.check_function = 1;
{
int i;
char *p;
- char *q;
+ const char * q;
grub_err_t err;
unsigned long j;
if (ctxt->state[0].set)
{
ptr = ctxt->state[0].arg;
- pciid_check_value |= (grub_strtoul (ptr, (char **) &ptr, 16) & 0xffff);
+ pciid_check_value |= (grub_strtoul (ptr, &ptr, 16) & 0xffff);
if (grub_errno == GRUB_ERR_BAD_NUMBER)
{
grub_errno = GRUB_ERR_NONE;
if (*ptr != ':')
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("missing `%c' symbol"), ':');
ptr++;
- pciid_check_value |= (grub_strtoul (ptr, (char **) &ptr, 16) & 0xffff)
- << 16;
+ pciid_check_value |= (grub_strtoul (ptr, &ptr, 16) & 0xffff) << 16;
if (grub_errno == GRUB_ERR_BAD_NUMBER)
grub_errno = GRUB_ERR_NONE;
else
if (ctxt->state[1].set)
{
const char *optr;
-
+
ptr = ctxt->state[1].arg;
optr = ptr;
- bus = grub_strtoul (ptr, (char **) &ptr, 16);
+ bus = grub_strtoul (ptr, &ptr, 16);
if (grub_errno == GRUB_ERR_BAD_NUMBER)
{
grub_errno = GRUB_ERR_NONE;
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("missing `%c' symbol"), ':');
ptr++;
optr = ptr;
- device = grub_strtoul (ptr, (char **) &ptr, 16);
+ device = grub_strtoul (ptr, &ptr, 16);
if (grub_errno == GRUB_ERR_BAD_NUMBER)
{
grub_errno = GRUB_ERR_NONE;
if (*ptr == '.')
{
ptr++;
- function = grub_strtoul (ptr, (char **) &ptr, 16);
+ function = grub_strtoul (ptr, &ptr, 16);
if (grub_errno)
return grub_errno;
check_function = 1;
if (i == ARRAY_SIZE (pci_registers))
{
regsize = 0;
- regaddr = grub_strtoul (ptr, (char **) &ptr, 16);
+ regaddr = grub_strtoul (ptr, &ptr, 16);
if (grub_errno)
return grub_error (GRUB_ERR_BAD_ARGUMENT, "unknown register");
}
if (*ptr == '+')
{
ptr++;
- regaddr += grub_strtoul (ptr, (char **) &ptr, 16);
+ regaddr += grub_strtoul (ptr, &ptr, 16);
if (grub_errno)
return grub_errno;
}
if (*ptr == '=')
{
ptr++;
- regwrite = grub_strtoul (ptr, (char **) &ptr, 16);
+ regwrite = grub_strtoul (ptr, &ptr, 16);
if (grub_errno)
return grub_errno;
write_mask = 0xffffffff;
if (*ptr == ':')
{
ptr++;
- write_mask = grub_strtoul (ptr, (char **) &ptr, 16);
+ write_mask = grub_strtoul (ptr, &ptr, 16);
if (grub_errno)
return grub_errno;
write_mask = 0xffffffff;
/* A simple implementation for signed numbers. */
static int
-grub_strtosl (char *arg, char **end, int base)
+grub_strtosl (char *arg, const char ** const end, int base)
{
if (arg[0] == '-')
return -grub_strtoul (arg + 1, end, base);
ctx.height = ctx.width = ctx.depth = 0;
if (argc)
{
- char *ptr;
+ const char *ptr;
ptr = args[0];
ctx.width = grub_strtoul (ptr, &ptr, 0);
if (grub_errno)
for (p = vgp->lvs; p; p = p->next)
{
int cur_num;
- char *num, *end;
+ char *num;
+ const char *end;
if (!p->fullname)
continue;
if (grub_strncmp (p->fullname, lv->fullname, len) != 0)
at the number. In case STR is not found, *P will be NULL and the
return value will be 0. */
static grub_uint64_t
-grub_lvm_getvalue (char **p, const char *str)
+grub_lvm_getvalue (const char ** const p, const char *str)
{
*p = grub_strstr (*p, str);
if (! *p)
#endif
static int
-grub_lvm_check_flag (char *p, const char *str, const char *flag)
+grub_lvm_check_flag (const char *p, const char *str, const char *flag)
{
grub_size_t len_str = grub_strlen (str), len_flag = grub_strlen (flag);
while (1)
{
- char *q;
+ const char *q;
p = grub_strstr (p, str);
if (! p)
return 0;
char buf[GRUB_LVM_LABEL_SIZE];
char vg_id[GRUB_LVM_ID_STRLEN+1];
char pv_id[GRUB_LVM_ID_STRLEN+1];
- char *metadatabuf, *p, *q, *vgname;
+ char *metadatabuf, *vgname;
+ const char *p, *q;
struct grub_lvm_label_header *lh = (struct grub_lvm_label_header *) buf;
struct grub_lvm_pv_header *pvh;
struct grub_lvm_disk_locn *dlocn;
/* Parse signed value */
static int
-grub_strtosl (const char *arg, char **end, int base)
+grub_strtosl (const char *arg, const char ** const end, int base)
{
if (arg[0] == '-')
return -grub_strtoul (arg + 1, end, base);
grub_memset (nvram, 0, nvramsize);
FOR_SORTED_ENV (var)
{
- char *guid, *attr, *name, *varname;
+ const char *guid;
+ char *attr, *name, *varname;
struct efi_variable *efivar;
int len = 0;
int i;
static int
parse_angle (const char *value)
{
- char *ptr;
+ const char *ptr;
int angle;
angle = grub_strtol (value, &ptr, 10);
ptr++;
}
- num = grub_strtoul (ptr, (char **) &ptr, 0);
+ num = grub_strtoul (ptr, &ptr, 0);
if (grub_errno)
return grub_errno;
if (sig)
static grub_err_t
grub_fs_blocklist_open (grub_file_t file, const char *name)
{
- char *p = (char *) name;
+ const char *p = name;
unsigned num = 0;
unsigned i;
grub_disk_t disk = file->device->disk;
}
unsigned long
-grub_strtoul (const char *str, char **end, int base)
+grub_strtoul (const char * restrict str, const char ** const restrict end,
+ int base)
{
unsigned long long num;
}
unsigned long long
-grub_strtoull (const char *str, char **end, int base)
+grub_strtoull (const char * restrict str, const char ** const restrict end,
+ int base)
{
unsigned long long num = 0;
int found = 0;
{
if (fmt[0] == '0')
zerofill = '0';
- format1 = grub_strtoul (fmt, (char **) &fmt, 10);
+ format1 = grub_strtoul (fmt, &fmt, 10);
}
if (*fmt == '.')
fmt++;
if (grub_isdigit (*fmt))
- format2 = grub_strtoul (fmt, (char **) &fmt, 10);
+ format2 = grub_strtoul (fmt, &fmt, 10);
if (*fmt == '$')
{
while (*ptr && grub_isalpha (*ptr))
ptr++;
partname_end = ptr;
- num = grub_strtoul (ptr, (char **) &ptr, 0) - 1;
+ num = grub_strtoul (ptr, &ptr, 0) - 1;
curpart = 0;
/* Use the first partition map type found. */
case ARG_TYPE_INT:
{
- char *tail;
+ const char * tail;
grub_strtoull (option, &tail, 0);
if (tail == 0 || tail == option || *tail != '\0' || grub_errno)
{
grub_json_type_t type;
const char *value;
- char *end;
+ const char *end;
grub_err_t ret;
ret = get_value (&type, &value, parent, key);
{
grub_json_type_t type;
const char *value;
- char *end;
+ const char *end;
grub_err_t ret;
ret = get_value (&type, &value, parent, key);
}
if (*comma != ',')
return grub_legacy_escape (in, len);
- part = grub_strtoull (comma + 1, (char **) &rest, 0);
+ part = grub_strtoull (comma + 1, &rest, 0);
if (rest[0] == ',' && rest[1] >= 'a' && rest[1] <= 'z')
{
subpart = rest[1] - 'a';
if (ptr[0] == 'h' && ptr[1] == 'd')
{
is_fd = 0;
- devn = grub_strtoul (ptr + 2, &ptr, 0);
+ devn = grub_strtoul (ptr + 2, (const char **)&ptr, 0);
continue;
}
if (grub_strncasecmp (ptr, "file=", 5) == 0)
if (ptr[0] == 'f' && ptr[1] == 'd')
{
is_fd = 1;
- devn = grub_strtoul (ptr + 2, &ptr, 0);
+ devn = grub_strtoul (ptr + 2, (const char **)&ptr, 0);
continue;
}
if (grub_isdigit (ptr[0]))
{
- part = grub_strtoul (ptr, &ptr, 0);
+ part = grub_strtoul (ptr, (const char **)&ptr, 0);
continue;
}
/* FIXME: isolinux, ntldr, cmldr, *dos, seg, hide
return grub_error (GRUB_ERR_BAD_ARGUMENT,
"unknown disk type name");
- unit = grub_strtoul (arg, (char **) &arg, 10);
+ unit = grub_strtoul (arg, &arg, 10);
if (! (arg && *arg >= 'a' && *arg <= 'z'))
return grub_error (GRUB_ERR_BAD_ARGUMENT,
"only device specifications of form "
if (ctxt->state[OPENBSD_SERIAL_ARG].set)
{
struct grub_openbsd_bootarg_console serial;
- char *ptr;
+ const char *ptr;
unsigned port = 0;
unsigned speed = 9600;
if (ctxt->state[NETBSD_SERIAL_ARG].set)
{
struct grub_netbsd_btinfo_serial serial;
- char *ptr;
+ const char *ptr;
grub_memset (&serial, 0, sizeof (serial));
grub_strcpy (serial.devname, "com");
#endif /* GRUB_MACHINE_PCBIOS */
if (grub_memcmp (argv[i], "mem=", 4) == 0)
{
- char *val = argv[i] + 4;
+ const char *val = argv[i] + 4;
linux_mem_size = grub_strtoul (val, &val, 0);
}
else if (grub_memcmp (argv[i], "mem=", 4) == 0)
{
- char *val = argv[i] + 4;
+ const char *val = argv[i] + 4;
linux_mem_size = grub_strtoul (val, &val, 0);
grub_off_t off, grub_size_t sz)
{
char *buf;
- char *ptr;
+ const char *ptr;
int has_paddr = 0;
grub_errno = GRUB_ERR_NONE;
grub_cmd_badram (grub_command_t cmd __attribute__ ((unused)),
int argc, char **args)
{
- char * str;
+ const char *str;
struct badram_entry entry;
if (argc != 1)
parsemem (const char *str)
{
grub_uint64_t ret;
- char *ptr;
+ const char *ptr;
ret = grub_strtoul (str, &ptr, 0);
return GRUB_ERR_NONE;
}
ptr += sizeof ("HTTP/1.1 ") - 1;
- code = grub_strtoul (ptr, &ptr, 10);
+ code = grub_strtoul (ptr, (const char **)&ptr, 10);
if (grub_errno)
return grub_errno;
switch (code)
== 0 && !data->size_recv)
{
ptr += sizeof ("Content-Length: ") - 1;
- file->size = grub_strtoull (ptr, &ptr, 10);
+ file->size = grub_strtoull (ptr, (const char **)&ptr, 10);
data->size_recv = 1;
return GRUB_ERR_NONE;
}
for (i = 0; i < 4; i++)
{
unsigned long t;
- t = grub_strtoul (ptr, (char **) &ptr, 0);
+ t = grub_strtoul (ptr, &ptr, 0);
if (grub_errno)
{
grub_errno = GRUB_ERR_NONE;
ptr++;
continue;
}
- t = grub_strtoul (ptr, (char **) &ptr, 16);
+ t = grub_strtoul (ptr, &ptr, 16);
if (grub_errno)
{
grub_errno = GRUB_ERR_NONE;
addr->type = GRUB_NET_NETWORK_LEVEL_PROTOCOL_IPV4;
if (*rest == '/')
{
- addr->ipv4.masksize = grub_strtoul (rest + 1, (char **) &rest, 0);
+ addr->ipv4.masksize = grub_strtoul (rest + 1, &rest, 0);
if (!grub_errno && *rest == 0)
return GRUB_ERR_NONE;
grub_errno = GRUB_ERR_NONE;
addr->type = GRUB_NET_NETWORK_LEVEL_PROTOCOL_IPV6;
if (*rest == '/')
{
- addr->ipv6.masksize = grub_strtoul (rest + 1, (char **) &rest, 0);
+ addr->ipv6.masksize = grub_strtoul (rest + 1, &rest, 0);
if (!grub_errno && *rest == 0)
return GRUB_ERR_NONE;
grub_errno = GRUB_ERR_NONE;
static int
get_and_remove_first_entry_number (const char *name)
{
- const char *val;
- char *tail;
+ const char *val, *tail;
int entry;
val = grub_env_get (name);
p1 = dev + strlen (dev);
else
{
- unit = grub_strtoul (p1 + 1, (char **) &p2, 16);
+ unit = grub_strtoul (p1 + 1, &p2, 16);
if (p2 && *p2 == '/')
flags = grub_strtoul (p2 + 1, 0, 16);
}
void *next = NULL;
uint64_t length, start;
char *target, *params;
- char *ptr;
+ const char *ptr;
int major = 0, minor = 0;
int first = 1;
grub_disk_addr_t partstart = 0;
grub_err_t
grub_script_break (grub_command_t cmd, int argc, char *argv[])
{
- char *p = 0;
+ const char *p = NULL;
unsigned long count;
if (argc == 0)
grub_script_shift (grub_command_t cmd __attribute__((unused)),
int argc, char *argv[])
{
- char *p = 0;
+ const char *p = NULL;
unsigned long n = 0;
if (! scope)
grub_script_return (grub_command_t cmd __attribute__((unused)),
int argc, char *argv[])
{
- char *p;
+ const char *p = NULL;
unsigned long n;
if (! scope || argc > 1)
if (state[OPTION_BASE_CLOCK].set)
{
- char *ptr;
+ const char *ptr;
config.base_clock = grub_strtoull (state[OPTION_BASE_CLOCK].arg, &ptr, 0);
if (grub_errno)
return grub_errno;
if (state[OPTION_GEOMETRY].set)
{
- char *ptr = state[OPTION_GEOMETRY].arg;
+ const char *ptr = state[OPTION_GEOMETRY].arg;
w = grub_strtoul (ptr, &ptr, 0);
if (grub_errno)
return grub_errno;
strtoull_testcase (const char *input, int base, unsigned long long expected,
int num_digits, grub_err_t error)
{
- char *output;
+ const char *output;
unsigned long long value;
grub_errno = 0;
value = grub_strtoull(input, &output, base);
- (int) grub_tolower ((grub_uint8_t) *s2);
}
-unsigned long EXPORT_FUNC(grub_strtoul) (const char *str, char **end, int base);
-unsigned long long EXPORT_FUNC(grub_strtoull) (const char *str, char **end, int base);
+/*
+ * Note that these differ from the C standard's definitions of strtol,
+ * strtoul(), and strtoull() by the addition of two const qualifiers on the end
+ * pointer, which make the declaration match the *semantic* requirements of
+ * their behavior. This means that instead of:
+ *
+ * char *s = "1234 abcd";
+ * char *end;
+ * unsigned long l;
+ *
+ * l = grub_strtoul(s, &end, 10);
+ *
+ * We must one of:
+ *
+ * const char *end;
+ * ... or ...
+ * l = grub_strtoul(s, (const char ** const)&end, 10);
+ */
+unsigned long EXPORT_FUNC(grub_strtoul) (const char * restrict str, const char ** const restrict end, int base);
+unsigned long long EXPORT_FUNC(grub_strtoull) (const char * restrict str, const char ** const restrict end, int base);
static inline long
-grub_strtol (const char *str, char **end, int base)
+grub_strtol (const char * restrict str, const char ** const restrict end, int base)
{
int negative = 0;
unsigned long long magnitude;
static error_t
argp_parser (int key, char *arg, struct argp_state *state)
{
- char *p;
+ const char *p;
switch (key)
{