aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/nvim/CMakeLists.txt2
-rw-r--r--src/nvim/buffer.c22
-rw-r--r--src/nvim/charset.c54
-rw-r--r--src/nvim/cursor_shape.c4
-rw-r--r--src/nvim/diff.c12
-rw-r--r--src/nvim/digraph.c4
-rw-r--r--src/nvim/edit.c2
-rw-r--r--src/nvim/eval.c88
-rw-r--r--src/nvim/ex_cmds.c18
-rw-r--r--src/nvim/ex_cmds2.c8
-rw-r--r--src/nvim/ex_docmd.c32
-rw-r--r--src/nvim/ex_getln.c2
-rw-r--r--src/nvim/fileio.c8
-rw-r--r--src/nvim/garray.c2
-rw-r--r--src/nvim/getchar.c2
-rw-r--r--src/nvim/globals.h1
-rw-r--r--src/nvim/hardcopy.c209
-rw-r--r--src/nvim/hardcopy.h8
-rw-r--r--src/nvim/indent_c.c8
-rw-r--r--src/nvim/keymap.c6
-rw-r--r--src/nvim/keymap.h4
-rw-r--r--src/nvim/main.c29
-rw-r--r--src/nvim/mark.c11
-rw-r--r--src/nvim/mbyte.c10
-rw-r--r--src/nvim/memline.c6
-rw-r--r--src/nvim/memory.c2
-rw-r--r--src/nvim/menu.c4
-rw-r--r--src/nvim/message.c2
-rw-r--r--src/nvim/misc1.c4
-rw-r--r--src/nvim/msgpack_rpc/channel.c42
-rw-r--r--src/nvim/msgpack_rpc/remote_ui.c109
-rw-r--r--src/nvim/normal.c1
-rw-r--r--src/nvim/ops.c4
-rw-r--r--src/nvim/option.c25
-rw-r--r--src/nvim/option_defs.h3
-rw-r--r--src/nvim/os/input.c22
-rw-r--r--src/nvim/os/job.c9
-rw-r--r--src/nvim/os/shell.c12
-rw-r--r--src/nvim/os/time.c4
-rw-r--r--src/nvim/os_unix.c21
-rw-r--r--src/nvim/path.c6
-rw-r--r--src/nvim/regexp.c6
-rw-r--r--src/nvim/screen.c16
-rw-r--r--src/nvim/search.c26
-rw-r--r--src/nvim/spell.c14
-rw-r--r--src/nvim/strings.c4
-rw-r--r--src/nvim/syntax.c48
-rw-r--r--src/nvim/tag.c2
-rw-r--r--src/nvim/term.c265
-rw-r--r--src/nvim/testdir/test48.in5
-rw-r--r--src/nvim/testdir/test48.ok1
-rw-r--r--src/nvim/testdir/test53.in7
-rw-r--r--src/nvim/testdir/test53.ok6
-rw-r--r--src/nvim/ui.c143
-rw-r--r--src/nvim/ui.h7
-rw-r--r--src/nvim/undo.c2
-rw-r--r--src/nvim/version.c10
-rw-r--r--src/nvim/window.c9
58 files changed, 743 insertions, 650 deletions
diff --git a/src/nvim/CMakeLists.txt b/src/nvim/CMakeLists.txt
index 2abac06574..5fe52e3323 100644
--- a/src/nvim/CMakeLists.txt
+++ b/src/nvim/CMakeLists.txt
@@ -59,7 +59,6 @@ set(CONV_SOURCES
fileio.c
fold.c
getchar.c
- hardcopy.c
if_cscope.c
indent.c
keymap.c
@@ -84,7 +83,6 @@ set(CONV_SOURCES
spell.c
syntax.c
tag.c
- term.c
ui.c
version.c
window.c)
diff --git a/src/nvim/buffer.c b/src/nvim/buffer.c
index 4c40cd631e..3a378ea360 100644
--- a/src/nvim/buffer.c
+++ b/src/nvim/buffer.c
@@ -602,7 +602,6 @@ void goto_buffer(exarg_T *eap, int start, int dir, int count)
{
(void)do_buffer(*eap->cmd == 's' ? DOBUF_SPLIT : DOBUF_GOTO,
start, dir, count, eap->forceit);
-#ifdef HAS_SWAP_EXISTS_ACTION
buf_T *old_curbuf = curbuf;
swap_exists_action = SEA_DIALOG;
@@ -624,10 +623,8 @@ void goto_buffer(exarg_T *eap, int start, int dir, int count)
} else {
handle_swap_exists(old_curbuf);
}
-#endif
}
-#if defined(HAS_SWAP_EXISTS_ACTION) || defined(PROTO)
/*
* Handle the situation of swap_exists_action being set.
* It is allowed for "old_curbuf" to be NULL or invalid.
@@ -678,7 +675,6 @@ void handle_swap_exists(buf_T *old_curbuf)
}
swap_exists_action = SEA_NONE;
}
-#endif
/*
* do_bufdel() - delete or unload buffer(s)
@@ -750,7 +746,7 @@ do_bufdel (
break;
arg = p;
} else
- bnr = getdigits(&arg);
+ bnr = getdigits_int(&arg);
}
}
if (!got_int && do_current && do_buffer(command, DOBUF_FIRST,
@@ -2351,7 +2347,7 @@ int buflist_add(char_u *fname, int flags)
return 0;
}
-#if defined(BACKSLASH_IN_FILENAME) || defined(PROTO)
+#if defined(BACKSLASH_IN_FILENAME)
/*
* Adjust slashes in file names. Called after 'shellslash' was set.
*/
@@ -2752,7 +2748,7 @@ void resettitle(void)
mch_settitle(lasttitle, lasticon);
}
-# if defined(EXITFREE) || defined(PROTO)
+# if defined(EXITFREE)
void free_titles(void)
{
free(lasttitle);
@@ -2997,7 +2993,7 @@ build_stl_str_hl (
l = -1;
}
if (VIM_ISDIGIT(*s)) {
- minwid = (int)getdigits(&s);
+ minwid = getdigits_int(&s);
if (minwid < 0) /* overflow */
minwid = 0;
}
@@ -3033,7 +3029,7 @@ build_stl_str_hl (
if (*s == '.') {
s++;
if (VIM_ISDIGIT(*s)) {
- maxwid = (int)getdigits(&s);
+ maxwid = getdigits_int(&s);
if (maxwid <= 0) /* overflow */
maxwid = 50;
}
@@ -3934,17 +3930,12 @@ void ex_buffer_all(exarg_T *eap)
continue;
/* Open the buffer in this window. */
-#if defined(HAS_SWAP_EXISTS_ACTION)
swap_exists_action = SEA_DIALOG;
-#endif
set_curbuf(buf, DOBUF_GOTO);
if (!buf_valid(buf)) { /* autocommands deleted the buffer!!! */
-#if defined(HAS_SWAP_EXISTS_ACTION)
swap_exists_action = SEA_NONE;
-# endif
break;
}
-#if defined(HAS_SWAP_EXISTS_ACTION)
if (swap_exists_action == SEA_QUIT) {
cleanup_T cs;
@@ -3964,7 +3955,6 @@ void ex_buffer_all(exarg_T *eap)
leave_cleanup(&cs);
} else
handle_swap_exists(NULL);
-#endif
}
os_breakcheck();
@@ -4077,7 +4067,7 @@ chk_modeline (
e = s + 4;
else
e = s + 3;
- vers = getdigits(&e);
+ vers = getdigits_int(&e);
if (*e == ':'
&& (s[0] != 'V'
|| STRNCMP(skipwhite(e + 1), "set", 3) == 0)
diff --git a/src/nvim/charset.c b/src/nvim/charset.c
index 32427cc3ba..b86c66c3fe 100644
--- a/src/nvim/charset.c
+++ b/src/nvim/charset.c
@@ -177,7 +177,7 @@ int buf_init_chartab(buf_T *buf, int global)
}
if (VIM_ISDIGIT(*p)) {
- c = getdigits(&p);
+ c = getdigits_int(&p);
} else if (has_mbyte) {
c = mb_ptr2char_adv(&p);
} else {
@@ -189,7 +189,7 @@ int buf_init_chartab(buf_T *buf, int global)
++p;
if (VIM_ISDIGIT(*p)) {
- c2 = getdigits(&p);
+ c2 = getdigits_int(&p);
} else if (has_mbyte) {
c2 = mb_ptr2char_adv(&p);
} else {
@@ -1676,26 +1676,41 @@ char_u* skiptowhite_esc(char_u *p) {
return p;
}
-/// Getdigits: Get a number from a string and skip over it.
+/// Get a number from a string and skip over it.
///
-/// Note: the argument is a pointer to a char_u pointer!
+/// @param[out] pp A pointer to a pointer to char_u.
+/// It will be advanced past the read number.
///
-/// @param pp
+/// @return Number read from the string.
+intmax_t getdigits(char_u **pp)
+{
+ intmax_t number = strtoimax((char *)*pp, (char **)pp, 10);
+ assert(errno != ERANGE);
+ return number;
+}
+
+/// Get an int number from a string.
///
-/// @return Number from the string.
-long getdigits(char_u **pp)
+/// A getdigits wrapper restricted to int values.
+int getdigits_int(char_u **pp)
{
- char_u *p = *pp;
- long retval = atol((char *)p);
+ intmax_t number = getdigits(pp);
+#if SIZEOF_INTMAX_T > SIZEOF_INT
+ assert(number >= INT_MIN && number <= INT_MAX);
+#endif
+ return (int)number;
+}
- if (*p == '-') {
- // skip negative sign
- ++p;
- }
- // skip to next non-digit
- p = skipdigits(p);
- *pp = p;
- return retval;
+/// Get a long number from a string.
+///
+/// A getdigits wrapper restricted to long values.
+long getdigits_long(char_u **pp)
+{
+ intmax_t number = getdigits(pp);
+#if SIZEOF_INTMAX_T > SIZEOF_LONG
+ assert(number >= LONG_MIN && number <= LONG_MAX);
+#endif
+ return (long)number;
}
/// Return TRUE if "lbuf" is empty or only contains blanks.
@@ -1838,7 +1853,7 @@ int hex2nr(int c)
return c - '0';
}
-#if defined(FEAT_TERMRESPONSE) || defined(FEAT_GUI_GTK) || defined(PROTO)
+#if defined(FEAT_TERMRESPONSE) || defined(FEAT_GUI_GTK)
/// Convert two hex characters to a byte.
/// Return -1 if one of the characters is not hex.
@@ -1855,8 +1870,7 @@ int hexhex2nr(char_u *p)
return (hex2nr(p[0]) << 4) + hex2nr(p[1]);
}
-#endif // if defined(FEAT_TERMRESPONSE) || defined(FEAT_GUI_GTK)
- // || defined(PROTO)
+#endif // if defined(FEAT_TERMRESPONSE) || defined(FEAT_GUI_GTK)
/// Return true if "str" starts with a backslash that should be removed.
/// For WIN32 this is only done when the character after the
diff --git a/src/nvim/cursor_shape.c b/src/nvim/cursor_shape.c
index 87064b4ef3..2e98b8f512 100644
--- a/src/nvim/cursor_shape.c
+++ b/src/nvim/cursor_shape.c
@@ -135,9 +135,7 @@ char_u *parse_shape_opt(int what)
p += len;
if (!VIM_ISDIGIT(*p))
return (char_u *)N_("E548: digit expected");
- int64_t digits = getdigits(&p);
- assert(digits <= INT_MAX);
- int n = (int)digits;
+ int n = getdigits_int(&p);
if (len == 3) { /* "ver" or "hor" */
if (n == 0)
return (char_u *)N_("E549: Illegal percentage");
diff --git a/src/nvim/diff.c b/src/nvim/diff.c
index ccff4520dc..b8fa3c24a2 100644
--- a/src/nvim/diff.c
+++ b/src/nvim/diff.c
@@ -1221,11 +1221,11 @@ static void diff_read(int idx_orig, int idx_new, char_u *fname)
// {first}a{first}[,{last}]
// {first}[,{last}]d{first}
p = linebuf;
- f1 = getdigits(&p);
+ f1 = getdigits_long(&p);
if (*p == ',') {
++p;
- l1 = getdigits(&p);
+ l1 = getdigits_long(&p);
} else {
l1 = f1;
}
@@ -1235,11 +1235,11 @@ static void diff_read(int idx_orig, int idx_new, char_u *fname)
continue;
}
difftype = *p++;
- f2 = getdigits(&p);
+ f2 = getdigits_long(&p);
if (*p == ',') {
++p;
- l2 = getdigits(&p);
+ l2 = getdigits_long(&p);
} else {
l2 = f2;
}
@@ -1783,7 +1783,7 @@ int diffopt_changed(void)
diff_flags_new |= DIFF_FILLER;
} else if ((STRNCMP(p, "context:", 8) == 0) && VIM_ISDIGIT(p[8])) {
p += 8;
- diff_context_new = getdigits(&p);
+ diff_context_new = getdigits_int(&p);
} else if (STRNCMP(p, "icase", 5) == 0) {
p += 5;
diff_flags_new |= DIFF_ICASE;
@@ -1798,7 +1798,7 @@ int diffopt_changed(void)
diff_flags_new |= DIFF_VERTICAL;
} else if ((STRNCMP(p, "foldcolumn:", 11) == 0) && VIM_ISDIGIT(p[11])) {
p += 11;
- diff_foldcolumn_new = getdigits(&p);
+ diff_foldcolumn_new = getdigits_int(&p);
}
if ((*p != ',') && (*p != NUL)) {
diff --git a/src/nvim/digraph.c b/src/nvim/digraph.c
index 2b5fdea2fe..243468b680 100644
--- a/src/nvim/digraph.c
+++ b/src/nvim/digraph.c
@@ -1611,9 +1611,7 @@ void putdigraph(char_u *str)
EMSG(_(e_number_exp));
return;
}
- int64_t digits = getdigits(&str);
- assert(digits <= INT_MAX);
- int n = (int)digits;
+ int n = getdigits_int(&str);
// If the digraph already exists, replace the result.
dp = (digr_T *)user_digraphs.ga_data;
diff --git a/src/nvim/edit.c b/src/nvim/edit.c
index e1a1fb18fa..4c00547daa 100644
--- a/src/nvim/edit.c
+++ b/src/nvim/edit.c
@@ -5800,7 +5800,7 @@ void set_last_insert(int c)
last_insert_skip = 0;
}
-#if defined(EXITFREE) || defined(PROTO)
+#if defined(EXITFREE)
void free_last_insert(void)
{
free(last_insert);
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
index 744fb13447..1833461fa9 100644
--- a/src/nvim/eval.c
+++ b/src/nvim/eval.c
@@ -76,6 +76,7 @@
#include "nvim/tag.h"
#include "nvim/tempfile.h"
#include "nvim/term.h"
+#include "nvim/ui.h"
#include "nvim/mouse.h"
#include "nvim/undo.h"
#include "nvim/version.h"
@@ -499,7 +500,7 @@ void eval_init(void)
job_event_pool = kmp_init(JobEventPool);
}
-#if defined(EXITFREE) || defined(PROTO)
+#if defined(EXITFREE)
void eval_clear(void)
{
struct vimvar *p;
@@ -2750,7 +2751,7 @@ void ex_lockvar(exarg_T *eap)
if (eap->forceit)
deep = -1;
else if (vim_isdigit(*arg)) {
- deep = getdigits(&arg);
+ deep = getdigits_int(&arg);
arg = skipwhite(arg);
}
@@ -4498,7 +4499,7 @@ static int get_string_tv(char_u **arg, typval_T *rettv, int evaluate)
{
char_u *p;
char_u *name;
- int extra = 0;
+ unsigned int extra = 0;
/*
* Find the end of the string, skipping backslashed characters.
@@ -4847,7 +4848,6 @@ list_equal (
return item1 == NULL && item2 == NULL;
}
-#if defined(PROTO)
/*
* Return the dictitem that an entry in a hashtable points to.
*/
@@ -4855,12 +4855,6 @@ dictitem_T *dict_lookup(hashitem_T *hi)
{
return HI2DI(hi);
}
-#endif
-
-dictitem_T * dict_lookup(hashitem_T *hi)
-{
- return HI2DI(hi);
-}
/*
* Return TRUE when two dictionaries have exactly the same key/values.
@@ -5129,7 +5123,7 @@ void list_append_list(list_T *list, list_T *itemlist)
li->li_tv.v_lock = 0;
li->li_tv.vval.v_list = itemlist;
list_append(list, li);
- ++list->lv_refcount;
+ ++itemlist->lv_refcount;
}
/*
@@ -5543,49 +5537,48 @@ int garbage_collect(void)
return did_free;
}
-/*
- * Free lists and dictionaries that are no longer referenced.
- */
+/// Free lists and dictionaries that are no longer referenced.
+///
+/// Note: This function may only be called from garbage_collect().
+///
+/// @param copyID Free lists/dictionaries that don't have this ID.
+/// @return true, if something was freed.
static int free_unref_items(int copyID)
{
- dict_T *dd;
- list_T *ll;
- int did_free = FALSE;
+ bool did_free = false;
- /*
- * Go through the list of dicts and free items without the copyID.
- */
- for (dd = first_dict; dd != NULL; )
+ // Go through the list of dicts and free items without the copyID.
+ for (dict_T *dd = first_dict; dd != NULL; ) {
if ((dd->dv_copyID & COPYID_MASK) != (copyID & COPYID_MASK)) {
- /* Free the Dictionary and ordinary items it contains, but don't
- * recurse into Lists and Dictionaries, they will be in the list
- * of dicts or list of lists. */
+ // Free the Dictionary and ordinary items it contains, but don't
+ // recurse into Lists and Dictionaries, they will be in the list
+ // of dicts or list of lists. */
+ dict_T *dd_next = dd->dv_used_next;
dict_free(dd, FALSE);
- did_free = TRUE;
-
- /* restart, next dict may also have been freed */
- dd = first_dict;
- } else
+ did_free = true;
+ dd = dd_next;
+ } else {
dd = dd->dv_used_next;
+ }
+ }
- /*
- * Go through the list of lists and free items without the copyID.
- * But don't free a list that has a watcher (used in a for loop), these
- * are not referenced anywhere.
- */
- for (ll = first_list; ll != NULL; )
+ // Go through the list of lists and free items without the copyID.
+ // But don't free a list that has a watcher (used in a for loop), these
+ // are not referenced anywhere.
+ for (list_T *ll = first_list; ll != NULL;) {
if ((ll->lv_copyID & COPYID_MASK) != (copyID & COPYID_MASK)
&& ll->lv_watch == NULL) {
- /* Free the List and ordinary items it contains, but don't recurse
- * into Lists and Dictionaries, they will be in the list of dicts
- * or list of lists. */
+ // Free the List and ordinary items it contains, but don't recurse
+ // into Lists and Dictionaries, they will be in the list of dicts
+ // or list of lists.
+ list_T* ll_next = ll->lv_used_next;
list_free(ll, FALSE);
- did_free = TRUE;
-
- /* restart, next list may also have been freed */
- ll = first_list;
- } else
+ did_free = true;
+ ll = ll_next;
+ } else {
ll = ll->lv_used_next;
+ }
+ }
return did_free;
}
@@ -5717,6 +5710,7 @@ dict_free (
/* Lock the hashtab, we don't want it to resize while freeing items. */
hash_lock(&d->dv_hashtab);
+ assert(d->dv_hashtab.ht_locked > 0);
todo = (int)d->dv_hashtab.ht_used;
for (hi = d->dv_hashtab.ht_array; todo > 0; ++hi) {
if (!HASHITEM_EMPTY(hi)) {
@@ -10023,6 +10017,8 @@ static void f_has(typval_T *argvars, typval_T *rettv)
#endif
} else if (STRICMP(name, "syntax_items") == 0) {
n = syntax_present(curwin);
+ } else if (STRICMP(name, "gui_running") == 0) {
+ n = ui_rgb_attached();
}
}
@@ -13370,7 +13366,7 @@ static void f_setreg(typval_T *argvars, typval_T *rettv)
yank_type = MBLOCK;
if (VIM_ISDIGIT(stropt[1])) {
++stropt;
- block_len = getdigits(&stropt) - 1;
+ block_len = getdigits_long(&stropt) - 1;
--stropt;
}
break;
@@ -14440,7 +14436,7 @@ static void f_synIDattr(typval_T *argvars, typval_T *rettv)
if (modec != 't' && modec != 'c' && modec != 'g')
modec = 0; /* replace invalid with current */
} else {
- if (t_colors > 1)
+ if (abstract_ui || t_colors > 1)
modec = 'c';
else
modec = 't';
@@ -18047,7 +18043,7 @@ static ufunc_T *find_func(char_u *name)
return NULL;
}
-#if defined(EXITFREE) || defined(PROTO)
+#if defined(EXITFREE)
void free_all_functions(void)
{
hashitem_T *hi;
diff --git a/src/nvim/ex_cmds.c b/src/nvim/ex_cmds.c
index 3278de3561..763a2d6212 100644
--- a/src/nvim/ex_cmds.c
+++ b/src/nvim/ex_cmds.c
@@ -569,7 +569,7 @@ void ex_retab(exarg_T *eap)
save_list = curwin->w_p_list;
curwin->w_p_list = 0; /* don't want list mode here */
- new_ts = getdigits(&(eap->arg));
+ new_ts = getdigits_int(&(eap->arg));
if (new_ts < 0) {
EMSG(_(e_positive));
return;
@@ -825,7 +825,7 @@ void ex_copy(linenr_T line1, linenr_T line2, linenr_T n)
static char_u *prevcmd = NULL; /* the previous command */
-#if defined(EXITFREE) || defined(PROTO)
+#if defined(EXITFREE)
void free_prev_shellcmd(void)
{
free(prevcmd);
@@ -2978,9 +2978,7 @@ do_ecmd (
lnum = curwin->w_cursor.lnum;
topline = curwin->w_topline;
if (!oldbuf) { /* need to read the file */
-#if defined(HAS_SWAP_EXISTS_ACTION)
swap_exists_action = SEA_DIALOG;
-#endif
curbuf->b_flags |= BF_CHECK_RO; /* set/reset 'ro' flag */
/*
@@ -2989,11 +2987,9 @@ do_ecmd (
if (should_abort(open_buffer(FALSE, eap, readfile_flags)))
retval = FAIL;
-#if defined(HAS_SWAP_EXISTS_ACTION)
if (swap_exists_action == SEA_QUIT)
retval = FAIL;
handle_swap_exists(old_curbuf);
-#endif
} else {
/* Read the modelines, but only to set window-local options. Any
* buffer-local options have already been set and may have been
@@ -3674,7 +3670,7 @@ void do_sub(exarg_T *eap)
*/
cmd = skipwhite(cmd);
if (VIM_ISDIGIT(*cmd)) {
- i = getdigits(&cmd);
+ i = getdigits_long(&cmd);
if (i <= 0 && !eap->skip && do_error) {
EMSG(_(e_zerocount));
return;
@@ -4609,7 +4605,7 @@ void write_viminfo_sub_string(FILE *fp)
}
}
-#if defined(EXITFREE) || defined(PROTO)
+#if defined(EXITFREE)
void free_old_sub(void)
{
free(old_sub);
@@ -5920,7 +5916,7 @@ void ex_sign(exarg_T *eap)
arg1 = arg;
if (VIM_ISDIGIT(*arg))
{
- id = getdigits(&arg);
+ id = getdigits_int(&arg);
if (!vim_iswhite(*arg) && *arg != NUL)
{
id = -1;
@@ -5985,7 +5981,7 @@ void ex_sign(exarg_T *eap)
else if (STRNCMP(arg, "buffer=", 7) == 0)
{
arg += 7;
- buf = buflist_findnr((int)getdigits(&arg));
+ buf = buflist_findnr(getdigits_int(&arg));
if (*skipwhite(arg) != NUL)
EMSG(_(e_trailing));
break;
@@ -6184,7 +6180,7 @@ char_u * sign_typenr2name(int typenr)
return (char_u *)_("[Deleted]");
}
-#if defined(EXITFREE) || defined(PROTO)
+#if defined(EXITFREE)
/*
* Undefine/free all signs.
*/
diff --git a/src/nvim/ex_cmds2.c b/src/nvim/ex_cmds2.c
index 072972d24e..7de47cb296 100644
--- a/src/nvim/ex_cmds2.c
+++ b/src/nvim/ex_cmds2.c
@@ -471,7 +471,7 @@ dbg_parsearg (
else if (
gap != &prof_ga &&
VIM_ISDIGIT(*p)) {
- bp->dbg_lnum = getdigits(&p);
+ bp->dbg_lnum = getdigits_long(&p);
p = skipwhite(p);
} else
bp->dbg_lnum = 0;
@@ -2546,7 +2546,7 @@ void ex_scriptnames(exarg_T *eap)
}
}
-# if defined(BACKSLASH_IN_FILENAME) || defined(PROTO)
+# if defined(BACKSLASH_IN_FILENAME)
/*
* Fix slashes in the list of script names for 'shellslash'.
*/
@@ -2579,7 +2579,7 @@ char_u *get_scriptname(scid_T id)
return SCRIPT_ITEM(id).sn_name;
}
-# if defined(EXITFREE) || defined(PROTO)
+# if defined(EXITFREE)
void free_scriptnames()
{
# define FREE_SCRIPTNAME(item) free((item)->sn_name)
@@ -3204,7 +3204,7 @@ static char_u **find_locales(void)
return (char_u **)locales_ga.ga_data;
}
-# if defined(EXITFREE) || defined(PROTO)
+# if defined(EXITFREE)
void free_locales(void)
{
int i;
diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c
index ca79270fcc..b4dfe99aed 100644
--- a/src/nvim/ex_docmd.c
+++ b/src/nvim/ex_docmd.c
@@ -1733,7 +1733,7 @@ static char_u * do_one_cmd(char_u **cmdlinep,
if ((ea.argt & COUNT) && VIM_ISDIGIT(*ea.arg)
&& (!(ea.argt & BUFNAME) || *(p = skipdigits(ea.arg)) == NUL
|| vim_iswhite(*p))) {
- n = getdigits(&ea.arg);
+ n = getdigits_long(&ea.arg);
ea.arg = skipwhite(ea.arg);
if (n <= 0 && !ni && (ea.argt & ZEROR) == 0) {
errormsg = (char_u *)_(e_zerocount);
@@ -3250,7 +3250,7 @@ get_address (
default:
if (VIM_ISDIGIT(*cmd)) /* absolute line number */
- lnum = getdigits(&cmd);
+ lnum = getdigits_long(&cmd);
}
for (;; ) {
@@ -3267,7 +3267,7 @@ get_address (
if (!VIM_ISDIGIT(*cmd)) /* '+' is '+1', but '+0' is not '+1' */
n = 1;
else
- n = getdigits(&cmd);
+ n = getdigits_long(&cmd);
if (i == '-')
lnum -= n;
else
@@ -4439,7 +4439,7 @@ two_count:
return FAIL;
}
- *def = getdigits(&p);
+ *def = getdigits_long(&p);
*argt |= (ZEROR | NOTADR);
if (p != val + vallen || vallen == 0) {
@@ -4456,7 +4456,7 @@ invalid_count:
if (*def >= 0)
goto two_count;
- *def = getdigits(&p);
+ *def = getdigits_long(&p);
if (p != val + vallen)
goto invalid_count;
@@ -5530,7 +5530,7 @@ void alist_new(void)
alist_init(curwin->w_alist);
}
-#if !defined(UNIX) || defined(PROTO)
+#if !defined(UNIX)
/*
* Expand the file names in the global argument list.
* If "fnum_list" is not NULL, use "fnum_list[fnum_len]" as a list of buffer
@@ -5623,7 +5623,7 @@ alist_add (
++al->al_ga.ga_len;
}
-#if defined(BACKSLASH_IN_FILENAME) || defined(PROTO)
+#if defined(BACKSLASH_IN_FILENAME)
/*
* Adjust slashes in file names. Called after 'shellslash' was set.
*/
@@ -5819,7 +5819,7 @@ static void ex_tabmove(exarg_T *eap)
return;
}
- tab_number = getdigits(&p);
+ tab_number = getdigits_int(&p);
if (relative != 0)
tab_number = tab_number * relative + tabpage_index(curtab) - 1; ;
} else if (eap->addr_count != 0)
@@ -6256,7 +6256,7 @@ static void ex_read(exarg_T *eap)
static char_u *prev_dir = NULL;
-#if defined(EXITFREE) || defined(PROTO)
+#if defined(EXITFREE)
void free_cd_dir(void)
{
free(prev_dir);
@@ -6441,10 +6441,10 @@ static void ex_winsize(exarg_T *eap)
char_u *arg = eap->arg;
char_u *p;
- w = getdigits(&arg);
+ w = getdigits_int(&arg);
arg = skipwhite(arg);
p = arg;
- h = getdigits(&arg);
+ h = getdigits_int(&arg);
if (*p != NUL && *arg == NUL)
screen_resize(w, h, TRUE);
else
@@ -6494,10 +6494,10 @@ static void ex_winpos(exarg_T *eap)
if (*arg == NUL) {
EMSG(_("E188: Obtaining window position not implemented for this platform"));
} else {
- x = getdigits(&arg);
+ x = getdigits_int(&arg);
arg = skipwhite(arg);
p = arg;
- y = getdigits(&arg);
+ y = getdigits_int(&arg);
if (*p == NUL || *arg != NUL) {
EMSG(_("E466: :winpos requires two number arguments"));
return;
@@ -6744,7 +6744,7 @@ static void ex_later(exarg_T *eap)
if (*p == NUL)
count = 1;
else if (isdigit(*p)) {
- count = getdigits(&p);
+ count = getdigits_long(&p);
switch (*p) {
case 's': ++p; sec = TRUE; break;
case 'm': ++p; sec = TRUE; count *= 60; break;
@@ -7354,7 +7354,7 @@ static void ex_findpat(exarg_T *eap)
n = 1;
if (vim_isdigit(*eap->arg)) { /* get count */
- n = getdigits(&eap->arg);
+ n = getdigits_long(&eap->arg);
eap->arg = skipwhite(eap->arg);
}
if (*eap->arg == '/') { /* Match regexp, not just whole words */
@@ -7618,7 +7618,7 @@ eval_vars (
s = src + 1;
if (*s == '<') /* "#<99" uses v:oldfiles */
++s;
- i = (int)getdigits(&s);
+ i = getdigits_int(&s);
*usedlen = (int)(s - src); /* length of what we expand */
if (src[1] == '<') {
diff --git a/src/nvim/ex_getln.c b/src/nvim/ex_getln.c
index 3ce8263457..b942f69f61 100644
--- a/src/nvim/ex_getln.c
+++ b/src/nvim/ex_getln.c
@@ -1972,7 +1972,7 @@ static void realloc_cmdbuff(int len)
static char_u *arshape_buf = NULL;
-# if defined(EXITFREE) || defined(PROTO)
+# if defined(EXITFREE)
void free_cmdline_buf(void)
{
free(arshape_buf);
diff --git a/src/nvim/fileio.c b/src/nvim/fileio.c
index 58e67fa58c..370584b095 100644
--- a/src/nvim/fileio.c
+++ b/src/nvim/fileio.c
@@ -636,14 +636,12 @@ readfile (
#endif
}
-#if defined(HAS_SWAP_EXISTS_ACTION)
/* If "Quit" selected at ATTENTION dialog, don't load the file */
if (swap_exists_action == SEA_QUIT) {
if (!read_buffer && !read_stdin)
close(fd);
return FAIL;
}
-#endif
++no_wait_return; /* don't wait for return yet */
@@ -5149,7 +5147,7 @@ void write_lnum_adjust(linenr_T offset)
curbuf->b_no_eol_lnum += offset;
}
-#if defined(BACKSLASH_IN_FILENAME) || defined(PROTO)
+#if defined(BACKSLASH_IN_FILENAME)
/*
* Convert all backslashes in fname to forward slashes in-place.
*/
@@ -5547,7 +5545,7 @@ void do_augroup(char_u *arg, int del_group)
}
}
-#if defined(EXITFREE) || defined(PROTO)
+#if defined(EXITFREE)
void free_all_autocmds(void)
{
for (current_augroup = -1; current_augroup < augroups.ga_len;
@@ -7454,7 +7452,7 @@ file_pat_to_reg_pat (
return reg_pat;
}
-#if defined(EINTR) || defined(PROTO)
+#if defined(EINTR)
/*
* Version of read() that retries when interrupted by EINTR (possibly
* by a SIGWINCH).
diff --git a/src/nvim/garray.c b/src/nvim/garray.c
index c4f8f66bfe..c3a3426e87 100644
--- a/src/nvim/garray.c
+++ b/src/nvim/garray.c
@@ -199,7 +199,7 @@ void ga_append(garray_T *gap, char c)
GA_APPEND(char, gap, c);
}
-#if defined(UNIX) || defined(WIN3264) || defined(PROTO)
+#if defined(UNIX) || defined(WIN3264)
/// Append the text in "gap" below the cursor line and clear "gap".
///
diff --git a/src/nvim/getchar.c b/src/nvim/getchar.c
index e12601e4c9..d97c983133 100644
--- a/src/nvim/getchar.c
+++ b/src/nvim/getchar.c
@@ -1307,7 +1307,7 @@ static void closescript(void)
--curscript;
}
-#if defined(EXITFREE) || defined(PROTO)
+#if defined(EXITFREE)
void close_all_scripts(void)
{
while (scriptin[0] != NULL)
diff --git a/src/nvim/globals.h b/src/nvim/globals.h
index 11a7e9ecac..73bcdea226 100644
--- a/src/nvim/globals.h
+++ b/src/nvim/globals.h
@@ -859,7 +859,6 @@ EXTERN int cmd_silent INIT(= FALSE); /* don't echo the command line */
#define SEA_QUIT 2 /* quit editing the file */
#define SEA_RECOVER 3 /* recover the file */
-#define HAS_SWAP_EXISTS_ACTION
EXTERN int swap_exists_action INIT(= SEA_NONE);
/* For dialog when swap file already
* exists. */
diff --git a/src/nvim/hardcopy.c b/src/nvim/hardcopy.c
index f1f619066a..92abcbada4 100644
--- a/src/nvim/hardcopy.c
+++ b/src/nvim/hardcopy.c
@@ -10,9 +10,11 @@
* hardcopy.c: printing to paper
*/
+#include <assert.h>
#include <errno.h>
#include <string.h>
#include <inttypes.h>
+#include <stdint.h>
#include "nvim/vim.h"
#include "nvim/ascii.h"
@@ -82,11 +84,11 @@
* void mch_print_set_font(int Bold, int Italic, int Underline);
* Called whenever the font style changes.
*
- * void mch_print_set_bg(long_u bgcol);
+ * void mch_print_set_bg(uint32_t bgcol);
* Called to set the background color for the following text. Parameter is an
* RGB value.
*
- * void mch_print_set_fg(long_u fgcol);
+ * void mch_print_set_fg(uint32_t fgcol);
* Called to set the foreground color for the following text. Parameter is an
* RGB value.
*
@@ -124,30 +126,28 @@ static option_table_T printer_opts[OPT_PRINT_NUM_OPTIONS]
;
-static const long_u cterm_color_8[8] =
-{
- (long_u)0x000000L, (long_u)0xff0000L, (long_u)0x00ff00L, (long_u)0xffff00L,
- (long_u)0x0000ffL, (long_u)0xff00ffL, (long_u)0x00ffffL, (long_u)0xffffffL
+static const uint32_t cterm_color_8[8] = {
+ 0x000000, 0xff0000, 0x00ff00, 0xffff00,
+ 0x0000ff, 0xff00ff, 0x00ffff, 0xffffff
};
-static const long_u cterm_color_16[16] =
-{
- (long_u)0x000000L, (long_u)0x0000c0L, (long_u)0x008000L, (long_u)0x004080L,
- (long_u)0xc00000L, (long_u)0xc000c0L, (long_u)0x808000L, (long_u)0xc0c0c0L,
- (long_u)0x808080L, (long_u)0x6060ffL, (long_u)0x00ff00L, (long_u)0x00ffffL,
- (long_u)0xff8080L, (long_u)0xff40ffL, (long_u)0xffff00L, (long_u)0xffffffL
+static const uint32_t cterm_color_16[16] = {
+ 0x000000, 0x0000c0, 0x008000, 0x004080,
+ 0xc00000, 0xc000c0, 0x808000, 0xc0c0c0,
+ 0x808080, 0x6060ff, 0x00ff00, 0x00ffff,
+ 0xff8080, 0xff40ff, 0xffff00, 0xffffff
};
static int current_syn_id;
-#define PRCOLOR_BLACK (long_u)0
-#define PRCOLOR_WHITE (long_u)0xFFFFFFL
+#define PRCOLOR_BLACK 0
+#define PRCOLOR_WHITE 0xffffff
static int curr_italic;
static int curr_bold;
static int curr_underline;
-static long_u curr_bg;
-static long_u curr_fg;
+static uint32_t curr_bg;
+static uint32_t curr_fg;
static int page_count;
# define OPT_MBFONT_USECOURIER 0
@@ -176,7 +176,7 @@ typedef struct {
int print_pos; /* virtual column for computing TABs */
colnr_T column; /* byte column */
linenr_T file_line; /* line nr in the buffer */
- long_u bytes_printed; /* bytes printed so far */
+ size_t bytes_printed; /* bytes printed so far */
int ff; /* seen form feed character */
} prt_pos_T;
@@ -321,7 +321,7 @@ static char_u *parse_list_options(char_u *option_str, option_table_T *table, int
if (!VIM_ISDIGIT(*p))
return (char_u *)N_("E552: digit expected");
- table[idx].number = getdigits(&p); /*advances p*/
+ table[idx].number = getdigits_int(&p);
}
table[idx].string = p;
@@ -340,14 +340,14 @@ static char_u *parse_list_options(char_u *option_str, option_table_T *table, int
* If using a dark background, the colors will probably be too bright to show
* up well on white paper, so reduce their brightness.
*/
-static long_u darken_rgb(long_u rgb)
+static uint32_t darken_rgb(uint32_t rgb)
{
return ((rgb >> 17) << 16)
+ (((rgb & 0xff00) >> 9) << 8)
+ ((rgb & 0xff) >> 1);
}
-static long_u prt_get_term_color(int colorindex)
+static uint32_t prt_get_term_color(int colorindex)
{
/* TODO: Should check for xterm with 88 or 256 colors. */
if (t_colors > 8)
@@ -358,8 +358,7 @@ static long_u prt_get_term_color(int colorindex)
static void prt_get_attr(int hl_id, prt_text_attr_T *pattr, int modec)
{
int colorindex;
- long_u fg_color;
- long_u bg_color;
+ uint32_t fg_color;
char *color;
pattr->bold = (highlight_has_attr(hl_id, HL_BOLD, modec) != NULL);
@@ -368,8 +367,6 @@ static void prt_get_attr(int hl_id, prt_text_attr_T *pattr, int modec)
pattr->undercurl = (highlight_has_attr(hl_id, HL_UNDERCURL, modec) != NULL);
{
- bg_color = PRCOLOR_WHITE;
-
color = (char *)highlight_color(hl_id, (char_u *)"fg", modec);
if (color == NULL)
colorindex = 0;
@@ -388,10 +385,10 @@ static void prt_get_attr(int hl_id, prt_text_attr_T *pattr, int modec)
fg_color = darken_rgb(fg_color);
pattr->fg_color = fg_color;
- pattr->bg_color = bg_color;
+ pattr->bg_color = PRCOLOR_WHITE;
}
-static void prt_set_fg(long_u fg)
+static void prt_set_fg(uint32_t fg)
{
if (fg != curr_fg) {
curr_fg = fg;
@@ -399,7 +396,7 @@ static void prt_set_fg(long_u fg)
}
}
-static void prt_set_bg(long_u bg)
+static void prt_set_bg(uint32_t bg)
{
if (bg != curr_bg) {
curr_bg = bg;
@@ -455,8 +452,9 @@ static void prt_line_number(prt_settings_T *psettings, int page_line, linenr_T l
*/
int prt_header_height(void)
{
- if (printer_opts[OPT_PRINT_HEADERHEIGHT].present)
+ if (printer_opts[OPT_PRINT_HEADERHEIGHT].present) {
return printer_opts[OPT_PRINT_HEADERHEIGHT].number;
+ }
return 2;
}
@@ -503,7 +501,8 @@ static void prt_header(prt_settings_T *psettings, int pagenum, linenr_T lnum)
if (prt_use_number())
width += PRINT_NUMBER_WIDTH;
- tbuf = xmalloc(width + IOSIZE);
+ assert(width >= 0);
+ tbuf = xmalloc((size_t)width + IOSIZE);
if (*p_header != NUL) {
linenr_T tmp_lnum, tmp_topline, tmp_botline;
@@ -524,7 +523,7 @@ static void prt_header(prt_settings_T *psettings, int pagenum, linenr_T lnum)
printer_page_num = pagenum;
use_sandbox = was_set_insecurely((char_u *)"printheader", 0);
- build_stl_str_hl(curwin, tbuf, (size_t)(width + IOSIZE),
+ build_stl_str_hl(curwin, tbuf, (size_t)width + IOSIZE,
p_header, use_sandbox,
' ', width, NULL, NULL);
@@ -582,7 +581,7 @@ void ex_hardcopy(exarg_T *eap)
linenr_T lnum;
int collated_copies, uncollated_copies;
prt_settings_T settings;
- long_u bytes_to_print = 0;
+ size_t bytes_to_print = 0;
int page_line;
int jobsplit;
@@ -655,15 +654,15 @@ void ex_hardcopy(exarg_T *eap)
* Estimate the total lines to be printed
*/
for (lnum = eap->line1; lnum <= eap->line2; lnum++)
- bytes_to_print += (long_u)STRLEN(skipwhite(ml_get(lnum)));
+ bytes_to_print += STRLEN(skipwhite(ml_get(lnum)));
if (bytes_to_print == 0) {
MSG(_("No text to be printed"));
goto print_fail_no_begin;
}
/* Set colors and font to normal. */
- curr_bg = (long_u)0xffffffffL;
- curr_fg = (long_u)0xffffffffL;
+ curr_bg = 0xffffffff;
+ curr_fg = 0xffffffff;
curr_italic = MAYBE;
curr_bold = MAYBE;
curr_underline = MAYBE;
@@ -728,13 +727,10 @@ void ex_hardcopy(exarg_T *eap)
if (got_int || settings.user_abort)
goto print_fail;
- sprintf((char *)IObuff, _("Printing page %d (%d%%)"),
- page_count + 1 + side,
- prtpos.bytes_printed > 1000000
- ? (int)(prtpos.bytes_printed /
- (bytes_to_print / 100))
- : (int)((prtpos.bytes_printed * 100)
- / bytes_to_print));
+ assert(prtpos.bytes_printed <= SIZE_MAX / 100);
+ sprintf((char *)IObuff, _("Printing page %d (%zu%%)"),
+ page_count + 1 + side,
+ prtpos.bytes_printed * 100 / bytes_to_print);
if (!mch_print_begin_page(IObuff))
goto print_fail;
@@ -820,7 +816,7 @@ static colnr_T hardcopy_line(prt_settings_T *psettings, int page_line, prt_pos_T
int need_break = FALSE;
int outputlen;
int tab_spaces;
- long_u print_pos;
+ int print_pos;
prt_text_attr_T attr;
int id;
@@ -900,7 +896,7 @@ static colnr_T hardcopy_line(prt_settings_T *psettings, int page_line, prt_pos_T
}
ppos->lead_spaces = tab_spaces;
- ppos->print_pos = (int)print_pos;
+ ppos->print_pos = print_pos;
/*
* Start next line of file if we clip lines, or have reached end of the
@@ -1240,19 +1236,19 @@ static char_u *prt_ps_file_name = NULL;
* Various offsets and dimensions in default PostScript user space (points).
* Used for text positioning calculations
*/
-static float prt_page_width;
-static float prt_page_height;
-static float prt_left_margin;
-static float prt_right_margin;
-static float prt_top_margin;
-static float prt_bottom_margin;
-static float prt_line_height;
-static float prt_first_line_height;
-static float prt_char_width;
-static float prt_number_width;
-static float prt_bgcol_offset;
-static float prt_pos_x_moveto = 0.0;
-static float prt_pos_y_moveto = 0.0;
+static double prt_page_width;
+static double prt_page_height;
+static double prt_left_margin;
+static double prt_right_margin;
+static double prt_top_margin;
+static double prt_bottom_margin;
+static double prt_line_height;
+static double prt_first_line_height;
+static double prt_char_width;
+static double prt_number_width;
+static double prt_bgcol_offset;
+static double prt_pos_x_moveto = 0.0;
+static double prt_pos_y_moveto = 0.0;
/*
* Various control variables used to decide when and how to change the
@@ -1266,13 +1262,13 @@ static int prt_need_underline;
static int prt_underline;
static int prt_do_underline;
static int prt_need_fgcol;
-static int prt_fgcol;
+static uint32_t prt_fgcol;
static int prt_need_bgcol;
static int prt_do_bgcol;
-static int prt_bgcol;
-static int prt_new_bgcol;
+static uint32_t prt_bgcol;
+static uint32_t prt_new_bgcol;
static int prt_attribute_change;
-static float prt_text_run;
+static double prt_text_run;
static int prt_page_num;
static int prt_bufsiz;
@@ -1304,11 +1300,10 @@ static int prt_half_width;
static char *prt_ascii_encoding;
static char_u prt_hexchar[] = "0123456789abcdef";
-static void prt_write_file_raw_len(char_u *buffer, int bytes)
+static void prt_write_file_raw_len(char_u *buffer, size_t bytes)
{
if (!prt_file_error
- && fwrite(buffer, sizeof(char_u), bytes, prt_ps_fd)
- != (size_t)bytes) {
+ && fwrite(buffer, sizeof(char_u), bytes, prt_ps_fd) != bytes) {
EMSG(_("E455: Error writing to PostScript output file"));
prt_file_error = TRUE;
}
@@ -1316,10 +1311,10 @@ static void prt_write_file_raw_len(char_u *buffer, int bytes)
static void prt_write_file(char_u *buffer)
{
- prt_write_file_len(buffer, (int)STRLEN(buffer));
+ prt_write_file_len(buffer, STRLEN(buffer));
}
-static void prt_write_file_len(char_u *buffer, int bytes)
+static void prt_write_file_len(char_u *buffer, size_t bytes)
{
prt_write_file_raw_len(buffer, bytes);
}
@@ -1398,15 +1393,11 @@ static void prt_dup_cidfont(char *original_name, char *new_name)
*/
static void prt_real_bits(double real, int precision, int *pinteger, int *pfraction)
{
- int i;
- int integer;
- float fraction;
-
- integer = (int)real;
- fraction = (float)(real - integer);
- if (real < (double)integer)
+ int integer = (int)real;
+ double fraction = real - integer;
+ if (real < integer)
fraction = -fraction;
- for (i = 0; i < precision; i++)
+ for (int i = 0; i < precision; i++)
fraction *= 10.0;
*pinteger = integer;
@@ -1463,7 +1454,7 @@ static void prt_flush_buffer(void)
if (!GA_EMPTY(&prt_ps_buffer)) {
/* Any background color must be drawn first */
if (prt_do_bgcol && (prt_new_bgcol != PRCOLOR_WHITE)) {
- int r, g, b;
+ unsigned int r, g, b;
if (prt_do_moveto) {
prt_write_real(prt_pos_x_moveto, 2);
@@ -1477,8 +1468,8 @@ static void prt_flush_buffer(void)
prt_write_real(prt_line_height, 2);
/* Lastly add the color of the background */
- r = ((unsigned)prt_new_bgcol & 0xff0000) >> 16;
- g = ((unsigned)prt_new_bgcol & 0xff00) >> 8;
+ r = (prt_new_bgcol & 0xff0000) >> 16;
+ g = (prt_new_bgcol & 0xff00) >> 8;
b = prt_new_bgcol & 0xff;
prt_write_real(r / 255.0, 3);
prt_write_real(g / 255.0, 3);
@@ -1505,7 +1496,8 @@ static void prt_flush_buffer(void)
prt_write_string("<");
else
prt_write_string("(");
- prt_write_file_raw_len(prt_ps_buffer.ga_data, prt_ps_buffer.ga_len);
+ assert(prt_ps_buffer.ga_len >= 0);
+ prt_write_file_raw_len(prt_ps_buffer.ga_data, (size_t)prt_ps_buffer.ga_len);
if (prt_out_mbyte)
prt_write_string(">");
else
@@ -1954,32 +1946,32 @@ void mch_print_cleanup(void)
}
}
-static float to_device_units(int idx, double physsize, int def_number)
+static double to_device_units(int idx, double physsize, int def_number)
{
- float ret;
- int u;
+ double ret;
int nr;
- u = prt_get_unit(idx);
+ int u = prt_get_unit(idx);
if (u == PRT_UNIT_NONE) {
u = PRT_UNIT_PERC;
nr = def_number;
- } else
+ } else {
nr = printer_opts[idx].number;
+ }
switch (u) {
case PRT_UNIT_INCH:
- ret = (float)(nr * PRT_PS_DEFAULT_DPI);
+ ret = nr * PRT_PS_DEFAULT_DPI;
break;
case PRT_UNIT_MM:
- ret = (float)(nr * PRT_PS_DEFAULT_DPI) / (float)25.4;
+ ret = nr * PRT_PS_DEFAULT_DPI / 25.4;
break;
case PRT_UNIT_POINT:
- ret = (float)nr;
+ ret = nr;
break;
case PRT_UNIT_PERC:
default:
- ret = (float)(physsize * nr) / 100;
+ ret = physsize * nr / 100;
break;
}
@@ -2022,7 +2014,8 @@ static int prt_get_cpl(void)
static void prt_build_cid_fontname(int font, char_u *name, int name_len)
{
- char *fontname = xstrndup((char *)name, name_len);
+ assert(name_len >= 0);
+ char *fontname = xstrndup((char *)name, (size_t)name_len);
prt_ps_mb_font.ps_fontname[font] = fontname;
}
@@ -2408,7 +2401,7 @@ static int prt_add_resource(struct prt_ps_resource_S *resource)
}
if (bytes_read == 0)
break;
- prt_write_file_raw_len(resource_buffer, (int)bytes_read);
+ prt_write_file_raw_len(resource_buffer, bytes_read);
if (prt_file_error) {
fclose(fd_resource);
return FALSE;
@@ -2851,8 +2844,8 @@ int mch_print_begin_page(char_u *str)
prt_dsc_noarg("EndPageSetup");
/* We have reset the font attributes, force setting them again. */
- curr_bg = (long_u)0xffffffff;
- curr_fg = (long_u)0xffffffff;
+ curr_bg = 0xffffffff;
+ curr_fg = 0xffffffff;
curr_bold = MAYBE;
return !prt_file_error;
@@ -2863,8 +2856,8 @@ int mch_print_blank_page(void)
return mch_print_begin_page(NULL) ? (mch_print_end_page()) : FALSE;
}
-static float prt_pos_x = 0;
-static float prt_pos_y = 0;
+static double prt_pos_x = 0;
+static double prt_pos_y = 0;
void mch_print_start_line(int margin, int page_line)
{
@@ -2885,8 +2878,8 @@ int mch_print_text_out(char_u *p, int len)
int need_break;
char_u ch;
char_u ch_buff[8];
- float char_width;
- float next_pos;
+ double char_width;
+ double next_pos;
int in_ascii;
int half_width;
@@ -2959,9 +2952,9 @@ int mch_print_text_out(char_u *p, int len)
prt_need_font = FALSE;
}
if (prt_need_fgcol) {
- int r, g, b;
- r = ((unsigned)prt_fgcol & 0xff0000) >> 16;
- g = ((unsigned)prt_fgcol & 0xff00) >> 8;
+ unsigned int r, g, b;
+ r = (prt_fgcol & 0xff0000) >> 16;
+ g = (prt_fgcol & 0xff00) >> 8;
b = prt_fgcol & 0xff;
prt_write_real(r / 255.0, 3);
@@ -3003,9 +2996,9 @@ int mch_print_text_out(char_u *p, int len)
*/
do {
ch = prt_hexchar[(unsigned)(*p) >> 4];
- ga_append(&prt_ps_buffer, ch);
+ ga_append(&prt_ps_buffer, (char)ch);
ch = prt_hexchar[(*p) & 0xf];
- ga_append(&prt_ps_buffer, ch);
+ ga_append(&prt_ps_buffer, (char)ch);
p++;
} while (--len);
} else {
@@ -3032,13 +3025,13 @@ int mch_print_text_out(char_u *p, int len)
default:
sprintf((char *)ch_buff, "%03o", (unsigned int)ch);
- ga_append(&prt_ps_buffer, ch_buff[0]);
- ga_append(&prt_ps_buffer, ch_buff[1]);
- ga_append(&prt_ps_buffer, ch_buff[2]);
+ ga_append(&prt_ps_buffer, (char)ch_buff[0]);
+ ga_append(&prt_ps_buffer, (char)ch_buff[1]);
+ ga_append(&prt_ps_buffer, (char)ch_buff[2]);
break;
}
} else
- ga_append(&prt_ps_buffer, ch);
+ ga_append(&prt_ps_buffer, (char)ch);
}
/* Need to free any translated characters */
@@ -3080,17 +3073,17 @@ void mch_print_set_font(int iBold, int iItalic, int iUnderline)
}
}
-void mch_print_set_bg(long_u bgcol)
+void mch_print_set_bg(uint32_t bgcol)
{
- prt_bgcol = (int)bgcol;
+ prt_bgcol = bgcol;
prt_attribute_change = TRUE;
prt_need_bgcol = TRUE;
}
-void mch_print_set_fg(long_u fgcol)
+void mch_print_set_fg(uint32_t fgcol)
{
- if (fgcol != (long_u)prt_fgcol) {
- prt_fgcol = (int)fgcol;
+ if (fgcol != prt_fgcol) {
+ prt_fgcol = fgcol;
prt_attribute_change = TRUE;
prt_need_fgcol = TRUE;
}
diff --git a/src/nvim/hardcopy.h b/src/nvim/hardcopy.h
index fa171db989..4ead8dd5d4 100644
--- a/src/nvim/hardcopy.h
+++ b/src/nvim/hardcopy.h
@@ -1,12 +1,14 @@
#ifndef NVIM_HARDCOPY_H
#define NVIM_HARDCOPY_H
+#include <stdint.h>
+
/*
* Structure to hold printing color and font attributes.
*/
typedef struct {
- long_u fg_color;
- long_u bg_color;
+ uint32_t fg_color;
+ uint32_t bg_color;
int bold;
int italic;
int underline;
@@ -38,7 +40,7 @@ typedef struct {
typedef struct {
const char *name;
int hasnum;
- long number;
+ int number;
char_u *string; /* points into option string */
int strlen;
int present;
diff --git a/src/nvim/indent_c.c b/src/nvim/indent_c.c
index 39ad512227..56276db3ce 100644
--- a/src/nvim/indent_c.c
+++ b/src/nvim/indent_c.c
@@ -1463,9 +1463,7 @@ void parse_cino(buf_T *buf)
if (*p == '-')
++p;
char_u *digits_start = p; /* remember where the digits start */
- int64_t digits = getdigits(&p);
- assert(digits <= INT_MAX);
- int n = (int)digits;
+ int n = getdigits_int(&p);
divider = 0;
if (*p == '.') { /* ".5s" means a fraction */
fraction = atoi((char *)++p);
@@ -1678,9 +1676,7 @@ int get_c_indent(void)
else if (*p == COM_LEFT || *p == COM_RIGHT)
align = *p++;
else if (VIM_ISDIGIT(*p) || *p == '-') {
- int64_t digits = getdigits(&p);
- assert(digits <= INT_MAX);
- off = (int)digits;
+ off = getdigits_int(&p);
}
else
++p;
diff --git a/src/nvim/keymap.c b/src/nvim/keymap.c
index 33eaf35555..251926c01a 100644
--- a/src/nvim/keymap.c
+++ b/src/nvim/keymap.c
@@ -487,7 +487,7 @@ char_u *get_special_key_name(int c, int modifiers)
* If there is a match, srcp is advanced to after the <> name.
* dst[] must be big enough to hold the result (up to six characters)!
*/
-int
+unsigned int
trans_special (
char_u **srcp,
char_u *dst,
@@ -729,9 +729,9 @@ int get_special_key_code(char_u *name)
return 0;
}
-char_u *get_key_name(int i)
+char_u *get_key_name(size_t i)
{
- if (i >= (int)KEY_NAMES_TABLE_LEN)
+ if (i >= KEY_NAMES_TABLE_LEN)
return NULL;
return key_names_table[i].name;
}
diff --git a/src/nvim/keymap.h b/src/nvim/keymap.h
index 94ea095ace..c82a95c00c 100644
--- a/src/nvim/keymap.h
+++ b/src/nvim/keymap.h
@@ -97,9 +97,6 @@
/* Used a termcap entry that produces a normal character. */
#define KS_KEY 242
-/* Used for the qnx pterm mouse. */
-#define KS_PTERM_MOUSE 241
-
/* Used for click in a tab pages label. */
#define KS_TABLINE 240
@@ -412,7 +409,6 @@ enum key_extra {
#define K_NETTERM_MOUSE TERMCAP2KEY(KS_NETTERM_MOUSE, KE_FILLER)
#define K_DEC_MOUSE TERMCAP2KEY(KS_DEC_MOUSE, KE_FILLER)
-#define K_PTERM_MOUSE TERMCAP2KEY(KS_PTERM_MOUSE, KE_FILLER)
#define K_URXVT_MOUSE TERMCAP2KEY(KS_URXVT_MOUSE, KE_FILLER)
#define K_SGR_MOUSE TERMCAP2KEY(KS_SGR_MOUSE, KE_FILLER)
diff --git a/src/nvim/main.c b/src/nvim/main.c
index 1f6c8ddc81..05b9778102 100644
--- a/src/nvim/main.c
+++ b/src/nvim/main.c
@@ -149,10 +149,6 @@ void early_init(void)
(void)mb_init(); // init mb_bytelen_tab[] to ones
eval_init(); // init global variables
-#ifdef __QNXNTO__
- qnx_init(); // PhAttach() for clipboard, (and gui)
-#endif
-
// Init the table of Normal mode commands.
init_normal_cmds();
@@ -265,10 +261,7 @@ int main(int argc, char **argv)
if (params.want_full_screen && !silent_mode) {
if (embedded_mode) {
- // In embedded mode don't do terminal-related initializations, assume an
- // initial screen size of 80x20
- full_screen = true;
- screen_resize(80, 20, false);
+ // embedded mode implies abstract_ui
termcapinit((uint8_t *)"abstract_ui");
} else {
// set terminal name and get terminal capabilities (will set full_screen)
@@ -282,7 +275,9 @@ int main(int argc, char **argv)
event_init();
if (abstract_ui) {
+ full_screen = true;
t_colors = 256;
+ T_CCO = (uint8_t *)"256";
} else {
// Print a warning if stdout is not a terminal TODO(tarruda): Remove this
// check once the new terminal UI is implemented
@@ -1564,19 +1559,15 @@ static void handle_quickfix(mparm_T *paramp)
static void handle_tag(char_u *tagname)
{
if (tagname != NULL) {
-#if defined(HAS_SWAP_EXISTS_ACTION)
swap_exists_did_quit = FALSE;
-#endif
vim_snprintf((char *)IObuff, IOSIZE, "ta %s", tagname);
do_cmdline_cmd(IObuff);
TIME_MSG("jumping to tag");
-#if defined(HAS_SWAP_EXISTS_ACTION)
/* If the user doesn't want to edit the file then we quit here. */
if (swap_exists_did_quit)
getout(1);
-#endif
}
}
@@ -1611,10 +1602,8 @@ static void read_stdin(void)
{
int i;
-#if defined(HAS_SWAP_EXISTS_ACTION)
/* When getting the ATTENTION prompt here, use a dialog */
swap_exists_action = SEA_DIALOG;
-#endif
no_wait_return = TRUE;
i = msg_didany;
set_buflisted(TRUE);
@@ -1622,9 +1611,7 @@ static void read_stdin(void)
no_wait_return = FALSE;
msg_didany = i;
TIME_MSG("reading stdin");
-#if defined(HAS_SWAP_EXISTS_ACTION)
check_swap_exists_action();
-#endif
/*
* Close stdin and dup it from stderr. Required for GPM to work
* properly, and for running external commands.
@@ -1706,16 +1693,13 @@ static void create_windows(mparm_T *parmp)
/* Set 'foldlevel' to 'foldlevelstart' if it's not negative. */
if (p_fdls >= 0)
curwin->w_p_fdl = p_fdls;
-#if defined(HAS_SWAP_EXISTS_ACTION)
/* When getting the ATTENTION prompt here, use a dialog */
swap_exists_action = SEA_DIALOG;
-#endif
set_buflisted(TRUE);
/* create memfile, read file */
(void)open_buffer(FALSE, NULL, 0);
-#if defined(HAS_SWAP_EXISTS_ACTION)
if (swap_exists_action == SEA_QUIT) {
if (got_int || only_one_window()) {
/* abort selected or quit and only one window */
@@ -1730,7 +1714,6 @@ static void create_windows(mparm_T *parmp)
swap_exists_action = SEA_NONE;
} else
handle_swap_exists(NULL);
-#endif
dorewind = TRUE; /* start again */
}
os_breakcheck();
@@ -1801,13 +1784,10 @@ static void edit_buffers(mparm_T *parmp)
curwin->w_arg_idx = arg_idx;
/* Edit file from arg list, if there is one. When "Quit" selected
* at the ATTENTION prompt close the window. */
-# ifdef HAS_SWAP_EXISTS_ACTION
swap_exists_did_quit = FALSE;
-# endif
(void)do_ecmd(0, arg_idx < GARGCOUNT
? alist_name(&GARGLIST[arg_idx]) : NULL,
NULL, NULL, ECMD_LASTL, ECMD_HIDE, curwin);
-# ifdef HAS_SWAP_EXISTS_ACTION
if (swap_exists_did_quit) {
/* abort or quit selected */
if (got_int || only_one_window()) {
@@ -1818,7 +1798,6 @@ static void edit_buffers(mparm_T *parmp)
win_close(curwin, TRUE);
advance = FALSE;
}
-# endif
if (arg_idx == GARGCOUNT - 1)
arg_had_last = TRUE;
++arg_idx;
@@ -2219,7 +2198,6 @@ static void usage(void)
mch_exit(0);
}
-#if defined(HAS_SWAP_EXISTS_ACTION)
/*
* Check the result of the ATTENTION dialog:
* When "Quit" selected, exit Vim.
@@ -2232,5 +2210,4 @@ static void check_swap_exists_action(void)
handle_swap_exists(NULL);
}
-#endif
diff --git a/src/nvim/mark.c b/src/nvim/mark.c
index 4ded438f52..cfc702f189 100644
--- a/src/nvim/mark.c
+++ b/src/nvim/mark.c
@@ -127,6 +127,7 @@ int setmark_pos(int c, pos_T *pos, int fnum)
return OK;
}
if (isupper(c)) {
+ assert(c >= 'A' && c <= 'Z');
i = c - 'A';
namedfm[i].fmark.mark = *pos;
namedfm[i].fmark.fnum = fnum;
@@ -1179,7 +1180,7 @@ void set_last_cursor(win_T *win)
win->w_buffer->b_last_cursor = win->w_cursor;
}
-#if defined(EXITFREE) || defined(PROTO)
+#if defined(EXITFREE)
void free_all_marks(void)
{
int i;
@@ -1219,13 +1220,15 @@ int read_viminfo_filemark(vir_T *virp, int force)
}
} else if (VIM_ISDIGIT(*str))
fm = &namedfm[*str - '0' + NMARKS];
- else
+ else { // is uppercase
+ assert(*str >= 'A' && *str <= 'Z');
fm = &namedfm[*str - 'A'];
+ }
if (fm != NULL && (fm->fmark.mark.lnum == 0 || force)) {
str = skipwhite(str + 1);
- fm->fmark.mark.lnum = getdigits(&str);
+ fm->fmark.mark.lnum = getdigits_long(&str);
str = skipwhite(str);
- fm->fmark.mark.col = getdigits(&str);
+ fm->fmark.mark.col = getdigits_int(&str);
fm->fmark.mark.coladd = 0;
fm->fmark.fnum = 0;
str = skipwhite(str);
diff --git a/src/nvim/mbyte.c b/src/nvim/mbyte.c
index 3274c8d8ec..bc8f768724 100644
--- a/src/nvim/mbyte.c
+++ b/src/nvim/mbyte.c
@@ -106,8 +106,6 @@
#include "nvim/os/os.h"
#include "nvim/arabic.h"
-#define WINBYTE BYTE
-
typedef struct {
int rangeStart;
int rangeEnd;
@@ -365,10 +363,6 @@ enc_alias_table[] =
{NULL, 0}
};
-#ifndef CP_UTF8
-# define CP_UTF8 65001 /* magic number from winnls.h */
-#endif
-
/*
* Find encoding "name" in the list of canonical encoding names.
* Returns -1 if not found.
@@ -3452,7 +3446,7 @@ char_u * enc_locale(void)
return enc_canonize((char_u *)buf);
}
-# if defined(USE_ICONV) || defined(PROTO)
+# if defined(USE_ICONV)
/*
@@ -3591,7 +3585,7 @@ static char_u * iconv_string(vimconv_T *vcp, char_u *str, int slen, int *unconvl
return result;
}
-# if defined(DYNAMIC_ICONV) || defined(PROTO)
+# if defined(DYNAMIC_ICONV)
/*
* Dynamically load the "iconv.dll" on Win32.
*/
diff --git a/src/nvim/memline.c b/src/nvim/memline.c
index f6246c8b57..1fa6d6acc6 100644
--- a/src/nvim/memline.c
+++ b/src/nvim/memline.c
@@ -3000,7 +3000,7 @@ static void ml_lineadd(buf_T *buf, int count)
}
}
-#if defined(HAVE_READLINK) || defined(PROTO)
+#if defined(HAVE_READLINK)
/*
* Resolve a symlink in the last component of a file name.
* Note that f_resolve() does it for every part of the path, we don't do that
@@ -3367,9 +3367,7 @@ findswapname (
* for the current file, and the buffer was not recovered. */
if (differ == FALSE && !(curbuf->b_flags & BF_RECOVERED)
&& vim_strchr(p_shm, SHM_ATTENTION) == NULL) {
-#if defined(HAS_SWAP_EXISTS_ACTION)
int choice = 0;
-#endif
#ifdef UNIX
process_still_running = FALSE;
@@ -3427,7 +3425,6 @@ findswapname (
redraw_all_later(NOT_VALID);
}
-#if defined(HAS_SWAP_EXISTS_ACTION)
if (choice > 0) {
switch (choice) {
case 1:
@@ -3454,7 +3451,6 @@ findswapname (
if (!os_file_exists(fname))
break;
} else
-#endif
{
MSG_PUTS("\n");
if (msg_silent == 0)
diff --git a/src/nvim/memory.c b/src/nvim/memory.c
index f38dfd56ac..a2274a25fe 100644
--- a/src/nvim/memory.c
+++ b/src/nvim/memory.c
@@ -440,7 +440,7 @@ void do_outofmem_msg(size_t size)
}
}
-#if defined(EXITFREE) || defined(PROTO)
+#if defined(EXITFREE)
#include "nvim/file_search.h"
#include "nvim/buffer.h"
diff --git a/src/nvim/menu.c b/src/nvim/menu.c
index b31b6c1cec..9c1ca71477 100644
--- a/src/nvim/menu.c
+++ b/src/nvim/menu.c
@@ -120,7 +120,7 @@ ex_menu (
break;
if (vim_iswhite(*p)) {
for (i = 0; i < MENUDEPTH && !vim_iswhite(*arg); ++i) {
- pri_tab[i] = getdigits(&arg);
+ pri_tab[i] = getdigits_int(&arg);
if (pri_tab[i] == 0)
pri_tab[i] = 500;
if (*arg == '.')
@@ -1359,7 +1359,7 @@ void ex_emenu(exarg_T *eap)
#if defined(FEAT_GUI_MSWIN) \
|| defined(FEAT_GUI_GTK) \
- || defined(FEAT_BEVAL_TIP) || defined(PROTO)
+ || defined(FEAT_BEVAL_TIP)
/*
* Given a menu descriptor, e.g. "File.New", find it in the menu hierarchy.
*/
diff --git a/src/nvim/message.c b/src/nvim/message.c
index 46e0a1a0df..9cd3814826 100644
--- a/src/nvim/message.c
+++ b/src/nvim/message.c
@@ -10,8 +10,6 @@
* message.c: functions for displaying messages on the command line
*/
-#define MESSAGE_FILE /* don't include prototype for smsg() */
-
#include <assert.h>
#include <errno.h>
#include <inttypes.h>
diff --git a/src/nvim/misc1.c b/src/nvim/misc1.c
index 4f17f84e11..f756201efb 100644
--- a/src/nvim/misc1.c
+++ b/src/nvim/misc1.c
@@ -525,7 +525,7 @@ open_line (
if (*p == COM_RIGHT || *p == COM_LEFT)
c = *p++;
else if (VIM_ISDIGIT(*p) || *p == '-')
- off = getdigits(&p);
+ off = getdigits_int(&p);
else
++p;
}
@@ -2662,7 +2662,7 @@ void init_homedir(void)
}
}
-#if defined(EXITFREE) || defined(PROTO)
+#if defined(EXITFREE)
void free_homedir(void)
{
free(homedir);
diff --git a/src/nvim/msgpack_rpc/channel.c b/src/nvim/msgpack_rpc/channel.c
index 4c35cce09a..c8f8252e6d 100644
--- a/src/nvim/msgpack_rpc/channel.c
+++ b/src/nvim/msgpack_rpc/channel.c
@@ -45,6 +45,7 @@ typedef struct {
typedef struct {
uint64_t id;
+ size_t pending_requests;
PMap(cstr_t) *subscribed_events;
bool is_job, closed;
msgpack_unpacker *unpacker;
@@ -83,7 +84,6 @@ static uint64_t next_id = 1;
static PMap(uint64_t) *channels = NULL;
static PMap(cstr_t) *event_strings = NULL;
static msgpack_sbuffer out_buffer;
-static size_t pending_requests = 0;
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "msgpack_rpc/channel.c.generated.h"
@@ -103,14 +103,7 @@ void channel_init(void)
}
if (abstract_ui) {
- // Add handler for "attach_ui"
remote_ui_init();
- String method = cstr_as_string("attach_ui");
- MsgpackRpcRequestHandler handler = {.fn = remote_ui_attach, .defer = true};
- msgpack_rpc_add_method_handler(method, handler);
- method = cstr_as_string("detach_ui");
- handler.fn = remote_ui_detach;
- msgpack_rpc_add_method_handler(method, handler);
}
}
@@ -200,20 +193,21 @@ bool channel_send_event(uint64_t id, char *name, Array args)
return false;
}
- if (pending_requests) {
- DelayedNotification p = {
- .channel = channel,
- .method = cstr_to_string(name),
- .args = args
- };
- // Pending request, queue the notification for sending later
- *kl_pushp(DelayedNotification, delayed_notifications) = p;
- } else {
- if (channel) {
- send_event(channel, name, args);
+ if (channel) {
+ if (channel->pending_requests) {
+ DelayedNotification p = {
+ .channel = channel,
+ .method = cstr_to_string(name),
+ .args = args
+ };
+ // Pending request, queue the notification for sending later
+ *kl_pushp(DelayedNotification, delayed_notifications) = p;
} else {
- broadcast_event(name, args);
+ send_event(channel, name, args);
}
+ } else {
+ // TODO(tarruda): Implement event broadcasting in vimscript
+ broadcast_event(name, args);
}
return true;
@@ -246,10 +240,10 @@ Object channel_send_call(uint64_t id,
// Push the frame
ChannelCallFrame frame = {request_id, false, false, NIL};
kv_push(ChannelCallFrame *, channel->call_stack, &frame);
- pending_requests++;
+ channel->pending_requests++;
event_poll_until(-1, frame.returned);
(void)kv_pop(channel->call_stack);
- pending_requests--;
+ channel->pending_requests--;
if (frame.errored) {
api_set_error(err, Exception, "%s", frame.result.data.string.data);
@@ -261,7 +255,7 @@ Object channel_send_call(uint64_t id,
free_channel(channel);
}
- if (!pending_requests) {
+ if (!channel->pending_requests) {
send_delayed_notifications();
}
@@ -644,6 +638,7 @@ static void close_channel(Channel *channel)
uv_handle_t *handle = (uv_handle_t *)channel->data.streams.uv;
if (handle) {
uv_close(handle, close_cb);
+ free_channel(channel);
} else {
event_push((Event) { .handler = on_stdio_close }, false);
}
@@ -687,6 +682,7 @@ static Channel *register_channel(void)
rv->closed = false;
rv->unpacker = msgpack_unpacker_new(MSGPACK_UNPACKER_INIT_BUFFER_SIZE);
rv->id = next_id++;
+ rv->pending_requests = 0;
rv->subscribed_events = pmap_new(cstr_t)();
rv->next_request_id = 1;
kv_init(rv->call_stack);
diff --git a/src/nvim/msgpack_rpc/remote_ui.c b/src/nvim/msgpack_rpc/remote_ui.c
index f980a77b4c..361e93a6da 100644
--- a/src/nvim/msgpack_rpc/remote_ui.c
+++ b/src/nvim/msgpack_rpc/remote_ui.c
@@ -26,18 +26,44 @@ static PMap(uint64_t) *connected_uis = NULL;
void remote_ui_init(void)
{
connected_uis = pmap_new(uint64_t)();
+ // Add handler for "attach_ui"
+ String method = cstr_as_string("ui_attach");
+ MsgpackRpcRequestHandler handler = {.fn = remote_ui_attach, .defer = false};
+ msgpack_rpc_add_method_handler(method, handler);
+ method = cstr_as_string("ui_detach");
+ handler.fn = remote_ui_detach;
+ msgpack_rpc_add_method_handler(method, handler);
+ method = cstr_as_string("ui_try_resize");
+ handler.fn = remote_ui_try_resize;
+ msgpack_rpc_add_method_handler(method, handler);
}
-Object remote_ui_attach(uint64_t channel_id, uint64_t request_id, Array args,
- Error *error)
+void remote_ui_disconnect(uint64_t channel_id)
+{
+ UI *ui = pmap_get(uint64_t)(connected_uis, channel_id);
+ if (!ui) {
+ return;
+ }
+ UIData *data = ui->data;
+ // destroy pending screen updates
+ api_free_array(data->buffer);
+ pmap_del(uint64_t)(connected_uis, channel_id);
+ free(ui->data);
+ ui_detach(ui);
+ free(ui);
+}
+
+static Object remote_ui_attach(uint64_t channel_id, uint64_t request_id,
+ Array args, Error *error)
{
if (pmap_has(uint64_t)(connected_uis, channel_id)) {
api_set_error(error, Exception, _("UI already attached for channel"));
return NIL;
}
- if (args.size != 2 || args.items[0].type != kObjectTypeInteger
+ if (args.size != 3 || args.items[0].type != kObjectTypeInteger
|| args.items[1].type != kObjectTypeInteger
+ || args.items[2].type != kObjectTypeBoolean
|| args.items[0].data.integer <= 0 || args.items[1].data.integer <= 0) {
api_set_error(error, Validation,
_("Arguments must be a pair of positive integers "
@@ -50,6 +76,7 @@ Object remote_ui_attach(uint64_t channel_id, uint64_t request_id, Array args,
UI *ui = xcalloc(1, sizeof(UI));
ui->width = (int)args.items[0].data.integer;
ui->height = (int)args.items[1].data.integer;
+ ui->rgb = args.items[2].data.boolean;
ui->data = data;
ui->resize = remote_ui_resize;
ui->clear = remote_ui_clear;
@@ -67,16 +94,19 @@ Object remote_ui_attach(uint64_t channel_id, uint64_t request_id, Array args,
ui->put = remote_ui_put;
ui->bell = remote_ui_bell;
ui->visual_bell = remote_ui_visual_bell;
+ ui->update_fg = remote_ui_update_fg;
+ ui->update_bg = remote_ui_update_bg;
ui->flush = remote_ui_flush;
ui->suspend = remote_ui_suspend;
+ ui->set_title = remote_ui_set_title;
+ ui->set_icon = remote_ui_set_icon;
pmap_put(uint64_t)(connected_uis, channel_id, ui);
ui_attach(ui);
-
return NIL;
}
-Object remote_ui_detach(uint64_t channel_id, uint64_t request_id, Array args,
- Error *error)
+static Object remote_ui_detach(uint64_t channel_id, uint64_t request_id,
+ Array args, Error *error)
{
if (!pmap_has(uint64_t)(connected_uis, channel_id)) {
api_set_error(error, Exception, _("UI is not attached for channel"));
@@ -86,21 +116,30 @@ Object remote_ui_detach(uint64_t channel_id, uint64_t request_id, Array args,
return NIL;
}
-void remote_ui_disconnect(uint64_t channel_id)
+static Object remote_ui_try_resize(uint64_t channel_id, uint64_t request_id,
+ Array args, Error *error)
{
- UI *ui = pmap_get(uint64_t)(connected_uis, channel_id);
- if (!ui) {
- return;
+ if (!pmap_has(uint64_t)(connected_uis, channel_id)) {
+ api_set_error(error, Exception, _("UI is not attached for channel"));
}
- UIData *data = ui->data;
- // destroy pending screen updates
- api_free_array(data->buffer);
- pmap_del(uint64_t)(connected_uis, channel_id);
- free(ui->data);
- ui_detach(ui);
- free(ui);
+
+ if (args.size != 2 || args.items[0].type != kObjectTypeInteger
+ || args.items[1].type != kObjectTypeInteger
+ || args.items[0].data.integer <= 0 || args.items[1].data.integer <= 0) {
+ api_set_error(error, Validation,
+ _("Arguments must be a pair of positive integers "
+ "representing the remote screen width/height"));
+ return NIL;
+ }
+
+ UI *ui = pmap_get(uint64_t)(connected_uis, channel_id);
+ ui->width = (int)args.items[0].data.integer;
+ ui->height = (int)args.items[1].data.integer;
+ ui_refresh();
+ return NIL;
}
+
static void push_call(UI *ui, char *name, Array args)
{
Array call = ARRAY_DICT_INIT;
@@ -214,10 +253,6 @@ static void remote_ui_highlight_set(UI *ui, HlAttrs attrs)
PUT(hl, "bold", BOOLEAN_OBJ(true));
}
- if (attrs.standout) {
- PUT(hl, "standout", BOOLEAN_OBJ(true));
- }
-
if (attrs.underline) {
PUT(hl, "underline", BOOLEAN_OBJ(true));
}
@@ -266,6 +301,20 @@ static void remote_ui_visual_bell(UI *ui)
push_call(ui, "visual_bell", args);
}
+static void remote_ui_update_fg(UI *ui, int fg)
+{
+ Array args = ARRAY_DICT_INIT;
+ ADD(args, INTEGER_OBJ(fg));
+ push_call(ui, "update_fg", args);
+}
+
+static void remote_ui_update_bg(UI *ui, int bg)
+{
+ Array args = ARRAY_DICT_INIT;
+ ADD(args, INTEGER_OBJ(bg));
+ push_call(ui, "update_bg", args);
+}
+
static void remote_ui_flush(UI *ui)
{
UIData *data = ui->data;
@@ -275,6 +324,20 @@ static void remote_ui_flush(UI *ui)
static void remote_ui_suspend(UI *ui)
{
- UIData *data = ui->data;
- remote_ui_disconnect(data->channel_id);
+ Array args = ARRAY_DICT_INIT;
+ push_call(ui, "suspend", args);
+}
+
+static void remote_ui_set_title(UI *ui, char *title)
+{
+ Array args = ARRAY_DICT_INIT;
+ ADD(args, STRING_OBJ(cstr_to_string(title)));
+ push_call(ui, "set_title", args);
+}
+
+static void remote_ui_set_icon(UI *ui, char *icon)
+{
+ Array args = ARRAY_DICT_INIT;
+ ADD(args, STRING_OBJ(cstr_to_string(icon)));
+ push_call(ui, "set_icon", args);
}
diff --git a/src/nvim/normal.c b/src/nvim/normal.c
index 5a6cc92a33..5b138f2d88 100644
--- a/src/nvim/normal.c
+++ b/src/nvim/normal.c
@@ -389,6 +389,7 @@ static int find_command(int cmdchar)
/* If the character is in the first part: The character is the index into
* nv_cmd_idx[]. */
+ assert(nv_max_linear < (int)NV_CMDS_SIZE);
if (cmdchar <= nv_max_linear)
return nv_cmd_idx[cmdchar];
diff --git a/src/nvim/ops.c b/src/nvim/ops.c
index 3cefc9f623..8fb3ba7f08 100644
--- a/src/nvim/ops.c
+++ b/src/nvim/ops.c
@@ -2293,7 +2293,7 @@ void init_yank(void)
y_regs[i].y_array = NULL;
}
-#if defined(EXITFREE) || defined(PROTO)
+#if defined(EXITFREE)
void clear_registers(void)
{
int i;
@@ -4501,7 +4501,7 @@ int read_viminfo_register(vir_T *virp, int force)
y_current->y_type = MLINE;
/* get the block width; if it's missing we get a zero, which is OK */
str = skipwhite(skiptowhite(str));
- y_current->y_width = getdigits(&str);
+ y_current->y_width = getdigits_int(&str);
}
while (!(eof = viminfo_readline(virp))
diff --git a/src/nvim/option.c b/src/nvim/option.c
index 1c07bef3e3..88108b14a2 100644
--- a/src/nvim/option.c
+++ b/src/nvim/option.c
@@ -887,7 +887,7 @@ static struct vimoption
SCRIPTID_INIT},
{"history", "hi", P_NUM|P_VIM,
(char_u *)&p_hi, PV_NONE,
- {(char_u *)0L, (char_u *)20L} SCRIPTID_INIT},
+ {(char_u *)0L, (char_u *)50L} SCRIPTID_INIT},
{"hkmap", "hk", P_BOOL|P_VI_DEF|P_VIM,
(char_u *)&p_hkmap, PV_NONE,
{(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
@@ -2237,7 +2237,7 @@ void set_number_default(char *name, long val)
options[opt_idx].def_val[VI_DEFAULT] = (char_u *)val;
}
-#if defined(EXITFREE) || defined(PROTO)
+#if defined(EXITFREE)
/*
* Free all options.
*/
@@ -2918,7 +2918,7 @@ do_set (
*/
else if (varp == (char_u *)&p_bs
&& VIM_ISDIGIT(**(char_u **)varp)) {
- i = getdigits((char_u **)varp);
+ i = getdigits_int((char_u **)varp);
switch (i) {
case 0:
*(char_u **)varp = empty_option;
@@ -2943,7 +2943,7 @@ do_set (
else if (varp == (char_u *)&p_ww
&& VIM_ISDIGIT(*arg)) {
*errbuf = NUL;
- i = getdigits(&arg);
+ i = getdigits_int(&arg);
if (i & 1)
STRCAT(errbuf, "b,");
if (i & 2)
@@ -4359,7 +4359,7 @@ did_set_string_option (
/* set ru_wid if 'ruf' starts with "%99(" */
if (*++s == '-') /* ignore a '-' */
s++;
- wid = getdigits(&s);
+ wid = getdigits_int(&s);
if (wid && *s == '(' && (errmsg = check_stl_option(p_ruf)) == NULL)
ru_wid = wid;
else
@@ -4664,14 +4664,14 @@ char_u *check_colorcolumn(win_T *wp)
++s;
if (!VIM_ISDIGIT(*s))
return e_invarg;
- col = col * getdigits(&s);
+ col = col * getdigits_int(&s);
if (wp->w_buffer->b_p_tw == 0)
goto skip; /* 'textwidth' not set, skip this item */
col += wp->w_buffer->b_p_tw;
if (col < 0)
goto skip;
} else if (VIM_ISDIGIT(*s))
- col = getdigits(&s);
+ col = getdigits_int(&s);
else
return e_invarg;
color_cols[count++] = col - 1; /* 1-based to 0-based */
@@ -7257,7 +7257,6 @@ int ExpandSettings(expand_T *xp, regmatch_T *regmatch, int *num_file, char_u ***
{
int num_normal = 0; /* Nr of matching non-term-code settings */
int num_term = 0; /* Nr of matching terminal code settings */
- int opt_idx;
int match;
int count = 0;
char_u *str;
@@ -7283,7 +7282,7 @@ int ExpandSettings(expand_T *xp, regmatch_T *regmatch, int *num_file, char_u ***
(*file)[count++] = vim_strsave((char_u *)names[match]);
}
}
- for (opt_idx = 0; (str = (char_u *)options[opt_idx].fullname) != NULL;
+ for (size_t opt_idx = 0; (str = (char_u *)options[opt_idx].fullname) != NULL;
opt_idx++) {
if (options[opt_idx].var == NULL)
continue;
@@ -7326,7 +7325,7 @@ int ExpandSettings(expand_T *xp, regmatch_T *regmatch, int *num_file, char_u ***
* Check terminal key codes, these are not in the option table
*/
if (xp->xp_context != EXPAND_BOOL_SETTINGS && num_normal == 0) {
- for (opt_idx = 0; (str = get_termcode(opt_idx)) != NULL; opt_idx++) {
+ for (size_t opt_idx = 0; (str = get_termcode(opt_idx)) != NULL; opt_idx++) {
if (!isprint(str[0]) || !isprint(str[1]))
continue;
@@ -7363,7 +7362,7 @@ int ExpandSettings(expand_T *xp, regmatch_T *regmatch, int *num_file, char_u ***
* Check special key names.
*/
regmatch->rm_ic = TRUE; /* ignore case here */
- for (opt_idx = 0; (str = get_key_name(opt_idx)) != NULL; opt_idx++) {
+ for (size_t opt_idx = 0; (str = get_key_name(opt_idx)) != NULL; opt_idx++) {
name_buf[0] = '<';
STRCPY(name_buf + 1, str);
STRCAT(name_buf, ">");
@@ -8115,12 +8114,12 @@ static bool briopt_check(win_T *wp)
&& ((p[6] == '-' && VIM_ISDIGIT(p[7])) || VIM_ISDIGIT(p[6])))
{
p += 6;
- bri_shift = getdigits(&p);
+ bri_shift = getdigits_int(&p);
}
else if (STRNCMP(p, "min:", 4) == 0 && VIM_ISDIGIT(p[4]))
{
p += 4;
- bri_min = getdigits(&p);
+ bri_min = getdigits_long(&p);
}
else if (STRNCMP(p, "sbr", 3) == 0)
{
diff --git a/src/nvim/option_defs.h b/src/nvim/option_defs.h
index 8b36df3276..99e8e645b6 100644
--- a/src/nvim/option_defs.h
+++ b/src/nvim/option_defs.h
@@ -576,13 +576,12 @@ EXTERN char_u *p_ttym; /* 'ttymouse' */
EXTERN unsigned ttym_flags;
# ifdef IN_OPTION_C
static char *(p_ttym_values[]) =
-{"xterm", "xterm2", "dec", "netterm", "pterm", "urxvt", "sgr", NULL};
+{"xterm", "xterm2", "dec", "netterm", "urxvt", "sgr", NULL};
# endif
# define TTYM_XTERM 0x01
# define TTYM_XTERM2 0x02
# define TTYM_DEC 0x04
# define TTYM_NETTERM 0x08
-# define TTYM_PTERM 0x10
# define TTYM_URXVT 0x20
# define TTYM_SGR 0x40
#endif
diff --git a/src/nvim/os/input.c b/src/nvim/os/input.c
index cddc28fac9..2ae4558f3d 100644
--- a/src/nvim/os/input.c
+++ b/src/nvim/os/input.c
@@ -184,18 +184,24 @@ size_t input_enqueue(String keys)
while (rbuffer_available(input_buffer) >= 6 && ptr < end) {
uint8_t buf[6] = {0};
- int new_size = trans_special((uint8_t **)&ptr, buf, false);
+ unsigned int new_size = trans_special((uint8_t **)&ptr, buf, false);
if (!new_size) {
+ if (*ptr == '<') {
+ // Invalid key sequence, skip until the next '>' or until *end
+ do {
+ ptr++;
+ } while (ptr < end && *ptr != '>');
+ ptr++;
+ continue;
+ }
// copy the character unmodified
*buf = (uint8_t)*ptr++;
new_size = 1;
}
new_size = handle_mouse_event(&ptr, buf, new_size);
- // TODO(tarruda): Don't produce past unclosed '<' characters, except if
- // there's a lot of characters after the '<'
- rbuffer_write(input_buffer, (char *)buf, (size_t)new_size);
+ rbuffer_write(input_buffer, (char *)buf, new_size);
}
size_t rv = (size_t)(ptr - keys.data);
@@ -205,7 +211,8 @@ size_t input_enqueue(String keys)
// Mouse event handling code(Extract row/col if available and detect multiple
// clicks)
-static int handle_mouse_event(char **ptr, uint8_t *buf, int bufsize)
+static unsigned int handle_mouse_event(char **ptr, uint8_t *buf,
+ unsigned int bufsize)
{
int mouse_code = 0;
@@ -216,7 +223,8 @@ static int handle_mouse_event(char **ptr, uint8_t *buf, int bufsize)
mouse_code = buf[5];
}
- if (mouse_code < KE_LEFTMOUSE || mouse_code > KE_RIGHTRELEASE) {
+ if (!((mouse_code >= KE_LEFTMOUSE && mouse_code <= KE_RIGHTRELEASE)
+ || (mouse_code >= KE_MOUSEDOWN && mouse_code <= KE_MOUSERIGHT))) {
return bufsize;
}
@@ -225,7 +233,7 @@ static int handle_mouse_event(char **ptr, uint8_t *buf, int bufsize)
// find mouse coordinates, and it would be too expensive to refactor this
// now.
int col, row, advance;
- if (sscanf(*ptr, "<%d,%d>%n", &col, &row, &advance)) {
+ if (sscanf(*ptr, "<%d,%d>%n", &col, &row, &advance) != EOF && advance) {
if (col >= 0 && row >= 0) {
mouse_row = row;
mouse_col = col;
diff --git a/src/nvim/os/job.c b/src/nvim/os/job.c
index 17872ab9c9..8db5e3cc39 100644
--- a/src/nvim/os/job.c
+++ b/src/nvim/os/job.c
@@ -310,8 +310,15 @@ int job_wait(Job *job, int ms) FUNC_ATTR_NONNULL_ALL
// we'll assume that a user frantically hitting interrupt doesn't like
// the current job. Signal that it has to be killed.
if (got_int) {
+ got_int = false;
job_stop(job);
- event_poll(0);
+ if (ms == -1) {
+ // We can only return, if all streams/handles are closed and the job
+ // exited.
+ event_poll_until(-1, job->refcount == 1);
+ } else {
+ event_poll(0);
+ }
}
if (job->refcount == 1) {
diff --git a/src/nvim/os/shell.c b/src/nvim/os/shell.c
index d0f8442768..d481d6af56 100644
--- a/src/nvim/os/shell.c
+++ b/src/nvim/os/shell.c
@@ -24,7 +24,6 @@
#include "nvim/option_defs.h"
#include "nvim/charset.h"
#include "nvim/strings.h"
-#include "nvim/ui.h"
#define DYNAMIC_BUFFER_INIT {NULL, 0, 0}
@@ -414,6 +413,7 @@ static size_t write_output(char *output, size_t remaining, bool to_buffer,
char *start = output;
size_t off = 0;
+ int lastrow = (int)Rows - 1;
while (off < remaining) {
if (output[off] == NL) {
// Insert the line
@@ -421,10 +421,8 @@ static size_t write_output(char *output, size_t remaining, bool to_buffer,
if (to_buffer) {
ml_append(curwin->w_cursor.lnum++, (char_u *)output, 0, false);
} else {
- // pending data from the output buffer has been flushed to the screen,
- // safe to call ui_write directly
- ui_write((char_u *)output, (int)off);
- ui_write((char_u *)"\r\n", 2);
+ screen_del_lines(0, 0, 1, (int)Rows, true, NULL);
+ screen_puts_len((char_u *)output, (int)off, lastrow, 0, 0);
}
size_t skip = off + 1;
output += skip;
@@ -448,8 +446,8 @@ static size_t write_output(char *output, size_t remaining, bool to_buffer,
// remember that the NL was missing
curbuf->b_no_eol_lnum = curwin->w_cursor.lnum;
} else {
- ui_write((char_u *)output, (int)remaining);
- ui_write((char_u *)"\r\n", 2);
+ screen_del_lines(0, 0, 1, (int)Rows, true, NULL);
+ screen_puts_len((char_u *)output, (int)remaining, lastrow, 0, 0);
}
output += remaining;
} else if (to_buffer) {
diff --git a/src/nvim/os/time.c b/src/nvim/os/time.c
index 810ddea82b..b69be88fc7 100644
--- a/src/nvim/os/time.c
+++ b/src/nvim/os/time.c
@@ -80,11 +80,11 @@ struct tm *os_localtime_r(const time_t *restrict clock,
{
#ifdef UNIX
// POSIX provides localtime_r() as a thread-safe version of localtime().
- return localtime_r(clock, result);
+ return localtime_r(clock, result); // NOLINT(runtime/threadsafe_fn)
#else
// Windows version of localtime() is thread-safe.
// See http://msdn.microsoft.com/en-us/library/bf12f0hc%28VS.80%29.aspx
- struct tm *local_time = localtime(clock); // NOLINT
+ struct tm *local_time = localtime(clock); // NOLINT(runtime/threadsafe_fn)
if (!local_time) {
return NULL;
}
diff --git a/src/nvim/os_unix.c b/src/nvim/os_unix.c
index 7ec4059bce..f7b47f9569 100644
--- a/src/nvim/os_unix.c
+++ b/src/nvim/os_unix.c
@@ -43,6 +43,7 @@
#include "nvim/syntax.h"
#include "nvim/tempfile.h"
#include "nvim/term.h"
+#include "nvim/ui.h"
#include "nvim/types.h"
#include "nvim/os/os.h"
#include "nvim/os/time.h"
@@ -181,22 +182,26 @@ void mch_settitle(char_u *title, char_u *icon)
* Note: if "t_ts" is set, title is set with escape sequence rather
* than x11 calls, because the x11 calls don't always work
*/
- if ((type || *T_TS != NUL) && title != NULL) {
+ if ((type || *T_TS != NUL || abstract_ui) && title != NULL) {
if (oldtitle == NULL
) /* first call but not in GUI, save title */
(void)get_x11_title(FALSE);
- if (*T_TS != NUL) /* it's OK if t_fs is empty */
+ if (abstract_ui) {
+ ui_set_title((char *)title);
+ } else if (*T_TS != NUL) /* it's OK if t_fs is empty */
term_settitle(title);
did_set_title = TRUE;
}
- if ((type || *T_CIS != NUL) && icon != NULL) {
+ if ((type || *T_CIS != NUL || abstract_ui) && icon != NULL) {
if (oldicon == NULL
) /* first call, save icon */
get_x11_icon(FALSE);
- if (*T_CIS != NUL) {
+ if (abstract_ui) {
+ ui_set_icon((char *)icon);
+ } else if (*T_CIS != NUL) {
out_str(T_CIS); /* set icon start */
out_str_nf(icon);
out_str(T_CIE); /* set icon end */
@@ -270,7 +275,7 @@ int use_xterm_mouse(void)
return 0;
}
-#if defined(USE_FNAME_CASE) || defined(PROTO)
+#if defined(USE_FNAME_CASE)
/*
* Set the case of the file name, if it already exists. This will cause the
* file name to remain exactly the same.
@@ -326,7 +331,7 @@ int len /* buffer size, only used when name gets longer */
}
#endif
-#if defined(HAVE_ACL) || defined(PROTO)
+#if defined(HAVE_ACL)
# ifdef HAVE_SYS_ACL_H
# include <sys/acl.h>
# endif
@@ -335,7 +340,7 @@ int len /* buffer size, only used when name gets longer */
# endif
-#if defined(HAVE_SELINUX) || defined(PROTO)
+#if defined(HAVE_SELINUX)
/*
* Copy security info from "from_file" to "to_file".
*/
@@ -437,7 +442,7 @@ int mch_nodetype(char_u *name)
return NODE_WRITABLE;
}
-#if defined(EXITFREE) || defined(PROTO)
+#if defined(EXITFREE)
void mch_free_mem(void)
{
free(oldtitle);
diff --git a/src/nvim/path.c b/src/nvim/path.c
index 8af4015611..219dac12de 100644
--- a/src/nvim/path.c
+++ b/src/nvim/path.c
@@ -403,9 +403,9 @@ char_u *save_absolute_path(const char_u *name)
}
-#if !defined(NO_EXPANDPATH) || defined(PROTO)
+#if !defined(NO_EXPANDPATH)
-#if defined(UNIX) || defined(USE_UNIXFILENAME) || defined(PROTO)
+#if defined(UNIX) || defined(USE_UNIXFILENAME)
/*
* Unix style wildcard expansion code.
* It's here because it's used both for Unix and Mac.
@@ -1622,7 +1622,7 @@ int same_directory(char_u *f1, char_u *f2)
&& pathcmp((char *)ffname, (char *)f2, (int)(t1 - ffname)) == 0;
}
-#if !defined(NO_EXPANDPATH) || defined(PROTO)
+#if !defined(NO_EXPANDPATH)
/*
* Compare path "p[]" to "q[]".
* If "maxlen" >= 0 compare "p[maxlen]" to "q[maxlen]"
diff --git a/src/nvim/regexp.c b/src/nvim/regexp.c
index dd7af63ce0..fafd99c046 100644
--- a/src/nvim/regexp.c
+++ b/src/nvim/regexp.c
@@ -3082,10 +3082,10 @@ static int read_limits(long *minval, long *maxval)
reverse = TRUE;
}
first_char = regparse;
- *minval = getdigits(&regparse);
+ *minval = getdigits_long(&regparse);
if (*regparse == ',') { /* There is a comma */
if (vim_isdigit(*++regparse))
- *maxval = getdigits(&regparse);
+ *maxval = getdigits_long(&regparse);
else
*maxval = MAX_LIMIT;
} else if (VIM_ISDIGIT(*first_char))
@@ -3228,7 +3228,7 @@ static garray_T backpos = GA_EMPTY_INIT_VALUE;
#define REGSTACK_INITIAL 2048
#define BACKPOS_INITIAL 64
-#if defined(EXITFREE) || defined(PROTO)
+#if defined(EXITFREE)
void free_regexp_stuff(void)
{
ga_clear(&regstack);
diff --git a/src/nvim/screen.c b/src/nvim/screen.c
index 855c09619e..8f4f894128 100644
--- a/src/nvim/screen.c
+++ b/src/nvim/screen.c
@@ -4548,7 +4548,7 @@ static void screen_line(int row, int coloff, int endcol, int clear_width, int rl
int c;
c = fillchar_vsep(&hl);
- if (ScreenLines[off_to] != c
+ if (ScreenLines[off_to] != (schar_T)c
|| (enc_utf8 && (int)ScreenLinesUC[off_to]
!= (c >= 0x80 ? c : 0))
|| ScreenAttrs[off_to] != hl) {
@@ -5971,7 +5971,7 @@ void screen_stop_highlight(void)
*/
void reset_cterm_colors(void)
{
- if (t_colors > 1) {
+ if (!abstract_ui && t_colors > 1) {
/* set Normal cterm colors */
if (cterm_normal_fg_color > 0 || cterm_normal_bg_color > 0) {
out_str(T_OP);
@@ -6150,8 +6150,7 @@ void screen_fill(int start_row, int end_row, int start_col, int end_col, int c1,
return;
/* it's a "normal" terminal when not in a GUI or cterm */
- norm_term = (
- t_colors <= 1);
+ norm_term = (!abstract_ui && t_colors <= 1);
for (row = start_row; row < end_row; ++row) {
if (has_mbyte
) {
@@ -6675,8 +6674,8 @@ static void linecopy(int to, int from, win_T *wp)
*/
int can_clear(char_u *p)
{
- return *p != NUL && (t_colors <= 1
- || cterm_normal_bg_color == 0 || *T_UT != NUL);
+ return abstract_ui || (*p != NUL && (t_colors <= 1
+ || cterm_normal_bg_color == 0 || *T_UT != NUL));
}
/*
@@ -8186,8 +8185,13 @@ void screen_resize(int width, int height, int mustset)
Columns = width;
}
check_shellsize();
+ height = Rows;
+ width = Columns;
if (abstract_ui) {
+ // Clear the output buffer to ensure UIs don't receive redraw command meant
+ // for invalid screen sizes.
+ out_buf_clear();
ui_resize(width, height);
} else {
mch_set_shellsize();
diff --git a/src/nvim/search.c b/src/nvim/search.c
index 5158e6cd86..e2781f17d5 100644
--- a/src/nvim/search.c
+++ b/src/nvim/search.c
@@ -294,7 +294,7 @@ void restore_search_patterns(void)
}
}
-#if defined(EXITFREE) || defined(PROTO)
+#if defined(EXITFREE)
void free_search_patterns(void)
{
free(spats[0].pat);
@@ -3757,7 +3757,6 @@ current_quote (
/*
* Find next search match under cursor, cursor at end.
* Used while an operator is pending, and in Visual mode.
- * TODO: redo only works when used in operator pending mode
*/
int
current_search (
@@ -3792,7 +3791,7 @@ current_search (
orig_pos = pos = curwin->w_cursor;
/* Is the pattern is zero-width? */
- int one_char = is_one_char(spats[last_idx].pat);
+ int one_char = is_one_char(spats[last_idx].pat, true);
if (one_char == -1) {
p_ws = old_p_ws;
return FAIL; /* pattern not found */
@@ -3840,6 +3839,10 @@ current_search (
int flags = forward ? SEARCH_END : 0;
pos_T start_pos = pos;
+ /* Check again from the current cursor position,
+ * since the next match might actually be only one char wide */
+ one_char = is_one_char(spats[last_idx].pat, false);
+
/* move to match, except for zero-width matches, in which case, we are
* already on the next match */
if (!one_char)
@@ -3878,24 +3881,33 @@ current_search (
/*
* Check if the pattern is one character or zero-width.
+ * If move is true, check from the beginning of the buffer,
+ * else from the current cursor position.
* Returns TRUE, FALSE or -1 for failure.
*/
-static int is_one_char(char_u *pattern)
+static int is_one_char(char_u *pattern, bool move)
{
regmmatch_T regmatch;
int nmatched = 0;
int result = -1;
pos_T pos;
int save_called_emsg = called_emsg;
+ int flag = 0;
if (search_regcomp(pattern, RE_SEARCH, RE_SEARCH,
SEARCH_KEEP, &regmatch) == FAIL)
return -1;
/* move to match */
- clearpos(&pos);
+ if (move) {
+ clearpos(&pos);
+ } else {
+ pos = curwin->w_cursor;
+ /* accept a match at the cursor position */
+ flag = SEARCH_START;
+ }
if (searchit(curwin, curbuf, &pos, FORWARD, spats[last_idx].pat, 1,
- SEARCH_KEEP, RE_SEARCH, 0, NULL) != FAIL) {
+ SEARCH_KEEP + flag, RE_SEARCH, 0, NULL) != FAIL) {
/* Zero-width pattern should match somewhere, then we can check if
* start and end are in the same position. */
called_emsg = FALSE;
@@ -4599,7 +4611,7 @@ int read_viminfo_search_pattern(vir_T *virp, int force)
if (lp[4] == 'E')
off_end = SEARCH_END;
lp += 5;
- off = getdigits(&lp);
+ off = getdigits_long(&lp);
}
if (lp[0] == '~') { /* use this pattern for last-used pattern */
setlast = TRUE;
diff --git a/src/nvim/spell.c b/src/nvim/spell.c
index b8713909b8..5e69a935ca 100644
--- a/src/nvim/spell.c
+++ b/src/nvim/spell.c
@@ -5162,7 +5162,7 @@ static unsigned get_affitem(int flagtype, char_u **pp)
++*pp; // always advance, avoid getting stuck
return 0;
}
- res = getdigits(pp);
+ res = getdigits_int(pp);
} else {
res = mb_ptr2char_adv(pp);
if (flagtype == AFT_LONG || (flagtype == AFT_CAPLONG
@@ -5283,7 +5283,9 @@ static bool flag_in_afflist(int flagtype, char_u *afflist, unsigned flag)
case AFT_NUM:
for (p = afflist; *p != NUL; ) {
- n = getdigits(&p);
+ int digits = getdigits_int(&p);
+ assert(digits >= 0);
+ n = (unsigned int)digits;
if (n == flag)
return true;
if (*p != NUL) // skip over comma
@@ -6357,19 +6359,19 @@ int spell_check_msm(void)
if (!VIM_ISDIGIT(*p))
return FAIL;
// block count = (value * 1024) / SBLOCKSIZE (but avoid overflow)
- start = (getdigits(&p) * 10) / (SBLOCKSIZE / 102);
+ start = (getdigits_long(&p) * 10) / (SBLOCKSIZE / 102);
if (*p != ',')
return FAIL;
++p;
if (!VIM_ISDIGIT(*p))
return FAIL;
- incr = (getdigits(&p) * 102) / (SBLOCKSIZE / 10);
+ incr = (getdigits_long(&p) * 102) / (SBLOCKSIZE / 10);
if (*p != ',')
return FAIL;
++p;
if (!VIM_ISDIGIT(*p))
return FAIL;
- added = getdigits(&p) * 1024;
+ added = getdigits_long(&p) * 1024;
if (*p != NUL)
return FAIL;
@@ -8355,7 +8357,7 @@ int spell_check_sps(void)
f = 0;
if (VIM_ISDIGIT(*buf)) {
s = buf;
- sps_limit = getdigits(&s);
+ sps_limit = getdigits_int(&s);
if (*s != NUL && !VIM_ISDIGIT(*s))
f = -1;
} else if (STRCMP(buf, "best") == 0)
diff --git a/src/nvim/strings.c b/src/nvim/strings.c
index 25e4a6c93b..20fa35ed1c 100644
--- a/src/nvim/strings.c
+++ b/src/nvim/strings.c
@@ -329,7 +329,7 @@ void vim_strcat(char_u *restrict to, const char_u *restrict from,
STRCPY(to + tolen, from);
}
-#if (!defined(HAVE_STRCASECMP) && !defined(HAVE_STRICMP)) || defined(PROTO)
+#if (!defined(HAVE_STRCASECMP) && !defined(HAVE_STRICMP))
/*
* Compare two strings, ignoring case, using current locale.
* Doesn't work for multi-byte characters.
@@ -353,7 +353,7 @@ int vim_stricmp(const char *s1, const char *s2)
}
#endif
-#if (!defined(HAVE_STRNCASECMP) && !defined(HAVE_STRNICMP)) || defined(PROTO)
+#if (!defined(HAVE_STRNCASECMP) && !defined(HAVE_STRNICMP))
/*
* Compare two strings, for length "len", ignoring case, using current locale.
* Doesn't work for multi-byte characters.
diff --git a/src/nvim/syntax.c b/src/nvim/syntax.c
index 6787ca8080..3980a4d8e6 100644
--- a/src/nvim/syntax.c
+++ b/src/nvim/syntax.c
@@ -45,6 +45,7 @@
#include "nvim/strings.h"
#include "nvim/syntax_defs.h"
#include "nvim/term.h"
+#include "nvim/ui.h"
#include "nvim/os/os.h"
#include "nvim/os/time.h"
@@ -223,8 +224,6 @@ struct name_list {
#define ATTR_OFF (HL_ALL + 1)
-#define SYN_NAMELEN 50 /* maximum length of a syntax name */
-
static char *(spo_name_tab[SPO_COUNT]) =
{"ms=", "me=", "hs=", "he=", "rs=", "re=", "lc="};
@@ -4900,7 +4899,7 @@ static char_u *get_syn_pattern(char_u *arg, synpat_T *ci)
ci->sp_off_flags |= (1 << idx);
if (idx == SPO_LC_OFF) { /* lc=99 */
end += 3;
- *p = getdigits(&end);
+ *p = getdigits_int(&end);
/* "lc=" offset automatically sets "ms=" offset */
if (!(ci->sp_off_flags & (1 << SPO_MS_OFF))) {
@@ -4911,10 +4910,10 @@ static char_u *get_syn_pattern(char_u *arg, synpat_T *ci)
end += 4;
if (*end == '+') {
++end;
- *p = getdigits(&end); /* positive offset */
+ *p = getdigits_int(&end); /* positive offset */
} else if (*end == '-') {
++end;
- *p = -getdigits(&end); /* negative offset */
+ *p = -getdigits_int(&end); /* negative offset */
}
}
if (*end != ',')
@@ -4980,7 +4979,7 @@ static void syn_cmd_sync(exarg_T *eap, int syncing)
illegal = TRUE;
break;
}
- n = getdigits(&arg_end);
+ n = getdigits_long(&arg_end);
if (!eap->skip) {
if (key[4] == 'B')
curwin->w_s->b_syn_sync_linebreaks = n;
@@ -6036,6 +6035,7 @@ int load_colors(char_u *name)
apply_autocmds(EVENT_COLORSCHEME, name, curbuf->b_fname, FALSE, curbuf);
recursive = FALSE;
+ ui_refresh();
return retval;
}
@@ -6070,8 +6070,6 @@ do_highlight (
int error = FALSE;
int color;
int is_normal_group = FALSE; /* "Normal" group */
-# define is_menu_group 0
-# define is_tooltip_group 0
/*
* If no argument, list current highlighting.
@@ -6407,12 +6405,6 @@ do_highlight (
4+8, 4+8, 2+8, 2+8,
6+8, 6+8, 1+8, 1+8, 5+8,
5+8, 3+8, 3+8, 7+8, -1};
-#if defined(__QNXNTO__)
- static int *color_numbers_8_qansi = color_numbers_8;
- /* On qnx, the 8 & 16 color arrays are the same */
- if (STRNCMP(T_NAME, "qansi", 5) == 0)
- color_numbers_8_qansi = color_numbers_16;
-#endif
/* reduce calls to STRICMP a bit, it can be slow */
off = TOUPPER_ASC(*arg);
@@ -6433,11 +6425,7 @@ do_highlight (
if (color >= 0) {
if (t_colors == 8) {
/* t_Co is 8: use the 8 colors table */
-#if defined(__QNXNTO__)
- color = color_numbers_8_qansi[i];
-#else
color = color_numbers_8[i];
-#endif
if (key[5] == 'F') {
/* set/reset bold attribute to get light foreground
* colors (on some terminals, e.g. "linux") */
@@ -6448,8 +6436,7 @@ do_highlight (
HL_TABLE()[idx].sg_cterm &= ~HL_BOLD;
}
color &= 7; /* truncate to 8 colors */
- } else if (t_colors == 16 || t_colors == 88
- || t_colors == 256) {
+ } else if (t_colors == 16 || t_colors == 88 || t_colors == 256) {
/*
* Guess: if the termcap entry ends in 'm', it is
* probably an xterm-like terminal. Use the changed
@@ -6459,7 +6446,7 @@ do_highlight (
p = T_CAF;
else
p = T_CSF;
- if (*p != NUL && *(p + STRLEN(p) - 1) == 'm')
+ if (abstract_ui || (*p != NUL && *(p + STRLEN(p) - 1) == 'm'))
switch (t_colors) {
case 16:
color = color_numbers_8[i];
@@ -6593,7 +6580,7 @@ do_highlight (
* Copy characters from arg[] to buf[], translating <> codes.
*/
for (p = arg, off = 0; off < 100 - 6 && *p; ) {
- len = trans_special(&p, buf + off, FALSE);
+ len = (int)trans_special(&p, buf + off, FALSE);
if (len > 0) /* recognized special char */
off += len;
else /* copy as normal char */
@@ -6642,6 +6629,10 @@ do_highlight (
if (is_normal_group) {
HL_TABLE()[idx].sg_term_attr = 0;
HL_TABLE()[idx].sg_cterm_attr = 0;
+ if (abstract_ui) {
+ // If the normal group has changed, it is simpler to refresh every UI
+ ui_refresh();
+ }
} else
set_hl_attr(idx);
HL_TABLE()[idx].sg_scriptID = current_SID;
@@ -6654,7 +6645,7 @@ do_highlight (
need_highlight_changed = TRUE;
}
-#if defined(EXITFREE) || defined(PROTO)
+#if defined(EXITFREE)
void free_highlight(void)
{
for (int i = 0; i < highlight_ga.ga_len; ++i) {
@@ -6870,7 +6861,7 @@ int hl_combine_attr(int char_attr, int prim_attr)
if (char_attr <= HL_ALL && prim_attr <= HL_ALL)
return char_attr | prim_attr;
- if (t_colors > 1) {
+ if (abstract_ui || t_colors > 1) {
if (char_attr > HL_ALL)
char_aep = syn_cterm_attr2entry(char_attr);
if (char_aep != NULL)
@@ -6934,7 +6925,7 @@ int syn_attr2attr(int attr)
{
attrentry_T *aep;
- if (t_colors > 1)
+ if (abstract_ui || t_colors > 1)
aep = syn_cterm_attr2entry(attr);
else
aep = syn_term_attr2entry(attr);
@@ -7204,9 +7195,10 @@ set_hl_attr (
* For the color term mode: If there are other than "normal"
* highlighting attributes, need to allocate an attr number.
*/
- if (sgp->sg_cterm_fg == 0 && sgp->sg_cterm_bg == 0)
+ if (sgp->sg_cterm_fg == 0 && sgp->sg_cterm_bg == 0
+ && sgp->sg_rgb_fg == -1 && sgp->sg_rgb_bg == -1) {
sgp->sg_cterm_attr = sgp->sg_cterm;
- else {
+ } else {
at_en.ae_attr = abstract_ui ? sgp->sg_gui : sgp->sg_cterm;
at_en.ae_u.cterm.fg_color = sgp->sg_cterm_fg;
at_en.ae_u.cterm.bg_color = sgp->sg_cterm_bg;
@@ -7361,7 +7353,7 @@ int syn_id2attr(int hl_id)
hl_id = syn_get_final_id(hl_id);
sgp = &HL_TABLE()[hl_id - 1]; /* index is ID minus one */
- if (t_colors > 1)
+ if (abstract_ui || t_colors > 1)
attr = sgp->sg_cterm_attr;
else
attr = sgp->sg_term_attr;
diff --git a/src/nvim/tag.c b/src/nvim/tag.c
index fb39e069f0..bab594a27d 100644
--- a/src/nvim/tag.c
+++ b/src/nvim/tag.c
@@ -1981,7 +1981,7 @@ static void found_tagfile_cb(char_u *fname, void *cookie)
GA_APPEND(char_u *, &tag_fnames, vim_strsave(fname));
}
-#if defined(EXITFREE) || defined(PROTO)
+#if defined(EXITFREE)
void free_tag_stuff(void)
{
ga_clear_strings(&tag_fnames);
diff --git a/src/nvim/term.c b/src/nvim/term.c
index cf2b78394f..78fd3c6a67 100644
--- a/src/nvim/term.c
+++ b/src/nvim/term.c
@@ -22,6 +22,7 @@
*/
#define tgetstr tgetstr_defined_wrong
+#include <assert.h>
#include <errno.h>
#include <inttypes.h>
#include <stdbool.h>
@@ -169,6 +170,7 @@ static struct builtin_term builtin_termcaps[] =
{(int)KS_DL, "\033|d"},
{(int)KS_CDL, "\033|%p1%dD"},
{(int)KS_CS, "\033|%p1%d;%p2%dR"},
+ {(int)KS_CSV, "\033|%p1%d;%p2%dV"},
{(int)KS_CL, "\033|C"},
// attributes switched on with 'h', off with * 'H'
{(int)KS_ME, "\033|31H"}, // HL_ALL
@@ -1065,8 +1067,8 @@ static void parse_builtin_tcap(char_u *term)
term_strings[p->bt_entry] = (char_u *)p->bt_string;
}
} else {
- name[0] = KEY2TERMCAP0((int)p->bt_entry);
- name[1] = KEY2TERMCAP1((int)p->bt_entry);
+ name[0] = (char_u)KEY2TERMCAP0(p->bt_entry);
+ name[1] = (char_u)KEY2TERMCAP1(p->bt_entry);
if (find_termcode(name) == NULL)
add_termcode(name, (char_u *)p->bt_string, term_8bit);
}
@@ -1255,7 +1257,7 @@ int set_termname(char_u *term)
UP = (char *)TGETSTR("up", &tp);
p = TGETSTR("pc", &tp);
if (p)
- PC = *p;
+ PC = (char)*p;
}
} else /* try == 0 || try == 2 */
#endif /* HAVE_TGETENT */
@@ -1472,13 +1474,12 @@ int set_termname(char_u *term)
# define HMT_NORMAL 1
# define HMT_NETTERM 2
# define HMT_DEC 4
-# define HMT_PTERM 8
# define HMT_URXVT 16
# define HMT_SGR 32
void
set_mouse_termcode (
- int n, /* KS_MOUSE, KS_NETTERM_MOUSE or KS_DEC_MOUSE */
+ char_u n, /* KS_MOUSE, KS_NETTERM_MOUSE or KS_DEC_MOUSE */
char_u *s
)
{
@@ -1487,10 +1488,10 @@ set_mouse_termcode (
add_termcode(name, s, FALSE);
}
-# if (defined(UNIX) && defined(FEAT_MOUSE_TTY)) || defined(PROTO)
+# if (defined(UNIX) && defined(FEAT_MOUSE_TTY))
void
del_mouse_termcode (
- int n /* KS_MOUSE, KS_NETTERM_MOUSE or KS_DEC_MOUSE */
+ char_u n /* KS_MOUSE, KS_NETTERM_MOUSE or KS_DEC_MOUSE */
)
{
char_u name[2] = { n, KE_FILLER };
@@ -1690,7 +1691,7 @@ bool term_is_8bit(char_u *name)
* <Esc>] -> <M-C-]>
* <Esc>O -> <M-C-O>
*/
-static int term_7to8bit(char_u *p)
+static char_u term_7to8bit(char_u *p)
{
if (*p == ESC) {
if (p[1] == '[')
@@ -1704,7 +1705,7 @@ static int term_7to8bit(char_u *p)
}
-#if !defined(HAVE_TGETENT) || defined(PROTO)
+#if !defined(HAVE_TGETENT)
char_u *tltoa(unsigned long i)
{
@@ -1801,7 +1802,9 @@ void term_write(char_u *s, size_t len)
#ifdef UNIX
if (p_wd) { // Unix is too fast, slow down a bit more
- os_microdelay(p_wd);
+ assert(p_wd >= 0
+ && (sizeof(long) <= sizeof(uint64_t) || p_wd <= UINT64_MAX));
+ os_microdelay((uint64_t)p_wd);
}
#endif
}
@@ -1814,17 +1817,20 @@ void term_write(char_u *s, size_t len)
static char_u out_buf[OUT_SIZE + 1];
static int out_pos = 0; /* number of chars in out_buf */
+// Clear the output buffer
+void out_buf_clear(void)
+{
+ out_pos = 0;
+}
+
/*
* out_flush(): flush the output buffer
*/
void out_flush(void)
{
- if (out_pos != 0) {
- /* set out_pos to 0 before ui_write, to avoid recursiveness */
- int len = out_pos;
- out_pos = 0;
- ui_write(out_buf, len);
- }
+ int len = out_pos;
+ out_pos = 0;
+ ui_write(out_buf, len);
}
/*
@@ -1843,7 +1849,7 @@ void out_flush_check(void)
* This should not be used for outputting text on the screen (use functions
* like msg_puts() and screen_putchar() for that).
*/
-void out_char(unsigned c)
+void out_char(char_u c)
{
#if defined(UNIX) || defined(MACOS_X_UNIX)
if (c == '\n') /* turn LF into CR-LF (CRMOD doesn't seem to do this) */
@@ -1861,7 +1867,7 @@ void out_char(unsigned c)
/*
* out_char_nf(c): like out_char(), but don't flush when p_wd is set
*/
-static void out_char_nf(unsigned c)
+static void out_char_nf(char_u c)
{
#if defined(UNIX) || defined(MACOS_X_UNIX)
if (c == '\n') /* turn LF into CR-LF (CRMOD doesn't seem to do this) */
@@ -1943,7 +1949,7 @@ void term_delete_lines(int line_count)
OUT_STR(tgoto((char *)T_CDL, 0, line_count));
}
-#if defined(HAVE_TGETENT) || defined(PROTO)
+#if defined(HAVE_TGETENT)
void term_set_winpos(int x, int y)
{
/* Can't handle a negative value here */
@@ -2008,7 +2014,7 @@ static void term_color(char_u *s, int n)
OUT_STR(tgoto((char *)s, 0, n));
}
-#if defined(UNIX) || defined(MACOS_X) || defined(PROTO)
+#if defined(UNIX) || defined(MACOS_X)
/*
* Generic function to set window title, using t_ts and t_fs.
*/
@@ -2112,31 +2118,6 @@ void ttest(int pairs)
t_colors = atoi((char *)T_CCO);
}
-#if defined(FEAT_GUI) || defined(PROTO)
-/*
- * Interpret the next string of bytes in buf as a long integer, with the most
- * significant byte first. Note that it is assumed that buf has been through
- * inchar(), so that NUL and K_SPECIAL will be represented as three bytes each.
- * Puts result in val, and returns the number of bytes read from buf
- * (between sizeof(long_u) and 2 * sizeof(long_u)), or -1 if not enough bytes
- * were present.
- */
-static int get_long_from_buf(char_u *buf, long_u *val)
-{
- char_u bytes[sizeof(long_u)];
-
- *val = 0;
- int len = get_bytes_from_buf(buf, bytes, (int)sizeof(long_u));
- if (len != -1) {
- for (int i = 0; i < (int)sizeof(long_u); i++) {
- int shift = 8 * (sizeof(long_u) - 1 - i);
- *val += (long_u)bytes[i] << shift;
- }
- }
- return len;
-}
-#endif
-
#if defined(FEAT_GUI) \
|| (defined(FEAT_MOUSE) && (!defined(UNIX) || defined(FEAT_MOUSE_XTERM) \
|| defined(FEAT_MOUSE_GPM) || defined(FEAT_SYSMOUSE)))
@@ -2203,8 +2184,8 @@ void limit_screen_size(void)
*/
void win_new_shellsize(void)
{
- static int old_Rows = 0;
- static int old_Columns = 0;
+ static long old_Rows = 0;
+ static long old_Columns = 0;
if (old_Rows != Rows) {
/* if 'window' uses the whole screen, keep it using that */
@@ -2225,7 +2206,11 @@ void win_new_shellsize(void)
*/
void shell_resized(void)
{
- screen_resize(0, 0, FALSE);
+ if (abstract_ui) {
+ ui_refresh();
+ } else {
+ screen_resize(0, 0, FALSE);
+ }
}
/*
@@ -2234,11 +2219,10 @@ void shell_resized(void)
*/
void shell_resized_check(void)
{
- int old_Rows = Rows;
- int old_Columns = Columns;
+ long old_Rows = Rows;
+ long old_Columns = Columns;
- if (!exiting
- ) {
+ if (!exiting) {
(void)ui_get_shellsize();
check_shellsize();
if (old_Rows != Rows || old_Columns != Columns)
@@ -2588,13 +2572,13 @@ static struct termcode {
int modlen; /* length of part before ";*~". */
} *termcodes = NULL;
-static int tc_max_len = 0; /* number of entries that termcodes[] can hold */
-static int tc_len = 0; /* current number of entries in termcodes[] */
+static size_t tc_max_len = 0; /* number of entries that termcodes[] can hold */
+static size_t tc_len = 0; /* current number of entries in termcodes[] */
void clear_termcodes(void)
{
- while (tc_len > 0)
+ while (tc_len != 0)
free(termcodes[--tc_len].code);
free(termcodes);
termcodes = NULL;
@@ -2621,7 +2605,7 @@ void clear_termcodes(void)
void add_termcode(char_u *name, char_u *string, int flags)
{
struct termcode *new_tc;
- int i, j;
+ size_t i, j;
if (string == NULL || *string == NUL) {
del_termcode(name);
@@ -2635,7 +2619,7 @@ void add_termcode(char_u *name, char_u *string, int flags)
STRMOVE(s, s + 1);
s[0] = term_7to8bit(string);
}
- int len = (int)STRLEN(s);
+ size_t len = STRLEN(s);
need_gather = true; // need to fill termleader[]
@@ -2666,15 +2650,14 @@ void add_termcode(char_u *name, char_u *string, int flags)
* Exact match: May replace old code.
*/
if (termcodes[i].name[1] == name[1]) {
- if (flags == ATC_FROM_TERM && (j = termcode_star(
- termcodes[i].code,
- termcodes[i].len)) > 0) {
+ if (flags == ATC_FROM_TERM
+ && (j = termcode_star(termcodes[i].code, termcodes[i].len)) > 0) {
/* Don't replace ESC[123;*X or ESC O*X with another when
* invoked from got_code_from_term(). */
- if (len == termcodes[i].len - j
+ assert(termcodes[i].len >= 0);
+ if (len == (size_t)termcodes[i].len - j
&& STRNCMP(s, termcodes[i].code, len - 1) == 0
- && s[len - 1]
- == termcodes[i].code[termcodes[i].len - 1]) {
+ && s[len - 1] == termcodes[i].code[termcodes[i].len - 1]) {
/* They are equal but for the ";*": don't add it. */
free(s);
return;
@@ -2698,14 +2681,15 @@ void add_termcode(char_u *name, char_u *string, int flags)
termcodes[i].name[0] = name[0];
termcodes[i].name[1] = name[1];
termcodes[i].code = s;
- termcodes[i].len = len;
+ assert(len <= INT_MAX);
+ termcodes[i].len = (int)len;
/* For xterm we recognize special codes like "ESC[42;*X" and "ESC O*X" that
* accept modifiers. */
termcodes[i].modlen = 0;
- j = termcode_star(s, len);
+ j = termcode_star(s, (int)len);
if (j > 0)
- termcodes[i].modlen = len - 1 - j;
+ termcodes[i].modlen = (int)(len - 1 - j);
++tc_len;
}
@@ -2714,7 +2698,7 @@ void add_termcode(char_u *name, char_u *string, int flags)
* The "X" can be any character.
* Return 0 if not found, 2 for ;*X and 1 for O*X and <M-O>*X.
*/
-static int termcode_star(char_u *code, int len)
+static unsigned int termcode_star(char_u *code, int len)
{
/* Shortest is <M-O>*X. With ; shortest is <CSI>1;*X */
if (len >= 3 && code[len - 2] == '*') {
@@ -2728,13 +2712,13 @@ static int termcode_star(char_u *code, int len)
char_u *find_termcode(char_u *name)
{
- for (int i = 0; i < tc_len; ++i)
+ for (size_t i = 0; i < tc_len; ++i)
if (termcodes[i].name[0] == name[0] && termcodes[i].name[1] == name[1])
return termcodes[i].code;
return NULL;
}
-char_u *get_termcode(int i)
+char_u *get_termcode(size_t i)
{
if (i >= tc_len)
return NULL;
@@ -2748,7 +2732,7 @@ void del_termcode(char_u *name)
need_gather = true; // need to fill termleader[]
- for (int i = 0; i < tc_len; ++i)
+ for (size_t i = 0; i < tc_len; ++i)
if (termcodes[i].name[0] == name[0] && termcodes[i].name[1] == name[1]) {
del_termcode_idx(i);
return;
@@ -2756,11 +2740,11 @@ void del_termcode(char_u *name)
/* not found. Give error message? */
}
-static void del_termcode_idx(int idx)
+static void del_termcode_idx(size_t idx)
{
free(termcodes[idx].code);
--tc_len;
- for (int i = idx; i < tc_len; ++i)
+ for (size_t i = idx; i < tc_len; ++i)
termcodes[i] = termcodes[i + 1];
}
@@ -2772,8 +2756,8 @@ static void switch_to_8bit(void)
{
/* Only need to do something when not already using 8-bit codes. */
if (!term_is_8bit(T_NAME)) {
- for (int i = 0; i < tc_len; ++i) {
- int c = term_7to8bit(termcodes[i].code);
+ for (size_t i = 0; i < tc_len; ++i) {
+ char_u c = term_7to8bit(termcodes[i].code);
if (c != 0) {
STRMOVE(termcodes[i].code + 1, termcodes[i].code + 2);
termcodes[i].code[0] = c;
@@ -2837,7 +2821,6 @@ int check_termcode(int max_offset, char_u *buf, int bufsize, int *buflen)
int extra;
char_u string[MAX_KEY_CODE_LEN + 1];
int i, j;
- int idx = 0;
# if !defined(UNIX) || defined(FEAT_MOUSE_XTERM) || defined(FEAT_GUI) \
|| defined(FEAT_MOUSE_GPM) || defined(FEAT_SYSMOUSE)
char_u bytes[6];
@@ -2912,6 +2895,7 @@ int check_termcode(int max_offset, char_u *buf, int bufsize, int *buflen)
key_name[1] = NUL; /* no key name found yet */
modifiers = 0; /* no modifiers yet */
+ size_t idx;
{
for (idx = 0; idx < tc_len; ++idx) {
/*
@@ -2936,10 +2920,10 @@ int check_termcode(int max_offset, char_u *buf, int bufsize, int *buflen)
*/
if (termcodes[idx].name[0] == 'K'
&& VIM_ISDIGIT(termcodes[idx].name[1])) {
- for (j = idx + 1; j < tc_len; ++j)
- if (termcodes[j].len == slen &&
- STRNCMP(termcodes[idx].code,
- termcodes[j].code, slen) == 0) {
+ for (size_t j = idx + 1; j < tc_len; ++j)
+ if (termcodes[j].len == slen
+ && STRNCMP(termcodes[idx].code,
+ termcodes[j].code, slen) == 0) {
idx = j;
break;
}
@@ -3253,7 +3237,7 @@ int check_termcode(int max_offset, char_u *buf, int bufsize, int *buflen)
*/
p = tp + slen;
- mouse_code = getdigits(&p);
+ mouse_code = getdigits_int(&p);
if (*p++ != ';')
return -1;
@@ -3261,11 +3245,11 @@ int check_termcode(int max_offset, char_u *buf, int bufsize, int *buflen)
if (key_name[0] == KS_SGR_MOUSE)
mouse_code += 32;
- mouse_col = getdigits(&p) - 1;
+ mouse_col = getdigits_int(&p);
if (*p++ != ';')
return -1;
- mouse_row = getdigits(&p) - 1;
+ mouse_row = getdigits_int(&p);
if (key_name[0] == KS_SGR_MOUSE && *p == 'm')
mouse_code |= MOUSE_RELEASE;
else if (*p != 'M')
@@ -3292,7 +3276,7 @@ int check_termcode(int max_offset, char_u *buf, int bufsize, int *buflen)
}
}
p += j;
- if (cmd_complete && getdigits(&p) == mouse_code) {
+ if (cmd_complete && getdigits_int(&p) == mouse_code) {
slen += j; /* skip the \033[ */
continue;
}
@@ -3338,10 +3322,10 @@ int check_termcode(int max_offset, char_u *buf, int bufsize, int *buflen)
* '6' is the row, 45 is the column
*/
p = tp + slen;
- mr = getdigits(&p);
+ mr = getdigits_int(&p);
if (*p++ != ',')
return -1;
- mc = getdigits(&p);
+ mc = getdigits_int(&p);
if (*p++ != '\r')
return -1;
@@ -3406,27 +3390,27 @@ int check_termcode(int max_offset, char_u *buf, int bufsize, int *buflen)
p = tp + slen;
/* get event status */
- Pe = getdigits(&p);
+ Pe = getdigits_int(&p);
if (*p++ != ';')
return -1;
/* get button status */
- Pb = getdigits(&p);
+ Pb = getdigits_int(&p);
if (*p++ != ';')
return -1;
/* get row status */
- Pr = getdigits(&p);
+ Pr = getdigits_int(&p);
if (*p++ != ';')
return -1;
/* get column status */
- Pc = getdigits(&p);
+ Pc = getdigits_int(&p);
/* the page parameter is optional */
if (*p == ';') {
p++;
- (void)getdigits(&p);
+ (void)getdigits_int(&p);
}
if (*p++ != '&')
return -1;
@@ -3502,7 +3486,7 @@ int check_termcode(int max_offset, char_u *buf, int bufsize, int *buflen)
// compute the time elapsed since the previous mouse click and
// convert it from ns to ms because p_mouset is stored as ms
- long timediff = (long) (mouse_time - orig_mouse_time) / 1E6;
+ long timediff = (long) (mouse_time - orig_mouse_time) / 1000000;
orig_mouse_time = mouse_time;
if (mouse_code == orig_mouse_code
@@ -3558,9 +3542,10 @@ int check_termcode(int max_offset, char_u *buf, int bufsize, int *buflen)
modifiers |= MOD_MASK_ALT;
key_name[1] = (wheel_code & 1)
? (int)KE_MOUSEUP : (int)KE_MOUSEDOWN;
- } else
- key_name[1] = get_pseudo_mouse_code(current_button,
- is_click, is_drag);
+ } else {
+ key_name[1] = (char_u)get_pseudo_mouse_code(current_button,
+ is_click, is_drag);
+ }
}
@@ -3580,13 +3565,13 @@ int check_termcode(int max_offset, char_u *buf, int bufsize, int *buflen)
if (modifiers != 0) {
string[new_slen++] = K_SPECIAL;
string[new_slen++] = (int)KS_MODIFIER;
- string[new_slen++] = modifiers;
+ string[new_slen++] = (char_u)modifiers;
}
}
/* Finally, add the special key code to our string */
- key_name[0] = KEY2TERMCAP0(key);
- key_name[1] = KEY2TERMCAP1(key);
+ key_name[0] = (char_u)KEY2TERMCAP0(key);
+ key_name[1] = (char_u)KEY2TERMCAP1(key);
if (key_name[0] == KS_KEY) {
/* from ":set <M-b>=xx" */
if (has_mbyte)
@@ -3670,10 +3655,10 @@ replace_termcodes (
int special /* always accept <key> notation */
)
{
- int i;
- int slen;
- int key;
- int dlen = 0;
+ ssize_t i;
+ size_t slen;
+ char_u key;
+ size_t dlen = 0;
char_u *src;
int do_backslash; /* backslash is a special character */
int do_special; /* recognize <> key codes */
@@ -3727,7 +3712,7 @@ replace_termcodes (
result[dlen++] = (int)KS_EXTRA;
result[dlen++] = (int)KE_SNR;
sprintf((char *)result + dlen, "%" PRId64, (int64_t)current_SID);
- dlen += (int)STRLEN(result + dlen);
+ dlen += STRLEN(result + dlen);
result[dlen++] = '_';
continue;
}
@@ -3832,14 +3817,17 @@ replace_termcodes (
* Find a termcode with keys 'src' (must be NUL terminated).
* Return the index in termcodes[], or -1 if not found.
*/
-int find_term_bykeys(char_u *src)
+ssize_t find_term_bykeys(char_u *src)
{
- int slen = (int)STRLEN(src);
-
- for (int i = 0; i < tc_len; ++i) {
- if (slen == termcodes[i].len
- && STRNCMP(termcodes[i].code, src, (size_t)slen) == 0)
- return i;
+ size_t slen = STRLEN(src);
+
+ for (size_t i = 0; i < tc_len; ++i) {
+ assert(termcodes[i].len >= 0);
+ if (slen == (size_t)termcodes[i].len
+ && STRNCMP(termcodes[i].code, src, slen) == 0) {
+ assert(i <= SSIZE_MAX);
+ return (ssize_t)i;
+ }
}
return -1;
}
@@ -3861,7 +3849,7 @@ static void gather_termleader(void)
in 8-bit mode */
termleader[len] = NUL;
- for (int i = 0; i < tc_len; ++i)
+ for (size_t i = 0; i < tc_len; ++i)
if (vim_strchr(termleader, termcodes[i].code[0]) == NULL) {
termleader[len++] = termcodes[i].code[0];
termleader[len] = NUL;
@@ -3876,22 +3864,14 @@ static void gather_termleader(void)
*/
void show_termcodes(void)
{
- int col;
- int *items;
- int item_count;
- int run;
- int row, rows;
- int cols;
- int i;
- int len;
-
#define INC3 27 /* try to make three columns */
#define INC2 40 /* try to make two columns */
#define GAP 2 /* spaces between columns */
if (tc_len == 0) /* no terminal codes (must be GUI) */
return;
- items = xmalloc(sizeof(int) * tc_len);
+
+ size_t *items = xmalloc(sizeof(size_t) * tc_len);
/* Highlight title */
MSG_PUTS_TITLE(_("\n--- Terminal keys ---"));
@@ -3902,14 +3882,14 @@ void show_termcodes(void)
* 2. display the medium items (medium length strings)
* 3. display the long items (remaining strings)
*/
- for (run = 1; run <= 3 && !got_int; ++run) {
+ for (int run = 1; run <= 3 && !got_int; ++run) {
/*
* collect the items in items[]
*/
- item_count = 0;
- for (i = 0; i < tc_len; i++) {
- len = show_one_termcode(termcodes[i].name,
- termcodes[i].code, FALSE);
+ size_t item_count = 0;
+ for (size_t i = 0; i < tc_len; i++) {
+ int len = show_one_termcode(termcodes[i].name,
+ termcodes[i].code, FALSE);
if (len <= INC3 - GAP ? run == 1
: len <= INC2 - GAP ? run == 2
: run == 3)
@@ -3919,22 +3899,24 @@ void show_termcodes(void)
/*
* display the items
*/
+ size_t rows, cols;
if (run <= 2) {
- cols = (Columns + GAP) / (run == 1 ? INC3 : INC2);
+ cols = (size_t)(Columns + GAP) / (run == 1 ? INC3 : INC2);
if (cols == 0)
cols = 1;
rows = (item_count + cols - 1) / cols;
} else /* run == 3 */
rows = item_count;
- for (row = 0; row < rows && !got_int; ++row) {
+ for (size_t row = 0; row < rows && !got_int; ++row) {
msg_putchar('\n'); /* go to next line */
if (got_int) /* 'q' typed in more */
break;
- col = 0;
- for (i = row; i < item_count; i += rows) {
- msg_col = col; /* make columns */
+ size_t col = 0;
+ for (size_t i = row; i < item_count; i += rows) {
+ assert(col <= INT_MAX);
+ msg_col = (int)col; /* make columns */
show_one_termcode(termcodes[items[i]].name,
- termcodes[items[i]].code, TRUE);
+ termcodes[items[i]].code, TRUE);
if (run == 2)
col += INC2;
else
@@ -4047,7 +4029,7 @@ static void got_code_from_term(char_u *code, int len)
#define XT_LEN 100
char_u name[3];
char_u str[XT_LEN];
- int i;
+ ssize_t i;
int j = 0;
int c;
@@ -4056,12 +4038,17 @@ static void got_code_from_term(char_u *code, int len)
* Our names are currently all 2 characters. */
if (code[0] == '1' && code[7] == '=' && len / 2 < XT_LEN) {
/* Get the name from the response and find it in the table. */
- name[0] = hexhex2nr(code + 3);
- name[1] = hexhex2nr(code + 5);
+ int byte = hexhex2nr(code + 3);
+ assert(byte != -1);
+ name[0] = (char_u)byte;
+ byte = hexhex2nr(code + 5);
+ assert(byte != -1);
+ name[1] = (char_u)byte;
name[2] = NUL;
for (i = 0; key_names[i] != NULL; ++i) {
if (STRCMP(key_names[i], name) == 0) {
- xt_index_in = i;
+ assert(i <= INT_MAX);
+ xt_index_in = (int)i;
break;
}
}
@@ -4075,7 +4062,7 @@ static void got_code_from_term(char_u *code, int len)
# endif
if (key_names[i] != NULL) {
for (i = 8; (c = hexhex2nr(code + i)) >= 0; i += 2)
- str[j++] = c;
+ str[j++] = (char_u)c;
str[j] = NUL;
if (name[0] == 'C' && name[1] == 'o') {
/* Color count is not a key code. */
@@ -4104,7 +4091,7 @@ static void got_code_from_term(char_u *code, int len)
/* First delete any existing entry with the same code. */
i = find_term_bykeys(str);
if (i >= 0)
- del_termcode_idx(i);
+ del_termcode_idx((size_t)i);
add_termcode(name, str, ATC_FROM_TERM);
}
}
@@ -4192,7 +4179,7 @@ translate_mapping (
}
if (cpo_special && cpo_keycode && c == K_SPECIAL && !modifiers) {
/* try to find special key in termcodes */
- int i;
+ size_t i;
for (i = 0; i < tc_len; ++i)
if (termcodes[i].name[0] == str[1]
&& termcodes[i].name[1] == str[2])
@@ -4226,7 +4213,7 @@ translate_mapping (
|| (c == '<' && !cpo_special) || (c == '\\' && !cpo_bslash))
ga_append(&ga, cpo_bslash ? Ctrl_V : '\\');
if (c)
- ga_append(&ga, c);
+ ga_append(&ga, (char)c);
}
ga_append(&ga, NUL);
return (char_u *)(ga.ga_data);
diff --git a/src/nvim/testdir/test48.in b/src/nvim/testdir/test48.in
index 25ea2fa154..998e1bba00 100644
--- a/src/nvim/testdir/test48.in
+++ b/src/nvim/testdir/test48.in
@@ -44,6 +44,10 @@ $4lDi<-- 'D' should be intact
/^"r"
$5lrxa<-- should be 'x'
:"
+:" Test "r" on a tab
+:" Note that for this test, 'ts' must be 8 (the default).
+^5lrxA<-- should be ' x '
+:"
:" Test to make sure 'x' can delete control characters
:set display=uhex
^xxxxxxi[This line should contain only the text between the brackets.]
@@ -72,6 +76,7 @@ this is a test
this is a test
this is a test
"r"
+"r"
ab sd
abcv6efi.him0kl
diff --git a/src/nvim/testdir/test48.ok b/src/nvim/testdir/test48.ok
index 334cb5a29c..14cd9b12ec 100644
--- a/src/nvim/testdir/test48.ok
+++ b/src/nvim/testdir/test48.ok
@@ -12,6 +12,7 @@ this is a test
this is a test
this is a test
"r" x<-- should be 'x'
+"r" x <-- should be ' x '
[This line should contain only the text between the brackets.]
v i m <-- should show the name of a noted text editor
6 . 0 <-- and its version number
diff --git a/src/nvim/testdir/test53.in b/src/nvim/testdir/test53.in
index 011c9ae39d..8ca9c9ed29 100644
--- a/src/nvim/testdir/test53.in
+++ b/src/nvim/testdir/test53.in
@@ -79,6 +79,8 @@ ggdgn.
:" test repeating gUgn
/^Depp
gggUgn.
+gg/a:0\@!\zs\d\+
+nygnop
:/^start:/,/^end:/wq! test.out
ENDTEST
@@ -108,6 +110,11 @@ delete first and last chars
uniquepattern uniquepattern
my very excellent mother just served us nachos
for (i=0; i<=10; i++)
+a:10
+
+a:1
+
+a:20
Y
text
Y
diff --git a/src/nvim/testdir/test53.ok b/src/nvim/testdir/test53.ok
index d7ffa6bc51..0c0b9ded16 100644
--- a/src/nvim/testdir/test53.ok
+++ b/src/nvim/testdir/test53.ok
@@ -49,6 +49,12 @@ elete first and last char
uniquepattern
my very excellent mongoose just served us nachos
for (j=0; i<=10; i++)
+a:10
+
+a:1
+1
+
+a:20
text
Y
diff --git a/src/nvim/ui.c b/src/nvim/ui.c
index 9c58193e8c..a8ca58d633 100644
--- a/src/nvim/ui.c
+++ b/src/nvim/ui.c
@@ -60,11 +60,8 @@ static struct {
int top, bot, left, right;
} sr;
static int current_highlight_mask = 0;
-static HlAttrs current_attrs = {
- false, false, false, false, false, false, -1, -1
-};
static bool cursor_enabled = true;
-static int height = INT_MAX, width = INT_MAX;
+static int height, width;
// This set of macros allow us to use UI_CALL to invoke any function on
// registered UI instances. The functions can have 0-5 arguments(configurable
@@ -98,6 +95,10 @@ void ui_write(uint8_t *s, int len)
return;
}
+ if (!len) {
+ return;
+ }
+
char_u *tofree = NULL;
if (output_conv.vc_type != CONV_NONE) {
@@ -113,6 +114,16 @@ void ui_write(uint8_t *s, int len)
free(tofree);
}
+bool ui_rgb_attached(void)
+{
+ for (size_t i = 0; i < ui_count; i++) {
+ if (uis[i]->rgb) {
+ return true;
+ }
+ }
+ return false;
+}
+
/*
* If the machine has job control, use it to suspend the program,
* otherwise fake it by starting a new shell.
@@ -122,11 +133,24 @@ void ui_suspend(void)
{
if (abstract_ui) {
UI_CALL(suspend);
+ UI_CALL(flush);
} else {
mch_suspend();
}
}
+void ui_set_title(char *title)
+{
+ UI_CALL(set_title, title);
+ UI_CALL(flush);
+}
+
+void ui_set_icon(char *icon)
+{
+ UI_CALL(set_icon, icon);
+ UI_CALL(flush);
+}
+
/*
* Try to get the current Vim shell size. Put the result in Rows and Columns.
* Use the new sizes as defaults for 'columns' and 'lines'.
@@ -165,8 +189,31 @@ void ui_cursor_shape(void)
}
}
-void ui_resize(int width, int height)
+void ui_refresh(void)
{
+ if (!ui_count) {
+ return;
+ }
+
+ int width = INT_MAX, height = INT_MAX;
+
+ for (size_t i = 0; i < ui_count; i++) {
+ UI *ui = uis[i];
+ width = ui->width < width ? ui->width : width;
+ height = ui->height < height ? ui->height : height;
+ }
+
+ screen_resize(width, height, true);
+}
+
+void ui_resize(int new_width, int new_height)
+{
+ width = new_width;
+ height = new_height;
+
+ UI_CALL(update_fg, (ui->rgb ? normal_fg : cterm_normal_fg_color - 1));
+ UI_CALL(update_bg, (ui->rgb ? normal_bg : cterm_normal_bg_color - 1));
+
sr.top = 0;
sr.bot = height - 1;
sr.left = 0;
@@ -240,7 +287,7 @@ void ui_attach(UI *ui)
}
uis[ui_count++] = ui;
- resized(ui);
+ ui_refresh();
}
void ui_detach(UI *ui)
@@ -267,17 +314,8 @@ void ui_detach(UI *ui)
ui_count--;
- if (ui->width == width || ui->height == height) {
- // It is possible that the UI being detached had the smallest screen,
- // so check for the new minimum dimensions
- width = height = INT_MAX;
- for (size_t i = 0; i < ui_count; i++) {
- check_dimensions(uis[i]);
- }
- }
-
if (ui_count) {
- screen_resize(width, height, true);
+ ui_refresh();
}
}
@@ -295,8 +333,7 @@ static void highlight_start(int mask)
return;
}
- set_highlight_args(current_highlight_mask, &current_attrs);
- UI_CALL(highlight_set, current_attrs);
+ set_highlight_args(current_highlight_mask);
}
static void highlight_stop(int mask)
@@ -309,12 +346,12 @@ static void highlight_stop(int mask)
current_highlight_mask &= ~mask;
}
- set_highlight_args(current_highlight_mask, &current_attrs);
- UI_CALL(highlight_set, current_attrs);
+ set_highlight_args(current_highlight_mask);
}
-static void set_highlight_args(int mask, HlAttrs *attrs)
+static void set_highlight_args(int mask)
{
+ HlAttrs rgb_attrs = { false, false, false, false, false, -1, -1 };
attrentry_T *aep = NULL;
if (mask > HL_ALL) {
@@ -322,18 +359,40 @@ static void set_highlight_args(int mask, HlAttrs *attrs)
mask = aep ? aep->ae_attr : 0;
}
- attrs->bold = mask & HL_BOLD;
- attrs->standout = mask & HL_STANDOUT;
- attrs->underline = mask & HL_UNDERLINE;
- attrs->undercurl = mask & HL_UNDERCURL;
- attrs->italic = mask & HL_ITALIC;
- attrs->reverse = mask & HL_INVERSE;
- attrs->foreground = aep && aep->fg_color >= 0 ? aep->fg_color : normal_fg;
- attrs->background = aep && aep->bg_color >= 0 ? aep->bg_color : normal_bg;
+ rgb_attrs.bold = mask & HL_BOLD;
+ rgb_attrs.underline = mask & HL_UNDERLINE;
+ rgb_attrs.undercurl = mask & HL_UNDERCURL;
+ rgb_attrs.italic = mask & HL_ITALIC;
+ rgb_attrs.reverse = mask & (HL_INVERSE | HL_STANDOUT);
+ HlAttrs cterm_attrs = rgb_attrs;
+
+ if (aep) {
+ if (aep->fg_color != normal_fg) {
+ rgb_attrs.foreground = aep->fg_color;
+ }
+
+ if (aep->bg_color != normal_bg) {
+ rgb_attrs.background = aep->bg_color;
+ }
+
+ if (cterm_normal_fg_color != aep->ae_u.cterm.fg_color) {
+ cterm_attrs.foreground = aep->ae_u.cterm.fg_color - 1;
+ }
+
+ if (cterm_normal_bg_color != aep->ae_u.cterm.bg_color) {
+ cterm_attrs.background = aep->ae_u.cterm.bg_color - 1;
+ }
+ }
+
+ UI_CALL(highlight_set, (ui->rgb ? rgb_attrs : cterm_attrs));
}
static void parse_abstract_ui_codes(uint8_t *ptr, int len)
{
+ if (!ui_count) {
+ return;
+ }
+
int arg1 = 0, arg2 = 0;
uint8_t *end = ptr + len, *p, c;
bool update_cursor = false;
@@ -344,14 +403,14 @@ static void parse_abstract_ui_codes(uint8_t *ptr, int len)
assert(p != end);
if (VIM_ISDIGIT(*p)) {
- arg1 = (int)getdigits(&p);
+ arg1 = getdigits_int(&p);
if (p >= end) {
break;
}
if (*p == ';') {
p++;
- arg2 = (int)getdigits(&p);
+ arg2 = getdigits_int(&p);
if (p >= end)
break;
}
@@ -444,6 +503,9 @@ static void parse_abstract_ui_codes(uint8_t *ptr, int len)
UI_CALL(put, NULL, 0);
col++;
}
+ if (col >= width) {
+ ui_linefeed();
+ }
p += clen;
}
ptr = p;
@@ -457,25 +519,6 @@ static void parse_abstract_ui_codes(uint8_t *ptr, int len)
UI_CALL(flush);
}
-static void resized(UI *ui)
-{
- check_dimensions(ui);
- screen_resize(width, height, true);
-}
-
-static void check_dimensions(UI *ui)
-{
- // The internal screen dimensions are always the minimum required to fit on
- // all connected screens
- if (ui->width < width) {
- width = ui->width;
- }
-
- if (ui->height < height) {
- height = ui->height;
- }
-}
-
static void ui_linefeed(void)
{
int new_col = 0;
diff --git a/src/nvim/ui.h b/src/nvim/ui.h
index d0933055cc..099f2643d5 100644
--- a/src/nvim/ui.h
+++ b/src/nvim/ui.h
@@ -6,13 +6,14 @@
#include <stdint.h>
typedef struct {
- bool bold, standout, underline, undercurl, italic, reverse;
+ bool bold, underline, undercurl, italic, reverse;
int foreground, background;
} HlAttrs;
typedef struct ui_t UI;
struct ui_t {
+ bool rgb;
int width, height;
void *data;
void (*resize)(UI *ui, int rows, int columns);
@@ -32,7 +33,11 @@ struct ui_t {
void (*bell)(UI *ui);
void (*visual_bell)(UI *ui);
void (*flush)(UI *ui);
+ void (*update_fg)(UI *ui, int fg);
+ void (*update_bg)(UI *ui, int bg);
void (*suspend)(UI *ui);
+ void (*set_title)(UI *ui, char *title);
+ void (*set_icon)(UI *ui, char *icon);
};
#ifdef INCLUDE_GENERATED_DECLARATIONS
diff --git a/src/nvim/undo.c b/src/nvim/undo.c
index 59920cfbe1..4d84c69158 100644
--- a/src/nvim/undo.c
+++ b/src/nvim/undo.c
@@ -128,7 +128,7 @@ static int undo_undoes = FALSE;
static int lastmark = 0;
-#if defined(U_DEBUG) || defined(PROTO)
+#if defined(U_DEBUG)
/*
* Check the undo structures for being valid. Print a warning when something
* looks wrong.
diff --git a/src/nvim/version.c b/src/nvim/version.c
index c41610fd0f..e34db7f40a 100644
--- a/src/nvim/version.c
+++ b/src/nvim/version.c
@@ -178,6 +178,13 @@ static char *(features[]) = {
};
static int included_patches[] = {
+ 567,
+ //566,
+ //565,
+ //564,
+ 563,
+ //562,
+ //561,
//560 NA
559,
//558 NA
@@ -187,7 +194,7 @@ static int included_patches[] = {
//554,
//553,
552,
- //551,
+ 551,
//550,
549,
//548 NA
@@ -272,6 +279,7 @@ static int included_patches[] = {
//469 NA
468,
467,
+ 466,
//465 NA
//464 NA
463,
diff --git a/src/nvim/window.c b/src/nvim/window.c
index ed4a8d8e7a..cf0977e280 100644
--- a/src/nvim/window.c
+++ b/src/nvim/window.c
@@ -371,7 +371,10 @@ newwindow:
postponed_split = Prenum;
else
postponed_split = -1;
- g_do_tagpreview = 0;
+
+ if (nchar != '}') {
+ g_do_tagpreview = 0;
+ }
// Execute the command right here, required when
// "wincmd ]" was used in a function.
@@ -2057,7 +2060,7 @@ win_free_mem (
return wp;
}
-#if defined(EXITFREE) || defined(PROTO)
+#if defined(EXITFREE)
void win_free_all(void)
{
int dummy;
@@ -4908,7 +4911,7 @@ file_name_in_line (
++p; /* skip the separator */
p = skipwhite(p);
if (isdigit(*p))
- *file_lnum = (int)getdigits(&p);
+ *file_lnum = getdigits_long(&p);
}
}