summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--epan/prefs.c6
-rw-r--r--epan/range.c72
-rw-r--r--epan/range.h6
-rw-r--r--gtk/prefs_dlg.c5
4 files changed, 49 insertions, 40 deletions
diff --git a/epan/prefs.c b/epan/prefs.c
index bc39fb177f..d1ee89d106 100644
--- a/epan/prefs.c
+++ b/epan/prefs.c
@@ -2149,11 +2149,13 @@ write_pref(gpointer data, gpointer user_data)
case PREF_RANGE:
{
- char range_string[MAXRANGESTRING];
+ char *range_string;
+ range_string = range_convert_range(*pref->varp.range);
fprintf(arg->pf, "# A string denoting an positive integer range (e.g., \"1-20,30-40\").\n");
fprintf(arg->pf, "%s.%s: %s\n", arg->module->name, pref->name,
- range_convert_range(*pref->varp.range, range_string));
+ range_string);
+ g_free(range_string);
break;
}
diff --git a/epan/range.c b/epan/range.c
index adf1591239..0c09626061 100644
--- a/epan/range.c
+++ b/epan/range.c
@@ -31,6 +31,7 @@
#include <string.h>
#include <ctype.h>
+#include <errno.h>
#include <glib.h>
@@ -141,13 +142,14 @@ convert_ret_t range_convert_str(range_t **rangep, const gchar *es,
range->ranges[range->nranges].low = 1;
} else if (isdigit((unsigned char)c)) {
/* Subrange starts with the specified number */
- val = strtol(p, &endp, 10);
+ errno = 0;
+ val = strtoul(p, &endp, 10);
if (p == endp) {
/* That wasn't a valid number. */
g_free(range);
return CVT_SYNTAX_ERROR;
}
- if (val > G_MAXUINT32) {
+ if (errno == ERANGE || val > G_MAXUINT32) {
/* That was valid, but it's too big. */
g_free(range);
return CVT_NUMBER_TOO_BIG;
@@ -179,23 +181,24 @@ convert_ret_t range_convert_str(range_t **rangep, const gchar *es,
range->ranges[range->nranges].high = max_value;
} else if (isdigit((unsigned char)c)) {
/* Subrange ends with the specified number. */
- val = strtoul(p, &endp, 10);
- if (p == endp) {
- /* That wasn't a valid number. */
- g_free(range);
- return CVT_SYNTAX_ERROR;
- }
- if (val > G_MAXUINT32) {
- /* That was valid, but it's too big. */
- g_free(range);
- return CVT_NUMBER_TOO_BIG;
- }
- p = endp;
- range->ranges[range->nranges].high = val;
-
- /* Skip white space. */
- while ((c = *p) == ' ' || c == '\t')
- p++;
+ errno = 0;
+ val = strtoul(p, &endp, 10);
+ if (p == endp) {
+ /* That wasn't a valid number. */
+ g_free(range);
+ return CVT_SYNTAX_ERROR;
+ }
+ if (errno == ERANGE || val > G_MAXUINT32) {
+ /* That was valid, but it's too big. */
+ g_free(range);
+ return CVT_NUMBER_TOO_BIG;
+ }
+ p = endp;
+ range->ranges[range->nranges].high = val;
+
+ /* Skip white space. */
+ while ((c = *p) == ' ' || c == '\t')
+ p++;
} else {
/* Neither empty nor a number. */
g_free(range);
@@ -291,25 +294,32 @@ range_foreach(range_t *range, void (*callback)(guint32 val))
}
}
-/* This function converts a range_t to a (caller-provided) string. */
+/* This function converts a range_t to a (g_malloc()-allocated) string. */
char *
-range_convert_range(range_t *range, char *string)
+range_convert_range(range_t *range)
{
- guint32 i, k;
+ GString *str;
+ guint32 i;
+ gboolean prepend_comma = FALSE;
+ char *string;
- k = 0;
- string[k] = '\0';
+ str = g_string_new("");
for (i=0; i < range->nranges; i++) {
- if (i != 0)
- string[k++] = ',';
-
- k += sprintf(&string[k], "%d-%d", range->ranges[i].low,
- range->ranges[i].high);
+ if (prepend_comma)
+ g_string_append_c(str, ',');
+
+ if (range->ranges[i].low == range->ranges[i].high)
+ g_string_sprintfa(str, "%u", range->ranges[i].low);
+ else
+ g_string_sprintfa(str, "%u-%u", range->ranges[i].low,
+ range->ranges[i].high);
+ prepend_comma = TRUE;
}
- return(string);
-
+ string = str->str;
+ g_string_free(str, FALSE);
+ return string;
}
/* Create a copy of a range. */
diff --git a/epan/range.h b/epan/range.h
index de88cfb77a..f3ec4c2c3d 100644
--- a/epan/range.h
+++ b/epan/range.h
@@ -30,10 +30,6 @@
#include <glib.h>
-#include <epan/frame_data.h>
-
-#define MAXRANGESTRING 255
-
typedef struct range_admin_tag {
guint32 low;
guint32 high;
@@ -65,7 +61,7 @@ extern gboolean ranges_are_equal(range_t *a, range_t *b);
extern void range_foreach(range_t *range, void (*callback)(guint32 val));
-extern char *range_convert_range(range_t *range, char *string);
+extern char *range_convert_range(range_t *range);
extern range_t *range_copy(range_t *src);
diff --git a/gtk/prefs_dlg.c b/gtk/prefs_dlg.c
index f2b31f4c60..517c3ecc13 100644
--- a/gtk/prefs_dlg.c
+++ b/gtk/prefs_dlg.c
@@ -204,15 +204,16 @@ pref_show(pref_t *pref, gpointer user_data)
case PREF_RANGE:
{
- char range_string[MAXRANGESTRING];
+ char *range_string;
if (pref->saved_val.range != NULL)
g_free(pref->saved_val.range);
pref->saved_val.range = range_copy(*pref->varp.range);
- range_convert_range(*pref->varp.range, range_string);
+ range_string = range_convert_range(*pref->varp.range);
pref->control = create_preference_entry(main_tb, pref->ordinal,
label_string, pref->description,
range_string);
+ g_free(range_string);
break;
}