vim-patch:9.0.1221: code is indented more than necessary (#21891)

Problem:    Code is indented more than necessary.
Solution:   Use an early return where it makes sense. (Yegappan Lakshmanan,
            closes vim/vim#11833)

f97a295cca

Co-authored-by: Yegappan Lakshmanan <yegappan@yahoo.com>
This commit is contained in:
zeertzjq
2023-01-19 09:51:59 +08:00
committed by GitHub
parent f8669e8a18
commit 45dc0f3454
6 changed files with 318 additions and 280 deletions

View File

@@ -1193,18 +1193,20 @@ static void put_reedit_in_typebuf(int silent)
{
char_u buf[3];
if (restart_edit != NUL) {
if (restart_edit == 'V') {
buf[0] = 'g';
buf[1] = 'R';
buf[2] = NUL;
} else {
buf[0] = (char_u)(restart_edit == 'I' ? 'i' : restart_edit);
buf[1] = NUL;
}
if (ins_typebuf((char *)buf, REMAP_NONE, 0, true, silent) == OK) {
restart_edit = NUL;
}
if (restart_edit == NUL) {
return;
}
if (restart_edit == 'V') {
buf[0] = 'g';
buf[1] = 'R';
buf[2] = NUL;
} else {
buf[0] = (char_u)(restart_edit == 'I' ? 'i' : restart_edit);
buf[1] = NUL;
}
if (ins_typebuf((char *)buf, REMAP_NONE, 0, true, silent) == OK) {
restart_edit = NUL;
}
}
@@ -2574,12 +2576,14 @@ void free_register(yankreg_T *reg)
FUNC_ATTR_NONNULL_ALL
{
set_yreg_additional_data(reg, NULL);
if (reg->y_array != NULL) {
for (size_t i = reg->y_size; i-- > 0;) { // from y_size - 1 to 0 included
xfree(reg->y_array[i]);
}
XFREE_CLEAR(reg->y_array);
if (reg->y_array == NULL) {
return;
}
for (size_t i = reg->y_size; i-- > 0;) { // from y_size - 1 to 0 included
xfree(reg->y_array[i]);
}
XFREE_CLEAR(reg->y_array);
}
/// Yanks the text between "oap->start" and "oap->end" into a yank register.

View File

@@ -703,17 +703,17 @@ void script_prof_save(proftime_T *tm)
/// Count time spent in children after invoking another script or function.
void script_prof_restore(const proftime_T *tm)
{
scriptitem_T *si;
if (!SCRIPT_ID_VALID(current_sctx.sc_sid)) {
return;
}
if (current_sctx.sc_sid > 0 && current_sctx.sc_sid <= script_items.ga_len) {
si = &SCRIPT_ITEM(current_sctx.sc_sid);
if (si->sn_prof_on && --si->sn_pr_nest == 0) {
si->sn_pr_child = profile_end(si->sn_pr_child);
// don't count wait time
si->sn_pr_child = profile_sub_wait(*tm, si->sn_pr_child);
si->sn_pr_children = profile_add(si->sn_pr_children, si->sn_pr_child);
si->sn_prl_children = profile_add(si->sn_prl_children, si->sn_pr_child);
}
scriptitem_T *si = &SCRIPT_ITEM(current_sctx.sc_sid);
if (si->sn_prof_on && --si->sn_pr_nest == 0) {
si->sn_pr_child = profile_end(si->sn_pr_child);
// don't count wait time
si->sn_pr_child = profile_sub_wait(*tm, si->sn_pr_child);
si->sn_pr_children = profile_add(si->sn_pr_children, si->sn_pr_child);
si->sn_prl_children = profile_add(si->sn_prl_children, si->sn_pr_child);
}
}
@@ -787,17 +787,17 @@ static void script_dump_profile(FILE *fd)
/// Dump the profiling info.
void profile_dump(void)
{
FILE *fd;
if (profile_fname == NULL) {
return;
}
if (profile_fname != NULL) {
fd = os_fopen(profile_fname, "w");
if (fd == NULL) {
semsg(_(e_notopen), profile_fname);
} else {
script_dump_profile(fd);
func_dump_profile(fd);
fclose(fd);
}
FILE *fd = os_fopen(profile_fname, "w");
if (fd == NULL) {
semsg(_(e_notopen), profile_fname);
} else {
script_dump_profile(fd);
func_dump_profile(fd);
fclose(fd);
}
}

View File

@@ -1190,13 +1190,15 @@ static void qf_store_title(qf_list_T *qfl, const char *title)
{
XFREE_CLEAR(qfl->qf_title);
if (title != NULL) {
size_t len = strlen(title) + 1;
char *p = xmallocz(len);
qfl->qf_title = p;
xstrlcpy(p, title, len + 1);
if (title == NULL) {
return;
}
size_t len = strlen(title) + 1;
char *p = xmallocz(len);
qfl->qf_title = p;
xstrlcpy(p, title, len + 1);
}
/// The title of a quickfix/location list is set, by default, to the command
@@ -1684,14 +1686,16 @@ int qf_stack_get_bufnr(void)
static void wipe_qf_buffer(qf_info_T *qi)
FUNC_ATTR_NONNULL_ALL
{
if (qi->qf_bufnr != INVALID_QFBUFNR) {
buf_T *const qfbuf = buflist_findnr(qi->qf_bufnr);
if (qfbuf != NULL && qfbuf->b_nwindows == 0) {
// If the quickfix buffer is not loaded in any window, then
// wipe the buffer.
close_buffer(NULL, qfbuf, DOBUF_WIPE, false, false);
qi->qf_bufnr = INVALID_QFBUFNR;
}
if (qi->qf_bufnr == INVALID_QFBUFNR) {
return;
}
buf_T *const qfbuf = buflist_findnr(qi->qf_bufnr);
if (qfbuf != NULL && qfbuf->b_nwindows == 0) {
// If the quickfix buffer is not loaded in any window, then
// wipe the buffer.
close_buffer(NULL, qfbuf, DOBUF_WIPE, false, false);
qi->qf_bufnr = INVALID_QFBUFNR;
}
}
@@ -3878,59 +3882,61 @@ static void qf_update_buffer(qf_info_T *qi, qfline_T *old_last)
{
// Check if a buffer for the quickfix list exists. Update it.
buf_T *buf = qf_find_buf(qi);
if (buf != NULL) {
linenr_T old_line_count = buf->b_ml.ml_line_count;
int qf_winid = 0;
win_T *win;
if (IS_LL_STACK(qi)) {
if (curwin->w_llist == qi) {
win = curwin;
} else {
// Find the file window (non-quickfix) with this location list
win = qf_find_win_with_loclist(qi);
if (win == NULL) {
// File window is not found. Find the location list window.
win = qf_find_win(qi);
}
if (win == NULL) {
return;
}
}
qf_winid = (int)win->handle;
}
// autocommands may cause trouble
incr_quickfix_busy();
aco_save_T aco;
if (old_last == NULL) {
// set curwin/curbuf to buf and save a few things
aucmd_prepbuf(&aco, buf);
}
qf_update_win_titlevar(qi);
qf_fill_buffer(qf_get_curlist(qi), buf, old_last, qf_winid);
buf_inc_changedtick(buf);
if (old_last == NULL) {
(void)qf_win_pos_update(qi, 0);
// restore curwin/curbuf and a few other things
aucmd_restbuf(&aco);
}
// Only redraw when added lines are visible. This avoids flickering when
// the added lines are not visible.
if ((win = qf_find_win(qi)) != NULL && old_line_count < win->w_botline) {
redraw_buf_later(buf, UPD_NOT_VALID);
}
// always called after incr_quickfix_busy()
decr_quickfix_busy();
if (buf == NULL) {
return;
}
linenr_T old_line_count = buf->b_ml.ml_line_count;
int qf_winid = 0;
win_T *win;
if (IS_LL_STACK(qi)) {
if (curwin->w_llist == qi) {
win = curwin;
} else {
// Find the file window (non-quickfix) with this location list
win = qf_find_win_with_loclist(qi);
if (win == NULL) {
// File window is not found. Find the location list window.
win = qf_find_win(qi);
}
if (win == NULL) {
return;
}
}
qf_winid = (int)win->handle;
}
// autocommands may cause trouble
incr_quickfix_busy();
aco_save_T aco;
if (old_last == NULL) {
// set curwin/curbuf to buf and save a few things
aucmd_prepbuf(&aco, buf);
}
qf_update_win_titlevar(qi);
qf_fill_buffer(qf_get_curlist(qi), buf, old_last, qf_winid);
buf_inc_changedtick(buf);
if (old_last == NULL) {
(void)qf_win_pos_update(qi, 0);
// restore curwin/curbuf and a few other things
aucmd_restbuf(&aco);
}
// Only redraw when added lines are visible. This avoids flickering when
// the added lines are not visible.
if ((win = qf_find_win(qi)) != NULL && old_line_count < win->w_botline) {
redraw_buf_later(buf, UPD_NOT_VALID);
}
// always called after incr_quickfix_busy()
decr_quickfix_busy();
}
// Add an error line to the quickfix buffer.
@@ -4188,14 +4194,16 @@ static int qf_id2nr(const qf_info_T *const qi, const unsigned qfid)
static int qf_restore_list(qf_info_T *qi, unsigned save_qfid)
FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
{
if (qf_get_curlist(qi)->qf_id != save_qfid) {
const int curlist = qf_id2nr(qi, save_qfid);
if (curlist < 0) {
// list is not present
return FAIL;
}
qi->qf_curlist = curlist;
if (qf_get_curlist(qi)->qf_id == save_qfid) {
return OK;
}
const int curlist = qf_id2nr(qi, save_qfid);
if (curlist < 0) {
// list is not present
return FAIL;
}
qi->qf_curlist = curlist;
return OK;
}
@@ -5736,12 +5744,14 @@ static void wipe_dummy_buffer(buf_T *buf, char *dirname_start)
// 'autochdir' option have changed it.
static void unload_dummy_buffer(buf_T *buf, char *dirname_start)
{
if (curbuf != buf) { // safety check
close_buffer(NULL, buf, DOBUF_UNLOAD, false, true);
// When autocommands/'autochdir' option changed directory: go back.
restore_start_dir(dirname_start);
if (curbuf == buf) { // safety check
return;
}
close_buffer(NULL, buf, DOBUF_UNLOAD, false, true);
// When autocommands/'autochdir' option changed directory: go back.
restore_start_dir(dirname_start);
}
/// Copy the specified quickfix entry items into a new dict and append the dict
@@ -5866,33 +5876,35 @@ static int qf_get_list_from_lines(dict_T *what, dictitem_T *di, dict_T *retdict)
int status = FAIL;
// Only a List value is supported
if (di->di_tv.v_type == VAR_LIST && di->di_tv.vval.v_list != NULL) {
char *errorformat = p_efm;
dictitem_T *efm_di;
// If errorformat is supplied then use it, otherwise use the 'efm'
// option setting
if ((efm_di = tv_dict_find(what, S_LEN("efm"))) != NULL) {
if (efm_di->di_tv.v_type != VAR_STRING
|| efm_di->di_tv.vval.v_string == NULL) {
return FAIL;
}
errorformat = efm_di->di_tv.vval.v_string;
}
list_T *l = tv_list_alloc(kListLenMayKnow);
qf_info_T *const qi = qf_alloc_stack(QFLT_INTERNAL);
if (qf_init_ext(qi, 0, NULL, NULL, &di->di_tv, errorformat,
true, (linenr_T)0, (linenr_T)0, NULL, NULL) > 0) {
(void)get_errorlist(qi, NULL, 0, 0, l);
qf_free(&qi->qf_lists[0]);
}
xfree(qi);
tv_dict_add_list(retdict, S_LEN("items"), l);
status = OK;
if (di->di_tv.v_type != VAR_LIST || di->di_tv.vval.v_list == NULL) {
return FAIL;
}
char *errorformat = p_efm;
dictitem_T *efm_di;
// If errorformat is supplied then use it, otherwise use the 'efm'
// option setting
if ((efm_di = tv_dict_find(what, S_LEN("efm"))) != NULL) {
if (efm_di->di_tv.v_type != VAR_STRING
|| efm_di->di_tv.vval.v_string == NULL) {
return FAIL;
}
errorformat = efm_di->di_tv.vval.v_string;
}
list_T *l = tv_list_alloc(kListLenMayKnow);
qf_info_T *const qi = qf_alloc_stack(QFLT_INTERNAL);
if (qf_init_ext(qi, 0, NULL, NULL, &di->di_tv, errorformat,
true, (linenr_T)0, (linenr_T)0, NULL, NULL) > 0) {
(void)get_errorlist(qi, NULL, 0, 0, l);
qf_free(&qi->qf_lists[0]);
}
xfree(qi);
tv_dict_add_list(retdict, S_LEN("items"), l);
status = OK;
return status;
}
@@ -6934,43 +6946,45 @@ void ex_cexpr(exarg_T *eap)
// Evaluate the expression. When the result is a string or a list we can
// use it to fill the errorlist.
typval_T tv;
if (eval0(eap->arg, &tv, &eap->nextcmd, true) != FAIL) {
if ((tv.v_type == VAR_STRING && tv.vval.v_string != NULL)
|| tv.v_type == VAR_LIST) {
incr_quickfix_busy();
int res = qf_init_ext(qi, qi->qf_curlist, NULL, NULL, &tv, p_efm,
(eap->cmdidx != CMD_caddexpr
&& eap->cmdidx != CMD_laddexpr),
(linenr_T)0, (linenr_T)0,
qf_cmdtitle(*eap->cmdlinep), NULL);
if (qf_stack_empty(qi)) {
decr_quickfix_busy();
goto cleanup;
}
if (res >= 0) {
qf_list_changed(qf_get_curlist(qi));
}
// Remember the current quickfix list identifier, so that we can
// check for autocommands changing the current quickfix list.
unsigned save_qfid = qf_get_curlist(qi)->qf_id;
if (au_name != NULL) {
apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name, curbuf->b_fname, true, curbuf);
}
// Jump to the first error for a new list and if autocmds didn't
// free the list.
if (res > 0
&& (eap->cmdidx == CMD_cexpr || eap->cmdidx == CMD_lexpr)
&& qflist_valid(wp, save_qfid)) {
// display the first error
qf_jump_first(qi, save_qfid, eap->forceit);
}
decr_quickfix_busy();
} else {
emsg(_("E777: String or List expected"));
}
cleanup:
tv_clear(&tv);
if (eval0(eap->arg, &tv, &eap->nextcmd, true) == FAIL) {
return;
}
if ((tv.v_type == VAR_STRING && tv.vval.v_string != NULL)
|| tv.v_type == VAR_LIST) {
incr_quickfix_busy();
int res = qf_init_ext(qi, qi->qf_curlist, NULL, NULL, &tv, p_efm,
(eap->cmdidx != CMD_caddexpr
&& eap->cmdidx != CMD_laddexpr),
(linenr_T)0, (linenr_T)0,
qf_cmdtitle(*eap->cmdlinep), NULL);
if (qf_stack_empty(qi)) {
decr_quickfix_busy();
goto cleanup;
}
if (res >= 0) {
qf_list_changed(qf_get_curlist(qi));
}
// Remember the current quickfix list identifier, so that we can
// check for autocommands changing the current quickfix list.
unsigned save_qfid = qf_get_curlist(qi)->qf_id;
if (au_name != NULL) {
apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name, curbuf->b_fname, true, curbuf);
}
// Jump to the first error for a new list and if autocmds didn't
// free the list.
if (res > 0
&& (eap->cmdidx == CMD_cexpr || eap->cmdidx == CMD_lexpr)
&& qflist_valid(wp, save_qfid)) {
// display the first error
qf_jump_first(qi, save_qfid, eap->forceit);
}
decr_quickfix_busy();
} else {
emsg(_("E777: String or List expected"));
}
cleanup:
tv_clear(&tv);
}
// Get the location list for ":lhelpgrep"

View File

@@ -1184,32 +1184,36 @@ static int prog_magic_wrong(void)
// used (to increase speed).
static void cleanup_subexpr(void)
{
if (rex.need_clear_subexpr) {
if (REG_MULTI) {
// Use 0xff to set lnum to -1
memset(rex.reg_startpos, 0xff, sizeof(lpos_T) * NSUBEXP);
memset(rex.reg_endpos, 0xff, sizeof(lpos_T) * NSUBEXP);
} else {
memset(rex.reg_startp, 0, sizeof(char *) * NSUBEXP);
memset(rex.reg_endp, 0, sizeof(char *) * NSUBEXP);
}
rex.need_clear_subexpr = false;
if (!rex.need_clear_subexpr) {
return;
}
if (REG_MULTI) {
// Use 0xff to set lnum to -1
memset(rex.reg_startpos, 0xff, sizeof(lpos_T) * NSUBEXP);
memset(rex.reg_endpos, 0xff, sizeof(lpos_T) * NSUBEXP);
} else {
memset(rex.reg_startp, 0, sizeof(char *) * NSUBEXP);
memset(rex.reg_endp, 0, sizeof(char *) * NSUBEXP);
}
rex.need_clear_subexpr = false;
}
static void cleanup_zsubexpr(void)
{
if (rex.need_clear_zsubexpr) {
if (REG_MULTI) {
// Use 0xff to set lnum to -1
memset(reg_startzpos, 0xff, sizeof(lpos_T) * NSUBEXP);
memset(reg_endzpos, 0xff, sizeof(lpos_T) * NSUBEXP);
} else {
memset(reg_startzp, 0, sizeof(char *) * NSUBEXP);
memset(reg_endzp, 0, sizeof(char *) * NSUBEXP);
}
rex.need_clear_zsubexpr = false;
if (!rex.need_clear_zsubexpr) {
return;
}
if (REG_MULTI) {
// Use 0xff to set lnum to -1
memset(reg_startzpos, 0xff, sizeof(lpos_T) * NSUBEXP);
memset(reg_endzpos, 0xff, sizeof(lpos_T) * NSUBEXP);
} else {
memset(reg_startzp, 0, sizeof(char *) * NSUBEXP);
memset(reg_endzp, 0, sizeof(char *) * NSUBEXP);
}
rex.need_clear_zsubexpr = false;
}
// Advance rex.lnum, rex.line and rex.input to the next line.

View File

@@ -3468,15 +3468,17 @@ static void save_subexpr(regbehind_T *bp)
// When "rex.need_clear_subexpr" is set we don't need to save the values, only
// remember that this flag needs to be set again when restoring.
bp->save_need_clear_subexpr = rex.need_clear_subexpr;
if (!rex.need_clear_subexpr) {
for (int i = 0; i < NSUBEXP; i++) {
if (REG_MULTI) {
bp->save_start[i].se_u.pos = rex.reg_startpos[i];
bp->save_end[i].se_u.pos = rex.reg_endpos[i];
} else {
bp->save_start[i].se_u.ptr = rex.reg_startp[i];
bp->save_end[i].se_u.ptr = rex.reg_endp[i];
}
if (rex.need_clear_subexpr) {
return;
}
for (int i = 0; i < NSUBEXP; i++) {
if (REG_MULTI) {
bp->save_start[i].se_u.pos = rex.reg_startpos[i];
bp->save_end[i].se_u.pos = rex.reg_endpos[i];
} else {
bp->save_start[i].se_u.ptr = rex.reg_startp[i];
bp->save_end[i].se_u.ptr = rex.reg_endp[i];
}
}
}
@@ -3487,15 +3489,17 @@ static void restore_subexpr(regbehind_T *bp)
{
// Only need to restore saved values when they are not to be cleared.
rex.need_clear_subexpr = bp->save_need_clear_subexpr;
if (!rex.need_clear_subexpr) {
for (int i = 0; i < NSUBEXP; i++) {
if (REG_MULTI) {
rex.reg_startpos[i] = bp->save_start[i].se_u.pos;
rex.reg_endpos[i] = bp->save_end[i].se_u.pos;
} else {
rex.reg_startp[i] = bp->save_start[i].se_u.ptr;
rex.reg_endp[i] = bp->save_end[i].se_u.ptr;
}
if (rex.need_clear_subexpr) {
return;
}
for (int i = 0; i < NSUBEXP; i++) {
if (REG_MULTI) {
rex.reg_startpos[i] = bp->save_start[i].se_u.pos;
rex.reg_endpos[i] = bp->save_end[i].se_u.pos;
} else {
rex.reg_startp[i] = bp->save_start[i].se_u.ptr;
rex.reg_endp[i] = bp->save_end[i].se_u.ptr;
}
}
}

View File

@@ -3285,25 +3285,27 @@ static void nfa_postfix_dump(char_u *expr, int retval)
FILE *f;
f = fopen(NFA_REGEXP_DUMP_LOG, "a");
if (f != NULL) {
fprintf(f, "\n-------------------------\n");
if (retval == FAIL) {
fprintf(f, ">>> NFA engine failed... \n");
} else if (retval == OK) {
fprintf(f, ">>> NFA engine succeeded !\n");
}
fprintf(f, "Regexp: \"%s\"\nPostfix notation (char): \"", expr);
for (p = post_start; *p && p < post_ptr; p++) {
nfa_set_code(*p);
fprintf(f, "%s, ", code);
}
fprintf(f, "\"\nPostfix notation (int): ");
for (p = post_start; *p && p < post_ptr; p++) {
fprintf(f, "%d ", *p);
}
fprintf(f, "\n\n");
fclose(f);
if (f == NULL) {
return;
}
fprintf(f, "\n-------------------------\n");
if (retval == FAIL) {
fprintf(f, ">>> NFA engine failed... \n");
} else if (retval == OK) {
fprintf(f, ">>> NFA engine succeeded !\n");
}
fprintf(f, "Regexp: \"%s\"\nPostfix notation (char): \"", expr);
for (p = post_start; *p && p < post_ptr; p++) {
nfa_set_code(*p);
fprintf(f, "%s, ", code);
}
fprintf(f, "\"\nPostfix notation (int): ");
for (p = post_start; *p && p < post_ptr; p++) {
fprintf(f, "%d ", *p);
}
fprintf(f, "\n\n");
fclose(f);
}
// Print the NFA starting with a root node "state".
@@ -3381,22 +3383,24 @@ static void nfa_dump(nfa_regprog_T *prog)
{
FILE *debugf = fopen(NFA_REGEXP_DUMP_LOG, "a");
if (debugf != NULL) {
nfa_print_state(debugf, prog->start);
if (prog->reganch) {
fprintf(debugf, "reganch: %d\n", prog->reganch);
}
if (prog->regstart != NUL) {
fprintf(debugf, "regstart: %c (decimal: %d)\n",
prog->regstart, prog->regstart);
}
if (prog->match_text != NULL) {
fprintf(debugf, "match_text: \"%s\"\n", prog->match_text);
}
fclose(debugf);
if (debugf == NULL) {
return;
}
nfa_print_state(debugf, prog->start);
if (prog->reganch) {
fprintf(debugf, "reganch: %d\n", prog->reganch);
}
if (prog->regstart != NUL) {
fprintf(debugf, "regstart: %c (decimal: %d)\n",
prog->regstart, prog->regstart);
}
if (prog->match_text != NULL) {
fprintf(debugf, "match_text: \"%s\"\n", prog->match_text);
}
fclose(debugf);
}
#endif // REGEXP_DEBUG
@@ -4427,16 +4431,18 @@ static void clear_sub(regsub_T *sub)
static void copy_sub(regsub_T *to, regsub_T *from)
{
to->in_use = from->in_use;
if (from->in_use > 0) {
// Copy the match start and end positions.
if (REG_MULTI) {
memmove(&to->list.multi[0], &from->list.multi[0],
sizeof(struct multipos) * (size_t)from->in_use);
to->orig_start_col = from->orig_start_col;
} else {
memmove(&to->list.line[0], &from->list.line[0],
sizeof(struct linepos) * (size_t)from->in_use);
}
if (from->in_use <= 0) {
return;
}
// Copy the match start and end positions.
if (REG_MULTI) {
memmove(&to->list.multi[0], &from->list.multi[0],
sizeof(struct multipos) * (size_t)from->in_use);
to->orig_start_col = from->orig_start_col;
} else {
memmove(&to->list.line[0], &from->list.line[0],
sizeof(struct linepos) * (size_t)from->in_use);
}
}
@@ -4446,31 +4452,35 @@ static void copy_sub_off(regsub_T *to, regsub_T *from)
if (to->in_use < from->in_use) {
to->in_use = from->in_use;
}
if (from->in_use > 1) {
// Copy the match start and end positions.
if (REG_MULTI) {
memmove(&to->list.multi[1], &from->list.multi[1],
sizeof(struct multipos) * (size_t)(from->in_use - 1));
} else {
memmove(&to->list.line[1], &from->list.line[1],
sizeof(struct linepos) * (size_t)(from->in_use - 1));
}
if (from->in_use <= 1) {
return;
}
// Copy the match start and end positions.
if (REG_MULTI) {
memmove(&to->list.multi[1], &from->list.multi[1],
sizeof(struct multipos) * (size_t)(from->in_use - 1));
} else {
memmove(&to->list.line[1], &from->list.line[1],
sizeof(struct linepos) * (size_t)(from->in_use - 1));
}
}
// Like copy_sub() but only do the end of the main match if \ze is present.
static void copy_ze_off(regsub_T *to, regsub_T *from)
{
if (rex.nfa_has_zend) {
if (REG_MULTI) {
if (from->list.multi[0].end_lnum >= 0) {
to->list.multi[0].end_lnum = from->list.multi[0].end_lnum;
to->list.multi[0].end_col = from->list.multi[0].end_col;
}
} else {
if (from->list.line[0].end != NULL) {
to->list.line[0].end = from->list.line[0].end;
}
if (!rex.nfa_has_zend) {
return;
}
if (REG_MULTI) {
if (from->list.multi[0].end_lnum >= 0) {
to->list.multi[0].end_lnum = from->list.multi[0].end_lnum;
to->list.multi[0].end_col = from->list.multi[0].end_col;
}
} else {
if (from->list.line[0].end != NULL) {
to->list.line[0].end = from->list.line[0].end;
}
}
}
@@ -7554,11 +7564,13 @@ fail:
// Free a compiled regexp program, returned by nfa_regcomp().
static void nfa_regfree(regprog_T *prog)
{
if (prog != NULL) {
xfree(((nfa_regprog_T *)prog)->match_text);
xfree(((nfa_regprog_T *)prog)->pattern);
xfree(prog);
if (prog == NULL) {
return;
}
xfree(((nfa_regprog_T *)prog)->match_text);
xfree(((nfa_regprog_T *)prog)->pattern);
xfree(prog);
}
/// Match a regexp against a string.