#include <string.h>
#include <strings.h>
#include <errno.h>
-#include <stdbool.h>
#include <libsigrok/libsigrok.h>
#include "libsigrok-internal.h"
#endif
}
+/**
+ * Convert a sequence of bytes to its textual representation ("hex dump").
+ *
+ * Callers should free the allocated GString. See @ref sr_hexdump_free().
+ *
+ * @param[in] data Pointer to the byte sequence to print.
+ * @param[in] len Number of bytes to print.
+ *
+ * @return #NULL upon error, newly allocated GString pointer otherwise.
+ */
+SR_PRIV GString *sr_hexdump_new(const uint8_t *data, const size_t len)
+{
+ GString *s;
+ size_t i;
+
+ s = g_string_sized_new(3 * len);
+ for (i = 0; i < len; i++) {
+ if (i)
+ g_string_append_c(s, ' ');
+ g_string_append_printf(s, "%02x", data[i]);
+ }
+
+ return s;
+}
+
+/**
+ * Free a hex dump text that was created by @ref sr_hexdump_new().
+ *
+ * @param[in] s Pointer to the GString to release.
+ */
+SR_PRIV void sr_hexdump_free(GString *s)
+{
+ if (s)
+ g_string_free(s, TRUE);
+}
+
/**
* Convert a string representation of a numeric value to a sr_rational.
*
int64_t denominator = 1;
int32_t fractional_len = 0;
int32_t exponent = 0;
- bool is_negative = false;
+ gboolean is_negative = FALSE;
+ gboolean no_integer, no_fractional;
+
+ while (isspace(*str))
+ str++;
errno = 0;
integral = g_ascii_strtoll(str, &endptr, 10);
- if (str == endptr && (str[0] == '-' || str[0] == '+') && str[1] == '.')
+ if (str == endptr && (str[0] == '-' || str[0] == '+') && str[1] == '.') {
endptr += 1;
- else if (str == endptr && str[0] == '.')
- /* EMPTY */;
- else if (errno)
+ no_integer = TRUE;
+ } else if (str == endptr && str[0] == '.') {
+ no_integer = TRUE;
+ } else if (errno) {
return SR_ERR;
+ } else {
+ no_integer = FALSE;
+ }
if (integral < 0 || str[0] == '-')
- is_negative = true;
+ is_negative = TRUE;
errno = 0;
if (*endptr == '.') {
+ gboolean is_exp, is_eos;
const char *start = endptr + 1;
fractional = g_ascii_strtoll(start, &endptr, 10);
+ is_exp = *endptr == 'E' || *endptr == 'e';
+ is_eos = *endptr == '\0';
+ if (endptr == start && (is_exp || is_eos)) {
+ fractional = 0;
+ errno = 0;
+ }
if (errno)
return SR_ERR;
+ no_fractional = endptr == start;
+ if (no_integer && no_fractional)
+ return SR_ERR;
fractional_len = endptr - start;
}