Patch 9.0.1245
Problem: Code is indented more than necessary.
Solution: Use an early return where it makes sense. (Yegappan Lakshmanan,
closes #11879)
Files: src/tag.c, src/term.c, src/terminal.c, src/testing.c,
src/textformat.c, src/textprop.c, src/time.c, src/typval.c
*** ../vim-9.0.1244/src/tag.c 2022-11-23 11:23:14.539539089 +0000
--- src/tag.c 2023-01-25 21:02:57.831082028 +0000
***************
*** 3263,3278 ****
static void
found_tagfile_cb(char_u *fname, void *cookie UNUSED)
{
! if (ga_grow(&tag_fnames, 1) == OK)
! {
! char_u *tag_fname = vim_strsave(fname);
#ifdef BACKSLASH_IN_FILENAME
! slash_adjust(tag_fname);
#endif
! simplify_filename(tag_fname);
! ((char_u **)(tag_fnames.ga_data))[tag_fnames.ga_len++] = tag_fname;
! }
}
#if defined(EXITFREE) || defined(PROTO)
--- 3263,3278 ----
static void
found_tagfile_cb(char_u *fname, void *cookie UNUSED)
{
! if (ga_grow(&tag_fnames, 1) == FAIL)
! return;
!
! char_u *tag_fname = vim_strsave(fname);
#ifdef BACKSLASH_IN_FILENAME
! slash_adjust(tag_fname);
#endif
! simplify_filename(tag_fname);
! ((char_u **)(tag_fnames.ga_data))[tag_fnames.ga_len++] = tag_fname;
}
#if defined(EXITFREE) || defined(PROTO)
***************
*** 3587,3640 ****
tagp->tagline = 0;
tagp->command_end = NULL;
! if (retval == OK)
{
! // Try to find a kind field: "kind:<kind>" or just "<kind>"
! p = tagp->command;
! if (find_extra(&p) == OK)
! {
! if (p > tagp->command && p[-1] == '|')
! tagp->command_end = p - 1; // drop trailing bar
! else
! tagp->command_end = p;
! p += 2; // skip ";\""
! if (*p++ == TAB)
! // Accept ASCII alphabetic kind characters and any multi-byte
! // character.
! while (ASCII_ISALPHA(*p) || mb_ptr2len(p) > 1)
! {
! if (STRNCMP(p, "kind:", 5) == 0)
! tagp->tagkind = p + 5;
! else if (STRNCMP(p, "user_data:", 10) == 0)
! tagp->user_data = p + 10;
! else if (STRNCMP(p, "line:", 5) == 0)
! tagp->tagline = atoi((char *)p + 5);
! if (tagp->tagkind != NULL && tagp->user_data != NULL)
! break;
! pc = vim_strchr(p, ':');
! pt = vim_strchr(p, '\t');
! if (pc == NULL || (pt != NULL && pc > pt))
! tagp->tagkind = p;
! if (pt == NULL)
! break;
! p = pt;
! MB_PTR_ADV(p);
! }
! }
! if (tagp->tagkind != NULL)
! {
! for (p = tagp->tagkind;
! *p && *p != '\t' && *p != '\r' && *p != '\n'; MB_PTR_ADV(p))
! ;
! tagp->tagkind_end = p;
! }
! if (tagp->user_data != NULL)
! {
! for (p = tagp->user_data;
! *p && *p != '\t' && *p != '\r' && *p != '\n'; MB_PTR_ADV(p))
! ;
! tagp->user_data_end = p;
! }
}
return retval;
}
--- 3587,3640 ----
tagp->tagline = 0;
tagp->command_end = NULL;
! if (retval != OK)
! return retval;
!
! // Try to find a kind field: "kind:<kind>" or just "<kind>"
! p = tagp->command;
! if (find_extra(&p) == OK)
{
! if (p > tagp->command && p[-1] == '|')
! tagp->command_end = p - 1; // drop trailing bar
! else
! tagp->command_end = p;
! p += 2; // skip ";\""
! if (*p++ == TAB)
! // Accept ASCII alphabetic kind characters and any multi-byte
! // character.
! while (ASCII_ISALPHA(*p) || mb_ptr2len(p) > 1)
! {
! if (STRNCMP(p, "kind:", 5) == 0)
! tagp->tagkind = p + 5;
! else if (STRNCMP(p, "user_data:", 10) == 0)
! tagp->user_data = p + 10;
! else if (STRNCMP(p, "line:", 5) == 0)
! tagp->tagline = atoi((char *)p + 5);
! if (tagp->tagkind != NULL && tagp->user_data != NULL)
! break;
! pc = vim_strchr(p, ':');
! pt = vim_strchr(p, '\t');
! if (pc == NULL || (pt != NULL && pc > pt))
! tagp->tagkind = p;
! if (pt == NULL)
! break;
! p = pt;
! MB_PTR_ADV(p);
! }
! }
! if (tagp->tagkind != NULL)
! {
! for (p = tagp->tagkind;
! *p && *p != '\t' && *p != '\r' && *p != '\n'; MB_PTR_ADV(p))
! ;
! tagp->tagkind_end = p;
! }
! if (tagp->user_data != NULL)
! {
! for (p = tagp->user_data;
! *p && *p != '\t' && *p != '\r' && *p != '\n'; MB_PTR_ADV(p))
! ;
! tagp->user_data_end = p;
}
return retval;
}
***************
*** 4372,4465 ****
ret = find_tags(pat, &num_matches, &matches,
TAG_REGEXP | TAG_NOIC, (int)MAXCOL, buf_fname);
! if (ret == OK && num_matches > 0)
{
! for (i = 0; i < num_matches; ++i)
{
! if (parse_match(matches[i], &tp) == FAIL)
! {
! vim_free(matches[i]);
! continue;
! }
! is_static = test_for_static(&tp);
! // Skip pseudo-tag lines.
! if (STRNCMP(tp.tagname, "!_TAG_", 6) == 0)
! {
! vim_free(matches[i]);
! continue;
! }
! if ((dict = dict_alloc()) == NULL)
! {
! ret = FAIL;
! vim_free(matches[i]);
! break;
! }
! if (list_append_dict(list, dict) == FAIL)
! ret = FAIL;
! full_fname = tag_full_fname(&tp);
! if (add_tag_field(dict, "name", tp.tagname, tp.tagname_end) == FAIL
! || add_tag_field(dict, "filename", full_fname,
! NULL) == FAIL
! || add_tag_field(dict, "cmd", tp.command,
! tp.command_end) == FAIL
! || add_tag_field(dict, "kind", tp.tagkind,
! tp.tagkind_end) == FAIL
! || dict_add_number(dict, "static", is_static) == FAIL)
! ret = FAIL;
! vim_free(full_fname);
! if (tp.command_end != NULL)
{
! for (p = tp.command_end + 3;
! *p != NUL && *p != '\n' && *p != '\r'; MB_PTR_ADV(p))
{
! if (p == tp.tagkind || (p + 5 == tp.tagkind
! && STRNCMP(p, "kind:", 5) == 0))
! // skip "kind:<kind>" and "<kind>"
! p = tp.tagkind_end - 1;
! else if (STRNCMP(p, "file:", 5) == 0)
! // skip "file:" (static tag)
! p += 4;
! else if (!VIM_ISWHITE(*p))
! {
! char_u *s, *n;
! int len;
! // Add extra field as a dict entry. Fields are
! // separated by Tabs.
! n = p;
! while (*p != NUL && *p >= ' ' && *p < 127 && *p != ':')
++p;
! len = (int)(p - n);
! if (*p == ':' && len > 0)
! {
! s = ++p;
! while (*p != NUL && *p >= ' ')
! ++p;
! n[len] = NUL;
! if (add_tag_field(dict, (char *)n, s, p) == FAIL)
! ret = FAIL;
! n[len] = ':';
! }
! else
! // Skip field without colon.
! while (*p != NUL && *p >= ' ')
! ++p;
! if (*p == NUL)
! break;
}
}
}
-
- vim_free(matches[i]);
}
! vim_free(matches);
}
return ret;
}
--- 4372,4465 ----
ret = find_tags(pat, &num_matches, &matches,
TAG_REGEXP | TAG_NOIC, (int)MAXCOL, buf_fname);
! if (ret != OK || num_matches <= 0)
! return ret;
!
! for (i = 0; i < num_matches; ++i)
{
! if (parse_match(matches[i], &tp) == FAIL)
{
! vim_free(matches[i]);
! continue;
! }
! is_static = test_for_static(&tp);
! // Skip pseudo-tag lines.
! if (STRNCMP(tp.tagname, "!_TAG_", 6) == 0)
! {
! vim_free(matches[i]);
! continue;
! }
! if ((dict = dict_alloc()) == NULL)
! {
! ret = FAIL;
! vim_free(matches[i]);
! break;
! }
! if (list_append_dict(list, dict) == FAIL)
! ret = FAIL;
! full_fname = tag_full_fname(&tp);
! if (add_tag_field(dict, "name", tp.tagname, tp.tagname_end) == FAIL
! || add_tag_field(dict, "filename", full_fname,
! NULL) == FAIL
! || add_tag_field(dict, "cmd", tp.command,
! tp.command_end) == FAIL
! || add_tag_field(dict, "kind", tp.tagkind,
! tp.tagkind_end) == FAIL
! || dict_add_number(dict, "static", is_static) == FAIL)
! ret = FAIL;
! vim_free(full_fname);
! if (tp.command_end != NULL)
! {
! for (p = tp.command_end + 3;
! *p != NUL && *p != '\n' && *p != '\r'; MB_PTR_ADV(p))
{
! if (p == tp.tagkind || (p + 5 == tp.tagkind
! && STRNCMP(p, "kind:", 5) == 0))
! // skip "kind:<kind>" and "<kind>"
! p = tp.tagkind_end - 1;
! else if (STRNCMP(p, "file:", 5) == 0)
! // skip "file:" (static tag)
! p += 4;
! else if (!VIM_ISWHITE(*p))
{
! char_u *s, *n;
! int len;
! // Add extra field as a dict entry. Fields are
! // separated by Tabs.
! n = p;
! while (*p != NUL && *p >= ' ' && *p < 127 && *p != ':')
! ++p;
! len = (int)(p - n);
! if (*p == ':' && len > 0)
! {
! s = ++p;
! while (*p != NUL && *p >= ' ')
++p;
! n[len] = NUL;
! if (add_tag_field(dict, (char *)n, s, p) == FAIL)
! ret = FAIL;
! n[len] = ':';
}
+ else
+ // Skip field without colon.
+ while (*p != NUL && *p >= ' ')
+ ++p;
+ if (*p == NUL)
+ break;
}
}
}
!
! vim_free(matches[i]);
}
+ vim_free(matches);
return ret;
}
*** ../vim-9.0.1244/src/term.c 2023-01-23 12:33:15.826715782 +0000
--- src/term.c 2023-01-25 21:02:57.831082028 +0000
***************
*** 1644,1667 ****
static void
may_adjust_color_count(int val)
{
! if (val != t_colors)
! {
! // Nr of colors changed, initialize highlighting and redraw everything.
! // This causes a redraw, which usually clears the message. Try keeping
! // the message if it might work.
! set_keep_msg_from_hist();
! set_color_count(val);
! init_highlight(TRUE, FALSE);
#ifdef DEBUG_TERMRESPONSE
! {
! int r = redraw_asap(UPD_CLEAR);
! log_tr("Received t_Co, redraw_asap(): %d", r);
! }
#else
! redraw_asap(UPD_CLEAR);
#endif
- }
}
#ifdef HAVE_TGETENT
--- 1644,1667 ----
static void
may_adjust_color_count(int val)
{
! if (val == t_colors)
! return;
!
! // Nr of colors changed, initialize highlighting and redraw everything.
! // This causes a redraw, which usually clears the message. Try keeping
! // the message if it might work.
! set_keep_msg_from_hist();
! set_color_count(val);
! init_highlight(TRUE, FALSE);
#ifdef DEBUG_TERMRESPONSE
! {
! int r = redraw_asap(UPD_CLEAR);
! log_tr("Received t_Co, redraw_asap(): %d", r);
! }
#else
! redraw_asap(UPD_CLEAR);
#endif
}
#ifdef HAVE_TGETENT
***************
*** 2419,2431 ****
{
char_u tbuf[TBUFSZ];
! if (T_NAME != NULL && *T_NAME != NUL && invoke_tgetent(tbuf, T_NAME) == NULL)
! {
! if (*cp == 0)
! *cp = tgetnum("co");
! if (*rp == 0)
! *rp = tgetnum("li");
! }
}
#endif // defined(HAVE_TGETENT) && defined(UNIX)
--- 2419,2432 ----
{
char_u tbuf[TBUFSZ];
! if (T_NAME == NULL || *T_NAME == NUL
! || invoke_tgetent(tbuf, T_NAME) != NULL)
! return;
!
! if (*cp == 0)
! *cp = tgetnum("co");
! if (*rp == 0)
! *rp = tgetnum("li");
}
#endif // defined(HAVE_TGETENT) && defined(UNIX)
***************
*** 2569,2583 ****
static int
term_7to8bit(char_u *p)
{
! if (*p == ESC)
! {
! if (p[1] == '[')
! return CSI;
! if (p[1] == ']')
! return OSC;
! if (p[1] == 'O')
! return 0x8f;
! }
return 0;
}
--- 2570,2584 ----
static int
term_7to8bit(char_u *p)
{
! if (*p != ESC)
! return 0;
!
! if (p[1] == '[')
! return CSI;
! else if (p[1] == ']')
! return OSC;
! else if (p[1] == 'O')
! return 0x8f;
return 0;
}
***************
*** 2712,2738 ****
{
int len;
! if (out_pos != 0)
! {
! // set out_pos to 0 before ui_write, to avoid recursiveness
! len = out_pos;
! out_pos = 0;
! ui_write(out_buf, len, FALSE);
#ifdef FEAT_EVAL
! if (ch_log_output != FALSE)
! {
! out_buf[len] = NUL;
! ch_log(NULL, "raw %s output: \"%s\"",
# ifdef FEAT_GUI
! (gui.in_use && !gui.dying && !gui.starting) ? "GUI" :
# endif
! "terminal",
! out_buf);
! if (ch_log_output == TRUE)
! ch_log_output = FALSE; // only log once
! }
! #endif
}
}
/*
--- 2713,2739 ----
{
int len;
! if (out_pos == 0)
! return;
!
! // set out_pos to 0 before ui_write, to avoid recursiveness
! len = out_pos;
! out_pos = 0;
! ui_write(out_buf, len, FALSE);
#ifdef FEAT_EVAL
! if (ch_log_output != FALSE)
! {
! out_buf[len] = NUL;
! ch_log(NULL, "raw %s output: \"%s\"",
# ifdef FEAT_GUI
! (gui.in_use && !gui.dying && !gui.starting) ? "GUI" :
# endif
! "terminal",
! out_buf);
! if (ch_log_output == TRUE)
! ch_log_output = FALSE; // only log once
}
+ #endif
}
/*
***************
*** 2846,2911 ****
void
out_str_cf(char_u *s)
{
! if (s != NULL && *s)
! {
#ifdef HAVE_TGETENT
! char_u *p;
#endif
#ifdef FEAT_GUI
! // Don't use tputs() when GUI is used, ncurses crashes.
! if (gui.in_use)
! {
! out_str_nf(s);
! return;
! }
#endif
! if (out_pos > OUT_SIZE - MAX_ESC_SEQ_LEN)
! out_flush();
#ifdef HAVE_TGETENT
! for (p = s; *s; ++s)
{
! // flush just before delay command
! if (*s == '$' && *(s + 1) == '<')
! {
! char_u save_c = *s;
! int duration = atoi((char *)s + 2);
! *s = NUL;
! tputs((char *)p, 1, TPUTSFUNCAST out_char_nf);
! *s = save_c;
! out_flush();
# ifdef ELAPSED_FUNC
! // Only sleep here if we can limit this happening in
! // vim_beep().
! p = vim_strchr(s, '>');
! if (p == NULL || duration <= 0)
! {
! // can't parse the time, don't sleep here
! p = s;
! }
! else
! {
! ++p;
! do_sleep(duration, FALSE);
! }
! # else
! // Rely on the terminal library to sleep.
p = s;
- # endif
- break;
}
}
! tputs((char *)p, 1, TPUTSFUNCAST out_char_nf);
#else
! while (*s)
! out_char_nf(*s++);
#endif
! // For testing we write one string at a time.
! if (p_wd)
! out_flush();
! }
}
/*
--- 2847,2912 ----
void
out_str_cf(char_u *s)
{
! if (s == NULL || *s == NUL)
! return;
!
#ifdef HAVE_TGETENT
! char_u *p;
#endif
#ifdef FEAT_GUI
! // Don't use tputs() when GUI is used, ncurses crashes.
! if (gui.in_use)
! {
! out_str_nf(s);
! return;
! }
#endif
! if (out_pos > OUT_SIZE - MAX_ESC_SEQ_LEN)
! out_flush();
#ifdef HAVE_TGETENT
! for (p = s; *s; ++s)
! {
! // flush just before delay command
! if (*s == '$' && *(s + 1) == '<')
{
! char_u save_c = *s;
! int duration = atoi((char *)s + 2);
! *s = NUL;
! tputs((char *)p, 1, TPUTSFUNCAST out_char_nf);
! *s = save_c;
! out_flush();
# ifdef ELAPSED_FUNC
! // Only sleep here if we can limit this happening in
! // vim_beep().
! p = vim_strchr(s, '>');
! if (p == NULL || duration <= 0)
! {
! // can't parse the time, don't sleep here
p = s;
}
+ else
+ {
+ ++p;
+ do_sleep(duration, FALSE);
+ }
+ # else
+ // Rely on the terminal library to sleep.
+ p = s;
+ # endif
+ break;
}
! }
! tputs((char *)p, 1, TPUTSFUNCAST out_char_nf);
#else
! while (*s)
! out_char_nf(*s++);
#endif
! // For testing we write one string at a time.
! if (p_wd)
! out_flush();
}
/*
***************
*** 2917,2946 ****
void
out_str(char_u *s)
{
! if (s != NULL && *s)
! {
#ifdef FEAT_GUI
! // Don't use tputs() when GUI is used, ncurses crashes.
! if (gui.in_use)
! {
! out_str_nf(s);
! return;
! }
#endif
! // avoid terminal strings being split up
! if (out_pos > OUT_SIZE - MAX_ESC_SEQ_LEN)
! out_flush();
#ifdef HAVE_TGETENT
! tputs((char *)s, 1, TPUTSFUNCAST out_char_nf);
#else
! while (*s)
! out_char_nf(*s++);
#endif
! // For testing we write one string at a time.
! if (p_wd)
! out_flush();
! }
}
/*
--- 2918,2947 ----
void
out_str(char_u *s)
{
! if (s == NULL || *s == NUL)
! return;
!
#ifdef FEAT_GUI
! // Don't use tputs() when GUI is used, ncurses crashes.
! if (gui.in_use)
! {
! out_str_nf(s);
! return;
! }
#endif
! // avoid terminal strings being split up
! if (out_pos > OUT_SIZE - MAX_ESC_SEQ_LEN)
! out_flush();
#ifdef HAVE_TGETENT
! tputs((char *)s, 1, TPUTSFUNCAST out_char_nf);
#else
! while (*s)
! out_char_nf(*s++);
#endif
! // For testing we write one string at a time.
! if (p_wd)
! out_flush();
}
/*
***************
*** 3468,3480 ****
*val = 0;
len = get_bytes_from_buf(buf, bytes, (int)sizeof(long_u));
! if (len != -1)
{
! for (i = 0; i < (int)sizeof(long_u); i++)
! {
! shift = 8 * (sizeof(long_u) - 1 - i);
! *val += (long_u)bytes[i] << shift;
! }
}
return len;
}
--- 3469,3480 ----
*val = 0;
len = get_bytes_from_buf(buf, bytes, (int)sizeof(long_u));
! if (len == -1)
! return -1;
! for (i = 0; i < (int)sizeof(long_u); i++)
{
! shift = 8 * (sizeof(long_u) - 1 - i);
! *val += (long_u)bytes[i] << shift;
}
return len;
}
***************
*** 3598,3616 ****
int old_Rows = Rows;
int old_Columns = Columns;
! if (!exiting
#ifdef FEAT_GUI
// Do not get the size when executing a shell command during
// startup.
! && !gui.starting
#endif
)
! {
! (void)ui_get_shellsize();
! check_shellsize();
! if (old_Rows != Rows || old_Columns != Columns)
! shell_resized();
! }
}
/*
--- 3598,3616 ----
int old_Rows = Rows;
int old_Columns = Columns;
! if (exiting
#ifdef FEAT_GUI
// Do not get the size when executing a shell command during
// startup.
! || gui.starting
#endif
)
! return;
!
! (void)ui_get_shellsize();
! check_shellsize();
! if (old_Rows != Rows || old_Columns != Columns)
! shell_resized();
}
/*
***************
*** 3843,3943 ****
return;
#endif
! if (full_screen)
{
- /*
- * When returning after calling a shell cur_tmode is TMODE_UNKNOWN,
- * set the terminal to raw mode, even though we think it already is,
- * because the shell program may have reset the terminal mode.
- * When we think the terminal is normal, don't try to set it to
- * normal again, because that causes problems (logout!) on some
- * machines.
- */
- if (tmode != cur_tmode)
- {
#ifdef FEAT_TERMRESPONSE
# ifdef FEAT_GUI
! if (!gui.in_use && !gui.starting)
# endif
! {
! // May need to check for T_CRV response and termcodes, it
! // doesn't work in Cooked mode, an external program may get
! // them.
! if (tmode != TMODE_RAW && termrequest_any_pending())
! (void)vpeekc_nomap();
! check_for_codes_from_term();
! }
#endif
! if (tmode != TMODE_RAW)
! mch_setmouse(FALSE); // switch mouse off
! // Disable bracketed paste and modifyOtherKeys in cooked mode.
! // Avoid doing this too often, on some terminals the codes are not
! // handled properly.
! if (termcap_active && tmode != TMODE_SLEEP
! && cur_tmode != TMODE_SLEEP)
! {
! MAY_WANT_TO_LOG_THIS;
! if (tmode != TMODE_RAW)
! {
! out_str(T_BD); // disable bracketed paste mode
! out_str_t_TE(); // possibly disables modifyOtherKeys
! }
! else
! {
! out_str_t_BE(); // enable bracketed paste mode (should
! // be before mch_settmode().
! out_str_t_TI(); // possibly enables modifyOtherKeys
! }
}
- out_flush();
- mch_settmode(tmode); // machine specific function
- cur_tmode = tmode;
- if (tmode == TMODE_RAW)
- setmouse(); // may switch mouse on
- out_flush();
}
#ifdef FEAT_TERMRESPONSE
! may_req_termresponse();
#endif
- }
}
void
starttermcap(void)
{
! if (full_screen && !termcap_active)
! {
! MAY_WANT_TO_LOG_THIS;
! out_str(T_TI); // start termcap mode
! out_str_t_TI(); // start "raw" mode
! out_str(T_KS); // start "keypad transmit" mode
! out_str_t_BE(); // enable bracketed paste mode
#if defined(UNIX) || defined(VMS)
! // Enable xterm's focus reporting mode when 'esckeys' is set.
! if (p_ek && *T_FE != NUL)
! out_str(T_FE);
#endif
! out_flush();
! termcap_active = TRUE;
! screen_start(); // don't know where cursor is now
#ifdef FEAT_TERMRESPONSE
# ifdef FEAT_GUI
! if (!gui.in_use && !gui.starting)
# endif
! {
! may_req_termresponse();
! // Immediately check for a response. If t_Co changes, we don't
! // want to redraw with wrong colors first.
! if (crv_status.tr_progress == STATUS_SENT)
! check_for_codes_from_term();
! }
! #endif
}
}
void
--- 3843,3943 ----
return;
#endif
! if (!full_screen)
! return;
!
! /*
! * When returning after calling a shell cur_tmode is TMODE_UNKNOWN,
! * set the terminal to raw mode, even though we think it already is,
! * because the shell program may have reset the terminal mode.
! * When we think the terminal is normal, don't try to set it to
! * normal again, because that causes problems (logout!) on some
! * machines.
! */
! if (tmode != cur_tmode)
{
#ifdef FEAT_TERMRESPONSE
# ifdef FEAT_GUI
! if (!gui.in_use && !gui.starting)
# endif
! {
! // May need to check for T_CRV response and termcodes, it
! // doesn't work in Cooked mode, an external program may get
! // them.
! if (tmode != TMODE_RAW && termrequest_any_pending())
! (void)vpeekc_nomap();
! check_for_codes_from_term();
! }
#endif
! if (tmode != TMODE_RAW)
! mch_setmouse(FALSE); // switch mouse off
! // Disable bracketed paste and modifyOtherKeys in cooked mode.
! // Avoid doing this too often, on some terminals the codes are not
! // handled properly.
! if (termcap_active && tmode != TMODE_SLEEP
! && cur_tmode != TMODE_SLEEP)
! {
! MAY_WANT_TO_LOG_THIS;
! if (tmode != TMODE_RAW)
! {
! out_str(T_BD); // disable bracketed paste mode
! out_str_t_TE(); // possibly disables modifyOtherKeys
! }
! else
! {
! out_str_t_BE(); // enable bracketed paste mode (should
! // be before mch_settmode().
! out_str_t_TI(); // possibly enables modifyOtherKeys
}
}
+ out_flush();
+ mch_settmode(tmode); // machine specific function
+ cur_tmode = tmode;
+ if (tmode == TMODE_RAW)
+ setmouse(); // may switch mouse on
+ out_flush();
+ }
#ifdef FEAT_TERMRESPONSE
! may_req_termresponse();
#endif
}
void
starttermcap(void)
{
! if (!full_screen || termcap_active)
! return;
!
! MAY_WANT_TO_LOG_THIS;
! out_str(T_TI); // start termcap mode
! out_str_t_TI(); // start "raw" mode
! out_str(T_KS); // start "keypad transmit" mode
! out_str_t_BE(); // enable bracketed paste mode
#if defined(UNIX) || defined(VMS)
! // Enable xterm's focus reporting mode when 'esckeys' is set.
! if (p_ek && *T_FE != NUL)
! out_str(T_FE);
#endif
! out_flush();
! termcap_active = TRUE;
! screen_start(); // don't know where cursor is now
#ifdef FEAT_TERMRESPONSE
# ifdef FEAT_GUI
! if (!gui.in_use && !gui.starting)
# endif
! {
! may_req_termresponse();
! // Immediately check for a response. If t_Co changes, we don't
! // want to redraw with wrong colors first.
! if (crv_status.tr_progress == STATUS_SENT)
! check_for_codes_from_term();
}
+ #endif
}
void
***************
*** 3945,4007 ****
{
screen_stop_highlight();
reset_cterm_colors();
! if (termcap_active)
! {
#ifdef FEAT_TERMRESPONSE
# ifdef FEAT_GUI
! if (!gui.in_use && !gui.starting)
# endif
{
- // May need to discard T_CRV, T_U7 or T_RBG response.
- if (termrequest_any_pending())
- {
# ifdef UNIX
! // Give the terminal a chance to respond.
! mch_delay(100L, 0);
# endif
# ifdef TCIFLUSH
! // Discard data received but not read.
! if (exiting)
! tcflush(fileno(stdin), TCIFLUSH);
# endif
- }
- // Check for termcodes first, otherwise an external program may
- // get them.
- check_for_codes_from_term();
}
#endif
! MAY_WANT_TO_LOG_THIS;
#if defined(UNIX) || defined(VMS)
! // Disable xterm's focus reporting mode if 'esckeys' is set.
! if (p_ek && *T_FD != NUL)
! out_str(T_FD);
#endif
! out_str(T_BD); // disable bracketed paste mode
! out_str(T_KE); // stop "keypad transmit" mode
! out_flush();
! termcap_active = FALSE;
! // Output t_te before t_TE, t_te may switch between main and alternate
! // screen and following codes may work on the active screen only.
! //
! // When using the Kitty keyboard protocol the main and alternate screen
! // use a separate state. If we are (or were) using the Kitty keyboard
! // protocol and t_te is not empty (possibly switching screens) then
! // output t_TE both before and after outputting t_te.
! if (*T_TE != NUL && (kitty_protocol_state == KKPS_ENABLED
! || kitty_protocol_state == KKPS_DISABLED))
! out_str_t_TE(); // probably disables the kitty keyboard
! // protocol
!
! out_str(T_TE); // stop termcap mode
! cursor_on(); // just in case it is still off
! out_str_t_TE(); // stop "raw" mode, modifyOtherKeys and
// Kitty keyboard protocol
! screen_start(); // don't know where cursor is now
! out_flush();
! }
}
#if defined(FEAT_TERMRESPONSE) || defined(PROTO)
--- 3945,4008 ----
{
screen_stop_highlight();
reset_cterm_colors();
!
! if (!termcap_active)
! return;
!
#ifdef FEAT_TERMRESPONSE
# ifdef FEAT_GUI
! if (!gui.in_use && !gui.starting)
# endif
+ {
+ // May need to discard T_CRV, T_U7 or T_RBG response.
+ if (termrequest_any_pending())
{
# ifdef UNIX
! // Give the terminal a chance to respond.
! mch_delay(100L, 0);
# endif
# ifdef TCIFLUSH
! // Discard data received but not read.
! if (exiting)
! tcflush(fileno(stdin), TCIFLUSH);
# endif
}
+ // Check for termcodes first, otherwise an external program may
+ // get them.
+ check_for_codes_from_term();
+ }
#endif
! MAY_WANT_TO_LOG_THIS;
#if defined(UNIX) || defined(VMS)
! // Disable xterm's focus reporting mode if 'esckeys' is set.
! if (p_ek && *T_FD != NUL)
! out_str(T_FD);
#endif
! out_str(T_BD); // disable bracketed paste mode
! out_str(T_KE); // stop "keypad transmit" mode
! out_flush();
! termcap_active = FALSE;
! // Output t_te before t_TE, t_te may switch between main and alternate
! // screen and following codes may work on the active screen only.
! //
! // When using the Kitty keyboard protocol the main and alternate screen
! // use a separate state. If we are (or were) using the Kitty keyboard
! // protocol and t_te is not empty (possibly switching screens) then
! // output t_TE both before and after outputting t_te.
! if (*T_TE != NUL && (kitty_protocol_state == KKPS_ENABLED
! || kitty_protocol_state == KKPS_DISABLED))
! out_str_t_TE(); // probably disables the kitty keyboard
! // protocol
!
! out_str(T_TE); // stop termcap mode
! cursor_on(); // just in case it is still off
! out_str_t_TE(); // stop "raw" mode, modifyOtherKeys and
// Kitty keyboard protocol
! screen_start(); // don't know where cursor is now
! out_flush();
}
#if defined(FEAT_TERMRESPONSE) || defined(PROTO)
***************
*** 4219,4231 ****
void
scroll_start(void)
{
! if (*T_VS != NUL && *T_CVS != NUL)
! {
! MAY_WANT_TO_LOG_THIS;
! out_str(T_VS);
! out_str(T_CVS);
! screen_start(); // don't know where cursor is now
! }
}
// True if cursor is not visible
--- 4220,4232 ----
void
scroll_start(void)
{
! if (*T_VS == NUL || *T_CVS == NUL)
! return;
!
! MAY_WANT_TO_LOG_THIS;
! out_str(T_VS);
! out_str(T_CVS);
! screen_start(); // don't know where cursor is now
}
// True if cursor is not visible
***************
*** 4355,4367 ****
void
term_cursor_color(char_u *color)
{
! if (*T_CSC != NUL)
! {
! out_str(T_CSC); // set cursor color start
! out_str_nf(color);
! out_str(T_CEC); // set cursor color end
! out_flush();
! }
}
# endif
--- 4356,4368 ----
void
term_cursor_color(char_u *color)
{
! if (*T_CSC == NUL)
! return;
!
! out_str(T_CSC); // set cursor color start
! out_str_nf(color);
! out_str(T_CEC); // set cursor color end
! out_flush();
}
# endif
***************
*** 4922,4939 ****
{
int new_slen = 0;
if (modifiers != 0)
{
! // Some keys have the modifier included. Need to handle that here to
! // make mappings work. This may result in a special key, such as
! // K_S_TAB.
! *key = simplify_key(*key, &modifiers);
! if (modifiers != 0)
! {
! string[new_slen++] = K_SPECIAL;
! string[new_slen++] = (int)KS_MODIFIER;
! string[new_slen++] = modifiers;
! }
}
return new_slen;
}
--- 4923,4940 ----
{
int new_slen = 0;
+ if (modifiers == 0)
+ return 0;
+
+ // Some keys have the modifier included. Need to handle that here to
+ // make mappings work. This may result in a special key, such as
+ // K_S_TAB.
+ *key = simplify_key(*key, &modifiers);
if (modifiers != 0)
{
! string[new_slen++] = K_SPECIAL;
! string[new_slen++] = (int)KS_MODIFIER;
! string[new_slen++] = modifiers;
}
return new_slen;
}
***************
*** 6523,6534 ****
void
term_get_fg_color(char_u *r, char_u *g, char_u *b)
{
! if (rfg_status.tr_progress == STATUS_GOT)
! {
! *r = fg_r;
! *g = fg_g;
! *b = fg_b;
! }
}
/*
--- 6524,6535 ----
void
term_get_fg_color(char_u *r, char_u *g, char_u *b)
{
! if (rfg_status.tr_progress != STATUS_GOT)
! return;
!
! *r = fg_r;
! *g = fg_g;
! *b = fg_b;
}
/*
***************
*** 6537,6548 ****
void
term_get_bg_color(char_u *r, char_u *g, char_u *b)
{
! if (rbg_status.tr_progress == STATUS_GOT)
! {
! *r = bg_r;
! *g = bg_g;
! *b = bg_b;
! }
}
#endif
--- 6538,6549 ----
void
term_get_bg_color(char_u *r, char_u *g, char_u *b)
{
! if (rbg_status.tr_progress != STATUS_GOT)
! return;
!
! *r = bg_r;
! *g = bg_g;
! *b = bg_b;
}
#endif
***************
*** 7283,7296 ****
int code)
{
tcap_entry_T *p = find_builtin_term(name);
! if (p != NULL)
{
! while (p->bt_string != NULL)
! {
! if (p->bt_entry == code)
! return p;
! ++p;
! }
}
return NULL;
}
--- 7284,7296 ----
int code)
{
tcap_entry_T *p = find_builtin_term(name);
! if (p == NULL)
! return NULL;
! while (p->bt_string != NULL)
{
! if (p->bt_entry == code)
! return p;
! ++p;
}
return NULL;
}
*** ../vim-9.0.1244/src/terminal.c 2022-11-28 18:51:38.959571588 +0000
--- src/terminal.c 2023-01-25 21:02:57.835082030 +0000
***************
*** 259,277 ****
*rows = 0;
*cols = 0;
! if (*wp->w_p_tws != NUL)
! {
! char_u *p = vim_strchr(wp->w_p_tws, 'x');
! // Syntax of value was already checked when it's set.
! if (p == NULL)
! {
! minsize = TRUE;
! p = vim_strchr(wp->w_p_tws, '*');
! }
! *rows = atoi((char *)wp->w_p_tws);
! *cols = atoi((char *)p + 1);
}
return minsize;
}
--- 259,277 ----
*rows = 0;
*cols = 0;
! if (*wp->w_p_tws == NUL)
! return FALSE;
! char_u *p = vim_strchr(wp->w_p_tws, 'x');
!
! // Syntax of value was already checked when it's set.
! if (p == NULL)
! {
! minsize = TRUE;
! p = vim_strchr(wp->w_p_tws, '*');
}
+ *rows = atoi((char *)wp->w_p_tws);
+ *cols = atoi((char *)p + 1);
return minsize;
}
***************
*** 1620,1640 ****
{
// Also consider the job finished when the channel is closed, to avoid a
// race condition when updating the title.
! if (term != NULL
! && term->tl_job != NULL
! && channel_is_open(term->tl_job->jv_channel))
! {
! job_T *job = term->tl_job;
! // Careful: Checking the job status may invoke callbacks, which close
! // the buffer and terminate "term". However, "job" will not be freed
! // yet.
! if (check_job_status)
! job_status(job);
! return (job->jv_status == JOB_STARTED
! || (job->jv_channel != NULL && job->jv_channel->ch_keep_open));
! }
! return FALSE;
}
/*
--- 1620,1639 ----
{
// Also consider the job finished when the channel is closed, to avoid a
// race condition when updating the title.
! if (term == NULL
! || term->tl_job == NULL
! || !channel_is_open(term->tl_job->jv_channel))
! return FALSE;
! job_T *job = term->tl_job;
!
! // Careful: Checking the job status may invoke callbacks, which close
! // the buffer and terminate "term". However, "job" will not be freed
! // yet.
! if (check_job_status)
! job_status(job);
! return (job->jv_status == JOB_STARTED
! || (job->jv_channel != NULL && job->jv_channel->ch_keep_open));
}
/*
***************
*** 1807,1834 ****
static int
add_empty_scrollback(term_T *term, cellattr_T *fill_attr, int lnum)
{
! if (ga_grow(&term->tl_scrollback, 1) == OK)
{
! sb_line_T *line = (sb_line_T *)term->tl_scrollback.ga_data
! + term->tl_scrollback.ga_len;
! if (lnum > 0)
{
! int i;
!
! for (i = 0; i < term->tl_scrollback.ga_len - lnum; ++i)
! {
! *line = *(line - 1);
! --line;
! }
}
- line->sb_cols = 0;
- line->sb_cells = NULL;
- line->sb_fill_attr = *fill_attr;
- ++term->tl_scrollback.ga_len;
- return OK;
}
! return FALSE;
}
/*
--- 1806,1832 ----
static int
add_empty_scrollback(term_T *term, cellattr_T *fill_attr, int lnum)
{
! if (ga_grow(&term->tl_scrollback, 1) == FAIL)
! return FALSE;
!
! sb_line_T *line = (sb_line_T *)term->tl_scrollback.ga_data
! + term->tl_scrollback.ga_len;
!
! if (lnum > 0)
{
! int i;
! for (i = 0; i < term->tl_scrollback.ga_len - lnum; ++i)
{
! *line = *(line - 1);
! --line;
}
}
! line->sb_cols = 0;
! line->sb_cells = NULL;
! line->sb_fill_attr = *fill_attr;
! ++term->tl_scrollback.ga_len;
! return OK;
}
/*
***************
*** 2409,2451 ****
return;
l = (list_T *)get_reg_contents(c, GREG_LIST);
! if (l != NULL)
{
! type = get_reg_type(c, ®len);
! FOR_ALL_LIST_ITEMS(l, item)
! {
! char_u *s = tv_get_string(&item->li_tv);
#ifdef MSWIN
! char_u *tmp = s;
! if (!enc_utf8 && enc_codepage > 0)
! {
! WCHAR *ret = NULL;
! int length = 0;
! MultiByteToWideChar_alloc(enc_codepage, 0, (char *)s,
! (int)STRLEN(s), &ret, &length);
! if (ret != NULL)
! {
! WideCharToMultiByte_alloc(CP_UTF8, 0,
! ret, length, (char **)&s, &length, 0, 0);
! vim_free(ret);
! }
}
#endif
! channel_send(curbuf->b_term->tl_job->jv_channel, PART_IN,
! s, (int)STRLEN(s), NULL);
#ifdef MSWIN
! if (tmp != s)
! vim_free(s);
#endif
! if (item->li_next != NULL || type == MLINE)
! channel_send(curbuf->b_term->tl_job->jv_channel, PART_IN,
! (char_u *)"\r", 1, NULL);
! }
! list_free(l);
}
}
/*
--- 2407,2449 ----
return;
l = (list_T *)get_reg_contents(c, GREG_LIST);
! if (l == NULL)
! return;
!
! type = get_reg_type(c, ®len);
! FOR_ALL_LIST_ITEMS(l, item)
{
! char_u *s = tv_get_string(&item->li_tv);
#ifdef MSWIN
! char_u *tmp = s;
! if (!enc_utf8 && enc_codepage > 0)
! {
! WCHAR *ret = NULL;
! int length = 0;
! MultiByteToWideChar_alloc(enc_codepage, 0, (char *)s,
! (int)STRLEN(s), &ret, &length);
! if (ret != NULL)
! {
! WideCharToMultiByte_alloc(CP_UTF8, 0,
! ret, length, (char **)&s, &length, 0, 0);
! vim_free(ret);
}
+ }
#endif
! channel_send(curbuf->b_term->tl_job->jv_channel, PART_IN,
! s, (int)STRLEN(s), NULL);
#ifdef MSWIN
! if (tmp != s)
! vim_free(s);
#endif
! if (item->li_next != NULL || type == MLINE)
! channel_send(curbuf->b_term->tl_job->jv_channel, PART_IN,
! (char_u *)"\r", 1, NULL);
}
+ list_free(l);
}
/*
***************
*** 2615,2632 ****
{
term_T *term = curbuf->b_term;
! if (term != NULL)
{
! if (term_use_loop_check(TRUE))
! {
! reset_VIsual_and_resel();
! if (State & MODE_INSERT)
! stop_insert_mode = TRUE;
! }
! mouse_was_outside = FALSE;
! enter_mouse_col = mouse_col;
! enter_mouse_row = mouse_row;
! }
}
void
--- 2613,2630 ----
{
term_T *term = curbuf->b_term;
! if (term == NULL)
! return;
!
! if (term_use_loop_check(TRUE))
{
! reset_VIsual_and_resel();
! if (State & MODE_INSERT)
! stop_insert_mode = TRUE;
! }
! mouse_was_outside = FALSE;
! enter_mouse_col = mouse_col;
! enter_mouse_row = mouse_row;
}
void
***************
*** 2634,2649 ****
{
term_T *term = curbuf->b_term;
! if (term != NULL && term->tl_vterm != NULL)
! {
! VTermState *state = vterm_obtain_state(term->tl_vterm);
! if (in_focus)
! vterm_state_focus_in(state);
! else
! vterm_state_focus_out(state);
! term_forward_output(term);
! }
}
/*
--- 2632,2647 ----
{
term_T *term = curbuf->b_term;
! if (term == NULL || term->tl_vterm == NULL)
! return;
! VTermState *state = vterm_obtain_state(term->tl_vterm);
!
! if (in_focus)
! vterm_state_focus_in(state);
! else
! vterm_state_focus_out(state);
! term_forward_output(term);
}
/*
***************
*** 2886,2898 ****
static void
may_toggle_cursor(term_T *term)
{
! if (in_terminal_loop == term)
! {
! if (term->tl_cursor_visible)
! cursor_on();
! else
! cursor_off();
! }
}
/*
--- 2884,2896 ----
static void
may_toggle_cursor(term_T *term)
{
! if (in_terminal_loop != term)
! return;
!
! if (term->tl_cursor_visible)
! cursor_on();
! else
! cursor_off();
}
/*
***************
*** 3320,3346 ****
static void
limit_scrollback(term_T *term, garray_T *gap, int update_buffer)
{
! if (gap->ga_len >= term->tl_buffer->b_p_twsl)
! {
! int todo = term->tl_buffer->b_p_twsl / 10;
! int i;
! curbuf = term->tl_buffer;
! for (i = 0; i < todo; ++i)
! {
! vim_free(((sb_line_T *)gap->ga_data + i)->sb_cells);
! if (update_buffer)
! ml_delete(1);
! }
! curbuf = curwin->w_buffer;
! gap->ga_len -= todo;
! mch_memmove(gap->ga_data,
! (sb_line_T *)gap->ga_data + todo,
! sizeof(sb_line_T) * gap->ga_len);
if (update_buffer)
! term->tl_scrollback_scrolled -= todo;
}
}
/*
--- 3318,3344 ----
static void
limit_scrollback(term_T *term, garray_T *gap, int update_buffer)
{
! if (gap->ga_len < term->tl_buffer->b_p_twsl)
! return;
! int todo = term->tl_buffer->b_p_twsl / 10;
! int i;
! curbuf = term->tl_buffer;
! for (i = 0; i < todo; ++i)
! {
! vim_free(((sb_line_T *)gap->ga_data + i)->sb_cells);
if (update_buffer)
! ml_delete(1);
}
+ curbuf = curwin->w_buffer;
+
+ gap->ga_len -= todo;
+ mch_memmove(gap->ga_data,
+ (sb_line_T *)gap->ga_data + todo,
+ sizeof(sb_line_T) * gap->ga_len);
+ if (update_buffer)
+ term->tl_scrollback_scrolled -= todo;
}
/*
***************
*** 3371,3448 ****
limit_scrollback(term, gap, update_buffer);
! if (ga_grow(gap, 1) == OK)
! {
! cellattr_T *p = NULL;
! int len = 0;
! int i;
! int c;
! int col;
! int text_len;
! char_u *text;
! sb_line_T *line;
! garray_T ga;
! cellattr_T fill_attr = term->tl_default_color;
! // do not store empty cells at the end
! for (i = 0; i < cols; ++i)
! if (cells[i].chars[0] != 0)
! len = i + 1;
! else
! cell2cellattr(&cells[i], &fill_attr);
! ga_init2(&ga, 1, 100);
! if (len > 0)
! p = ALLOC_MULT(cellattr_T, len);
! if (p != NULL)
{
! for (col = 0; col < len; col += cells[col].width)
{
! if (ga_grow(&ga, MB_MAXBYTES) == FAIL)
! {
! ga.ga_len = 0;
! break;
! }
! for (i = 0; (c = cells[col].chars[i]) > 0 || i == 0; ++i)
! ga.ga_len += utf_char2bytes(c == NUL ? ' ' : c,
! (char_u *)ga.ga_data + ga.ga_len);
! cell2cellattr(&cells[col], &p[col]);
}
}
! if (ga_grow(&ga, 1) == FAIL)
! {
! if (update_buffer)
! text = (char_u *)"";
! else
! text = vim_strsave((char_u *)"");
! text_len = 0;
! }
! else
! {
! text = ga.ga_data;
! text_len = ga.ga_len;
! *(text + text_len) = NUL;
! }
! if (update_buffer)
! add_scrollback_line_to_buffer(term, text, text_len);
!
! line = (sb_line_T *)gap->ga_data + gap->ga_len;
! line->sb_cols = len;
! line->sb_cells = p;
! line->sb_fill_attr = fill_attr;
if (update_buffer)
! {
! line->sb_text = NULL;
! ++term->tl_scrollback_scrolled;
! ga_clear(&ga); // free the text
! }
else
! {
! line->sb_text = text;
! ga_init(&ga); // text is kept in tl_scrollback_postponed
! }
! ++gap->ga_len;
}
return 0; // ignored
}
--- 3369,3446 ----
limit_scrollback(term, gap, update_buffer);
! if (ga_grow(gap, 1) == FAIL)
! return 0;
! cellattr_T *p = NULL;
! int len = 0;
! int i;
! int c;
! int col;
! int text_len;
! char_u *text;
! sb_line_T *line;
! garray_T ga;
! cellattr_T fill_attr = term->tl_default_color;
! // do not store empty cells at the end
! for (i = 0; i < cols; ++i)
! if (cells[i].chars[0] != 0)
! len = i + 1;
! else
! cell2cellattr(&cells[i], &fill_attr);
!
! ga_init2(&ga, 1, 100);
! if (len > 0)
! p = ALLOC_MULT(cellattr_T, len);
! if (p != NULL)
! {
! for (col = 0; col < len; col += cells[col].width)
{
! if (ga_grow(&ga, MB_MAXBYTES) == FAIL)
{
! ga.ga_len = 0;
! break;
}
+ for (i = 0; (c = cells[col].chars[i]) > 0 || i == 0; ++i)
+ ga.ga_len += utf_char2bytes(c == NUL ? ' ' : c,
+ (char_u *)ga.ga_data + ga.ga_len);
+ cell2cellattr(&cells[col], &p[col]);
}
! }
! if (ga_grow(&ga, 1) == FAIL)
! {
if (update_buffer)
! text = (char_u *)"";
else
! text = vim_strsave((char_u *)"");
! text_len = 0;
}
+ else
+ {
+ text = ga.ga_data;
+ text_len = ga.ga_len;
+ *(text + text_len) = NUL;
+ }
+ if (update_buffer)
+ add_scrollback_line_to_buffer(term, text, text_len);
+
+ line = (sb_line_T *)gap->ga_data + gap->ga_len;
+ line->sb_cols = len;
+ line->sb_cells = p;
+ line->sb_fill_attr = fill_attr;
+ if (update_buffer)
+ {
+ line->sb_text = NULL;
+ ++term->tl_scrollback_scrolled;
+ ga_clear(&ga); // free the text
+ }
+ else
+ {
+ line->sb_text = text;
+ ga_init(&ga); // text is kept in tl_scrollback_postponed
+ }
+ ++gap->ga_len;
return 0; // ignored
}
***************
*** 3612,3628 ****
int
may_close_term_popup(void)
{
! if (popup_is_popup(curwin) && curbuf->b_term != NULL
! && !term_job_running_not_none(curbuf->b_term))
! {
! win_T *pwin = curwin;
! if (win_valid(prevwin))
! win_enter(prevwin, FALSE);
! popup_close_with_retval(pwin, 0);
! return OK;
! }
! return FAIL;
}
#endif
--- 3610,3625 ----
int
may_close_term_popup(void)
{
! if (!popup_is_popup(curwin) || curbuf->b_term == NULL
! || term_job_running_not_none(curbuf->b_term))
! return FAIL;
! win_T *pwin = curwin;
!
! if (win_valid(prevwin))
! win_enter(prevwin, FALSE);
! popup_close_with_retval(pwin, 0);
! return OK;
}
#endif
***************
*** 4002,4013 ****
{
term_T *term = wp->w_buffer->b_term;
! if (term != NULL && term->tl_vterm != NULL && !term->tl_normal_mode
! && wp->w_redr_type == 0)
! {
! term->tl_dirty_row_start = MAX_ROW;
! term->tl_dirty_row_end = 0;
! }
}
/*
--- 3999,4010 ----
{
term_T *term = wp->w_buffer->b_term;
! if (term == NULL || term->tl_vterm == NULL || term->tl_normal_mode
! || wp->w_redr_type != 0)
! return;
!
! term->tl_dirty_row_start = MAX_ROW;
! term->tl_dirty_row_end = 0;
}
/*
***************
*** 4040,4055 ****
{
term_T *term = curbuf->b_term;
! if (term_is_finished(curbuf) && term->tl_scrollback.ga_len > 0)
! {
! free_scrollback(term);
! redraw_buf_later(term->tl_buffer, UPD_NOT_VALID);
! // The buffer is now like a normal buffer, it cannot be easily
! // abandoned when changed.
! set_string_option_direct((char_u *)"buftype", -1,
! (char_u *)"", OPT_FREE|OPT_LOCAL, 0);
! }
}
/*
--- 4037,4052 ----
{
term_T *term = curbuf->b_term;
! if (!term_is_finished(curbuf) || term->tl_scrollback.ga_len <= 0)
! return;
! free_scrollback(term);
! redraw_buf_later(term->tl_buffer, UPD_NOT_VALID);
!
! // The buffer is now like a normal buffer, it cannot be easily
! // abandoned when changed.
! set_string_option_direct((char_u *)"buftype", -1,
! (char_u *)"", OPT_FREE|OPT_LOCAL, 0);
}
/*
***************
*** 4908,4941 ****
char_u *
term_get_status_text(term_T *term)
{
! if (term->tl_status_text == NULL)
! {
! char_u *txt;
! size_t len;
! char_u *fname;
! if (term->tl_normal_mode)
! {
! if (term_job_running(term))
! txt = (char_u *)_("Terminal");
! else
! txt = (char_u *)_("Terminal-finished");
! }
! else if (term->tl_title != NULL)
! txt = term->tl_title;
! else if (term_none_open(term))
! txt = (char_u *)_("active");
! else if (term_job_running(term))
! txt = (char_u *)_("running");
else
! txt = (char_u *)_("finished");
! fname = buf_get_fname(term->tl_buffer);
! len = 9 + STRLEN(fname) + STRLEN(txt);
! term->tl_status_text = alloc(len);
! if (term->tl_status_text != NULL)
! vim_snprintf((char *)term->tl_status_text, len, "%s [%s]",
! fname, txt);
}
return term->tl_status_text;
}
--- 4905,4938 ----
char_u *
term_get_status_text(term_T *term)
{
! if (term->tl_status_text != NULL)
! return term->tl_status_text;
! char_u *txt;
! size_t len;
! char_u *fname;
!
! if (term->tl_normal_mode)
! {
! if (term_job_running(term))
! txt = (char_u *)_("Terminal");
else
! txt = (char_u *)_("Terminal-finished");
}
+ else if (term->tl_title != NULL)
+ txt = term->tl_title;
+ else if (term_none_open(term))
+ txt = (char_u *)_("active");
+ else if (term_job_running(term))
+ txt = (char_u *)_("running");
+ else
+ txt = (char_u *)_("finished");
+ fname = buf_get_fname(term->tl_buffer);
+ len = 9 + STRLEN(fname) + STRLEN(txt);
+ term->tl_status_text = alloc(len);
+ if (term->tl_status_text != NULL)
+ vim_snprintf((char *)term->tl_status_text, len, "%s [%s]",
+ fname, txt);
return term->tl_status_text;
}
***************
*** 5236,5246 ****
static void
append_cell(garray_T *gap, cellattr_T *cell)
{
! if (ga_grow(gap, 1) == OK)
! {
! *(((cellattr_T *)gap->ga_data) + gap->ga_len) = *cell;
! ++gap->ga_len;
! }
}
static void
--- 5233,5243 ----
static void
append_cell(garray_T *gap, cellattr_T *cell)
{
! if (ga_grow(gap, 1) == FAIL)
! return;
!
! *(((cellattr_T *)gap->ga_data) + gap->ga_len) = *cell;
! ++gap->ga_len;
}
static void
***************
*** 6036,6050 ****
list_append_number(l, term->tl_cursor_pos.col + 1);
d = dict_alloc();
! if (d != NULL)
! {
! dict_add_number(d, "visible", term->tl_cursor_visible);
! dict_add_number(d, "blink", blink_state_is_inverted()
! ? !term->tl_cursor_blink : term->tl_cursor_blink);
! dict_add_number(d, "shape", term->tl_cursor_shape);
! dict_add_string(d, "color", cursor_color_get(term->tl_cursor_color));
! list_append_dict(l, d);
! }
}
/*
--- 6033,6047 ----
list_append_number(l, term->tl_cursor_pos.col + 1);
d = dict_alloc();
! if (d == NULL)
! return;
!
! dict_add_number(d, "visible", term->tl_cursor_visible);
! dict_add_number(d, "blink", blink_state_is_inverted()
! ? !term->tl_cursor_blink : term->tl_cursor_blink);
! dict_add_number(d, "shape", term->tl_cursor_shape);
! dict_add_string(d, "color", cursor_color_get(term->tl_cursor_color));
! list_append_dict(l, d);
}
/*
***************
*** 7692,7711 ****
term_report_winsize(term_T *term, int rows, int cols)
{
// Use an ioctl() to report the new window size to the job.
! if (term->tl_job != NULL && term->tl_job->jv_channel != NULL)
! {
! int fd = -1;
! int part;
! for (part = PART_OUT; part < PART_COUNT; ++part)
! {
! fd = term->tl_job->jv_channel->ch_part[part].ch_fd;
! if (mch_isatty(fd))
! break;
! }
! if (part < PART_COUNT && mch_report_winsize(fd, rows, cols) == OK)
! mch_signal_job(term->tl_job, (char_u *)"winch");
}
}
# endif
--- 7689,7708 ----
term_report_winsize(term_T *term, int rows, int cols)
{
// Use an ioctl() to report the new window size to the job.
! if (term->tl_job == NULL || term->tl_job->jv_channel == NULL)
! return;
! int fd = -1;
! int part;
!
! for (part = PART_OUT; part < PART_COUNT; ++part)
! {
! fd = term->tl_job->jv_channel->ch_part[part].ch_fd;
! if (mch_isatty(fd))
! break;
}
+ if (part < PART_COUNT && mch_report_winsize(fd, rows, cols) == OK)
+ mch_signal_job(term->tl_job, (char_u *)"winch");
}
# endif
*** ../vim-9.0.1244/src/testing.c 2022-12-20 20:01:09.624090908 +0000
--- src/testing.c 2023-01-25 21:02:57.835082030 +0000
***************
*** 55,62 ****
mch_memmove(buf, p, clen);
buf[clen] = NUL;
ga_concat(gap, buf);
}
! else switch (*p)
{
case BS: ga_concat(gap, (char_u *)"\\b"); break;
case ESC: ga_concat(gap, (char_u *)"\\e"); break;
--- 55,64 ----
mch_memmove(buf, p, clen);
buf[clen] = NUL;
ga_concat(gap, buf);
+ return;
}
!
! switch (*p)
{
case BS: ga_concat(gap, (char_u *)"\\b"); break;
case ESC: ga_concat(gap, (char_u *)"\\e"); break;
*** ../vim-9.0.1244/src/textformat.c 2023-01-23 16:56:52.740404170 +0000
--- src/textformat.c 2023-01-25 21:02:57.835082030 +0000
***************
*** 752,777 ****
int c = ' ';
int cc;
! if (did_add_space)
{
! cc = gchar_cursor();
! if (!WHITECHAR(cc))
! // Somehow the space was removed already.
! did_add_space = FALSE;
! else
{
! if (!end_insert)
! {
! inc_cursor();
! c = gchar_cursor();
! dec_cursor();
! }
! if (c != NUL)
! {
! // The space is no longer at the end of the line, delete it.
! del_char(FALSE);
! did_add_space = FALSE;
! }
}
}
}
--- 752,777 ----
int c = ' ';
int cc;
! if (!did_add_space)
! return;
!
! cc = gchar_cursor();
! if (!WHITECHAR(cc))
! // Somehow the space was removed already.
! did_add_space = FALSE;
! else
{
! if (!end_insert)
{
! inc_cursor();
! c = gchar_cursor();
! dec_cursor();
! }
! if (c != NUL)
! {
! // The space is no longer at the end of the line, delete it.
! del_char(FALSE);
! did_add_space = FALSE;
}
}
}
*** ../vim-9.0.1244/src/textprop.c 2023-01-02 18:10:00.019271226 +0000
--- src/textprop.c 2023-01-25 21:02:57.835082030 +0000
***************
*** 1939,1966 ****
}
hi = find_prop_type_hi(name, buf);
! if (hi != NULL)
! {
! hashtab_T *ht;
! proptype_T *prop = HI2PT(hi);
! if (buf == NULL)
! {
! ht = global_proptypes;
! VIM_CLEAR(global_proparray);
! }
! else
! {
! ht = buf->b_proptypes;
! VIM_CLEAR(buf->b_proparray);
! }
! hash_remove(ht, hi, "prop type delete");
! vim_free(prop);
! // currently visibile text properties will disappear
! redraw_all_later(UPD_CLEAR);
! changed_window_setting_buf(buf == NULL ? curbuf : buf);
}
}
/*
--- 1939,1966 ----
}
hi = find_prop_type_hi(name, buf);
! if (hi == NULL)
! return;
! hashtab_T *ht;
! proptype_T *prop = HI2PT(hi);
! if (buf == NULL)
! {
! ht = global_proptypes;
! VIM_CLEAR(global_proparray);
! }
! else
! {
! ht = buf->b_proptypes;
! VIM_CLEAR(buf->b_proparray);
}
+ hash_remove(ht, hi, "prop type delete");
+ vim_free(prop);
+
+ // currently visibile text properties will disappear
+ redraw_all_later(UPD_CLEAR);
+ changed_window_setting_buf(buf == NULL ? curbuf : buf);
}
/*
***************
*** 1982,2016 ****
semsg(_(e_invalid_argument_str), "\"\"");
return;
}
- if (rettv_dict_alloc(rettv) == OK)
- {
- proptype_T *prop = NULL;
- buf_T *buf = NULL;
! if (argvars[1].v_type != VAR_UNKNOWN)
! {
! if (get_bufnr_from_arg(&argvars[1], &buf) == FAIL)
! return;
! }
! prop = find_prop_type(name, buf);
! if (prop != NULL)
! {
! dict_T *d = rettv->vval.v_dict;
! if (prop->pt_hl_id > 0)
! dict_add_string(d, "highlight", syn_id2name(prop->pt_hl_id));
! dict_add_number(d, "priority", prop->pt_priority);
! dict_add_number(d, "combine",
! (prop->pt_flags & PT_FLAG_COMBINE) ? 1 : 0);
! dict_add_number(d, "start_incl",
! (prop->pt_flags & PT_FLAG_INS_START_INCL) ? 1 : 0);
! dict_add_number(d, "end_incl",
! (prop->pt_flags & PT_FLAG_INS_END_INCL) ? 1 : 0);
! if (buf != NULL)
! dict_add_number(d, "bufnr", buf->b_fnum);
! }
}
}
static void
--- 1982,2017 ----
semsg(_(e_invalid_argument_str), "\"\"");
return;
}
! if (rettv_dict_alloc(rettv) == FAIL)
! return;
! proptype_T *prop = NULL;
! buf_T *buf = NULL;
! if (argvars[1].v_type != VAR_UNKNOWN)
! {
! if (get_bufnr_from_arg(&argvars[1], &buf) == FAIL)
! return;
}
+
+ prop = find_prop_type(name, buf);
+ if (prop == NULL)
+ return;
+
+ dict_T *d = rettv->vval.v_dict;
+
+ if (prop->pt_hl_id > 0)
+ dict_add_string(d, "highlight", syn_id2name(prop->pt_hl_id));
+ dict_add_number(d, "priority", prop->pt_priority);
+ dict_add_number(d, "combine",
+ (prop->pt_flags & PT_FLAG_COMBINE) ? 1 : 0);
+ dict_add_number(d, "start_incl",
+ (prop->pt_flags & PT_FLAG_INS_START_INCL) ? 1 : 0);
+ dict_add_number(d, "end_incl",
+ (prop->pt_flags & PT_FLAG_INS_END_INCL) ? 1 : 0);
+ if (buf != NULL)
+ dict_add_number(d, "bufnr", buf->b_fnum);
}
static void
***************
*** 2040,2063 ****
{
buf_T *buf = NULL;
! if (rettv_list_alloc(rettv) == OK)
{
! if (in_vim9script() && check_for_opt_dict_arg(argvars, 0) == FAIL)
return;
-
- if (argvars[0].v_type != VAR_UNKNOWN)
- {
- if (get_bufnr_from_arg(&argvars[0], &buf) == FAIL)
- return;
- }
- if (buf == NULL)
- {
- if (global_proptypes != NULL)
- list_types(global_proptypes, rettv->vval.v_list);
- }
- else if (buf->b_proptypes != NULL)
- list_types(buf->b_proptypes, rettv->vval.v_list);
}
}
/*
--- 2041,2064 ----
{
buf_T *buf = NULL;
! if (rettv_list_alloc(rettv) == FAIL)
! return;
!
! if (in_vim9script() && check_for_opt_dict_arg(argvars, 0) == FAIL)
! return;
!
! if (argvars[0].v_type != VAR_UNKNOWN)
{
! if (get_bufnr_from_arg(&argvars[0], &buf) == FAIL)
return;
}
+ if (buf == NULL)
+ {
+ if (global_proptypes != NULL)
+ list_types(global_proptypes, rettv->vval.v_list);
+ }
+ else if (buf->b_proptypes != NULL)
+ list_types(buf->b_proptypes, rettv->vval.v_list);
}
/*
*** ../vim-9.0.1244/src/time.c 2022-12-02 15:58:34.610705474 +0000
--- src/time.c 2023-01-25 21:02:57.835082030 +0000
***************
*** 302,348 ****
curtime = vim_localtime(&seconds, &tmval);
// MSVC returns NULL for an invalid value of seconds.
if (curtime == NULL)
- rettv->vval.v_string = vim_strsave((char_u *)_("(Invalid)"));
- else
{
# ifdef MSWIN
! WCHAR result_buf[256];
! WCHAR *wp;
! wp = enc_to_utf16(p, NULL);
! if (wp != NULL)
! (void)wcsftime(result_buf, ARRAY_LENGTH(result_buf), wp, curtime);
! else
! result_buf[0] = NUL;
! rettv->vval.v_string = utf16_to_enc(result_buf, NULL);
! vim_free(wp);
# else
! char_u result_buf[256];
! vimconv_T conv;
! char_u *enc;
!
! conv.vc_type = CONV_NONE;
! enc = enc_locale();
! convert_setup(&conv, p_enc, enc);
! if (conv.vc_type != CONV_NONE)
! p = string_convert(&conv, p, NULL);
! if (p == NULL || strftime((char *)result_buf, sizeof(result_buf),
! (char *)p, curtime) == 0)
! result_buf[0] = NUL;
!
! if (conv.vc_type != CONV_NONE)
! vim_free(p);
! convert_setup(&conv, enc, p_enc);
! if (conv.vc_type != CONV_NONE)
! rettv->vval.v_string = string_convert(&conv, result_buf, NULL);
! else
! rettv->vval.v_string = vim_strsave(result_buf);
! // Release conversion descriptors
! convert_setup(&conv, NULL, NULL);
! vim_free(enc);
# endif
- }
}
# endif
--- 302,349 ----
curtime = vim_localtime(&seconds, &tmval);
// MSVC returns NULL for an invalid value of seconds.
if (curtime == NULL)
{
+ rettv->vval.v_string = vim_strsave((char_u *)_("(Invalid)"));
+ return;
+ }
+
# ifdef MSWIN
! WCHAR result_buf[256];
! WCHAR *wp;
! wp = enc_to_utf16(p, NULL);
! if (wp != NULL)
! (void)wcsftime(result_buf, ARRAY_LENGTH(result_buf), wp, curtime);
! else
! result_buf[0] = NUL;
! rettv->vval.v_string = utf16_to_enc(result_buf, NULL);
! vim_free(wp);
# else
! char_u result_buf[256];
! vimconv_T conv;
! char_u *enc;
! conv.vc_type = CONV_NONE;
! enc = enc_locale();
! convert_setup(&conv, p_enc, enc);
! if (conv.vc_type != CONV_NONE)
! p = string_convert(&conv, p, NULL);
! if (p == NULL || strftime((char *)result_buf, sizeof(result_buf),
! (char *)p, curtime) == 0)
! result_buf[0] = NUL;
!
! if (conv.vc_type != CONV_NONE)
! vim_free(p);
! convert_setup(&conv, enc, p_enc);
! if (conv.vc_type != CONV_NONE)
! rettv->vval.v_string = string_convert(&conv, result_buf, NULL);
! else
! rettv->vval.v_string = vim_strsave(result_buf);
!
! // Release conversion descriptors
! convert_setup(&conv, NULL, NULL);
! vim_free(enc);
# endif
}
# endif
***************
*** 672,683 ****
{
timer_T *timer;
! if (id >= 0)
! {
! FOR_ALL_TIMERS(timer)
! if (timer->tr_id == id)
! return timer;
! }
return NULL;
}
--- 673,684 ----
{
timer_T *timer;
! if (id < 0)
! return NULL;
!
! FOR_ALL_TIMERS(timer)
! if (timer->tr_id == id)
! return timer;
return NULL;
}
***************
*** 791,797 ****
{
if (timer == NULL)
return FALSE;
! for (timer_T *t = first_timer; t != NULL; t = t->tr_next)
if (t == timer)
return TRUE;
return FALSE;
--- 792,800 ----
{
if (timer == NULL)
return FALSE;
!
! timer_T *t;
! FOR_ALL_TIMERS(t)
if (t == timer)
return TRUE;
return FALSE;
***************
*** 848,862 ****
return;
if (argvars[0].v_type != VAR_NUMBER)
- emsg(_(e_number_expected));
- else
{
! int paused = (int)tv_get_bool(&argvars[1]);
!
! timer = find_timer((int)tv_get_number(&argvars[0]));
! if (timer != NULL)
! timer->tr_paused = paused;
}
}
/*
--- 851,866 ----
return;
if (argvars[0].v_type != VAR_NUMBER)
{
! emsg(_(e_number_expected));
! return;
}
+
+ int paused = (int)tv_get_bool(&argvars[1]);
+
+ timer = find_timer((int)tv_get_number(&argvars[0]));
+ if (timer != NULL)
+ timer->tr_paused = paused;
}
/*
***************
*** 904,917 ****
timer = create_timer(msec, repeat);
if (timer == NULL)
- free_callback(&callback);
- else
{
! set_callback(&timer->tr_callback, &callback);
! if (callback.cb_free_name)
! vim_free(callback.cb_name);
! rettv->vval.v_number = (varnumber_T)timer->tr_id;
}
}
/*
--- 908,921 ----
timer = create_timer(msec, repeat);
if (timer == NULL)
{
! free_callback(&callback);
! return;
}
+ set_callback(&timer->tr_callback, &callback);
+ if (callback.cb_free_name)
+ vim_free(callback.cb_name);
+ rettv->vval.v_number = (varnumber_T)timer->tr_id;
}
/*
***************
*** 1019,1046 ****
static struct timeval start;
struct timeval now;
! if (time_fd != NULL)
{
- if (strstr(mesg, "STARTING") != NULL)
- {
- gettimeofday(&start, NULL);
- prev_timeval = start;
- fprintf(time_fd, "\n\ntimes in msec\n");
- fprintf(time_fd, " clock self+sourced self: sourced script\n");
- fprintf(time_fd, " clock elapsed: other lines\n\n");
- }
- gettimeofday(&now, NULL);
- time_diff(&start, &now);
- if (((struct timeval *)tv_start) != NULL)
- {
- fprintf(time_fd, " ");
- time_diff(((struct timeval *)tv_start), &now);
- }
fprintf(time_fd, " ");
! time_diff(&prev_timeval, &now);
! prev_timeval = now;
! fprintf(time_fd, ": %s\n", mesg);
}
}
# endif // STARTUPTIME
#endif // FEAT_EVAL
--- 1023,1050 ----
static struct timeval start;
struct timeval now;
! if (time_fd == NULL)
! return;
!
! if (strstr(mesg, "STARTING") != NULL)
! {
! gettimeofday(&start, NULL);
! prev_timeval = start;
! fprintf(time_fd, "\n\ntimes in msec\n");
! fprintf(time_fd, " clock self+sourced self: sourced script\n");
! fprintf(time_fd, " clock elapsed: other lines\n\n");
! }
! gettimeofday(&now, NULL);
! time_diff(&start, &now);
! if (((struct timeval *)tv_start) != NULL)
{
fprintf(time_fd, " ");
! time_diff(((struct timeval *)tv_start), &now);
}
+ fprintf(time_fd, " ");
+ time_diff(&prev_timeval, &now);
+ prev_timeval = now;
+ fprintf(time_fd, ": %s\n", mesg);
}
# endif // STARTUPTIME
#endif // FEAT_EVAL
*** ../vim-9.0.1244/src/typval.c 2023-01-02 20:32:18.425749782 +0000
--- src/typval.c 2023-01-25 21:02:57.835082030 +0000
***************
*** 52,108 ****
void
free_tv(typval_T *varp)
{
! if (varp != NULL)
{
! switch (varp->v_type)
! {
! case VAR_FUNC:
! func_unref(varp->vval.v_string);
! // FALLTHROUGH
! case VAR_STRING:
! vim_free(varp->vval.v_string);
! break;
! case VAR_PARTIAL:
! partial_unref(varp->vval.v_partial);
! break;
! case VAR_BLOB:
! blob_unref(varp->vval.v_blob);
! break;
! case VAR_LIST:
! list_unref(varp->vval.v_list);
! break;
! case VAR_DICT:
! dict_unref(varp->vval.v_dict);
! break;
! case VAR_JOB:
#ifdef FEAT_JOB_CHANNEL
! job_unref(varp->vval.v_job);
! break;
#endif
! case VAR_CHANNEL:
#ifdef FEAT_JOB_CHANNEL
! channel_unref(varp->vval.v_channel);
! break;
#endif
! case VAR_CLASS:
! class_unref(varp->vval.v_class);
! break;
! case VAR_OBJECT:
! object_unref(varp->vval.v_object);
! break;
! case VAR_NUMBER:
! case VAR_FLOAT:
! case VAR_ANY:
! case VAR_UNKNOWN:
! case VAR_VOID:
! case VAR_BOOL:
! case VAR_SPECIAL:
! case VAR_INSTR:
! break;
! }
! vim_free(varp);
}
}
/*
--- 52,108 ----
void
free_tv(typval_T *varp)
{
! if (varp == NULL)
! return;
!
! switch (varp->v_type)
{
! case VAR_FUNC:
! func_unref(varp->vval.v_string);
! // FALLTHROUGH
! case VAR_STRING:
! vim_free(varp->vval.v_string);
! break;
! case VAR_PARTIAL:
! partial_unref(varp->vval.v_partial);
! break;
! case VAR_BLOB:
! blob_unref(varp->vval.v_blob);
! break;
! case VAR_LIST:
! list_unref(varp->vval.v_list);
! break;
! case VAR_DICT:
! dict_unref(varp->vval.v_dict);
! break;
! case VAR_JOB:
#ifdef FEAT_JOB_CHANNEL
! job_unref(varp->vval.v_job);
! break;
#endif
! case VAR_CHANNEL:
#ifdef FEAT_JOB_CHANNEL
! channel_unref(varp->vval.v_channel);
! break;
#endif
! case VAR_CLASS:
! class_unref(varp->vval.v_class);
! break;
! case VAR_OBJECT:
! object_unref(varp->vval.v_object);
! break;
! case VAR_NUMBER:
! case VAR_FLOAT:
! case VAR_ANY:
! case VAR_UNKNOWN:
! case VAR_VOID:
! case VAR_BOOL:
! case VAR_SPECIAL:
! case VAR_INSTR:
! break;
}
+ vim_free(varp);
}
/*
***************
*** 111,180 ****
void
clear_tv(typval_T *varp)
{
! if (varp != NULL)
{
! switch (varp->v_type)
! {
! case VAR_FUNC:
! func_unref(varp->vval.v_string);
! // FALLTHROUGH
! case VAR_STRING:
! VIM_CLEAR(varp->vval.v_string);
! break;
! case VAR_PARTIAL:
! partial_unref(varp->vval.v_partial);
! varp->vval.v_partial = NULL;
! break;
! case VAR_BLOB:
! blob_unref(varp->vval.v_blob);
! varp->vval.v_blob = NULL;
! break;
! case VAR_LIST:
! list_unref(varp->vval.v_list);
! varp->vval.v_list = NULL;
! break;
! case VAR_DICT:
! dict_unref(varp->vval.v_dict);
! varp->vval.v_dict = NULL;
! break;
! case VAR_NUMBER:
! case VAR_BOOL:
! case VAR_SPECIAL:
! varp->vval.v_number = 0;
! break;
! case VAR_FLOAT:
! varp->vval.v_float = 0.0;
! break;
! case VAR_JOB:
#ifdef FEAT_JOB_CHANNEL
! job_unref(varp->vval.v_job);
! varp->vval.v_job = NULL;
#endif
! break;
! case VAR_CHANNEL:
#ifdef FEAT_JOB_CHANNEL
! channel_unref(varp->vval.v_channel);
! varp->vval.v_channel = NULL;
#endif
! break;
! case VAR_INSTR:
! VIM_CLEAR(varp->vval.v_instr);
! break;
! case VAR_CLASS:
! class_unref(varp->vval.v_class);
! varp->vval.v_class = NULL;
! break;
! case VAR_OBJECT:
! object_unref(varp->vval.v_object);
! varp->vval.v_object = NULL;
! break;
! case VAR_UNKNOWN:
! case VAR_ANY:
! case VAR_VOID:
! break;
! }
! varp->v_lock = 0;
}
}
/*
--- 111,180 ----
void
clear_tv(typval_T *varp)
{
! if (varp == NULL)
! return;
!
! switch (varp->v_type)
{
! case VAR_FUNC:
! func_unref(varp->vval.v_string);
! // FALLTHROUGH
! case VAR_STRING:
! VIM_CLEAR(varp->vval.v_string);
! break;
! case VAR_PARTIAL:
! partial_unref(varp->vval.v_partial);
! varp->vval.v_partial = NULL;
! break;
! case VAR_BLOB:
! blob_unref(varp->vval.v_blob);
! varp->vval.v_blob = NULL;
! break;
! case VAR_LIST:
! list_unref(varp->vval.v_list);
! varp->vval.v_list = NULL;
! break;
! case VAR_DICT:
! dict_unref(varp->vval.v_dict);
! varp->vval.v_dict = NULL;
! break;
! case VAR_NUMBER:
! case VAR_BOOL:
! case VAR_SPECIAL:
! varp->vval.v_number = 0;
! break;
! case VAR_FLOAT:
! varp->vval.v_float = 0.0;
! break;
! case VAR_JOB:
#ifdef FEAT_JOB_CHANNEL
! job_unref(varp->vval.v_job);
! varp->vval.v_job = NULL;
#endif
! break;
! case VAR_CHANNEL:
#ifdef FEAT_JOB_CHANNEL
! channel_unref(varp->vval.v_channel);
! varp->vval.v_channel = NULL;
#endif
! break;
! case VAR_INSTR:
! VIM_CLEAR(varp->vval.v_instr);
! break;
! case VAR_CLASS:
! class_unref(varp->vval.v_class);
! varp->vval.v_class = NULL;
! break;
! case VAR_OBJECT:
! object_unref(varp->vval.v_object);
! varp->vval.v_object = NULL;
! break;
! case VAR_UNKNOWN:
! case VAR_ANY:
! case VAR_VOID:
! break;
}
+ varp->v_lock = 0;
}
/*
*** ../vim-9.0.1244/src/version.c 2023-01-25 17:34:38.013795178 +0000
--- src/version.c 2023-01-25 21:03:52.359067883 +0000
***************
*** 697,698 ****
--- 697,700 ----
{ /* Add new patch number below this line */
+ /**/
+ 1245,
/**/
--
hundred-and-one symptoms of being an internet addict:
46. Your wife makes a new rule: "The computer cannot come to bed."
/// Bram Moolenaar -- Br...@Moolenaar.net --
http://www.Moolenaar.net \\\
/// \\\
\\\ sponsor Vim, vote for features --
http://www.Vim.org/sponsor/ ///
\\\ help me help AIDS victims --
http://ICCF-Holland.org ///