Mercurial > vim
changeset 33856:32bc4c71f8a6 v9.0.2138
patch 9.0.2138: Overflow logic requires long long
Commit: https://github.com/vim/vim/commit/fda700cb04612fe2f9301a9ba820309175decabf
Author: Ernie Rael <errael@raelity.com>
Date: Thu Nov 30 18:20:00 2023 +0100
patch 9.0.2138: Overflow logic requires long long
Problem: Overflow logic requires long long
Solution: Define vimlong_T data type to make life easier
for porters
closes: #13598
Signed-off-by: Ernie Rael <errael@raelity.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Thu, 30 Nov 2023 18:30:03 +0100 |
parents | 8ef8da090c3b |
children | 8ced1e26de43 |
files | src/cindent.c src/misc1.c src/ops.c src/proto/misc1.pro src/version.c src/vim.h |
diffstat | 6 files changed, 17 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/src/cindent.c +++ b/src/cindent.c @@ -1730,7 +1730,7 @@ parse_cino(buf_T *buf) char_u *p; char_u *l; char_u *digits; - long long n; + vimlong_T n; int divider; int fraction = 0; int sw; @@ -1902,7 +1902,7 @@ parse_cino(buf_T *buf) { n *= sw; if (divider) - n += ((long long)sw * fraction + divider / 2) / divider; + n += ((vimlong_T)sw * fraction + divider / 2) / divider; } ++p; }
--- a/src/misc1.c +++ b/src/misc1.c @@ -2843,7 +2843,7 @@ vim_append_digit_long(long *value, int d // Return something that fits into an int. int -trim_to_int(long long x) +trim_to_int(vimlong_T x) { return x > INT_MAX ? INT_MAX : x < INT_MIN ? INT_MIN : x; }
--- a/src/ops.c +++ b/src/ops.c @@ -229,11 +229,11 @@ shift_line( int amount, int call_changed_bytes) // call changed_bytes() { - long long count; + vimlong_T count; int i, j; int sw_val = trim_to_int(get_sw_value_indent(curbuf)); - count = (long long)get_indent(); // get current indent + count = get_indent(); // get current indent if (round) // round off indent { @@ -249,18 +249,18 @@ shift_line( } else i += amount; - count = (long long)i * (long long)sw_val; + count = (vimlong_T)i * (vimlong_T)sw_val; } else // original vi indent { if (left) { - count -= (long long)sw_val * (long long)amount; + count -= (vimlong_T)sw_val * (vimlong_T)amount; if (count < 0) count = 0; } else - count += (long long)sw_val * (long long)amount; + count += (vimlong_T)sw_val * (vimlong_T)amount; } // Set new indent
--- a/src/proto/misc1.pro +++ b/src/proto/misc1.pro @@ -55,5 +55,5 @@ void restore_v_event(dict_T *v_event, sa void may_trigger_modechanged(void); int vim_append_digit_int(int *value, int digit); int vim_append_digit_long(long *value, int digit); -int trim_to_int(long long x); +int trim_to_int(vimlong_T x); /* vim: set ft=c : */
--- a/src/version.c +++ b/src/version.c @@ -705,6 +705,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2138, +/**/ 2137, /**/ 2136,
--- a/src/vim.h +++ b/src/vim.h @@ -435,6 +435,12 @@ typedef unsigned short sattr_T; */ typedef unsigned int u8char_T; // int is 32 bits or more +/* + * The vimlong_T has sizeof(vimlong_T) >= 2 * sizeof(int). + * One use is simple handling of overflow in int calculations. + */ +typedef long long vimlong_T; + #ifndef UNIX // For Unix this is included in os_unix.h # include <stdio.h> # include <ctype.h>