-#ifdef DBUS_BUILD_TESTS
-static dbus_bool_t
-ascii_isspace (char c)
-{
- return (c == ' ' ||
- c == '\f' ||
- c == '\n' ||
- c == '\r' ||
- c == '\t' ||
- c == '\v');
-}
-#endif /* DBUS_BUILD_TESTS */
-
-#ifdef DBUS_BUILD_TESTS
-static dbus_bool_t
-ascii_isdigit (char c)
-{
- return c >= '0' && c <= '9';
-}
-#endif /* DBUS_BUILD_TESTS */
-
-#ifdef DBUS_BUILD_TESTS
-static dbus_bool_t
-ascii_isxdigit (char c)
-{
- return (ascii_isdigit (c) ||
- (c >= 'a' && c <= 'f') ||
- (c >= 'A' && c <= 'F'));
-}
-#endif /* DBUS_BUILD_TESTS */
-
-#ifdef DBUS_BUILD_TESTS
-/* Calls strtod in a locale-independent fashion, by looking at
- * the locale data and patching the decimal comma to a point.
- *
- * Relicensed from glib.
- */
-static double
-ascii_strtod (const char *nptr,
- char **endptr)
-{
- /* FIXME: The Win32 C library's strtod() doesn't handle hex.
- * Presumably many Unixes don't either.
- */
-
- char *fail_pos;
- double val;
- struct lconv *locale_data;
- const char *decimal_point;
- int decimal_point_len;
- const char *p, *decimal_point_pos;
- const char *end = NULL; /* Silence gcc */
-
- fail_pos = NULL;
-
-#if HAVE_LOCALECONV
- locale_data = localeconv ();
- decimal_point = locale_data->decimal_point;
-#else
- decimal_point = ".";
-#endif
-
- decimal_point_len = strlen (decimal_point);
- _dbus_assert (decimal_point_len != 0);
-
- decimal_point_pos = NULL;
- if (decimal_point[0] != '.' ||
- decimal_point[1] != 0)
- {
- p = nptr;
- /* Skip leading space */
- while (ascii_isspace (*p))
- p++;
-
- /* Skip leading optional sign */
- if (*p == '+' || *p == '-')
- p++;
-
- if (p[0] == '0' &&
- (p[1] == 'x' || p[1] == 'X'))
- {
- p += 2;
- /* HEX - find the (optional) decimal point */
-
- while (ascii_isxdigit (*p))
- p++;
-
- if (*p == '.')
- {
- decimal_point_pos = p++;
-
- while (ascii_isxdigit (*p))
- p++;
-
- if (*p == 'p' || *p == 'P')
- p++;
- if (*p == '+' || *p == '-')
- p++;
- while (ascii_isdigit (*p))
- p++;
- end = p;
- }
- }
- else
- {
- while (ascii_isdigit (*p))
- p++;
-
- if (*p == '.')
- {
- decimal_point_pos = p++;
-
- while (ascii_isdigit (*p))
- p++;
-
- if (*p == 'e' || *p == 'E')
- p++;
- if (*p == '+' || *p == '-')
- p++;
- while (ascii_isdigit (*p))
- p++;
- end = p;
- }
- }
- /* For the other cases, we need not convert the decimal point */
- }
-
- /* Set errno to zero, so that we can distinguish zero results
- and underflows */
- _dbus_set_errno_to_zero ();
-
- if (decimal_point_pos)
- {
- char *copy, *c;
-
- /* We need to convert the '.' to the locale specific decimal point */
- copy = dbus_malloc (end - nptr + 1 + decimal_point_len);
-
- c = copy;
- memcpy (c, nptr, decimal_point_pos - nptr);
- c += decimal_point_pos - nptr;
- memcpy (c, decimal_point, decimal_point_len);
- c += decimal_point_len;
- memcpy (c, decimal_point_pos + 1, end - (decimal_point_pos + 1));
- c += end - (decimal_point_pos + 1);
- *c = 0;
-
- val = strtod (copy, &fail_pos);
-
- if (fail_pos)
- {
- if (fail_pos > decimal_point_pos)
- fail_pos = (char *)nptr + (fail_pos - copy) - (decimal_point_len - 1);
- else
- fail_pos = (char *)nptr + (fail_pos - copy);
- }
-
- dbus_free (copy);
-
- }
- else
- val = strtod (nptr, &fail_pos);
-
- if (endptr)
- *endptr = fail_pos;
-
- return val;
-}
-#endif /* DBUS_BUILD_TESTS */
-
-#ifdef DBUS_BUILD_TESTS
-/**
- * Parses a floating point number contained in a DBusString. Either
- * return parameter may be #NULL if you aren't interested in it. The
- * integer is parsed and stored in value_return. Return parameters are
- * not initialized if the function returns #FALSE.
- *
- * @param str the string
- * @param start the byte index of the start of the float
- * @param value_return return location of the float value or #NULL
- * @param end_return return location of the end of the float, or #NULL
- * @returns #TRUE on success
- */
-dbus_bool_t
-_dbus_string_parse_double (const DBusString *str,
- int start,
- double *value_return,
- int *end_return)
-{
- double v;
- const char *p;
- char *end;
-
- p = _dbus_string_get_const_data_len (str, start,
- _dbus_string_get_length (str) - start);
-
- /* parsing hex works on linux but isn't portable, so intercept it
- * here to get uniform behavior.
- */
- if (p[0] == '0' && (p[1] == 'x' || p[1] == 'X'))
- return FALSE;
-
- end = NULL;
- _dbus_set_errno_to_zero ();
- v = ascii_strtod (p, &end);
- if (end == NULL || end == p || errno != 0)
- return FALSE;
-
- if (value_return)
- *value_return = v;
- if (end_return)
- *end_return = start + (end - p);
-
- return TRUE;
-}
-#endif /* DBUS_BUILD_TESTS */
-