/** * Convert string @nptr to an unsigned integer, and store it in @result. * * This is a wrapper around strtoul() that is harder to misuse. * Semantics of @nptr, @endptr, @base match strtoul() with differences * noted below. * * @nptr may be null, and no conversion is performed then. * * If no conversion is performed, store @nptr in *@endptr and return * -EINVAL. * * If @endptr is null, and the string isn't fully converted, return * -EINVAL. This is the case when the pointer that would be stored in * a non-null @endptr points to a character other than '\0'. * * If the conversion overflows @result, store UINT_MAX in @result, * and return -ERANGE. * * Else store the converted value in @result, and return zero. * * Note that a number with a leading minus sign gets converted without * the minus sign, checked for overflow (see above), then negated (in * @result's type). This is exactly how strtoul() works. */ int qemu_strtoui(const char *nptr, const char **endptr, int base, unsigned int *result) { char *ep; long long lresult; assert((unsigned) base <= 36 && base != 1); if (!nptr) { if (endptr) { *endptr = nptr; } return -EINVAL; } errno = 0; lresult = strtoull(nptr, &ep, base); /* Windows returns 1 for negative out-of-range values. */ if (errno == ERANGE) { *result = -1; } else { if (lresult > UINT_MAX) { *result = UINT_MAX; errno = ERANGE; } else if (lresult < INT_MIN) { *result = UINT_MAX; errno = ERANGE; } else { *result = lresult; } } return check_strtox_error(nptr, ep, endptr, errno); }
/** * Convert string @nptr to an integer, and store it in @result. * * This is a wrapper around strtol() that is harder to misuse. * Semantics of @nptr, @endptr, @base match strtol() with differences * noted below. * * @nptr may be null, and no conversion is performed then. * * If no conversion is performed, store @nptr in *@endptr and return * -EINVAL. * * If @endptr is null, and the string isn't fully converted, return * -EINVAL. This is the case when the pointer that would be stored in * a non-null @endptr points to a character other than '\0'. * * If the conversion overflows @result, store INT_MAX in @result, * and return -ERANGE. * * If the conversion underflows @result, store INT_MIN in @result, * and return -ERANGE. * * Else store the converted value in @result, and return zero. */ int qemu_strtoi(const char *nptr, const char **endptr, int base, int *result) { char *ep; long long lresult; assert((unsigned) base <= 36 && base != 1); if (!nptr) { if (endptr) { *endptr = nptr; } return -EINVAL; } errno = 0; lresult = strtoll(nptr, &ep, base); if (lresult < INT_MIN) { *result = INT_MIN; errno = ERANGE; } else if (lresult > INT_MAX) { *result = INT_MAX; errno = ERANGE; } else { *result = lresult; } return check_strtox_error(nptr, ep, endptr, errno); }
/** * Convert string @nptr to a double. * * This is a wrapper around strtod() that is harder to misuse. * Semantics of @nptr and @endptr match strtod() with differences * noted below. * * @nptr may be null, and no conversion is performed then. * * If no conversion is performed, store @nptr in *@endptr and return * -EINVAL. * * If @endptr is null, and the string isn't fully converted, return * -EINVAL. This is the case when the pointer that would be stored in * a non-null @endptr points to a character other than '\0'. * * If the conversion overflows, store +/-HUGE_VAL in @result, depending * on the sign, and return -ERANGE. * * If the conversion underflows, store +/-0.0 in @result, depending on the * sign, and return -ERANGE. * * Else store the converted value in @result, and return zero. */ int qemu_strtod(const char *nptr, const char **endptr, double *result) { char *ep; if (!nptr) { if (endptr) { *endptr = nptr; } return -EINVAL; } errno = 0; *result = strtod(nptr, &ep); return check_strtox_error(nptr, ep, endptr, errno); }
/** * Convert string @nptr to a long integer, and store it in @result. * * This is a wrapper around strtol() that is harder to misuse. * Semantics of @nptr, @endptr, @base match strtol() with differences * noted below. * * @nptr may be null, and no conversion is performed then. * * If no conversion is performed, store @nptr in *@endptr and return * -EINVAL. * * If @endptr is null, and the string isn't fully converted, return * -EINVAL. This is the case when the pointer that would be stored in * a non-null @endptr points to a character other than '\0'. * * If the conversion overflows @result, store LONG_MAX in @result, * and return -ERANGE. * * If the conversion underflows @result, store LONG_MIN in @result, * and return -ERANGE. * * Else store the converted value in @result, and return zero. */ int qemu_strtol(const char *nptr, const char **endptr, int base, long *result) { char *ep; if (!nptr) { if (endptr) { *endptr = nptr; } return -EINVAL; } errno = 0; *result = strtol(nptr, &ep, base); return check_strtox_error(nptr, ep, endptr, errno); }
/** * Converts ASCII string to a long long integer. * * See qemu_strtol() documentation for more info. */ int qemu_strtoll(const char *nptr, const char **endptr, int base, int64_t *result) { char *p; int err = 0; if (!nptr) { if (endptr) { *endptr = nptr; } err = -EINVAL; } else { errno = 0; *result = strtoll(nptr, &p, base); err = check_strtox_error(nptr, p, endptr, errno); } return err; }
/** * Convert string @nptr to an int64_t. * * Works like qemu_strtol(), except it stores INT64_MAX on overflow, * and INT_MIN on underflow. */ int qemu_strtoi64(const char *nptr, const char **endptr, int base, int64_t *result) { char *ep; if (!nptr) { if (endptr) { *endptr = nptr; } return -EINVAL; } errno = 0; /* FIXME This assumes int64_t is long long */ *result = strtoll(nptr, &ep, base); return check_strtox_error(nptr, ep, endptr, errno); }
/** * Convert string @nptr to an unsigned long, and store it in @result. * * This is a wrapper around strtoul() that is harder to misuse. * Semantics of @nptr, @endptr, @base match strtoul() with differences * noted below. * * @nptr may be null, and no conversion is performed then. * * If no conversion is performed, store @nptr in *@endptr and return * -EINVAL. * * If @endptr is null, and the string isn't fully converted, return * -EINVAL. This is the case when the pointer that would be stored in * a non-null @endptr points to a character other than '\0'. * * If the conversion overflows @result, store ULONG_MAX in @result, * and return -ERANGE. * * Else store the converted value in @result, and return zero. * * Note that a number with a leading minus sign gets converted without * the minus sign, checked for overflow (see above), then negated (in * @result's type). This is exactly how strtoul() works. */ int qemu_strtoul(const char *nptr, const char **endptr, int base, unsigned long *result) { char *ep; if (!nptr) { if (endptr) { *endptr = nptr; } return -EINVAL; } errno = 0; *result = strtoul(nptr, &ep, base); /* Windows returns 1 for negative out-of-range values. */ if (errno == ERANGE) { *result = -1; } return check_strtox_error(nptr, ep, endptr, errno); }
/** * Converts ASCII string to an unsigned long long integer. * * See qemu_strtol() documentation for more info. */ int qemu_strtoull(const char *nptr, const char **endptr, int base, uint64_t *result) { char *p; int err = 0; if (!nptr) { if (endptr) { *endptr = nptr; } err = -EINVAL; } else { errno = 0; *result = strtoull(nptr, &p, base); /* Windows returns 1 for negative out-of-range values. */ if (errno == ERANGE) { *result = -1; } err = check_strtox_error(nptr, p, endptr, errno); } return err; }
/** * Convert string @nptr to an uint64_t. * * Works like qemu_strtoul(), except it stores UINT64_MAX on overflow. */ int qemu_strtou64(const char *nptr, const char **endptr, int base, uint64_t *result) { char *ep; assert((unsigned) base <= 36 && base != 1); if (!nptr) { if (endptr) { *endptr = nptr; } return -EINVAL; } errno = 0; /* FIXME This assumes uint64_t is unsigned long long */ *result = strtoull(nptr, &ep, base); /* Windows returns 1 for negative out-of-range values. */ if (errno == ERANGE) { *result = -1; } return check_strtox_error(nptr, ep, endptr, errno); }