summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAkim Demaille <akim.demaille@gmail.com>2021-09-25 07:32:33 +0200
committerAkim Demaille <akim.demaille@gmail.com>2021-09-25 08:03:22 +0200
commit028df02a9fd60a489caaed066e5b07f96e029878 (patch)
treedf0c9fe9c7e10c032d4ea2b06b037db95d62abe9
parent71dfc86d58c2276fde3bea2a32646eed4e95fe5c (diff)
downloadbison-028df02a9fd60a489caaed066e5b07f96e029878.tar.gz
avoid using atoi
* cfg.mk: Disable sc_indent as auto indent is too invasive for now. Enable sc_prohibit_atoi_atof, except where we don't care. * src/location.c, src/muscle-tab.c: Use strtol instead of atoi.
-rw-r--r--cfg.mk3
-rw-r--r--src/location.c16
-rw-r--r--src/location.h5
-rw-r--r--src/muscle-tab.c3
4 files changed, 18 insertions, 9 deletions
diff --git a/cfg.mk b/cfg.mk
index 8fb39a8a..9c3f334d 100644
--- a/cfg.mk
+++ b/cfg.mk
@@ -42,7 +42,7 @@ url_dir_list = \
# Tests not to run as part of "make distcheck".
local-checks-to-skip = \
sc_immutable_NEWS \
- sc_prohibit_atoi_atof
+ sc_indent
# The local directory containing the checked-out copy of gnulib used in
# this release. Used solely to get a date for the "announcement" target.
@@ -164,6 +164,7 @@ $(call exclude,
prohibit_always-defined_macros=^data/skeletons/yacc.c$$ \
prohibit_always-defined_macros+=?|^src/(parse-gram.c|system.h)$$ \
prohibit_always-defined_macros+=?|^tests/regression.at$$ \
+ prohibit_atoi_atof=^(doc|etc|examples|tests)/ \
prohibit_doubled_word=^tests/named-refs.at$$ \
prohibit_magic_number_exit=^doc/bison.texi$$ \
prohibit_magic_number_exit+=?|^tests/(conflicts|regression).at$$ \
diff --git a/src/location.c b/src/location.c
index 356f4947..5edce82c 100644
--- a/src/location.c
+++ b/src/location.c
@@ -512,22 +512,28 @@ location_empty (location loc)
&& !loc.end.file && !loc.end.line && !loc.end.column;
}
+static inline int
+str_to_int (const char *s)
+{
+ long l = strtol (s, NULL, 10);
+ return l < 0 ? -1 : l <= INT_MAX ? l : INT_MAX;
+}
+
void
boundary_set_from_string (boundary *bound, char *str)
{
- /* Must search in reverse since the file name field may contain '.'
- or ':'. */
+ /* Search backwards: the file name may contain '.' or ':'. */
char *at = strrchr (str, '@');
if (at)
{
*at = '\0';
- bound->byte = atoi (at+1);
+ bound->byte = str_to_int (at + 1);
}
{
char *dot = strrchr (str, '.');
aver (dot);
*dot = '\0';
- bound->column = atoi (dot+1);
+ bound->column = str_to_int (dot + 1);
if (!at)
bound->byte = bound->column;
}
@@ -535,7 +541,7 @@ boundary_set_from_string (boundary *bound, char *str)
char *colon = strrchr (str, ':');
aver (colon);
*colon = '\0';
- bound->line = atoi (colon+1);
+ bound->line = str_to_int (colon + 1);
}
bound->file = uniqstr_new (str);
}
diff --git a/src/location.h b/src/location.h
index af21c70f..6e356b81 100644
--- a/src/location.h
+++ b/src/location.h
@@ -146,8 +146,9 @@ location_cmp (location a, location b)
/* Whether this is the empty location. */
bool location_empty (location loc);
-/* STR must be formatted as 'file:line.column@byte' or 'file:line.column',
- it will be modified. */
+/* STR must be formatted as 'file:line.column@byte' or 'file:line.column'.
+ It may be '<command line>:3.-1@-1', with -1 to denote no-column/no-byte.
+ STR will be modified. */
void boundary_set_from_string (boundary *bound, char *str);
#endif /* ! defined LOCATION_H_ */
diff --git a/src/muscle-tab.c b/src/muscle-tab.c
index 0654a3f1..3d3baf13 100644
--- a/src/muscle-tab.c
+++ b/src/muscle-tab.c
@@ -517,8 +517,9 @@ muscle_percent_define_insert (char const *var, location variable_loc,
char const *current_value = muscle_find_const (name);
if (current_value)
{
+ long l = strtol (muscle_find_const (how_name), NULL, 10);
muscle_percent_define_how how_old
- = atoi (muscle_find_const (how_name));
+ = 0 <= l && l <= INT_MAX ? l : INT_MAX;
if (how_old == MUSCLE_PERCENT_DEFINE_F)
goto end;
/* If assigning the same value, make it a warning. */