Message ID | f09b0838f049de3e4b8cc6adc6cd4492bac7e967.1706416952.git.gitgitgadget@gmail.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | Replace atoi() with strtoi_with_tail() | expand |
"Mohit Marathe via GitGitGadget" <gitgitgadget@gmail.com> writes: > From: Mohit Marathe <mohitmarathe23@gmail.com> > > This function is an updated version of strtol_i() function. It will > give more control to handle parsing of the characters after the > numbers and better error handling while parsing numbers. > > Signed-off-by: Mohit Marathe <mohitmarathe@proton.me> > --- > git-compat-util.h | 23 +++++++++++++++++++++++ > 1 file changed, 23 insertions(+) > > diff --git a/git-compat-util.h b/git-compat-util.h > index 7c2a6538e5a..c576b1b104f 100644 > --- a/git-compat-util.h > +++ b/git-compat-util.h > @@ -1309,6 +1309,29 @@ static inline int strtol_i(char const *s, int base, int *result) > return 0; > } Are we leaving the original one above? Shouldn't this step instead remove it, as strtol_i() is now a C preprocessor macro as seen below? > +#define strtol_i(s,b,r) strtoi_with_tail((s), (b), (r), NULL) > +static inline int strtoi_with_tail(char const *s, int base, int *result, char **endp) > +{ > + long ul; > + char *dummy = NULL; > + > + if (!endp) > + endp = &dummy; > + errno = 0; > + ul = strtol(s, endp, base); > + if (errno || > + /* > + * if we are told to parse to the end of the string by > + * passing NULL to endp, it is an error to have any > + * remaining character after the digits. > + */ > + (dummy && *dummy) || > + *endp == s || (int) ul != ul) > + return -1; > + *result = ul; > + return 0; > +} > + > void git_stable_qsort(void *base, size_t nmemb, size_t size, > int(*compar)(const void *, const void *)); > #ifdef INTERNAL_QSORT
diff --git a/git-compat-util.h b/git-compat-util.h index 7c2a6538e5a..c576b1b104f 100644 --- a/git-compat-util.h +++ b/git-compat-util.h @@ -1309,6 +1309,29 @@ static inline int strtol_i(char const *s, int base, int *result) return 0; } +#define strtol_i(s,b,r) strtoi_with_tail((s), (b), (r), NULL) +static inline int strtoi_with_tail(char const *s, int base, int *result, char **endp) +{ + long ul; + char *dummy = NULL; + + if (!endp) + endp = &dummy; + errno = 0; + ul = strtol(s, endp, base); + if (errno || + /* + * if we are told to parse to the end of the string by + * passing NULL to endp, it is an error to have any + * remaining character after the digits. + */ + (dummy && *dummy) || + *endp == s || (int) ul != ul) + return -1; + *result = ul; + return 0; +} + void git_stable_qsort(void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *)); #ifdef INTERNAL_QSORT