diff options
author | Eliseo Martínez <eliseomarmol@gmail.com> | 2015-01-11 12:55:38 +0100 |
---|---|---|
committer | Eliseo Martínez <eliseomarmol@gmail.com> | 2015-01-11 17:18:39 +0100 |
commit | 04c0658024a98a0586997f0ea8af1e3f774cc83e (patch) | |
tree | cb34605b25e040a179de11dbc34cc739c7547d34 /src/nvim/charset.c | |
parent | 28e75d4c453dcf7b1d1630815036d0236cfa0034 (diff) | |
download | rneovim-04c0658024a98a0586997f0ea8af1e3f774cc83e.tar.gz rneovim-04c0658024a98a0586997f0ea8af1e3f774cc83e.tar.bz2 rneovim-04c0658024a98a0586997f0ea8af1e3f774cc83e.zip |
Cleanup: Refactor getdigits().
Problem : getdigits() currently returns a long, but at most places,
return value is casted (unsafely) into an int. Making casts
safe would introduce a lot of fuss in the form of assertions
checking for limits.
Note : We cannot just change return type to int, because, at some
places, legitimate long values are used. For example, in
diff.c, for line numbers.
Solution : Introduce new functions:
- get_digits() : Gets an intmax_t from a string.
- get_int_digits() : Wrapper for ints.
- get_long_digits() : Wrapper for longs.
And replace getdigits() invocations by the appropiate
wrapper invocations.
Diffstat (limited to 'src/nvim/charset.c')
-rw-r--r-- | src/nvim/charset.c | 45 |
1 files changed, 28 insertions, 17 deletions
diff --git a/src/nvim/charset.c b/src/nvim/charset.c index 32427cc3ba..91d8f221c9 100644 --- a/src/nvim/charset.c +++ b/src/nvim/charset.c @@ -177,7 +177,7 @@ int buf_init_chartab(buf_T *buf, int global) } if (VIM_ISDIGIT(*p)) { - c = getdigits(&p); + c = get_int_digits(&p); } else if (has_mbyte) { c = mb_ptr2char_adv(&p); } else { @@ -189,7 +189,7 @@ int buf_init_chartab(buf_T *buf, int global) ++p; if (VIM_ISDIGIT(*p)) { - c2 = getdigits(&p); + c2 = get_int_digits(&p); } else if (has_mbyte) { c2 = mb_ptr2char_adv(&p); } else { @@ -1676,26 +1676,37 @@ char_u* skiptowhite_esc(char_u *p) { return p; } -/// Getdigits: Get a number from a string and skip over it. +/// Get a number from a string and skip over it. /// -/// Note: the argument is a pointer to a char_u pointer! +/// @param[out] pp A pointer to a pointer to char_u. +/// It will be advanced past the read number. /// -/// @param pp +/// @return Number read from the string. +intmax_t get_digits(char_u **pp) +{ + intmax_t number = strtoimax((char *)*pp, (char **)pp, 10); + assert(errno != ERANGE); + return number; +} + +/// Get an int number from a string. /// -/// @return Number from the string. -long getdigits(char_u **pp) +/// A get_digits wrapper restricted to int values. +int get_int_digits(char_u **pp) { - char_u *p = *pp; - long retval = atol((char *)p); + intmax_t number = get_digits(pp); + assert(number >= INT_MIN && number <= INT_MAX); + return (int)number; +} - if (*p == '-') { - // skip negative sign - ++p; - } - // skip to next non-digit - p = skipdigits(p); - *pp = p; - return retval; +/// Get a long number from a string. +/// +/// A get_digits wrapper restricted to long values. +long get_long_digits(char_u **pp) +{ + intmax_t number = get_digits(pp); + assert(number >= LONG_MIN && number <= LONG_MAX); + return (long)number; } /// Return TRUE if "lbuf" is empty or only contains blanks. |