diff options
author | Akim Demaille <akim.demaille@gmail.com> | 2021-09-25 07:32:33 +0200 |
---|---|---|
committer | Akim Demaille <akim.demaille@gmail.com> | 2021-09-25 08:03:22 +0200 |
commit | 028df02a9fd60a489caaed066e5b07f96e029878 (patch) | |
tree | df0c9fe9c7e10c032d4ea2b06b037db95d62abe9 | |
parent | 71dfc86d58c2276fde3bea2a32646eed4e95fe5c (diff) | |
download | bison-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.mk | 3 | ||||
-rw-r--r-- | src/location.c | 16 | ||||
-rw-r--r-- | src/location.h | 5 | ||||
-rw-r--r-- | src/muscle-tab.c | 3 |
4 files changed, 18 insertions, 9 deletions
@@ -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. */ |