diff options
Diffstat (limited to 'src')
36 files changed, 333 insertions, 197 deletions
diff --git a/src/nvim/buffer.c b/src/nvim/buffer.c index b76bad67f6..6b5b97fe67 100644 --- a/src/nvim/buffer.c +++ b/src/nvim/buffer.c @@ -332,7 +332,7 @@ close_buffer ( /* When the buffer is no longer in a window, trigger BufWinLeave */ if (buf->b_nwindows == 1) { - buf->b_closing = TRUE; + buf->b_closing = true; apply_autocmds(EVENT_BUFWINLEAVE, buf->b_fname, buf->b_fname, FALSE, buf); if (!buf_valid(buf)) { @@ -340,7 +340,7 @@ close_buffer ( EMSG(_(e_auabort)); return; } - buf->b_closing = FALSE; + buf->b_closing = false; if (abort_if_last && one_window()) { /* Autocommands made this the only window. */ EMSG(_(e_auabort)); @@ -350,7 +350,7 @@ close_buffer ( /* When the buffer becomes hidden, but is not unloaded, trigger * BufHidden */ if (!unload_buf) { - buf->b_closing = TRUE; + buf->b_closing = true; apply_autocmds(EVENT_BUFHIDDEN, buf->b_fname, buf->b_fname, FALSE, buf); if (!buf_valid(buf)) { @@ -358,7 +358,7 @@ close_buffer ( EMSG(_(e_auabort)); return; } - buf->b_closing = FALSE; + buf->b_closing = false; if (abort_if_last && one_window()) { /* Autocommands made this the only window. */ EMSG(_(e_auabort)); @@ -447,7 +447,7 @@ close_buffer ( buf->b_flags = BF_CHECK_RO | BF_NEVERLOADED; /* Init the options when loaded again. */ - buf->b_p_initialized = FALSE; + buf->b_p_initialized = false; } buf_clear_file(buf); if (del_buf) @@ -481,7 +481,7 @@ void buf_freeall(buf_T *buf, int flags) { bool is_curbuf = (buf == curbuf); - buf->b_closing = TRUE; + buf->b_closing = true; apply_autocmds(EVENT_BUFUNLOAD, buf->b_fname, buf->b_fname, FALSE, buf); if (!buf_valid(buf)) /* autocommands may delete the buffer */ return; @@ -496,7 +496,7 @@ void buf_freeall(buf_T *buf, int flags) if (!buf_valid(buf)) /* autocommands may delete the buffer */ return; } - buf->b_closing = FALSE; + buf->b_closing = false; if (aborting()) /* autocmds may abort script processing */ return; @@ -1398,7 +1398,7 @@ buflist_new ( free_buffer_stuff(buf, FALSE); /* delete local variables et al. */ /* Init the options. */ - buf->b_p_initialized = FALSE; + buf->b_p_initialized = false; buf_copy_options(buf, BCO_ENTER); /* need to reload lmaps and set b:keymap_name */ @@ -1446,7 +1446,7 @@ buflist_new ( buf->file_id_valid = true; buf->file_id = file_id; } - buf->b_u_synced = TRUE; + buf->b_u_synced = true; buf->b_flags = BF_CHECK_RO | BF_NEVERLOADED; if (flags & BLN_DUMMY) buf->b_flags |= BF_DUMMY; @@ -2004,7 +2004,7 @@ static void buflist_setfpos(buf_T *buf, win_T *win, linenr_T lnum, colnr_T col, copy_winopt(&win->w_onebuf_opt, &wip->wi_opt); wip->wi_fold_manual = win->w_fold_manual; cloneFoldGrowArray(&win->w_folds, &wip->wi_folds); - wip->wi_optset = TRUE; + wip->wi_optset = true; } /* insert the entry in front of the list */ @@ -2084,7 +2084,7 @@ void get_winopts(buf_T *buf) if (wip != NULL && wip->wi_optset) { copy_winopt(&wip->wi_opt, &curwin->w_onebuf_opt); curwin->w_fold_manual = wip->wi_fold_manual; - curwin->w_foldinvalid = TRUE; + curwin->w_foldinvalid = true; cloneFoldGrowArray(&wip->wi_folds, &curwin->w_folds); } else copy_winopt(&curwin->w_allbuf_opt, &curwin->w_onebuf_opt); diff --git a/src/nvim/buffer_defs.h b/src/nvim/buffer_defs.h index 094d6dfd05..196b975d2a 100644 --- a/src/nvim/buffer_defs.h +++ b/src/nvim/buffer_defs.h @@ -243,9 +243,9 @@ struct wininfo_S { wininfo_T *wi_prev; /* previous entry or NULL for first entry */ win_T *wi_win; /* pointer to window that did set wi_fpos */ pos_T wi_fpos; /* last cursor position in the file */ - int wi_optset; /* TRUE when wi_opt has useful values */ + bool wi_optset; /* true when wi_opt has useful values */ winopt_T wi_opt; /* local window options */ - int wi_fold_manual; /* copy of w_fold_manual */ + bool wi_fold_manual; /* copy of w_fold_manual */ garray_T wi_folds; /* clone of w_folds */ }; @@ -464,7 +464,7 @@ struct file_buffer { int b_nwindows; /* nr of windows open on this buffer */ int b_flags; /* various BF_ flags */ - int b_closing; /* buffer is being closed, don't let + bool b_closing; /* buffer is being closed, don't let autocommands close it too. */ /* @@ -482,18 +482,18 @@ struct file_buffer { int b_fnum; /* buffer number for this file. */ - int b_changed; /* 'modified': Set to TRUE if something in the + bool b_changed; /* 'modified': Set to true if something in the file has been changed and not written out. */ int b_changedtick; /* incremented for each change, also for undo */ - int b_saving; /* Set to TRUE if we are in the middle of + bool b_saving; /* Set to true if we are in the middle of saving the buffer. */ /* * Changes to a buffer require updating of the display. To minimize the * work, remember changes made and update everything at once. */ - int b_mod_set; /* TRUE when there are changes since the last + bool b_mod_set; /* true when there are changes since the last time the display was updated */ linenr_T b_mod_top; /* topmost lnum that was changed */ linenr_T b_mod_bot; /* lnum below last changed line, AFTER the @@ -524,7 +524,7 @@ struct file_buffer { */ pos_T b_changelist[JUMPLISTSIZE]; int b_changelistlen; /* number of active entries */ - int b_new_change; /* set by u_savecommon() */ + bool b_new_change; /* set by u_savecommon() */ /* * Character table, only used in charset.c for 'iskeyword' @@ -546,7 +546,7 @@ struct file_buffer { pos_T b_op_start_orig; // used for Insstart_orig pos_T b_op_end; - int b_marks_read; /* Have we read viminfo marks yet? */ + bool b_marks_read; /* Have we read viminfo marks yet? */ /* * The following only used in undo.c. @@ -556,7 +556,7 @@ struct file_buffer { if b_u_curhead is not NULL */ u_header_T *b_u_curhead; /* pointer to current header */ int b_u_numhead; /* current number of headers */ - int b_u_synced; /* entry lists are synced */ + bool b_u_synced; /* entry lists are synced */ long b_u_seq_last; /* last used undo sequence number */ long b_u_save_nr_last; /* counter for last file write */ long b_u_seq_cur; /* hu_seq of header below which we are now */ @@ -570,7 +570,7 @@ struct file_buffer { linenr_T b_u_line_lnum; /* line number of line in u_line */ colnr_T b_u_line_colnr; /* optional column number */ - int b_scanned; /* ^N/^P have scanned this buffer */ + bool b_scanned; /* ^N/^P have scanned this buffer */ /* flags for use of ":lmap" and IM control */ long b_p_iminsert; /* input mode for insert */ @@ -595,7 +595,7 @@ struct file_buffer { * They are here because their value depends on the type of file * or contents of the file being edited. */ - int b_p_initialized; /* set when options initialized */ + bool b_p_initialized; /* set when options initialized */ int b_p_scriptID[BV_COUNT]; /* SIDs for buffer-local options */ @@ -731,8 +731,8 @@ struct file_buffer { * then set to indicate that a swap file may be opened later. It is reset * if a swap file could not be opened. */ - int b_may_swap; - int b_did_warn; /* Set to 1 if user has been warned on first + bool b_may_swap; + bool b_did_warn; /* Set to true if user has been warned on first change of a read-only file */ /* Two special kinds of buffers: @@ -740,7 +740,7 @@ struct file_buffer { * spell buffer - used for spell info, never displayed and doesn't have a * file name. */ - int b_help; /* TRUE for help file buffer (when set b_p_bt + bool b_help; /* TRUE for help file buffer (when set b_p_bt is "help") */ bool b_spell; /* True for a spell file buffer, most fields are not used! Use the B_SPELL macro to @@ -925,7 +925,7 @@ struct window_S { win_T *w_prev; /* link to previous window */ win_T *w_next; /* link to next window */ - int w_closing; /* window is being closed, don't let + bool w_closing; /* window is being closed, don't let autocommands close it too. */ frame_T *w_frame; /* frame containing this window */ @@ -961,9 +961,9 @@ struct window_S { e.g. by winrestview() */ int w_topfill; /* number of filler lines above w_topline */ int w_old_topfill; /* w_topfill at last redraw */ - int w_botfill; /* TRUE when filler lines are actually + bool w_botfill; /* true when filler lines are actually below w_topline (at end of file) */ - int w_old_botfill; /* w_botfill at last redraw */ + bool w_old_botfill; /* w_botfill at last redraw */ colnr_T w_leftcol; /* window column number of the left most character in the window; used when 'wrap' is off */ @@ -1039,9 +1039,9 @@ struct window_S { wline_T *w_lines; garray_T w_folds; /* array of nested folds */ - char w_fold_manual; /* when TRUE: some folds are opened/closed + bool w_fold_manual; /* when true: some folds are opened/closed manually */ - char w_foldinvalid; /* when TRUE: folding needs to be + bool w_foldinvalid; /* when true: folding needs to be recomputed */ int w_nrwidth; /* width of 'number' and 'relativenumber' column being used */ diff --git a/src/nvim/charset.c b/src/nvim/charset.c index 57c4aec395..f3bb3d8c73 100644 --- a/src/nvim/charset.c +++ b/src/nvim/charset.c @@ -978,7 +978,6 @@ int win_lbr_chartabsize(win_T *wp, char_u *line, char_u *s, colnr_T col, int *he int mb_added = 0; int numberextra; char_u *ps; - int tab_corr = (*s == TAB); int n; // No 'linebreak', 'showbreak' and 'breakindent': return quickly. @@ -992,7 +991,7 @@ int win_lbr_chartabsize(win_T *wp, char_u *line, char_u *s, colnr_T col, int *he // First get normal size, without 'linebreak' int size = win_chartabsize(wp, s, col); int c = *s; - if (tab_corr) { + if (*s == TAB) { col_adj = size - 1; } @@ -1034,7 +1033,6 @@ int win_lbr_chartabsize(win_T *wp, char_u *line, char_u *s, colnr_T col, int *he if (col2 >= colmax) { /* doesn't fit */ size = colmax - col + col_adj; - tab_corr = FALSE; break; } } @@ -1072,12 +1070,7 @@ int win_lbr_chartabsize(win_T *wp, char_u *line, char_u *s, colnr_T col, int *he if (wp->w_p_bri) added += get_breakindent_win(wp, line); - if (tab_corr) { - size += (added / wp->w_buffer->b_p_ts) * wp->w_buffer->b_p_ts; - } else { - size += added; - } - + size += added; if (col != 0) { added = 0; } diff --git a/src/nvim/diff.c b/src/nvim/diff.c index 39db77bd82..18e30f8587 100644 --- a/src/nvim/diff.c +++ b/src/nvim/diff.c @@ -1745,11 +1745,11 @@ void diff_set_topline(win_T *fromwin, win_T *towin) } // safety check (if diff info gets outdated strange things may happen) - towin->w_botfill = FALSE; + towin->w_botfill = false; if (towin->w_topline > towin->w_buffer->b_ml.ml_line_count) { towin->w_topline = towin->w_buffer->b_ml.ml_line_count; - towin->w_botfill = TRUE; + towin->w_botfill = true; } if (towin->w_topline < 1) { diff --git a/src/nvim/edit.c b/src/nvim/edit.c index 384ca9abd8..d7910347fc 100644 --- a/src/nvim/edit.c +++ b/src/nvim/edit.c @@ -235,7 +235,7 @@ static int did_add_space = FALSE; /* auto_format() added an extra space * * Return TRUE if a CTRL-O command caused the return (insert mode pending). */ -int +int edit ( int cmdchar, int startln, /* if set, insert at start of line */ @@ -1224,7 +1224,7 @@ force_cindent: * Only redraw when there are no characters available. This speeds up * inserting sequences of characters (e.g., for CTRL-R). */ -static void +static void ins_redraw ( int ready /* not busy with something */ ) @@ -1440,7 +1440,7 @@ static void undisplay_dollar(void) * type == INDENT_SET set indent to "amount" * if round is TRUE, round the indent to 'shiftwidth' (only with _INC and _Dec). */ -void +void change_indent ( int type, int amount, @@ -1986,7 +1986,7 @@ int ins_compl_add_infercase(char_u *str, int len, int icase, char_u *fname, int * NOTDONE, otherwise add it to the list and return OK. If there is an error * then FAIL is returned. */ -static int +static int ins_compl_add ( char_u *str, int len, @@ -2450,7 +2450,7 @@ void ins_compl_show_pum(void) * Add any identifiers that match the given pattern in the list of dictionary * files "dict_start" to the list of completions. */ -static void +static void ins_compl_dictionaries ( char_u *dict_start, char_u *pat, @@ -3255,7 +3255,7 @@ static buf_T *ins_compl_next_buf(buf_T *buf, int flag) * Execute user defined complete function 'completefunc' or 'omnifunc', and * get matches in "matches". */ -static void +static void expand_by_function ( int type, /* CTRL_X_OMNI or CTRL_X_FUNCTION */ char_u *base @@ -3438,7 +3438,7 @@ static int ins_compl_get_exp(pos_T *ini) if (!compl_started) { FOR_ALL_BUFFERS(buf) { - buf->b_scanned = 0; + buf->b_scanned = false; } found_all = FALSE; ins_buf = curbuf; @@ -3764,7 +3764,7 @@ static int ins_compl_get_exp(pos_T *ini) /* Mark a buffer scanned when it has been scanned completely */ if (type == 0 || type == CTRL_X_PATH_PATTERNS) { assert(ins_buf); - ins_buf->b_scanned = TRUE; + ins_buf->b_scanned = true; } compl_started = FALSE; @@ -3833,7 +3833,7 @@ static void ins_compl_insert(void) * "allow_get_expansion" TRUE, which calls ins_compl_get_exp(), which in turn * calls this function with "allow_get_expansion" FALSE. */ -static int +static int ins_compl_next ( int allow_get_expansion, int count, /* repeat completion this many times; should @@ -4792,7 +4792,7 @@ int get_literal(void) /* * Insert character, taking care of special keys and mod_mask */ -static void +static void insert_special ( int c, int allow_modmask, @@ -4852,7 +4852,7 @@ insert_special ( * INSCHAR_DO_COM - format comments * INSCHAR_COM_LIST - format comments with num list or 2nd line indent */ -void +void insertchar ( int c, /* character to insert or NUL */ int flags, /* INSCHAR_FORMAT, etc. */ @@ -5055,7 +5055,7 @@ insertchar ( * If the INSCHAR_COM_LIST flag is present, then the value of second_indent * will be the comment leader length sent to open_line(). */ -static void +static void internal_format ( int textwidth, int second_indent, @@ -5376,7 +5376,7 @@ internal_format ( * The caller must have saved the cursor line for undo, following ones will be * saved here. */ -void +void auto_format ( int trailblank, /* when TRUE also format with trailing blank */ int prev_line /* may start in previous line */ @@ -5478,7 +5478,7 @@ auto_format ( * delete it now. The space must be under the cursor, just after the insert * position. */ -static void +static void check_auto_format ( int end_insert /* TRUE when ending Insert mode */ ) @@ -5513,7 +5513,7 @@ check_auto_format ( * if invalid value, use 0. * Set default to window width (maximum 79) for "gq" operator. */ -int +int comp_textwidth ( int ff /* force formatting (for "gq" command) */ ) @@ -5566,7 +5566,7 @@ static void redo_literal(int c) * start_arrow() is called when an arrow key is used in insert mode. * For undo/redo it resembles hitting the <ESC> key. */ -static void +static void start_arrow ( pos_T *end_insert_pos /* can be NULL */ ) @@ -5650,7 +5650,7 @@ int stop_arrow(void) * "end_insert_pos" is where insert ended. It is NULL when we already jumped * to another window/buffer. */ -static void +static void stop_insert ( pos_T *end_insert_pos, int esc, /* called by ins_esc() */ @@ -5910,8 +5910,8 @@ int oneleft(void) width = 1; for (;; ) { coladvance(v - width); - /* getviscol() is slow, skip it when 'showbreak' is empty, - 'breakindent' is not set and there are no multi-byte + /* getviscol() is slow, skip it when 'showbreak' is empty, + 'breakindent' is not set and there are no multi-byte characters */ if ((*p_sbr == NUL && !curwin->w_p_bri @@ -5949,7 +5949,7 @@ int oneleft(void) return OK; } -int +int cursor_up ( long n, int upd_topline /* When TRUE: update topline */ @@ -6002,7 +6002,7 @@ cursor_up ( /* * Cursor down a number of logical lines. */ -int +int cursor_down ( long n, int upd_topline /* When TRUE: update topline */ @@ -6055,7 +6055,7 @@ cursor_down ( * Last_insert actually is a copy of the redo buffer, so we * first have to remove the command. */ -int +int stuff_inserted ( int c, /* Command character to be inserted */ long count, /* Repeat this many times */ @@ -6226,7 +6226,7 @@ static int replace_pop(void) * Join the top two items on the replace stack. This removes to "off"'th NUL * encountered. */ -static void +static void replace_join ( int off /* offset for which NUL to remove */ ) @@ -6889,7 +6889,7 @@ static void ins_ctrl_hat(void) * Returns TRUE when leaving insert mode, FALSE when going to repeat the * insert. */ -static int +static int ins_esc ( long *count, int cmdchar, @@ -7730,7 +7730,7 @@ static void ins_s_right(void) vim_beep(); } -static void +static void ins_up ( int startcol /* when TRUE move to Insstart.col */ ) @@ -7777,7 +7777,7 @@ static void ins_pageup(void) vim_beep(); } -static void +static void ins_down ( int startcol /* when TRUE move to Insstart.col */ ) diff --git a/src/nvim/eval.c b/src/nvim/eval.c index 8a7fb83402..a0e6f84259 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -2241,6 +2241,22 @@ static void set_var_lval(lval_T *lp, char_u *endp, typval_T *rettv, int copy, ch : lp->ll_tv->vval.v_dict->dv_lock, lp->ll_name)) ; else if (lp->ll_range) { + listitem_T *ll_li = lp->ll_li; + int ll_n1 = lp->ll_n1; + + // Check whether any of the list items is locked + for (listitem_T *ri = rettv->vval.v_list->lv_first; ri != NULL; ) { + if (tv_check_lock(ll_li->li_tv.v_lock, lp->ll_name)) { + return; + } + ri = ri->li_next; + if (ri == NULL || (!lp->ll_empty2 && lp->ll_n2 == ll_n1)) { + break; + } + ll_li = ll_li->li_next; + ll_n1++; + } + /* * Assign the List values to the list items. */ @@ -2804,6 +2820,17 @@ static int do_unlet_var(lval_T *lp, char_u *name_end, int forceit) return FAIL; else if (lp->ll_range) { listitem_T *li; + listitem_T *ll_li = lp->ll_li; + int ll_n1 = lp->ll_n1; + + while (ll_li != NULL && (lp->ll_empty2 || lp->ll_n2 >= ll_n1)) { + li = ll_li->li_next; + if (tv_check_lock(ll_li->li_tv.v_lock, lp->ll_name)) { + return false; + } + ll_li = li; + ll_n1++; + } /* Delete a range of List items. */ while (lp->ll_li != NULL && (lp->ll_empty2 || lp->ll_n2 >= lp->ll_n1)) { diff --git a/src/nvim/ex_cmds.c b/src/nvim/ex_cmds.c index ef9affcdf6..f33a96cc50 100644 --- a/src/nvim/ex_cmds.c +++ b/src/nvim/ex_cmds.c @@ -2830,7 +2830,7 @@ do_ecmd ( if ((flags & ECMD_SET_HELP) || keep_help_flag) { char_u *p; - curbuf->b_help = TRUE; + curbuf->b_help = true; set_string_option_direct((char_u *)"buftype", -1, (char_u *)"help", OPT_FREE|OPT_LOCAL, 0); diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c index 134def0c2c..3e9b889253 100644 --- a/src/nvim/ex_docmd.c +++ b/src/nvim/ex_docmd.c @@ -31,6 +31,7 @@ #include "nvim/ex_getln.h" #include "nvim/fileio.h" #include "nvim/fold.h" +#include "nvim/func_attr.h" #include "nvim/getchar.h" #include "nvim/hardcopy.h" #include "nvim/if_cscope.h" @@ -4025,7 +4026,7 @@ static void ex_blast(exarg_T *eap) goto_buffer(eap, DOBUF_LAST, BACKWARD, 0); } -int ends_excmd(int c) +int ends_excmd(int c) FUNC_ATTR_CONST { return c == NUL || c == '|' || c == '"' || c == '\n'; } diff --git a/src/nvim/fileio.c b/src/nvim/fileio.c index b20150b2c9..97a357bff7 100644 --- a/src/nvim/fileio.c +++ b/src/nvim/fileio.c @@ -2197,7 +2197,7 @@ static void check_marks_read(void) /* Always set b_marks_read; needed when 'viminfo' is changed to include * the ' parameter after opening a buffer. */ - curbuf->b_marks_read = TRUE; + curbuf->b_marks_read = true; } #ifdef UNIX @@ -2690,7 +2690,7 @@ buf_write ( got_int = FALSE; /* Mark the buffer as 'being saved' to prevent changed buffer warnings */ - buf->b_saving = TRUE; + buf->b_saving = true; /* * If we are not appending or filtering, the file exists, and the @@ -3665,7 +3665,7 @@ fail: nofail: /* Done saving, we accept changed buffer warnings again */ - buf->b_saving = FALSE; + buf->b_saving = false; free(backup); if (buffer != smallbuf) @@ -6489,7 +6489,7 @@ apply_autocmds_group ( { char_u *sfname = NULL; /* short file name */ char_u *tail; - int save_changed; + bool save_changed; buf_T *old_curbuf; int retval = FALSE; char_u *save_sourcing_name; diff --git a/src/nvim/fold.c b/src/nvim/fold.c index 6014dbfd15..e76aacbadc 100644 --- a/src/nvim/fold.c +++ b/src/nvim/fold.c @@ -485,7 +485,7 @@ static void newFoldLevelWin(win_T *wp) fp = (fold_T *)wp->w_folds.ga_data; for (int i = 0; i < wp->w_folds.ga_len; ++i) fp[i].fd_flags = FD_LEVEL; - wp->w_fold_manual = FALSE; + wp->w_fold_manual = false; } changed_window_setting_win(wp); } @@ -648,7 +648,7 @@ void foldCreate(linenr_T start, linenr_T end) if (use_level && !closed && level < curwin->w_p_fdl) closeFold(start, 1L); if (!use_level) - curwin->w_fold_manual = TRUE; + curwin->w_fold_manual = true; fp->fd_flags = FD_CLOSED; fp->fd_small = MAYBE; @@ -755,7 +755,7 @@ deleteFold ( void clearFolding(win_T *win) { deleteFoldRecurse(&win->w_folds); - win->w_foldinvalid = FALSE; + win->w_foldinvalid = false; } /* foldUpdate() {{{2 */ @@ -800,7 +800,7 @@ void foldUpdate(win_T *wp, linenr_T top, linenr_T bot) */ void foldUpdateAll(win_T *win) { - win->w_foldinvalid = TRUE; + win->w_foldinvalid = true; redraw_win_later(win, NOT_VALID); } @@ -1098,7 +1098,7 @@ static void checkupdate(win_T *wp) { if (wp->w_foldinvalid) { foldUpdate(wp, (linenr_T)1, (linenr_T)MAXLNUM); /* will update all */ - wp->w_foldinvalid = FALSE; + wp->w_foldinvalid = false; } } @@ -1251,7 +1251,7 @@ setManualFoldWin ( found->fd_flags = FD_CLOSED; done |= DONE_ACTION; } - wp->w_fold_manual = TRUE; + wp->w_fold_manual = true; if (done & DONE_ACTION) changed_window_setting_win(wp); done |= DONE_FOLD; @@ -1877,7 +1877,7 @@ static void foldUpdateIEMS(win_T *wp, linenr_T top, linenr_T bot) /* Need to update all folds. */ top = 1; bot = wp->w_buffer->b_ml.ml_line_count; - wp->w_foldinvalid = FALSE; + wp->w_foldinvalid = false; /* Mark all folds a maybe-small. */ setSmallMaybe(&wp->w_folds); @@ -2285,12 +2285,12 @@ static linenr_T foldUpdateIEMSRecurse(garray_T *gap, int level, * The new fold is closed if the fold above it is closed. * The first fold depends on the containing fold. */ if (topflags == FD_OPEN) { - flp->wp->w_fold_manual = TRUE; + flp->wp->w_fold_manual = true; fp->fd_flags = FD_OPEN; } else if (i <= 0) { fp->fd_flags = topflags; if (topflags != FD_LEVEL) - flp->wp->w_fold_manual = TRUE; + flp->wp->w_fold_manual = true; } else fp->fd_flags = (fp - 1)->fd_flags; fp->fd_small = MAYBE; diff --git a/src/nvim/memline.c b/src/nvim/memline.c index 91fbe62c18..e9edeb842f 100644 --- a/src/nvim/memline.c +++ b/src/nvim/memline.c @@ -277,9 +277,9 @@ int ml_open(buf_T *buf) * When 'updatecount' is non-zero swap file may be opened later. */ if (p_uc && buf->b_p_swf) - buf->b_may_swap = TRUE; + buf->b_may_swap = true; else - buf->b_may_swap = FALSE; + buf->b_may_swap = false; /* * Open the memfile. No swap file is created yet. @@ -495,7 +495,7 @@ void ml_open_file(buf_T *buf) fname = vim_tempname(); if (fname != NULL) (void)mf_open_file(mfp, fname); /* consumes fname! */ - buf->b_may_swap = FALSE; + buf->b_may_swap = false; return; } @@ -540,7 +540,7 @@ void ml_open_file(buf_T *buf) } /* don't try to open a swap file again */ - buf->b_may_swap = FALSE; + buf->b_may_swap = false; } /* diff --git a/src/nvim/misc1.c b/src/nvim/misc1.c index 2eea48df00..310cb6faac 100644 --- a/src/nvim/misc1.c +++ b/src/nvim/misc1.c @@ -1855,7 +1855,7 @@ void changed(void) */ void changed_int(void) { - curbuf->b_changed = TRUE; + curbuf->b_changed = true; ml_setflags(curbuf); check_status(curbuf); redraw_tabline = TRUE; @@ -1900,7 +1900,7 @@ static void changedOneline(buf_T *buf, linenr_T lnum) buf->b_mod_bot = lnum + 1; } else { /* set the area that must be redisplayed to one line */ - buf->b_mod_set = TRUE; + buf->b_mod_set = true; buf->b_mod_top = lnum; buf->b_mod_bot = lnum + 1; buf->b_mod_xlines = 0; @@ -2013,7 +2013,7 @@ changed_lines_buf ( buf->b_mod_xlines += xtra; } else { /* set the area that must be redisplayed */ - buf->b_mod_set = TRUE; + buf->b_mod_set = true; buf->b_mod_top = lnum; buf->b_mod_bot = lnume + xtra; buf->b_mod_xlines = xtra; @@ -2063,7 +2063,7 @@ static void changed_common(linenr_T lnum, colnr_T col, linenr_T lnume, long xtra /* This is the first of a new sequence of undo-able changes * and it's at some distance of the last change. Use a new * position in the changelist. */ - curbuf->b_new_change = FALSE; + curbuf->b_new_change = false; if (curbuf->b_changelistlen == JUMPLISTSIZE) { /* changelist is full: remove oldest entry */ @@ -2195,7 +2195,7 @@ unchanged ( ) { if (buf->b_changed || (ff && file_ff_differs(buf, FALSE))) { - buf->b_changed = 0; + buf->b_changed = false; ml_setflags(buf); if (ff) save_file_ff(buf); @@ -2226,8 +2226,8 @@ void check_status(buf_T *buf) * If the file is readonly, give a warning message with the first change. * Don't do this for autocommands. * Don't use emsg(), because it flushes the macro buffer. - * If we have undone all changes b_changed will be FALSE, but "b_did_warn" - * will be TRUE. + * If we have undone all changes b_changed will be false, but "b_did_warn" + * will be true. * Careful: may trigger autocommands that reload the buffer. */ void @@ -2238,7 +2238,7 @@ change_warning ( { static char *w_readonly = N_("W10: Warning: Changing a readonly file"); - if (curbuf->b_did_warn == FALSE + if (curbuf->b_did_warn == false && curbufIsChanged() == 0 && !autocmd_busy && curbuf->b_p_ro) { @@ -2263,7 +2263,7 @@ change_warning ( out_flush(); ui_delay(1000L, true); /* give the user time to think about it */ } - curbuf->b_did_warn = TRUE; + curbuf->b_did_warn = true; redraw_cmdline = FALSE; /* don't redraw and erase the message */ if (msg_row < Rows - 1) showmode(); diff --git a/src/nvim/move.c b/src/nvim/move.c index c43fa1d09d..95b961e52c 100644 --- a/src/nvim/move.c +++ b/src/nvim/move.c @@ -1673,7 +1673,7 @@ void scroll_cursor_halfway(int atend) curwin->w_topline = topline; curwin->w_topfill = topfill; if (old_topline > curwin->w_topline + curwin->w_height) - curwin->w_botfill = FALSE; + curwin->w_botfill = false; check_topfill(curwin, false); curwin->w_valid &= ~(VALID_WROW|VALID_CROW|VALID_BOTLINE|VALID_BOTLINE_AP); curwin->w_valid |= VALID_TOPLINE; diff --git a/src/nvim/normal.c b/src/nvim/normal.c index 829c762c51..29070ff188 100644 --- a/src/nvim/normal.c +++ b/src/nvim/normal.c @@ -413,7 +413,7 @@ static int find_command(int cmdchar) /* * Execute a command in Normal mode. */ -void +void normal_cmd ( oparg_T *oap, bool toplevel /* true when called from main() */ @@ -3244,7 +3244,7 @@ static void nv_page(cmdarg_T *cap) /* * Implementation of "gd" and "gD" command. */ -static void +static void nv_gd ( oparg_T *oap, int nchar, @@ -4832,7 +4832,7 @@ static void nv_next(cmdarg_T *cap) * Search for "pat" in direction "dir" ('/' or '?', 0 for repeat). * Uses only cap->count1 and cap->oap from "cap". */ -static void +static void normal_search ( cmdarg_T *cap, int dir, @@ -7060,7 +7060,7 @@ static void nv_edit(cmdarg_T *cap) /* * Invoke edit() and take care of "restart_edit" and the return value. */ -static void +static void invoke_edit ( cmdarg_T *cap, int repl, /* "r" or "gr" command */ diff --git a/src/nvim/option.c b/src/nvim/option.c index 207be0bd74..31f5ab7788 100644 --- a/src/nvim/option.c +++ b/src/nvim/option.c @@ -2007,7 +2007,7 @@ void set_init_1(void) set_options_default(0); - curbuf->b_p_initialized = TRUE; + curbuf->b_p_initialized = true; curbuf->b_p_ar = -1; /* no local 'autoread' value */ curbuf->b_p_ul = NO_LOCAL_UNDOLEVEL; check_buf_options(curbuf); @@ -2563,7 +2563,6 @@ do_set ( /* find end of name */ key = 0; if (*arg == '<') { - nextchar = 0; opt_idx = -1; /* look out for <t_>;> */ if (arg[1] == 't' && arg[2] == '_' && arg[3] && arg[4]) @@ -3481,7 +3480,7 @@ static void didset_options(void) (void)compile_cap_prog(curwin->w_s); /* set cedit_key */ (void)check_cedit(); - briopt_check(); + briopt_check(curwin); } /* @@ -3818,7 +3817,7 @@ did_set_string_option ( } /* 'breakindentopt' */ else if (varp == &curwin->w_p_briopt) { - if (briopt_check() == FAIL) + if (briopt_check(curwin) == FAIL) errmsg = e_invarg; } /* @@ -4977,7 +4976,7 @@ set_bool_option ( /* when 'readonly' is set may give W10 again */ if (curbuf->b_p_ro) - curbuf->b_did_warn = FALSE; + curbuf->b_did_warn = false; redraw_titles(); } @@ -5086,7 +5085,7 @@ set_bool_option ( did_set_title(FALSE); } else if ((int *)varp == &p_icon) { did_set_title(TRUE); - } else if ((int *)varp == &curbuf->b_changed) { + } else if ((bool *)varp == &curbuf->b_changed) { if (!value) save_file_ff(curbuf); /* Buffer is unchanged */ redraw_titles(); @@ -5782,7 +5781,7 @@ get_option_value ( else { /* Special case: 'modified' is b_changed, but we also want to consider * it set when 'ff' or 'fenc' changed. */ - if ((int *)varp == &curbuf->b_changed) + if ((bool *)varp == &curbuf->b_changed) *numval = curbufIsChanged(); else *numval = *(int *)varp; @@ -6173,8 +6172,8 @@ showoneopt ( varp = get_varp_scope(p, opt_flags); /* for 'modified' we also need to check if 'ff' or 'fenc' changed. */ - if ((p->flags & P_BOOL) && ((int *)varp == &curbuf->b_changed - ? !curbufIsChanged() : !*(int *)varp)) + if ((p->flags & P_BOOL) && ((bool *)varp == &curbuf->b_changed + ? !curbufIsChanged() : !*(bool *)varp)) MSG_PUTS("no"); else if ((p->flags & P_BOOL) && *(int *)varp < 0) MSG_PUTS("--"); @@ -6771,6 +6770,7 @@ void win_copy_options(win_T *wp_from, win_T *wp_to) copy_winopt(&wp_from->w_allbuf_opt, &wp_to->w_allbuf_opt); /* Is this right? */ wp_to->w_farsi = wp_from->w_farsi; + briopt_check(wp_to); } /* @@ -7026,7 +7026,7 @@ void buf_copy_options(buf_T *buf, int flags) buf->b_p_isk = vim_strsave(p_isk); did_isk = TRUE; buf->b_p_ts = p_ts; - buf->b_help = FALSE; + buf->b_help = false; if (buf->b_p_bt[0] == 'h') clear_string_option(&buf->b_p_bt); buf->b_p_ma = p_ma; @@ -7038,7 +7038,7 @@ void buf_copy_options(buf_T *buf, int flags) * flag that indicates that the options have been initialized. */ if (should_copy) - buf->b_p_initialized = TRUE; + buf->b_p_initialized = true; } check_buf_options(buf); /* make sure we don't have NULLs */ @@ -8143,16 +8143,15 @@ void find_mps_values(int *initc, int *findc, int *backwards, int switchit) } } -/* This is called when 'breakindentopt' is changed and when a window is - initialized */ -int briopt_check(void) +/// This is called when 'breakindentopt' is changed and when a window is +/// initialized +static bool briopt_check(win_T *wp) { - char_u *p; int bri_shift = 0; long bri_min = 20; bool bri_sbr = false; - p = curwin->w_p_briopt; + char_u *p = wp->w_p_briopt; while (*p != NUL) { if (STRNCMP(p, "shift:", 6) == 0 @@ -8172,15 +8171,15 @@ int briopt_check(void) bri_sbr = true; } if (*p != ',' && *p != NUL) - return FAIL; + return false; if (*p == ',') ++p; } - curwin->w_p_brishift = bri_shift; - curwin->w_p_brimin = bri_min; - curwin->w_p_brisbr = bri_sbr; + wp->w_p_brishift = bri_shift; + wp->w_p_brimin = bri_min; + wp->w_p_brisbr = bri_sbr; - return OK; + return true; } diff --git a/src/nvim/popupmnu.c b/src/nvim/popupmnu.c index 19b92c5789..af2ab73dc8 100644 --- a/src/nvim/popupmnu.c +++ b/src/nvim/popupmnu.c @@ -604,7 +604,7 @@ static int pum_set_selected(int n, int repeat) } } - curbuf->b_changed = 0; + curbuf->b_changed = false; curbuf->b_p_ma = FALSE; curwin->w_cursor.lnum = 1; curwin->w_cursor.col = 0; diff --git a/src/nvim/quickfix.c b/src/nvim/quickfix.c index 738bfb4c58..3de7f73339 100644 --- a/src/nvim/quickfix.c +++ b/src/nvim/quickfix.c @@ -10,6 +10,7 @@ * quickfix.c: functions for quickfix mode, using a file with error messages */ +#include <assert.h> #include <errno.h> #include <inttypes.h> #include <stdbool.h> @@ -798,6 +799,16 @@ qf_init_end: return retval; } +static void qf_store_title(qf_info_T *qi, char_u *title) +{ + if (title != NULL) { + char_u *p = xmalloc(STRLEN(title) + 2); + + qi->qf_lists[qi->qf_curlist].qf_title = p; + sprintf((char *)p, ":%s", (char *)title); + } +} + /* * Prepare for adding a new quickfix list. */ @@ -805,11 +816,9 @@ static void qf_new_list(qf_info_T *qi, char_u *qf_title) { int i; - /* - * If the current entry is not the last entry, delete entries below - * the current entry. This makes it possible to browse in a tree-like - * way with ":grep'. - */ + // If the current entry is not the last entry, delete entries beyond + // the current entry. This makes it possible to browse in a tree-like + // way with ":grep'. while (qi->qf_listcount > qi->qf_curlist + 1) qf_free(qi, --qi->qf_listcount); @@ -825,12 +834,7 @@ static void qf_new_list(qf_info_T *qi, char_u *qf_title) } else qi->qf_curlist = qi->qf_listcount++; memset(&qi->qf_lists[qi->qf_curlist], 0, (size_t)(sizeof(qf_list_T))); - if (qf_title != NULL) { - char_u *p = xmalloc(STRLEN(qf_title) + 2); - - qi->qf_lists[qi->qf_curlist].qf_title = p; - sprintf((char *)p, ":%s", (char *)qf_title); - } + qf_store_title(qi, qf_title); } /* @@ -877,7 +881,7 @@ void qf_free_all(win_T *wp) static int qf_add_entry ( qf_info_T *qi, /* quickfix list */ - qfline_T **prevp, /* pointer to previously added entry or NULL */ + qfline_T **prevp, /* nonnull pointer (to previously added entry or NULL) */ char_u *dir, /* optional directory name */ char_u *fname, /* file name or NULL */ int bufnum, /* buffer number or zero */ @@ -917,6 +921,7 @@ qf_add_entry ( qi->qf_lists[qi->qf_curlist].qf_start = qfp; qfp->qf_prev = qfp; /* first element points to itself */ } else { + assert(*prevp); qfp->qf_prev = *prevp; (*prevp)->qf_next = qfp; } @@ -2124,8 +2129,9 @@ void ex_copen(exarg_T *eap) */ qf_fill_buffer(qi); - if (qi->qf_lists[qi->qf_curlist].qf_title != NULL) - qf_set_title(qi); + if (qi->qf_lists[qi->qf_curlist].qf_title != NULL) { + qf_set_title_var(qi); + } curwin->w_cursor.lnum = qi->qf_lists[qi->qf_curlist].qf_index; curwin->w_cursor.col = 0; @@ -2263,7 +2269,7 @@ static void qf_update_buffer(qf_info_T *qi) && (win = qf_find_win(qi)) != NULL) { curwin_save = curwin; curwin = win; - qf_set_title(qi); + qf_set_title_var(qi); curwin = curwin_save; } @@ -2275,7 +2281,7 @@ static void qf_update_buffer(qf_info_T *qi) } } -static void qf_set_title(qf_info_T *qi) +static void qf_set_title_var(qf_info_T *qi) { set_internal_string_var((char_u *)"w:quickfix_title", qi->qf_lists[qi->qf_curlist].qf_title); @@ -3302,8 +3308,10 @@ int set_errorlist(win_T *wp, list_T *list, int action, char_u *title) for (prevp = qi->qf_lists[qi->qf_curlist].qf_start; prevp->qf_next != prevp; prevp = prevp->qf_next) ; - else if (action == 'r') + else if (action == 'r') { qf_free(qi, qi->qf_curlist); + qf_store_title(qi, title); + } for (li = list->lv_first; li != NULL; li = li->li_next) { if (li->li_tv.v_type != VAR_DICT) diff --git a/src/nvim/regexp.c b/src/nvim/regexp.c index cef2e6d9bf..d57bc889ac 100644 --- a/src/nvim/regexp.c +++ b/src/nvim/regexp.c @@ -1983,9 +1983,15 @@ static char_u *regatom(int *flagp) break; case 's': ret = regnode(MOPEN + 0); + if (!re_mult_next("\\zs")) { + return NULL; + } break; case 'e': ret = regnode(MCLOSE + 0); + if (!re_mult_next("\\ze")) { + return NULL; + } break; default: EMSG_RET_NULL(_("E68: Invalid character after \\z")); @@ -2460,6 +2466,15 @@ do_multibyte: return ret; } +/// Used in a place where no * or \+ can follow. +static bool re_mult_next(char *what) +{ + if (re_multi_type(peekchr()) == MULTI_MULT) { + EMSG2_RET_FAIL(_("E888: (NFA regexp) cannot repeat %s"), what); + } + return true; +} + /* * Return TRUE if MULTIBYTECODE should be used instead of EXACTLY for * character "c". diff --git a/src/nvim/regexp_nfa.c b/src/nvim/regexp_nfa.c index 2659eac762..60cdc12c92 100644 --- a/src/nvim/regexp_nfa.c +++ b/src/nvim/regexp_nfa.c @@ -1084,7 +1084,6 @@ static int nfa_regatom(void) int extra = 0; int emit_range; int negated; - int result; int startc = -1; int endc = -1; int oldstartc = -1; @@ -1259,10 +1258,16 @@ static int nfa_regatom(void) switch (c) { case 's': EMIT(NFA_ZSTART); + if (!re_mult_next("\\zs")) { + return false; + } break; case 'e': EMIT(NFA_ZEND); - nfa_has_zend = TRUE; + nfa_has_zend = true; + if (!re_mult_next("\\zs")) { + return false; + } break; case '1': case '2': @@ -1446,8 +1451,8 @@ collection: * recognize that [0-9] stands for \d and [A-Za-z_] for \h, * and perform the necessary substitutions in the NFA. */ - result = nfa_recognize_char_class(regparse, endp, - extra == NFA_ADD_NL); + int result = nfa_recognize_char_class(regparse, endp, + extra == NFA_ADD_NL); if (result != FAIL) { if (result >= NFA_FIRST_NL && result <= NFA_LAST_NL) { EMIT(result - NFA_ADD_NL); @@ -1551,7 +1556,6 @@ collection: /* Try equivalence class [=a=] and the like */ if (equiclass != 0) { nfa_emit_equi_class(equiclass); - result = OK; continue; } /* Try collating class like [. .] */ diff --git a/src/nvim/screen.c b/src/nvim/screen.c index e217945ac3..58faac1ae7 100644 --- a/src/nvim/screen.c +++ b/src/nvim/screen.c @@ -554,7 +554,7 @@ void update_screen(int type) /* Reset b_mod_set flags. Going through all windows is probably faster * than going through all buffers (there could be many buffers). */ FOR_ALL_WINDOWS_IN_TAB(wp, curtab) { - wp->w_buffer->b_mod_set = FALSE; + wp->w_buffer->b_mod_set = false; } updating_screen = FALSE; @@ -1672,7 +1672,7 @@ static void win_update(win_T *wp) if (must_redraw != 0) { /* Don't update for changes in buffer again. */ i = curbuf->b_mod_set; - curbuf->b_mod_set = FALSE; + curbuf->b_mod_set = false; win_update(curwin); must_redraw = 0; curbuf->b_mod_set = i; diff --git a/src/nvim/search.c b/src/nvim/search.c index 1e275e9753..bd1811c7fb 100644 --- a/src/nvim/search.c +++ b/src/nvim/search.c @@ -3973,6 +3973,7 @@ find_pattern_in_path ( char_u *startp = NULL; char_u *inc_opt = NULL; win_T *curwin_save = NULL; + const int l_g_do_tagpreview = g_do_tagpreview; regmatch.regprog = NULL; incl_regmatch.regprog = NULL; @@ -4370,7 +4371,7 @@ search_line: } else if (--count <= 0) { found = TRUE; if (depth == -1 && lnum == curwin->w_cursor.lnum - && g_do_tagpreview == 0 + && l_g_do_tagpreview == 0 ) EMSG(_("E387: Match is on current line")); else if (action == ACTION_SHOW) { @@ -4380,7 +4381,7 @@ search_line: did_show = TRUE; } else { /* ":psearch" uses the preview window */ - if (g_do_tagpreview != 0) { + if (l_g_do_tagpreview != 0) { curwin_save = curwin; prepare_tagpreview(true); } @@ -4391,7 +4392,7 @@ search_line: } if (depth == -1) { /* match in current file */ - if (g_do_tagpreview != 0) { + if (l_g_do_tagpreview != 0) { if (getfile(0, curwin_save->w_buffer->b_fname, NULL, TRUE, lnum, FALSE) > 0) break; /* failed to jump to file */ @@ -4412,7 +4413,7 @@ search_line: curwin->w_set_curswant = TRUE; } - if (g_do_tagpreview != 0 + if (l_g_do_tagpreview != 0 && curwin != curwin_save && win_valid(curwin_save)) { /* Return cursor to where we were */ validate_cursor(); diff --git a/src/nvim/spell.c b/src/nvim/spell.c index 342f121c48..ea5ce7ee0d 100644 --- a/src/nvim/spell.c +++ b/src/nvim/spell.c @@ -284,6 +284,7 @@ // stored as an offset to the previous number in as // few bytes as possible, see offset2bytes()) +#include <assert.h> #include <errno.h> #include <inttypes.h> #include <stdbool.h> @@ -303,6 +304,7 @@ #include "nvim/ex_cmds2.h" #include "nvim/ex_docmd.h" #include "nvim/fileio.h" +#include "nvim/func_attr.h" #include "nvim/getchar.h" #include "nvim/hashtab.h" #include "nvim/mbyte.h" @@ -1599,7 +1601,9 @@ static void find_word(matchinf_T *mip, int mode) mip->mi_compoff = (int)(p - mip->mi_fword); } } +#if 0 c = mip->mi_compoff; +#endif ++mip->mi_complen; if (flags & WF_COMPROOT) ++mip->mi_compextra; @@ -2058,7 +2062,7 @@ spell_move_to ( char_u *line; char_u *p; char_u *endp; - hlf_T attr; + hlf_T attr = HLF_COUNT; int len; int has_syntax = syntax_present(wp); int col; @@ -2094,6 +2098,7 @@ spell_move_to ( buflen = len + MAXWLEN + 2; buf = xmalloc(buflen); } + assert(buf && buflen >= len + MAXWLEN + 2); // In first line check first word for Capital. if (lnum == 1) @@ -4462,7 +4467,7 @@ static afffile_T *spell_read_aff(spellinfo_T *spin, char_u *fname) || aff->af_pref.ht_used > 0) smsg((char_u *)_("FLAG after using flags in %s line %d: %s"), fname, lnum, items[1]); - } else if (spell_info_item(items[0])) { + } else if (spell_info_item(items[0]) && itemcnt > 1) { p = (char_u *)getroom(spin, (spin->si_info == NULL ? 0 : STRLEN(spin->si_info)) + STRLEN(items[0]) @@ -5800,6 +5805,8 @@ store_aff_word ( // Get compound IDS from the affix list. get_compflags(affile, ae->ae_flags, use_pfxlist + use_pfxlen); + else + use_pfxlist[use_pfxlen] = NUL; // Combine the list of compound flags. // Concatenate them to the prefix IDs list. @@ -6066,14 +6073,17 @@ static int spell_read_wordfile(spellinfo_T *spin, char_u *fname) /// track of them). /// The memory is cleared to all zeros. /// -/// @param len Length needed. +/// @param len Length needed (<= SBLOCKSIZE). /// @param align Align for pointer. -/// @return NULL when out of memory. +/// @return Pointer into block data. static void *getroom(spellinfo_T *spin, size_t len, bool align) + FUNC_ATTR_NONNULL_RET { char_u *p; sblock_T *bl = spin->si_blocks; + assert(len <= SBLOCKSIZE); + if (align && bl != NULL) // Round size up for alignment. On some systems structures need to be // aligned to the size of a pointer (e.g., SPARC). @@ -6081,11 +6091,8 @@ static void *getroom(spellinfo_T *spin, size_t len, bool align) & ~(sizeof(char *) - 1); if (bl == NULL || bl->sb_used + len > SBLOCKSIZE) { - if (len >= SBLOCKSIZE) - bl = NULL; - else - // Allocate a block of memory. It is not freed until much later. - bl = xcalloc(1, (sizeof(sblock_T) + SBLOCKSIZE)); + // Allocate a block of memory. It is not freed until much later. + bl = xcalloc(1, (sizeof(sblock_T) + SBLOCKSIZE)); bl->sb_next = spin->si_blocks; spin->si_blocks = bl; bl->sb_used = 0; @@ -12496,8 +12503,9 @@ static int spell_edit_score(slang_T *slang, char_u *badword, char_u *goodword) char_u *p; int wbadword[MAXWLEN]; int wgoodword[MAXWLEN]; + const int l_has_mbyte = has_mbyte; - if (has_mbyte) { + if (l_has_mbyte) { // Get the characters from the multi-byte strings and put them in an // int array for easy access. for (p = badword, badlen = 0; *p != NUL; ) @@ -12522,7 +12530,7 @@ static int spell_edit_score(slang_T *slang, char_u *badword, char_u *goodword) for (i = 1; i <= badlen; ++i) { CNT(i, 0) = CNT(i - 1, 0) + SCORE_DEL; for (j = 1; j <= goodlen; ++j) { - if (has_mbyte) { + if (l_has_mbyte) { bc = wbadword[i - 1]; gc = wgoodword[j - 1]; } else { @@ -12546,7 +12554,7 @@ static int spell_edit_score(slang_T *slang, char_u *badword, char_u *goodword) } if (i > 1 && j > 1) { - if (has_mbyte) { + if (l_has_mbyte) { pbc = wbadword[i - 2]; pgc = wgoodword[j - 2]; } else { diff --git a/src/nvim/syntax.c b/src/nvim/syntax.c index e0c9628985..6c5c0f37b1 100644 --- a/src/nvim/syntax.c +++ b/src/nvim/syntax.c @@ -2851,15 +2851,16 @@ static int syn_regexec(regmmatch_T *rmp, linenr_T lnum, colnr_T col, syn_time_T { int r; proftime_T pt; + const int l_syn_time_on = syn_time_on; - if (syn_time_on) { + if (l_syn_time_on) { pt = profile_start(); } rmp->rmm_maxcol = syn_buf->b_p_smc; r = vim_regexec_multi(rmp, syn_win, syn_buf, lnum, col, NULL); - if (syn_time_on) { + if (l_syn_time_on) { pt = profile_end(pt); st->total = profile_add(st->total, pt); if (profile_cmp(pt, st->slowest) < 0) { @@ -5105,7 +5106,7 @@ get_id_list ( * parse the arguments after "contains" */ count = 0; - while (!ends_excmd(*p)) { + do { for (end = p; *end && !vim_iswhite(*end) && *end != ','; ++end) ; name = xmalloc((int)(end - p + 3)); /* leave room for "^$" */ @@ -5198,7 +5199,7 @@ get_id_list ( if (*p != ',') break; p = skipwhite(p + 1); /* skip comma in between arguments */ - } + } while (!ends_excmd(*p)); if (failed) break; if (round == 1) { diff --git a/src/nvim/tag.c b/src/nvim/tag.c index a123e9b902..e267280bbd 100644 --- a/src/nvim/tag.c +++ b/src/nvim/tag.c @@ -1180,7 +1180,7 @@ find_tags ( * Initialize a few variables */ if (help_only) /* want tags from help file */ - curbuf->b_help = TRUE; /* will be restored later */ + curbuf->b_help = true; /* will be restored later */ orgpat.len = (int)STRLEN(pat); if (curbuf->b_help) { diff --git a/src/nvim/testdir/Makefile b/src/nvim/testdir/Makefile index 521fbc19cf..9ca2c9688a 100644 --- a/src/nvim/testdir/Makefile +++ b/src/nvim/testdir/Makefile @@ -34,6 +34,7 @@ SCRIPTS := test_autoformat_join.out \ test_options.out \ test_listlbr.out test_listlbr_utf8.out \ test_changelist.out \ + test_qf_title.out \ test_breakindent.out \ test_insertcount.out \ test_utf8.out diff --git a/src/nvim/testdir/test55.in b/src/nvim/testdir/test55.in index 8e073f30f2..140cb7c0e5 100644 --- a/src/nvim/testdir/test55.in +++ b/src/nvim/testdir/test55.in @@ -282,6 +282,21 @@ let l = [0, 1, 2, 3] : $put =ps : endfor :endfor +:unlet l +:let l = [1, 2, 3, 4] +:lockvar! l +:$put =string(l) +:unlockvar l[1] +:unlet l[0:1] +:$put =string(l) +:unlet l[1:2] +:$put =string(l) +:unlockvar l[1] +:let l[0:1] = [0, 1] +:$put =string(l) +:let l[1:2] = [0, 1] +:$put =string(l) +:unlet l :" :lockvar/islocked() triggering script autoloading :set rtp+=./sautest :lockvar g:footest#x diff --git a/src/nvim/testdir/test55.ok b/src/nvim/testdir/test55.ok index dfd8060db7..e8560de401 100644 --- a/src/nvim/testdir/test55.ok +++ b/src/nvim/testdir/test55.ok @@ -86,6 +86,11 @@ FFFFFFF FFpFFpp 0000-000 ppppppp +[1, 2, 3, 4] +[1, 2, 3, 4] +[1, 2, 3, 4] +[1, 2, 3, 4] +[1, 2, 3, 4] locked g:footest#x:-1 exists g:footest#x:0 g:footest#x: 1 diff --git a/src/nvim/testdir/test64.in b/src/nvim/testdir/test64.in index 2abdcd1c08..f2452fc0f3 100644 --- a/src/nvim/testdir/test64.in +++ b/src/nvim/testdir/test64.in @@ -459,7 +459,7 @@ STARTTEST : let text = t[2] : let matchidx = 3 : for engine in [0, 1, 2] -: if engine == 2 && re == 0 || engine == 1 && re ==1 +: if engine == 2 && re == 0 || engine == 1 && re == 1 : continue : endif : let ®expengine = engine @@ -608,6 +608,17 @@ yeGopA END:" "ayb20gg/..\%$ "bybGo"apo"bp:" :" +:" Check for detecting error +:set regexpengine=2 +:for pat in [' \ze*', ' \zs*'] +: try +: let l = matchlist('x x', pat) +: $put ='E888 NOT detected for ' . pat +: catch +: $put ='E888 detected for ' . pat +: endtry +:endfor +:" :""""" Write the results """"""""""""" :/\%#=1^Results/,$wq! test.out ENDTEST diff --git a/src/nvim/testdir/test64.ok b/src/nvim/testdir/test64.ok index e7d173141a..ffc0b5341f 100644 --- a/src/nvim/testdir/test64.ok +++ b/src/nvim/testdir/test64.ok @@ -1097,3 +1097,5 @@ Test Test END EN E +E888 detected for \ze* +E888 detected for \zs* diff --git a/src/nvim/testdir/test_breakindent.in b/src/nvim/testdir/test_breakindent.in index 8f40e4f7e5..150c9430db 100644 --- a/src/nvim/testdir/test_breakindent.in +++ b/src/nvim/testdir/test_breakindent.in @@ -27,6 +27,7 @@ STARTTEST : $put =g:line1 : wincmd p :endfu +:set briopt=min:0 :let g:test="Test 1: Simple breakindent" :let line1=ScreenChar(8) :call DoRecordScreen() @@ -73,6 +74,23 @@ STARTTEST :let width = strlen(text[1:])+indent(2)*4+strlen(&sbr)*3 " text wraps 3 times :$put =g:test :$put =printf(\"strdisplaywidth: %d == calculated: %d\", strdisplaywidth(text), width) +:" +:" Test, that the string " a\tb\tc\td\te" is correctly +:" displayed in a 20 column wide window (see bug report +:" https://groups.google.com/d/msg/vim_dev/ZOdg2mc9c9Y/TT8EhFjEy0IJ +:only +:vert 20new +:set all& nocp breakindent briopt=min:10 +:call setline(1, [" a\tb\tc\td\te", " z y x w v"]) +:/^\s*a +fbgjyl:let line1 = @0 +:?^\s*z +fygjyl:let line2 = @0 +:quit! +:$put ='Test 12: breakindent with wrapping Tab' +:$put =line1 +:$put =line2 +:" :%w! test.out :qa! ENDTEST diff --git a/src/nvim/testdir/test_breakindent.ok b/src/nvim/testdir/test_breakindent.ok index 723cb25012..d89d424fb3 100644 --- a/src/nvim/testdir/test_breakindent.ok +++ b/src/nvim/testdir/test_breakindent.ok @@ -53,3 +53,6 @@ Test 4: Simple breakindent + min width: 18 Test 11: strdisplaywidth when breakindent is on strdisplaywidth: 46 == calculated: 64 +Test 12: breakindent with wrapping Tab +d +w diff --git a/src/nvim/testdir/test_qf_title.in b/src/nvim/testdir/test_qf_title.in new file mode 100644 index 0000000000..fce0c260e3 --- /dev/null +++ b/src/nvim/testdir/test_qf_title.in @@ -0,0 +1,18 @@ +Tests for quickfix window's title vim: set ft=vim : + +STARTTEST +:so small.vim +:if !has('quickfix') | e! test.ok | wq! test.out | endif +:set efm=%E%f:%l:%c:%m +:cgetexpr ['file:1:1:message'] +:let qflist=getqflist() +:call setqflist(qflist, 'r') +:copen +:let g:quickfix_title=w:quickfix_title +:wincmd p +:$put =g:quickfix_title +:/^Results/,$w test.out +:qa! +ENDTEST + +Results of test_qf_title: diff --git a/src/nvim/testdir/test_qf_title.ok b/src/nvim/testdir/test_qf_title.ok new file mode 100644 index 0000000000..4ebdbeff3b --- /dev/null +++ b/src/nvim/testdir/test_qf_title.ok @@ -0,0 +1,2 @@ +Results of test_qf_title: +:setqflist() diff --git a/src/nvim/undo.c b/src/nvim/undo.c index 7a57f70498..2ab31b6cfd 100644 --- a/src/nvim/undo.c +++ b/src/nvim/undo.c @@ -80,6 +80,7 @@ #define UH_MAGIC 0x18dade /* value for uh_magic when in use */ #define UE_MAGIC 0xabc123 /* value for ue_magic when in use */ +#include <assert.h> #include <inttypes.h> #include <errno.h> #include <stdbool.h> @@ -369,11 +370,11 @@ int u_savecommon(linenr_T top, linenr_T bot, linenr_T newbot, int reload) size = bot - top - 1; /* - * If curbuf->b_u_synced == TRUE make a new header. + * If curbuf->b_u_synced == true make a new header. */ if (curbuf->b_u_synced) { /* Need to create new entry in b_changelist. */ - curbuf->b_new_change = TRUE; + curbuf->b_new_change = true; if (get_undolevel() >= 0) { /* @@ -424,7 +425,7 @@ int u_savecommon(linenr_T top, linenr_T bot, linenr_T newbot, int reload) if (uhp == NULL) { /* no undo at all */ if (old_curhead != NULL) u_freebranch(curbuf, old_curhead, NULL); - curbuf->b_u_synced = FALSE; + curbuf->b_u_synced = false; return OK; } @@ -510,7 +511,7 @@ int u_savecommon(linenr_T top, linenr_T bot, linenr_T newbot, int reload) * entry now. Following deleted/inserted lines go to * the re-used entry. */ u_getbot(); - curbuf->b_u_synced = FALSE; + curbuf->b_u_synced = false; /* Move the found entry to become the last entry. The * order of undo/redo doesn't matter for the entries @@ -581,7 +582,7 @@ int u_savecommon(linenr_T top, linenr_T bot, linenr_T newbot, int reload) uep->ue_array = NULL; uep->ue_next = curbuf->b_u_newhead->uh_entry; curbuf->b_u_newhead->uh_entry = uep; - curbuf->b_u_synced = FALSE; + curbuf->b_u_synced = false; undo_undoes = FALSE; #ifdef U_DEBUG @@ -1461,7 +1462,7 @@ void u_read_undo(char_u *name, char_u *hash, char_u *orig_name) curbuf->b_u_save_nr_last = last_save_nr; curbuf->b_u_save_nr_cur = last_save_nr; - curbuf->b_u_synced = TRUE; + curbuf->b_u_synced = true; free(uhp_table); #ifdef U_DEBUG @@ -1506,7 +1507,7 @@ void u_undo(int count) * original vi. If this happens twice in one macro the result will not * be compatible. */ - if (curbuf->b_u_synced == FALSE) { + if (curbuf->b_u_synced == false) { u_sync(TRUE); count = 1; } @@ -1618,7 +1619,7 @@ void undo_time(long step, int sec, int file, int absolute) int did_undo = TRUE; /* First make sure the current undoable change is synced. */ - if (curbuf->b_u_synced == FALSE) + if (curbuf->b_u_synced == false) u_sync(TRUE); u_newcount = 0; @@ -2219,7 +2220,7 @@ u_sync ( if (curbuf->b_u_synced || (!force && no_u_sync > 0)) return; if (get_undolevel() < 0) - curbuf->b_u_synced = TRUE; /* no entries, nothing to do */ + curbuf->b_u_synced = true; /* no entries, nothing to do */ else { u_getbot(); /* compute ue_bot of previous u_save */ curbuf->b_u_curhead = NULL; @@ -2354,7 +2355,7 @@ void ex_undojoin(exarg_T *eap) else { /* Go back to the last entry */ curbuf->b_u_curhead = curbuf->b_u_newhead; - curbuf->b_u_synced = FALSE; /* no entries, nothing to do */ + curbuf->b_u_synced = false; /* no entries, nothing to do */ } } @@ -2365,7 +2366,7 @@ void ex_undojoin(exarg_T *eap) void u_unchanged(buf_T *buf) { u_unch_branch(buf->b_u_oldhead); - buf->b_did_warn = FALSE; + buf->b_did_warn = false; } /* @@ -2446,7 +2447,7 @@ static u_entry_T *u_get_headentry(void) /* * u_getbot(): compute the line number of the previous u_save - * It is called only when b_u_synced is FALSE. + * It is called only when b_u_synced is false. */ static void u_getbot(void) { @@ -2477,7 +2478,7 @@ static void u_getbot(void) curbuf->b_u_newhead->uh_getbot_entry = NULL; } - curbuf->b_u_synced = TRUE; + curbuf->b_u_synced = true; } /* @@ -2602,7 +2603,7 @@ static void u_freeentry(u_entry_T *uep, long n) void u_clearall(buf_T *buf) { buf->b_u_newhead = buf->b_u_oldhead = buf->b_u_curhead = NULL; - buf->b_u_synced = TRUE; + buf->b_u_synced = true; buf->b_u_numhead = 0; buf->b_u_line_ptr = NULL; buf->b_u_line_lnum = 0; @@ -2682,8 +2683,11 @@ void u_undoline(void) */ void u_blockfree(buf_T *buf) { - while (buf->b_u_oldhead != NULL) + while (buf->b_u_oldhead != NULL) { + u_header_T *previous_oldhead = buf->b_u_oldhead; u_freeheader(buf, buf->b_u_oldhead, NULL); + assert(buf->b_u_oldhead != previous_oldhead); + } free(buf->b_u_line_ptr); } diff --git a/src/nvim/version.c b/src/nvim/version.c index 9b5b995801..c2818edcc5 100644 --- a/src/nvim/version.c +++ b/src/nvim/version.c @@ -228,7 +228,7 @@ static int included_patches[] = { 440, 439, //438, - //437, + 437, 436, //435, //434, @@ -244,12 +244,12 @@ static int included_patches[] = { //424 NA //423, //422, - //421, + 421, //420 NA - //419, + 419, 418, - //417, - //416, + 417, + 416, 415, 414, //413 NA @@ -287,7 +287,7 @@ static int included_patches[] = { 381, //380 NA 379, - //378, + 378, 377, 376, 375, diff --git a/src/nvim/window.c b/src/nvim/window.c index fe40cd2a95..9345d740d1 100644 --- a/src/nvim/window.c +++ b/src/nvim/window.c @@ -1849,19 +1849,19 @@ int win_close(win_T *win, int free_buf) */ if (wp->w_buffer != curbuf) { other_buffer = TRUE; - win->w_closing = TRUE; + win->w_closing = true; apply_autocmds(EVENT_BUFLEAVE, NULL, NULL, FALSE, curbuf); if (!win_valid(win)) return FAIL; - win->w_closing = FALSE; + win->w_closing = false; if (last_window()) return FAIL; } - win->w_closing = TRUE; + win->w_closing = true; apply_autocmds(EVENT_WINLEAVE, NULL, NULL, FALSE, curbuf); if (!win_valid(win)) return FAIL; - win->w_closing = FALSE; + win->w_closing = false; if (last_window()) return FAIL; /* autocmds may abort script processing */ @@ -1878,10 +1878,10 @@ int win_close(win_T *win, int free_buf) * Close the link to the buffer. */ if (win->w_buffer != NULL) { - win->w_closing = TRUE; + win->w_closing = true; close_buffer(win, win->w_buffer, free_buf ? DOBUF_UNLOAD : 0, TRUE); if (win_valid(win)) - win->w_closing = FALSE; + win->w_closing = false; } if (only_one_window() && win_valid(win) && win->w_buffer == NULL @@ -5404,7 +5404,7 @@ int match_add(win_T *wp, char_u *grp, char_u *pat, int prio, int id, list_T *pos wp->w_buffer->b_mod_bot = botlnum; } } else { - wp->w_buffer->b_mod_set = TRUE; + wp->w_buffer->b_mod_set = true; wp->w_buffer->b_mod_top = toplnum; wp->w_buffer->b_mod_bot = botlnum; wp->w_buffer->b_mod_xlines = 0; @@ -5478,7 +5478,7 @@ int match_delete(win_T *wp, int id, int perr) wp->w_buffer->b_mod_bot = cur->pos.botlnum; } } else { - wp->w_buffer->b_mod_set = TRUE; + wp->w_buffer->b_mod_set = true; wp->w_buffer->b_mod_top = cur->pos.toplnum; wp->w_buffer->b_mod_bot = cur->pos.botlnum; wp->w_buffer->b_mod_xlines = 0; |