summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2018-09-28 23:09:55 +0200
committerBram Moolenaar <Bram@vim.org>2018-09-28 23:09:55 +0200
commitb434ae2a1fcbbd43244c6130451de7f14346e224 (patch)
treeb85d92e02cfd7df601bde79c30e5cb96837671d1
parent95892c27b242cdbc78e622c7a861a4e15aec7a30 (diff)
patch 8.1.0438: the ex_make() function is too longv8.1.0438
Problem: The ex_make() function is too long. Solution: Split it into several functions. (Yegappan Lakshmanan)
-rw-r--r--src/quickfix.c209
-rw-r--r--src/version.c2
2 files changed, 118 insertions, 93 deletions
diff --git a/src/quickfix.c b/src/quickfix.c
index 1c3343f344..19363d3582 100644
--- a/src/quickfix.c
+++ b/src/quickfix.c
@@ -148,7 +148,6 @@ static win_T *qf_find_win(qf_info_T *qi);
static buf_T *qf_find_buf(qf_info_T *qi);
static void qf_update_buffer(qf_info_T *qi, qfline_T *old_last);
static void qf_fill_buffer(qf_info_T *qi, buf_T *buf, qfline_T *old_last);
-static char_u *get_mef_name(void);
static buf_T *load_dummy_buffer(char_u *fname, char_u *dirname_start, char_u *resulting_dir);
static void wipe_dummy_buffer(buf_T *buf, char_u *dirname_start);
static void unload_dummy_buffer(buf_T *buf, char_u *dirname_start);
@@ -4480,6 +4479,116 @@ grep_internal(cmdidx_T cmdidx)
}
/*
+ * Return the make/grep autocmd name.
+ */
+ static char_u *
+make_get_auname(cmdidx_T cmdidx)
+{
+ switch (cmdidx)
+ {
+ case CMD_make: return (char_u *)"make";
+ case CMD_lmake: return (char_u *)"lmake";
+ case CMD_grep: return (char_u *)"grep";
+ case CMD_lgrep: return (char_u *)"lgrep";
+ case CMD_grepadd: return (char_u *)"grepadd";
+ case CMD_lgrepadd: return (char_u *)"lgrepadd";
+ default: return NULL;
+ }
+}
+
+/*
+ * Return the name for the errorfile, in allocated memory.
+ * Find a new unique name when 'makeef' contains "##".
+ * Returns NULL for error.
+ */
+ static char_u *
+get_mef_name(void)
+{
+ char_u *p;
+ char_u *name;
+ static int start = -1;
+ static int off = 0;
+#ifdef HAVE_LSTAT
+ stat_T sb;
+#endif
+
+ if (*p_mef == NUL)
+ {
+ name = vim_tempname('e', FALSE);
+ if (name == NULL)
+ EMSG(_(e_notmp));
+ return name;
+ }
+
+ for (p = p_mef; *p; ++p)
+ if (p[0] == '#' && p[1] == '#')
+ break;
+
+ if (*p == NUL)
+ return vim_strsave(p_mef);
+
+ // Keep trying until the name doesn't exist yet.
+ for (;;)
+ {
+ if (start == -1)
+ start = mch_get_pid();
+ else
+ off += 19;
+
+ name = alloc((unsigned)STRLEN(p_mef) + 30);
+ if (name == NULL)
+ break;
+ STRCPY(name, p_mef);
+ sprintf((char *)name + (p - p_mef), "%d%d", start, off);
+ STRCAT(name, p + 2);
+ if (mch_getperm(name) < 0
+#ifdef HAVE_LSTAT
+ // Don't accept a symbolic link, it's a security risk.
+ && mch_lstat((char *)name, &sb) < 0
+#endif
+ )
+ break;
+ vim_free(name);
+ }
+ return name;
+}
+
+/*
+ * Form the complete command line to invoke 'make'/'grep'. Quote the command
+ * using 'shellquote' and append 'shellpipe'. Echo the fully formed command.
+ */
+ static char_u *
+make_get_fullcmd(char_u *makecmd, char_u *fname)
+{
+ char_u *cmd;
+ unsigned len;
+
+ len = (unsigned)STRLEN(p_shq) * 2 + (unsigned)STRLEN(makecmd) + 1;
+ if (*p_sp != NUL)
+ len += (unsigned)STRLEN(p_sp) + (unsigned)STRLEN(fname) + 3;
+ cmd = alloc(len);
+ if (cmd == NULL)
+ return NULL;
+ sprintf((char *)cmd, "%s%s%s", (char *)p_shq, (char *)makecmd,
+ (char *)p_shq);
+
+ // If 'shellpipe' empty: don't redirect to 'errorfile'.
+ if (*p_sp != NUL)
+ append_redir(cmd, len, p_sp, fname);
+
+ // Display the fully formed command. Output a newline if there's something
+ // else than the :make command that was typed (in which case the cursor is
+ // in column 0).
+ if (msg_col == 0)
+ msg_didout = FALSE;
+ msg_start();
+ MSG_PUTS(":!");
+ msg_outtrans(cmd); // show what we are doing
+
+ return cmd;
+}
+
+/*
* Used for ":make", ":lmake", ":grep", ":lgrep", ":grepadd", and ":lgrepadd"
*/
void
@@ -4488,30 +4597,20 @@ ex_make(exarg_T *eap)
char_u *fname;
char_u *cmd;
char_u *enc = NULL;
- unsigned len;
win_T *wp = NULL;
qf_info_T *qi = &ql_info;
int res;
char_u *au_name = NULL;
int_u save_qfid;
- /* Redirect ":grep" to ":vimgrep" if 'grepprg' is "internal". */
+ // Redirect ":grep" to ":vimgrep" if 'grepprg' is "internal".
if (grep_internal(eap->cmdidx))
{
ex_vimgrep(eap);
return;
}
- switch (eap->cmdidx)
- {
- case CMD_make: au_name = (char_u *)"make"; break;
- case CMD_lmake: au_name = (char_u *)"lmake"; break;
- case CMD_grep: au_name = (char_u *)"grep"; break;
- case CMD_lgrep: au_name = (char_u *)"lgrep"; break;
- case CMD_grepadd: au_name = (char_u *)"grepadd"; break;
- case CMD_lgrepadd: au_name = (char_u *)"lgrepadd"; break;
- default: break;
- }
+ au_name = make_get_auname(eap->cmdidx);
if (au_name != NULL && apply_autocmds(EVENT_QUICKFIXCMDPRE, au_name,
curbuf->b_fname, TRUE, curbuf))
{
@@ -4531,37 +4630,18 @@ ex_make(exarg_T *eap)
fname = get_mef_name();
if (fname == NULL)
return;
- mch_remove(fname); /* in case it's not unique */
+ mch_remove(fname); // in case it's not unique
- /*
- * If 'shellpipe' empty: don't redirect to 'errorfile'.
- */
- len = (unsigned)STRLEN(p_shq) * 2 + (unsigned)STRLEN(eap->arg) + 1;
- if (*p_sp != NUL)
- len += (unsigned)STRLEN(p_sp) + (unsigned)STRLEN(fname) + 3;
- cmd = alloc(len);
+ cmd = make_get_fullcmd(eap->arg, fname);
if (cmd == NULL)
return;
- sprintf((char *)cmd, "%s%s%s", (char *)p_shq, (char *)eap->arg,
- (char *)p_shq);
- if (*p_sp != NUL)
- append_redir(cmd, len, p_sp, fname);
- /*
- * Output a newline if there's something else than the :make command that
- * was typed (in which case the cursor is in column 0).
- */
- if (msg_col == 0)
- msg_didout = FALSE;
- msg_start();
- MSG_PUTS(":!");
- msg_outtrans(cmd); /* show what we are doing */
- /* let the shell know if we are redirecting output or not */
+ // let the shell know if we are redirecting output or not
do_shell(cmd, *p_sp != NUL ? SHELL_DOOUT : 0);
#ifdef AMIGA
out_flush();
- /* read window status report and redraw before message */
+ // read window status report and redraw before message
(void)char_avail();
#endif
@@ -4596,63 +4676,6 @@ cleanup:
}
/*
- * Return the name for the errorfile, in allocated memory.
- * Find a new unique name when 'makeef' contains "##".
- * Returns NULL for error.
- */
- static char_u *
-get_mef_name(void)
-{
- char_u *p;
- char_u *name;
- static int start = -1;
- static int off = 0;
-#ifdef HAVE_LSTAT
- stat_T sb;
-#endif
-
- if (*p_mef == NUL)
- {
- name = vim_tempname('e', FALSE);
- if (name == NULL)
- EMSG(_(e_notmp));
- return name;
- }
-
- for (p = p_mef; *p; ++p)
- if (p[0] == '#' && p[1] == '#')
- break;
-
- if (*p == NUL)
- return vim_strsave(p_mef);
-
- /* Keep trying until the name doesn't exist yet. */
- for (;;)
- {
- if (start == -1)
- start = mch_get_pid();
- else
- off += 19;
-
- name = alloc((unsigned)STRLEN(p_mef) + 30);
- if (name == NULL)
- break;
- STRCPY(name, p_mef);
- sprintf((char *)name + (p - p_mef), "%d%d", start, off);
- STRCAT(name, p + 2);
- if (mch_getperm(name) < 0
-#ifdef HAVE_LSTAT
- /* Don't accept a symbolic link, it's a security risk. */
- && mch_lstat((char *)name, &sb) < 0
-#endif
- )
- break;
- vim_free(name);
- }
- return name;
-}
-
-/*
* Returns the number of valid entries in the current quickfix/location list.
*/
int
diff --git a/src/version.c b/src/version.c
index 55d3d8013f..f4e0508d65 100644
--- a/src/version.c
+++ b/src/version.c
@@ -795,6 +795,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 438,
+/**/
437,
/**/
436,