From 7a7c933b86cf90f394e9b3b7d1928931a6d32f39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eliseo=20Marti=CC=81nez?= Date: Wed, 11 Feb 2015 18:26:48 +0100 Subject: [PATCH 1/6] Enable -Wconversion: ui.c. Refactoring summary: - ui_write(): len: int --> size_t * parse_abstract_ui_codes(): len: int --> size_t * string_convert(): lenp: int * --> size_t * - string_convert_ext(): lenp : int * --> size_t * unconvlenp: int * --> size_t * * utf8len_tab_zero: char[] --> uint8_t[] * iconv_string(): slen : int --> size_t unconvlenp: int * --> size_t * resultlenp: int * --> size_t * - mch_print_text_out(): len: int --> size_t * out_pos: int --> size_t --- src/nvim/CMakeLists.txt | 1 - src/nvim/api/vim.c | 2 +- src/nvim/digraph.c | 4 +++- src/nvim/ex_cmds.c | 3 +-- src/nvim/hardcopy.c | 13 ++++++------ src/nvim/mbyte.c | 45 ++++++++++++++++++++--------------------- src/nvim/term.c | 4 ++-- src/nvim/ui.c | 4 ++-- 8 files changed, 37 insertions(+), 39 deletions(-) diff --git a/src/nvim/CMakeLists.txt b/src/nvim/CMakeLists.txt index 922b8b85a1..99e0b215de 100644 --- a/src/nvim/CMakeLists.txt +++ b/src/nvim/CMakeLists.txt @@ -84,7 +84,6 @@ set(CONV_SOURCES spell.c syntax.c tag.c - ui.c window.c) foreach(sfile ${CONV_SOURCES}) diff --git a/src/nvim/api/vim.c b/src/nvim/api/vim.c index e3f426719e..33020c5b8c 100644 --- a/src/nvim/api/vim.c +++ b/src/nvim/api/vim.c @@ -578,7 +578,7 @@ Array vim_get_api_info(uint64_t channel_id) /// `emsg` instead of `msg` to print each line) static void write_msg(String message, bool to_err) { - static int out_pos = 0, err_pos = 0; + static size_t out_pos = 0, err_pos = 0; static char out_line_buf[LINE_BUFFER_SIZE], err_line_buf[LINE_BUFFER_SIZE]; #define PUSH_CHAR(i, pos, line_buf, msg) \ diff --git a/src/nvim/digraph.c b/src/nvim/digraph.c index 243468b680..cb6bfc9cc9 100644 --- a/src/nvim/digraph.c +++ b/src/nvim/digraph.c @@ -1532,7 +1532,9 @@ static int getexactdigraph(int char1, int char2, int meta_char) if (convert_setup(&vc, (char_u *)"utf-8", p_enc) == OK) { vc.vc_fail = true; - to = string_convert(&vc, buf, &i); + assert(i >= 0); + size_t len = (size_t)i; + to = string_convert(&vc, buf, &len); if (to != NULL) { retval = (*mb_ptr2char)(to); diff --git a/src/nvim/ex_cmds.c b/src/nvim/ex_cmds.c index 49f33c5017..ad49153a1e 100644 --- a/src/nvim/ex_cmds.c +++ b/src/nvim/ex_cmds.c @@ -5257,8 +5257,7 @@ void fix_help_buffer(void) else { /* Do the conversion. If it fails * use the unconverted text. */ - cp = string_convert(&vc, IObuff, - NULL); + cp = string_convert(&vc, IObuff, NULL); if (cp == NULL) cp = IObuff; } diff --git a/src/nvim/hardcopy.c b/src/nvim/hardcopy.c index 2dbe33d6e2..cc6aa57419 100644 --- a/src/nvim/hardcopy.c +++ b/src/nvim/hardcopy.c @@ -96,7 +96,7 @@ * Sets the current position at the start of line "page_line". * If margin is TRUE start in the left margin (for header and line number). * - * int mch_print_text_out(char_u *p, int len); + * int mch_print_text_out(char_u *p, size_t len); * Output one character of text p[len] at the current position. * Return TRUE if there is no room for another character in the same line. * @@ -495,7 +495,6 @@ static void prt_header(prt_settings_T *psettings, int pagenum, linenr_T lnum) int page_line; char_u *tbuf; char_u *p; - int l; /* Also use the space for the line number. */ if (prt_use_number()) @@ -542,9 +541,9 @@ static void prt_header(prt_settings_T *psettings, int pagenum, linenr_T lnum) page_line = 0 - prt_header_height(); mch_print_start_line(TRUE, page_line); for (p = tbuf; *p != NUL; ) { - if (mch_print_text_out(p, - (l = (*mb_ptr2len)(p)) - )) { + int l = (*mb_ptr2len)(p); + assert(l >= 0); + if (mch_print_text_out(p, (size_t)l)) { ++page_line; if (page_line >= 0) /* out of room in header */ break; @@ -884,7 +883,7 @@ static colnr_T hardcopy_line(prt_settings_T *psettings, int page_line, prt_pos_T ppos->ff = TRUE; need_break = 1; } else { - need_break = mch_print_text_out(line + col, outputlen); + need_break = mch_print_text_out(line + col, (size_t)outputlen); if (has_mbyte) print_pos += (*mb_ptr2cells)(line + col); else @@ -2871,7 +2870,7 @@ void mch_print_start_line(int margin, int page_line) prt_half_width = FALSE; } -int mch_print_text_out(char_u *p, int len) +int mch_print_text_out(char_u *p, size_t len) { int need_break; char_u ch; diff --git a/src/nvim/mbyte.c b/src/nvim/mbyte.c index bc8f768724..660259498b 100644 --- a/src/nvim/mbyte.c +++ b/src/nvim/mbyte.c @@ -143,7 +143,7 @@ static char utf8len_tab[256] = /* * Like utf8len_tab above, but using a zero for illegal lead bytes. */ -static char utf8len_tab_zero[256] = +static uint8_t utf8len_tab_zero[256] = { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, @@ -1375,7 +1375,7 @@ static int dbcs_ptr2char(const char_u *p) */ int utf_ptr2char(const char_u *p) { - int len; + uint8_t len; if (p[0] < 0x80) /* be quick for ASCII */ return p[0]; @@ -1427,12 +1427,12 @@ int utf_ptr2char(const char_u *p) */ static int utf_safe_read_char_adv(char_u **s, size_t *n) { - int c, k; + int c; if (*n == 0) /* end of buffer */ return 0; - k = utf8len_tab_zero[**s]; + uint8_t k = utf8len_tab_zero[**s]; if (k == 1) { /* ASCII character or NUL */ @@ -1440,7 +1440,7 @@ static int utf_safe_read_char_adv(char_u **s, size_t *n) return *(*s)++; } - if ((size_t)k <= *n) { + if (k <= *n) { /* We have a multibyte sequence and it isn't truncated by buffer * limits so utf_ptr2char() is safe to use. Or the first byte is * illegal (k=0), and it's also safe to use utf_ptr2char(). */ @@ -3504,7 +3504,8 @@ void * my_iconv_open(char_u *to, char_u *from) * Returns the converted string in allocated memory. NULL for an error. * If resultlenp is not NULL, sets it to the result length in bytes. */ -static char_u * iconv_string(vimconv_T *vcp, char_u *str, int slen, int *unconvlenp, int *resultlenp) +static char_u * iconv_string(vimconv_T *vcp, char_u *str, size_t slen, + size_t *unconvlenp, size_t *resultlenp) { const char *from; size_t fromlen; @@ -3534,8 +3535,7 @@ static char_u * iconv_string(vimconv_T *vcp, char_u *str, int slen, int *unconvl tolen = len - done - 2; /* Avoid a warning for systems with a wrong iconv() prototype by * casting the second argument to void *. */ - if (iconv(vcp->vc_fd, (void *)&from, &fromlen, &to, &tolen) - != (size_t)-1) { + if (iconv(vcp->vc_fd, (void *)&from, &fromlen, &to, &tolen) != SIZE_MAX) { /* Finished, append a NUL. */ *to = NUL; break; @@ -3547,7 +3547,7 @@ static char_u * iconv_string(vimconv_T *vcp, char_u *str, int slen, int *unconvl && (ICONV_ERRNO == ICONV_EINVAL || ICONV_ERRNO == EINVAL)) { /* Handle an incomplete sequence at the end. */ *to = NUL; - *unconvlenp = (int)fromlen; + *unconvlenp = fromlen; break; } /* Check both ICONV_EILSEQ and EILSEQ, because the dynamically loaded @@ -3581,7 +3581,7 @@ static char_u * iconv_string(vimconv_T *vcp, char_u *str, int slen, int *unconvl } if (resultlenp != NULL && result != NULL) - *resultlenp = (int)(to - (char *)result); + *resultlenp = (size_t)(to - (char *)result); return result; } @@ -3802,7 +3802,7 @@ int convert_setup_ext(vimconv_T *vcp, char_u *from, bool from_unicode_is_utf8, * Illegal chars are often changed to "?", unless vcp->vc_fail is set. * When something goes wrong, NULL is returned and "*lenp" is unchanged. */ -char_u * string_convert(vimconv_T *vcp, char_u *ptr, int *lenp) +char_u * string_convert(vimconv_T *vcp, char_u *ptr, size_t *lenp) { return string_convert_ext(vcp, ptr, lenp, NULL); } @@ -3812,18 +3812,17 @@ char_u * string_convert(vimconv_T *vcp, char_u *ptr, int *lenp) * an incomplete sequence at the end it is not converted and "*unconvlenp" is * set to the number of remaining bytes. */ -char_u * string_convert_ext(vimconv_T *vcp, char_u *ptr, int *lenp, - int *unconvlenp) +char_u * string_convert_ext(vimconv_T *vcp, char_u *ptr, + size_t *lenp, size_t *unconvlenp) { char_u *retval = NULL; char_u *d; - int len; - int i; int l; int c; + size_t len; if (lenp == NULL) - len = (int)STRLEN(ptr); + len = STRLEN(ptr); else len = *lenp; if (len == 0) @@ -3833,7 +3832,7 @@ char_u * string_convert_ext(vimconv_T *vcp, char_u *ptr, int *lenp, case CONV_TO_UTF8: /* latin1 to utf-8 conversion */ retval = xmalloc(len * 2 + 1); d = retval; - for (i = 0; i < len; ++i) { + for (size_t i = 0; i < len; ++i) { c = ptr[i]; if (c < 0x80) *d++ = c; @@ -3844,13 +3843,13 @@ char_u * string_convert_ext(vimconv_T *vcp, char_u *ptr, int *lenp, } *d = NUL; if (lenp != NULL) - *lenp = (int)(d - retval); + *lenp = (size_t)(d - retval); break; case CONV_9_TO_UTF8: /* latin9 to utf-8 conversion */ retval = xmalloc(len * 3 + 1); d = retval; - for (i = 0; i < len; ++i) { + for (size_t i = 0; i < len; ++i) { c = ptr[i]; switch (c) { case 0xa4: c = 0x20ac; break; /* euro */ @@ -3866,19 +3865,19 @@ char_u * string_convert_ext(vimconv_T *vcp, char_u *ptr, int *lenp, } *d = NUL; if (lenp != NULL) - *lenp = (int)(d - retval); + *lenp = (size_t)(d - retval); break; case CONV_TO_LATIN1: /* utf-8 to latin1 conversion */ case CONV_TO_LATIN9: /* utf-8 to latin9 conversion */ retval = xmalloc(len + 1); d = retval; - for (i = 0; i < len; ++i) { + for (size_t i = 0; i < len; ++i) { l = utf_ptr2len_len(ptr + i, len - i); if (l == 0) *d++ = NUL; else if (l == 1) { - int l_w = utf8len_tab_zero[ptr[i]]; + uint8_t l_w = utf8len_tab_zero[ptr[i]]; if (l_w == 0) { /* Illegal utf-8 byte cannot be converted */ @@ -3929,7 +3928,7 @@ char_u * string_convert_ext(vimconv_T *vcp, char_u *ptr, int *lenp, } *d = NUL; if (lenp != NULL) - *lenp = (int)(d - retval); + *lenp = (size_t)(d - retval); break; # ifdef MACOS_CONVERT diff --git a/src/nvim/term.c b/src/nvim/term.c index fa85860cb0..bdeebc7f6e 100644 --- a/src/nvim/term.c +++ b/src/nvim/term.c @@ -545,7 +545,7 @@ void termcapinit(char_u *name) # define OUT_SIZE 2047 // Add one to allow term_write() in os_win32.c to append a NUL static char_u out_buf[OUT_SIZE + 1]; -static int out_pos = 0; /* number of chars in out_buf */ +static size_t out_pos = 0; /* number of chars in out_buf */ // Clear the output buffer void out_buf_clear(void) @@ -558,7 +558,7 @@ void out_buf_clear(void) */ void out_flush(void) { - int len = out_pos; + size_t len = out_pos; out_pos = 0; ui_write(out_buf, len); } diff --git a/src/nvim/ui.c b/src/nvim/ui.c index af8989f397..c09cca1347 100644 --- a/src/nvim/ui.c +++ b/src/nvim/ui.c @@ -95,7 +95,7 @@ void ui_builtin_stop(void) UI_CALL(stop); } -void ui_write(uint8_t *s, int len) +void ui_write(uint8_t *s, size_t len) { if (silent_mode && !p_verbose) { // Don't output anything in silent mode ("ex -s") unless 'verbose' set @@ -346,7 +346,7 @@ end: UI_CALL(highlight_set, (ui->rgb ? rgb_attrs : cterm_attrs)); } -static void parse_abstract_ui_codes(uint8_t *ptr, int len) +static void parse_abstract_ui_codes(uint8_t *ptr, size_t len) { if (!ui_active()) { return; From 690e43b461491507094da8eeb48a92cf2f38b282 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eliseo=20Marti=CC=81nez?= Date: Wed, 11 Feb 2015 18:46:00 +0100 Subject: [PATCH 2/6] Enable -Wconversion: Passing-by: Remove dead code (MACOS_CONVERT). MacOS (pre Mac OS X) is not supported anymore. --- src/nvim/fileio.c | 43 ------------------------------------------- src/nvim/mbyte.c | 22 ---------------------- src/nvim/option.c | 6 ------ src/nvim/os_unix.c | 4 ---- src/nvim/path.c | 10 ---------- src/nvim/term.c | 4 ---- 6 files changed, 89 deletions(-) diff --git a/src/nvim/fileio.c b/src/nvim/fileio.c index 762514a237..cd27567bd8 100644 --- a/src/nvim/fileio.c +++ b/src/nvim/fileio.c @@ -1235,7 +1235,6 @@ retry: if (size <= 0) break; - # ifdef USE_ICONV if (iconv_fd != (iconv_t)-1) { /* @@ -1294,16 +1293,6 @@ retry: } # endif -# ifdef MACOS_CONVERT - if (fio_flags & FIO_MACROMAN) { - /* - * Conversion from Apple MacRoman char encoding to UTF-8 or - * latin1. This is in os_mac_conv.c. - */ - if (macroman2enc(ptr, &size, real_size) == FAIL) - goto rewind_retry; - } else -# endif if (fio_flags != 0) { int u8c; char_u *dest; @@ -4029,38 +4018,6 @@ static int buf_write_bytes(struct bw_info *ip) } } - -# ifdef MACOS_CONVERT - else if (flags & FIO_MACROMAN) { - /* - * Convert UTF-8 or latin1 to Apple MacRoman. - */ - char_u *from; - size_t fromlen; - - if (ip->bw_restlen > 0) { - /* Need to concatenate the remainder of the previous call and - * the bytes of the current call. Use the end of the - * conversion buffer for this. */ - fromlen = len + ip->bw_restlen; - from = ip->bw_conv_buf + ip->bw_conv_buflen - fromlen; - memmove(from, ip->bw_rest, (size_t)ip->bw_restlen); - memmove(from + ip->bw_restlen, buf, (size_t)len); - } else { - from = buf; - fromlen = len; - } - - if (enc2macroman(from, fromlen, - ip->bw_conv_buf, &len, ip->bw_conv_buflen, - ip->bw_rest, &ip->bw_restlen) == FAIL) { - ip->bw_conv_error = TRUE; - return FAIL; - } - buf = ip->bw_conv_buf; - } -# endif - # ifdef USE_ICONV if (ip->bw_iconv_fd != (iconv_t)-1) { const char *from; diff --git a/src/nvim/mbyte.c b/src/nvim/mbyte.c index 660259498b..123ef377e6 100644 --- a/src/nvim/mbyte.c +++ b/src/nvim/mbyte.c @@ -3931,28 +3931,6 @@ char_u * string_convert_ext(vimconv_T *vcp, char_u *ptr, *lenp = (size_t)(d - retval); break; -# ifdef MACOS_CONVERT - case CONV_MAC_LATIN1: - retval = mac_string_convert(ptr, len, lenp, vcp->vc_fail, - 'm', 'l', unconvlenp); - break; - - case CONV_LATIN1_MAC: - retval = mac_string_convert(ptr, len, lenp, vcp->vc_fail, - 'l', 'm', unconvlenp); - break; - - case CONV_MAC_UTF8: - retval = mac_string_convert(ptr, len, lenp, vcp->vc_fail, - 'm', 'u', unconvlenp); - break; - - case CONV_UTF8_MAC: - retval = mac_string_convert(ptr, len, lenp, vcp->vc_fail, - 'u', 'm', unconvlenp); - break; -# endif - # ifdef USE_ICONV case CONV_ICONV: /* conversion with output_conv.vc_fd */ retval = iconv_string(vcp, ptr, len, unconvlenp, lenp); diff --git a/src/nvim/option.c b/src/nvim/option.c index 7242c2d925..bf7d0d0bf3 100644 --- a/src/nvim/option.c +++ b/src/nvim/option.c @@ -2059,12 +2059,6 @@ void set_init_1(void) /* Parse default for 'fillchars'. */ (void)set_chars_option(&p_fcs); - -# ifdef MACOS_CONVERT - /* Moved to os_mac_conv.c to avoid dependency problems. */ - mac_lang_init(); -# endif - /* enc_locale() will try to find the encoding of the current locale. */ p = enc_locale(); if (p != NULL) { diff --git a/src/nvim/os_unix.c b/src/nvim/os_unix.c index 455ed737ff..0fc45c9543 100644 --- a/src/nvim/os_unix.c +++ b/src/nvim/os_unix.c @@ -415,10 +415,6 @@ void mch_exit(int r) out_flush(); ml_close_all(TRUE); /* remove all memfiles */ -#ifdef MACOS_CONVERT - mac_conv_cleanup(); -#endif - event_teardown(); #ifdef EXITFREE diff --git a/src/nvim/path.c b/src/nvim/path.c index e5f78440c2..abeb755482 100644 --- a/src/nvim/path.c +++ b/src/nvim/path.c @@ -578,16 +578,6 @@ unix_expandpath ( if (*path_end != NUL) backslash_halve(buf + len + 1); if (os_file_exists(buf)) { /* add existing file */ -#ifdef MACOS_CONVERT - size_t precomp_len = STRLEN(buf)+1; - char_u *precomp_buf = - mac_precompose_path(buf, precomp_len, &precomp_len); - - if (precomp_buf) { - memmove(buf, precomp_buf, precomp_len); - free(precomp_buf); - } -#endif addfile(gap, buf, flags); } } diff --git a/src/nvim/term.c b/src/nvim/term.c index bdeebc7f6e..a16c1a59ca 100644 --- a/src/nvim/term.c +++ b/src/nvim/term.c @@ -161,10 +161,6 @@ void term_init(void) setbuf(stdout, NULL); out_flush(); - -#ifdef MACOS_CONVERT - mac_conv_init(); -#endif } /* From 7dd48d7af08613255bc95b63f5b6b0f096a98d22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eliseo=20Marti=CC=81nez?= Date: Thu, 12 Feb 2015 13:49:02 +0100 Subject: [PATCH 3/6] Enable -Wconversion: mark.c. Refactoring summary: - MB_STRNICMP: Inlined. - MB_STRNCMP: Inlined. --- src/nvim/CMakeLists.txt | 1 - src/nvim/diff.c | 2 +- src/nvim/edit.c | 6 ++++-- src/nvim/eval.c | 4 ++-- src/nvim/mark.c | 13 ++++++++----- src/nvim/mbyte.c | 10 ++++++++++ src/nvim/path.c | 4 ++-- src/nvim/pos.h | 4 ++-- src/nvim/regexp.c | 6 ++++-- src/nvim/search.c | 12 ++++++++---- src/nvim/spell.c | 5 +++-- src/nvim/syntax.c | 2 +- src/nvim/tag.c | 12 ++++++++---- src/nvim/vim.h | 11 ----------- 14 files changed, 53 insertions(+), 39 deletions(-) diff --git a/src/nvim/CMakeLists.txt b/src/nvim/CMakeLists.txt index 99e0b215de..795997c052 100644 --- a/src/nvim/CMakeLists.txt +++ b/src/nvim/CMakeLists.txt @@ -65,7 +65,6 @@ set(CONV_SOURCES if_cscope.c indent.c keymap.c - mark.c mbyte.c memline.c menu.c diff --git a/src/nvim/diff.c b/src/nvim/diff.c index 35c00c4f23..63b0eaf4f6 100644 --- a/src/nvim/diff.c +++ b/src/nvim/diff.c @@ -1582,7 +1582,7 @@ static int diff_cmp(char_u *s1, char_u *s2) } if ((diff_flags & DIFF_ICASE) && !(diff_flags & DIFF_IWHITE)) { - return MB_STRICMP(s1, s2); + return mb_stricmp(s1, s2); } // Ignore white space changes and possibly ignore case. diff --git a/src/nvim/edit.c b/src/nvim/edit.c index fa4e4b2835..7913a37d2c 100644 --- a/src/nvim/edit.c +++ b/src/nvim/edit.c @@ -6594,9 +6594,10 @@ int in_cinkeys(int keytyped, int when, int line_is_empty) for (s = line + curwin->w_cursor.col; s > line; --s) if (!vim_iswordc(s[-1])) break; + assert(p >= look && (uintmax_t)(p - look) <= SIZE_MAX); if (s + (p - look) <= line + curwin->w_cursor.col && (icase - ? MB_STRNICMP(s, look, p - look) + ? mb_strnicmp(s, look, (size_t)(p - look)) : STRNCMP(s, look, p - look)) == 0) match = TRUE; } else @@ -6605,10 +6606,11 @@ int in_cinkeys(int keytyped, int when, int line_is_empty) && TOLOWER_LOC(keytyped) == TOLOWER_LOC((int)p[-1]))) { line = get_cursor_pos_ptr(); + assert(p >= look && (uintmax_t)(p - look) <= SIZE_MAX); if ((curwin->w_cursor.col == (colnr_T)(p - look) || !vim_iswordc(line[-(p - look) - 1])) && (icase - ? MB_STRNICMP(line - (p - look), look, p - look) + ? mb_strnicmp(line - (p - look), look, (size_t)(p - look)) : STRNCMP(line - (p - look), look, p - look)) == 0) match = TRUE; diff --git a/src/nvim/eval.c b/src/nvim/eval.c index 97993eb651..b06c0961c5 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -3615,7 +3615,7 @@ static int eval4(char_u **arg, typval_T *rettv, int evaluate) s1 = get_tv_string_buf(rettv, buf1); s2 = get_tv_string_buf(&var2, buf2); if (type != TYPE_MATCH && type != TYPE_NOMATCH) - i = ic ? MB_STRICMP(s1, s2) : STRCMP(s1, s2); + i = ic ? mb_stricmp(s1, s2) : STRCMP(s1, s2); else i = 0; n1 = FALSE; @@ -4955,7 +4955,7 @@ tv_equal ( case VAR_STRING: s1 = get_tv_string_buf(tv1, buf1); s2 = get_tv_string_buf(tv2, buf2); - return (ic ? MB_STRICMP(s1, s2) : STRCMP(s1, s2)) == 0; + return (ic ? mb_stricmp(s1, s2) : STRCMP(s1, s2)) == 0; } EMSG2(_(e_intern2), "tv_equal()"); diff --git a/src/nvim/mark.c b/src/nvim/mark.c index 5853b535cd..ddbe4e76cb 100644 --- a/src/nvim/mark.c +++ b/src/nvim/mark.c @@ -604,7 +604,8 @@ static char_u *mark_line(pos_T *mp, int lead_len) if (mp->lnum == 0 || mp->lnum > curbuf->b_ml.ml_line_count) return vim_strsave((char_u *)"-invalid-"); - s = vim_strnsave(skipwhite(ml_get(mp->lnum)), (int)Columns); + assert(Columns >= 0 && (size_t)Columns <= SIZE_MAX); + s = vim_strnsave(skipwhite(ml_get(mp->lnum)), (size_t)Columns); /* Truncate the line to fit it in the window */ len = 0; @@ -1033,10 +1034,11 @@ void mark_adjust(linenr_T line1, linenr_T line2, long amount, long amount_after) if (posp->lnum == lnum && posp->col >= mincol) \ { \ posp->lnum += lnum_amount; \ + assert(col_amount > INT_MIN && col_amount <= INT_MAX); \ if (col_amount < 0 && posp->col <= (colnr_T)-col_amount) \ posp->col = 0; \ else \ - posp->col += col_amount; \ + posp->col += (colnr_T)col_amount; \ } \ } @@ -1329,7 +1331,7 @@ int removable(char_u *name) copy_option_part(&p, part, 51, ", "); if (part[0] == 'r') { n = STRLEN(part + 1); - if (MB_STRNICMP(part + 1, name, n) == 0) { + if (mb_strnicmp(part + 1, name, n) == 0) { retval = TRUE; break; } @@ -1499,12 +1501,13 @@ void copy_viminfo_marks(vir_T *virp, FILE *fp_out, int count, int eof, int flags if (load_marks) { if (line[1] != NUL) { int64_t lnum_64; - unsigned u; + unsigned int u; sscanf((char *)line + 2, "%" SCNd64 "%u", &lnum_64, &u); // safely downcast to linenr_T (long); remove when linenr_T refactored assert(lnum_64 <= LONG_MAX); pos.lnum = (linenr_T)lnum_64; - pos.col = u; + assert(u <= INT_MAX); + pos.col = (colnr_T)u; switch (line[1]) { case '"': curbuf->b_last_cursor = pos; break; case '^': curbuf->b_last_insert = pos; break; diff --git a/src/nvim/mbyte.c b/src/nvim/mbyte.c index 123ef377e6..5c89e9d8eb 100644 --- a/src/nvim/mbyte.c +++ b/src/nvim/mbyte.c @@ -2839,6 +2839,16 @@ int mb_strnicmp(char_u *s1, char_u *s2, size_t nn) return 0; } +/* We need to call mb_stricmp() even when we aren't dealing with a multi-byte + * encoding because mb_stricmp() takes care of all ascii and non-ascii + * encodings, including characters with umlauts in latin1, etc., while + * STRICMP() only handles the system locale version, which often does not + * handle non-ascii properly. */ +int mb_stricmp(char_u *s1, char_u *s2) +{ + return mb_strnicmp(s1, s2, MAXCOL); +} + /* * "g8": show bytes of the UTF-8 char under the cursor. Doesn't matter what * 'encoding' has been set to. diff --git a/src/nvim/path.c b/src/nvim/path.c index abeb755482..93aa5eed3d 100644 --- a/src/nvim/path.c +++ b/src/nvim/path.c @@ -297,7 +297,7 @@ int vim_fnamecmp(char_u *x, char_u *y) return vim_fnamencmp(x, y, MAXPATHL); #else if (p_fic) - return MB_STRICMP(x, y); + return mb_stricmp(x, y); return STRCMP(x, y); #endif } @@ -327,7 +327,7 @@ int vim_fnamencmp(char_u *x, char_u *y, size_t len) return cx - cy; #else if (p_fic) - return MB_STRNICMP(x, y, len); + return mb_strnicmp(x, y, len); return STRNCMP(x, y, len); #endif } diff --git a/src/nvim/pos.h b/src/nvim/pos.h index 7cfb52b283..7071df51e8 100644 --- a/src/nvim/pos.h +++ b/src/nvim/pos.h @@ -4,8 +4,8 @@ typedef long linenr_T; // line number type typedef int colnr_T; // column number type -#define MAXLNUM (0x7fffffffL) // maximum (invalid) line number -#define MAXCOL (0x7fffffffL) // maximum column number, 31 bits +#define MAXLNUM 0x7fffffff // maximum (invalid) line number +#define MAXCOL 0x7fffffff // maximum column number, 31 bits /* * position in file or buffer diff --git a/src/nvim/regexp.c b/src/nvim/regexp.c index 4af09915d5..8b7033b64b 100644 --- a/src/nvim/regexp.c +++ b/src/nvim/regexp.c @@ -6226,8 +6226,10 @@ static int cstrncmp(char_u *s1, char_u *s2, int *n) if (!ireg_ic) result = STRNCMP(s1, s2, *n); - else - result = MB_STRNICMP(s1, s2, *n); + else { + assert(*n >= 0); + result = mb_strnicmp(s1, s2, (size_t)*n); + } /* if it failed and it's utf8 and we want to combineignore: */ if (result != 0 && enc_utf8 && ireg_icombine) { diff --git a/src/nvim/search.c b/src/nvim/search.c index 055d2db445..095d7484a5 100644 --- a/src/nvim/search.c +++ b/src/nvim/search.c @@ -9,6 +9,7 @@ * search.c: code for normal mode searching commands */ +#include #include #include #include @@ -1258,11 +1259,12 @@ int search_for_exact_line(buf_T *buf, pos_T *pos, int dir, char_u *pat) * ignored because we are interested in the next line -- Acevedo */ if ((compl_cont_status & CONT_ADDING) && !(compl_cont_status & CONT_SOL)) { - if ((p_ic ? MB_STRICMP(p, pat) : STRCMP(p, pat)) == 0) + if ((p_ic ? mb_stricmp(p, pat) : STRCMP(p, pat)) == 0) return OK; } else if (*p != NUL) { /* ignore empty lines */ /* expanding lines or words */ - if ((p_ic ? MB_STRNICMP(p, pat, compl_length) + assert(compl_length >= 0); + if ((p_ic ? mb_strnicmp(p, pat, (size_t)compl_length) : STRNCMP(p, pat, compl_length)) == 0) return OK; } @@ -4234,8 +4236,10 @@ search_line: ) { /* compare the first "len" chars from "ptr" */ startp = skipwhite(p); - if (p_ic) - matched = !MB_STRNICMP(startp, ptr, len); + if (p_ic) { + assert(len >= 0); + matched = !mb_strnicmp(startp, ptr, (size_t)len); + } else matched = !STRNCMP(startp, ptr, len); if (matched && define_matched && whole diff --git a/src/nvim/spell.c b/src/nvim/spell.c index cbaa44d7eb..f66560f772 100644 --- a/src/nvim/spell.c +++ b/src/nvim/spell.c @@ -13082,8 +13082,9 @@ spell_dump_compl ( // proper case later. This isn't exactly right when // length changes for multi-byte characters with // ignore case... + assert(depth >= 0); if (depth <= patlen - && MB_STRNICMP(word, pat, depth) != 0) + && mb_strnicmp(word, pat, (size_t)depth) != 0) --depth; } } @@ -13154,7 +13155,7 @@ static void dump_word(slang_T *slang, char_u *word, char_u *pat, int *dir, int d ml_append(lnum, p, (colnr_T)0, FALSE); } else if (((dumpflags & DUMPFLAG_ICASE) - ? MB_STRNICMP(p, pat, STRLEN(pat)) == 0 + ? mb_strnicmp(p, pat, STRLEN(pat)) == 0 : STRNCMP(p, pat, STRLEN(pat)) == 0) && ins_compl_add_infercase(p, (int)STRLEN(p), p_ic, NULL, *dir, 0) == OK) diff --git a/src/nvim/syntax.c b/src/nvim/syntax.c index 744a6c68fd..c94e6e437b 100644 --- a/src/nvim/syntax.c +++ b/src/nvim/syntax.c @@ -1391,7 +1391,7 @@ static int syn_stack_equal(synstate_T *sp) || six->matches[j] == NULL) break; if ((SYN_ITEMS(syn_block)[CUR_STATE(i).si_idx]).sp_ic - ? MB_STRICMP(bsx->matches[j], + ? mb_stricmp(bsx->matches[j], six->matches[j]) != 0 : STRCMP(bsx->matches[j], six->matches[j]) != 0) break; diff --git a/src/nvim/tag.c b/src/nvim/tag.c index bab594a27d..5c3d7cc30b 100644 --- a/src/nvim/tag.c +++ b/src/nvim/tag.c @@ -1641,7 +1641,8 @@ parse_line: /* No match yet and are at the end of the binary search. */ break; } else if (state == TS_SKIP_BACK) { - if (MB_STRNICMP(tagp.tagname, orgpat.head, cmplen) != 0) + assert(cmplen >= 0); + if (mb_strnicmp(tagp.tagname, orgpat.head, (size_t)cmplen) != 0) state = TS_STEP_FORWARD; else /* Have to skip back more. Restore the curr_offset @@ -1649,7 +1650,8 @@ parse_line: search_info.curr_offset = search_info.curr_offset_used; continue; } else if (state == TS_STEP_FORWARD) { - if (MB_STRNICMP(tagp.tagname, orgpat.head, cmplen) != 0) { + assert(cmplen >= 0); + if (mb_strnicmp(tagp.tagname, orgpat.head, (size_t)cmplen) != 0) { if ((off_t)ftell(fp) > search_info.match_offset) break; /* past last match */ else @@ -1657,7 +1659,8 @@ parse_line: } } else /* skip this match if it can't match */ - if (MB_STRNICMP(tagp.tagname, orgpat.head, cmplen) != 0) + assert(cmplen >= 0); + if (mb_strnicmp(tagp.tagname, orgpat.head, (size_t)cmplen) != 0) continue; /* @@ -1691,7 +1694,8 @@ parse_line: match = FALSE; else { if (orgpat.regmatch.rm_ic) { - match = (MB_STRNICMP(tagp.tagname, orgpat.pat, cmplen) == 0); + assert(cmplen >= 0); + match = mb_strnicmp(tagp.tagname, orgpat.pat, (size_t)cmplen) == 0; if (match) match_no_ic = (STRNCMP(tagp.tagname, orgpat.pat, cmplen) == 0); diff --git a/src/nvim/vim.h b/src/nvim/vim.h index be3f246ff4..5a89a3c861 100644 --- a/src/nvim/vim.h +++ b/src/nvim/vim.h @@ -290,17 +290,6 @@ enum { # endif #endif -/* We need to call mb_stricmp() even when we aren't dealing with a multi-byte - * encoding because mb_stricmp() takes care of all ascii and non-ascii - * encodings, including characters with umlauts in latin1, etc., while - * STRICMP() only handles the system locale version, which often does not - * handle non-ascii properly. */ - -# define MB_STRICMP(d, s) mb_strnicmp((char_u *)(d), (char_u *)(s), \ - (int)MAXCOL) -# define MB_STRNICMP(d, s, n) mb_strnicmp((char_u *)(d), (char_u *)(s), \ - (int)(n)) - #define STRCAT(d, s) strcat((char *)(d), (char *)(s)) #define STRNCAT(d, s, n) strncat((char *)(d), (char *)(s), (size_t)(n)) From 94db26edbdce5a2c147329fc8e8da580216d2a1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eliseo=20Marti=CC=81nez?= Date: Thu, 12 Feb 2015 16:11:04 +0100 Subject: [PATCH 4/6] Enable -Wconversion: indent.c. Note: Clint was failing because of recommending not to use long. But converting to long is the proper refactoring here, in as far as other longs exist. We could, then, disable clint rule, or remove this file from checking. We choose the former, as it's being discussed what to do with longs, but a decision has not been taken. So, it seems most reasonable to allow longs for now, to enable proper refactorings, and then, when a decision is taken, refactor all longs to some other thing. --- clint.py | 2 +- src/nvim/CMakeLists.txt | 1 - src/nvim/indent.c | 12 ++++++++---- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/clint.py b/clint.py index 5e0e5a1e2b..290abd2820 100755 --- a/clint.py +++ b/clint.py @@ -2776,7 +2776,7 @@ def CheckLanguage(filename, clean_lines, linenum, file_extension, # TODO(unknown): figure out if they're using default arguments in fn proto. # Check if people are using the verboten C basic types. - match = Search(r'\b(short|long(?! +double)|long long)\b', line) + match = Search(r'\b(short|long long)\b', line) if match: error(filename, linenum, 'runtime/int', 4, 'Use int16_t/int64_t/etc, rather than the C type %s' diff --git a/src/nvim/CMakeLists.txt b/src/nvim/CMakeLists.txt index 795997c052..127dd7cfb7 100644 --- a/src/nvim/CMakeLists.txt +++ b/src/nvim/CMakeLists.txt @@ -63,7 +63,6 @@ set(CONV_SOURCES fold.c getchar.c if_cscope.c - indent.c keymap.c mbyte.c memline.c diff --git a/src/nvim/indent.c b/src/nvim/indent.c index 075acc6c13..5711207933 100644 --- a/src/nvim/indent.c +++ b/src/nvim/indent.c @@ -1,3 +1,4 @@ +#include #include #include @@ -198,7 +199,8 @@ int set_indent(int size, int flags) // characters and allocate accordingly. We will fill the rest with spaces // after the if (!curbuf->b_p_et) below. if (orig_char_len != -1) { - newline = xmalloc(orig_char_len + size - ind_done + line_len); + assert(orig_char_len + size - ind_done + line_len >= 0); + newline = xmalloc((size_t)(orig_char_len + size - ind_done + line_len)); todo = size - ind_done; // Set total length of indent in characters, which may have been @@ -219,7 +221,8 @@ int set_indent(int size, int flags) } } else { todo = size; - newline = xmalloc(ind_len + line_len); + assert(ind_len + line_len >= 0); + newline = xmalloc((size_t)(ind_len + line_len)); s = newline; } @@ -384,7 +387,8 @@ int copy_indent(int size, char_u *src) // Allocate memory for the result: the copied indent, new indent // and the rest of the line. line_len = (int)STRLEN(get_cursor_line_ptr()) + 1; - line = xmalloc(ind_len + line_len); + assert(ind_len + line_len >= 0); + line = xmalloc((size_t)(ind_len + line_len)); p = line; } } @@ -449,7 +453,7 @@ int get_number_indent(linenr_T lnum) */ int get_breakindent_win(win_T *wp, char_u *line) { static int prev_indent = 0; /* cached indent value */ - static int prev_ts = 0L; /* cached tabstop value */ + static long prev_ts = 0; /* cached tabstop value */ static char_u *prev_line = NULL; /* cached pointer to line */ static int prev_tick = 0; // changedtick of cached value int bri = 0; From cbabf9491b5dee3d06e4c0d594a5f085bdddb126 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eliseo=20Marti=CC=81nez?= Date: Thu, 12 Feb 2015 16:47:21 +0100 Subject: [PATCH 5/6] Enable -Wconversion: keymap.c. --- src/nvim/CMakeLists.txt | 1 - src/nvim/keymap.c | 22 +++++++++++++--------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/nvim/CMakeLists.txt b/src/nvim/CMakeLists.txt index 127dd7cfb7..08d86cc1ce 100644 --- a/src/nvim/CMakeLists.txt +++ b/src/nvim/CMakeLists.txt @@ -63,7 +63,6 @@ set(CONV_SOURCES fold.c getchar.c if_cscope.c - keymap.c mbyte.c memline.c menu.c diff --git a/src/nvim/keymap.c b/src/nvim/keymap.c index 8d98a0a95d..67f342fd37 100644 --- a/src/nvim/keymap.c +++ b/src/nvim/keymap.c @@ -3,6 +3,7 @@ * special key codes. */ +#include #include #include "nvim/vim.h" @@ -457,7 +458,7 @@ char_u *get_special_key_name(int c, int modifiers) if (IS_SPECIAL(c)) { string[idx++] = 't'; string[idx++] = '_'; - string[idx++] = KEY2TERMCAP0(c); + string[idx++] = (char_u)KEY2TERMCAP0(c); string[idx++] = KEY2TERMCAP1(c); } /* Not a special key, only modifiers, output directly */ @@ -465,7 +466,7 @@ char_u *get_special_key_name(int c, int modifiers) if (has_mbyte && (*mb_char2len)(c) > 1) idx += (*mb_char2bytes)(c, string + idx); else if (vim_isprintc(c)) - string[idx++] = c; + string[idx++] = (char_u)c; else { s = transchar(c); while (*s) @@ -496,7 +497,7 @@ trans_special ( { int modifiers = 0; int key; - int dlen = 0; + unsigned int dlen = 0; key = find_special_key(srcp, &modifiers, keycode, FALSE); if (key == 0) @@ -506,19 +507,22 @@ trans_special ( if (modifiers != 0) { dst[dlen++] = K_SPECIAL; dst[dlen++] = KS_MODIFIER; - dst[dlen++] = modifiers; + dst[dlen++] = (char_u)modifiers; } if (IS_SPECIAL(key)) { dst[dlen++] = K_SPECIAL; - dst[dlen++] = KEY2TERMCAP0(key); + dst[dlen++] = (char_u)KEY2TERMCAP0(key); dst[dlen++] = KEY2TERMCAP1(key); } else if (has_mbyte && !keycode) - dlen += (*mb_char2bytes)(key, dst + dlen); - else if (keycode) - dlen = (int)(add_char2buf(key, dst + dlen) - dst); + dlen += (unsigned int)(*mb_char2bytes)(key, dst + dlen); + else if (keycode) { + char_u *after = add_char2buf(key, dst + dlen); + assert(after >= dst && (uintmax_t)(after - dst) <= UINT_MAX); + dlen = (unsigned int)(after - dst); + } else - dst[dlen++] = key; + dst[dlen++] = (char_u)key; return dlen; } From 36340803afe1504f15468a715172c25cfef6974c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eliseo=20Marti=CC=81nez?= Date: Thu, 12 Feb 2015 17:28:35 +0100 Subject: [PATCH 6/6] Enable -Wconversion: os_unix.c. --- src/nvim/CMakeLists.txt | 1 - src/nvim/os_unix.c | 7 +++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/nvim/CMakeLists.txt b/src/nvim/CMakeLists.txt index 08d86cc1ce..1c2dad6094 100644 --- a/src/nvim/CMakeLists.txt +++ b/src/nvim/CMakeLists.txt @@ -71,7 +71,6 @@ set(CONV_SOURCES move.c normal.c ops.c - os_unix.c path.c popupmnu.c quickfix.c diff --git a/src/nvim/os_unix.c b/src/nvim/os_unix.c index 0fc45c9543..bfdf5969ff 100644 --- a/src/nvim/os_unix.c +++ b/src/nvim/os_unix.c @@ -730,7 +730,10 @@ int mch_expand_wildcards(int num_pat, char_u **pat, int *num_file, { redraw_later_clear(); /* probably messed up screen */ msg_putchar('\n'); /* clear bottom line quickly */ - cmdline_row = Rows - 1; /* continue on last line */ +#if SIZEOF_LONG > SIZEOF_INT + assert(Rows <= (long)INT_MAX + 1); +#endif + cmdline_row = (int)(Rows - 1); /* continue on last line */ MSG(_(e_wildexpand)); msg_start(); /* don't overwrite this message */ } @@ -858,7 +861,7 @@ int mch_expand_wildcards(int num_pat, char_u **pat, int *num_file, goto notfound; } *num_file = i; - *file = (char_u **)xmalloc(sizeof(char_u *) * i); + *file = xmalloc(sizeof(char_u *) * (size_t)i); /* * Isolate the individual file names.