int64_t strtosz_suffix_unit(const char *nptr, char **end,

                            const char default_suffix, int64_t unit)

{

    int64_t retval = -1;

    char *endptr;

    unsigned char c, d;

    int mul_required = 0;

    double val, mul, integral, fraction;



    errno = 0;

    val = strtod(nptr, &endptr);

    if (isnan(val) || endptr == nptr || errno != 0) {

        goto fail;

    }

    fraction = modf(val, &integral);

    if (fraction != 0) {

        mul_required = 1;

    }

    /*

     * Any whitespace character is fine for terminating the number,

     * in addition we accept ',' to handle strings where the size is

     * part of a multi token argument.

     */

    c = *endptr;

    d = c;

    if (qemu_isspace(c) || c == '\0' || c == ',') {

        c = 0;

        d = default_suffix;

    }

    switch (qemu_toupper(d)) {

    case STRTOSZ_DEFSUFFIX_B:

        mul = 1;

        if (mul_required) {

            goto fail;

        }

        break;

    case STRTOSZ_DEFSUFFIX_KB:

        mul = unit;

        break;

    case STRTOSZ_DEFSUFFIX_MB:

        mul = unit * unit;

        break;

    case STRTOSZ_DEFSUFFIX_GB:

        mul = unit * unit * unit;

        break;

    case STRTOSZ_DEFSUFFIX_TB:

        mul = unit * unit * unit * unit;

        break;

    default:

        goto fail;

    }

    /*

     * If not terminated by whitespace, ',', or \0, increment endptr

     * to point to next character, then check that we are terminated

     * by an appropriate separating character, ie. whitespace, ',', or

     * \0. If not, we are seeing trailing garbage, thus fail.

     */

    if (c != 0) {

        endptr++;

        if (!qemu_isspace(*endptr) && *endptr != ',' && *endptr != 0) {

            goto fail;

        }

    }

    if ((val * mul >= INT64_MAX) || val < 0) {

        goto fail;

    }

    retval = val * mul;



fail:

    if (end) {

        *end = endptr;

    }



    return retval;

}

int64_t strtosz_suffix_unit(const char *nptr, char **end,

                            const char default_suffix, int64_t unit)

{

    int64_t retval = -1;

    char *endptr;

    unsigned char c, d;

    int mul_required = 0;

    double val, mul, integral, fraction;



    errno = 0;

    val = strtod(nptr, &endptr);

    if (isnan(val) || endptr == nptr || errno != 0) {

        goto fail;

    }

    fraction = modf(val, &integral);

    if (fraction != 0) {

        mul_required = 1;

    }

    









    c = *endptr;

    d = c;

    if (qemu_isspace(c) || c == '\0' || c == ',') {

        c = 0;

        d = default_suffix;

    }

    switch (qemu_toupper(d)) {

    case STRTOSZ_DEFSUFFIX_B:

        mul = 1;

        if (mul_required) {

            goto fail;

        }

        break;

    case STRTOSZ_DEFSUFFIX_KB:

        mul = unit;

        break;

    case STRTOSZ_DEFSUFFIX_MB:

        mul = unit * unit;

        break;

    case STRTOSZ_DEFSUFFIX_GB:

        mul = unit * unit * unit;

        break;

    case STRTOSZ_DEFSUFFIX_TB:

        mul = unit * unit * unit * unit;

        break;

    default:

        goto fail;

    }

    











    if (c != 0) {

        endptr++;

        if (!qemu_isspace(*endptr) && *endptr != ',' && *endptr != 0) {

            goto fail;

        }

    }

    if ((val * mul >= INT64_MAX) || val < 0) {

        goto fail;

    }

    retval = val * mul;



fail:

    if (end) {

        *end = endptr;

    }



    return retval;

}

int64_t FUNC_0(const char *nptr, char **end,

                            const char default_suffix, int64_t unit)

{

    int64_t retval = -1;

    char *VAR_0;

    unsigned char VAR_1, VAR_2;

    int VAR_3 = 0;

    double VAR_4, VAR_5, VAR_6, VAR_7;



    errno = 0;

    VAR_4 = strtod(nptr, &VAR_0);

    if (isnan(VAR_4) || VAR_0 == nptr || errno != 0) {

        goto fail;

    }

    VAR_7 = modf(VAR_4, &VAR_6);

    if (VAR_7 != 0) {

        VAR_3 = 1;

    }

    









    VAR_1 = *VAR_0;

    VAR_2 = VAR_1;

    if (qemu_isspace(VAR_1) || VAR_1 == '\0' || VAR_1 == ',') {

        VAR_1 = 0;

        VAR_2 = default_suffix;

    }

    switch (qemu_toupper(VAR_2)) {

    case STRTOSZ_DEFSUFFIX_B:

        VAR_5 = 1;

        if (VAR_3) {

            goto fail;

        }

        break;

    case STRTOSZ_DEFSUFFIX_KB:

        VAR_5 = unit;

        break;

    case STRTOSZ_DEFSUFFIX_MB:

        VAR_5 = unit * unit;

        break;

    case STRTOSZ_DEFSUFFIX_GB:

        VAR_5 = unit * unit * unit;

        break;

    case STRTOSZ_DEFSUFFIX_TB:

        VAR_5 = unit * unit * unit * unit;

        break;

    default:

        goto fail;

    }

    











    if (VAR_1 != 0) {

        VAR_0++;

        if (!qemu_isspace(*VAR_0) && *VAR_0 != ',' && *VAR_0 != 0) {

            goto fail;

        }

    }

    if ((VAR_4 * VAR_5 >= INT64_MAX) || VAR_4 < 0) {

        goto fail;

    }

    retval = VAR_4 * VAR_5;



fail:

    if (end) {

        *end = VAR_0;

    }



    return retval;

}

int64_t FUNC_0(const char *nptr, char **end,
const char default_suffix, int64_t unit)
{ int64_t retval = -1; char *VAR_0; unsigned char VAR_1, VAR_2; int VAR_3 = 0; double VAR_4, VAR_5, VAR_6, VAR_7; errno = 0; VAR_4 = strtod(nptr, &VAR_0); if (isnan(VAR_4) || VAR_0 == nptr || errno != 0) { goto fail; } VAR_7 = modf(VAR_4, &VAR_6); if (VAR_7 != 0) { VAR_3 = 1; } VAR_1 = *VAR_0; VAR_2 = VAR_1; if (qemu_isspace(VAR_1) || VAR_1 == '\0' || VAR_1 == ',') { VAR_1 = 0; VAR_2 = default_suffix; } switch (qemu_toupper(VAR_2)) { case STRTOSZ_DEFSUFFIX_B:
VAR_5 = 1; if (VAR_3) { goto fail; } break; case STRTOSZ_DEFSUFFIX_KB:
VAR_5 = unit; break; case STRTOSZ_DEFSUFFIX_MB:
VAR_5 = unit * unit; break; case STRTOSZ_DEFSUFFIX_GB:
VAR_5 = unit * unit * unit; break; case STRTOSZ_DEFSUFFIX_TB:
VAR_5 = unit * unit * unit * unit; break; default:
goto fail; } if (VAR_1 != 0) { VAR_0++; if (!qemu_isspace(*VAR_0) && *VAR_0 != ',' && *VAR_0 != 0) { goto fail; } } if ((VAR_4 * VAR_5 >= INT64_MAX) || VAR_4 < 0) { goto fail; } retval = VAR_4 * VAR_5; fail:
if (end) { *end = VAR_0; } return retval; }