summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-09-01 17:52:32 +0200
committerBram Moolenaar <Bram@vim.org>2019-09-01 17:52:32 +0200
commitdb022f3ffb57c5ff4b97b4e93a994d11e4c10466 (patch)
treeff0dacb002fe1224be8ebd9f6ac8f88e786cc73f
parenta112f2d0035b0800b4a70dbb6f0e5f85e8ec84e5 (diff)
downloadvim-git-8.1.1960.tar.gz
patch 8.1.1960: fold code is spread outv8.1.1960
Problem: Fold code is spread out. Solution: Move fold functions to fold.c.
-rw-r--r--src/evalfunc.c172
-rw-r--r--src/fold.c181
-rw-r--r--src/proto/fold.pro7
-rw-r--r--src/version.c2
4 files changed, 185 insertions, 177 deletions
diff --git a/src/evalfunc.c b/src/evalfunc.c
index 648c46592..840b89a0c 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -117,11 +117,6 @@ static void f_fmod(typval_T *argvars, typval_T *rettv);
#endif
static void f_fnameescape(typval_T *argvars, typval_T *rettv);
static void f_fnamemodify(typval_T *argvars, typval_T *rettv);
-static void f_foldclosed(typval_T *argvars, typval_T *rettv);
-static void f_foldclosedend(typval_T *argvars, typval_T *rettv);
-static void f_foldlevel(typval_T *argvars, typval_T *rettv);
-static void f_foldtext(typval_T *argvars, typval_T *rettv);
-static void f_foldtextresult(typval_T *argvars, typval_T *rettv);
static void f_foreground(typval_T *argvars, typval_T *rettv);
static void f_funcref(typval_T *argvars, typval_T *rettv);
static void f_function(typval_T *argvars, typval_T *rettv);
@@ -3642,173 +3637,6 @@ f_fnamemodify(typval_T *argvars, typval_T *rettv)
}
/*
- * "foldclosed()" function
- */
- static void
-foldclosed_both(
- typval_T *argvars UNUSED,
- typval_T *rettv,
- int end UNUSED)
-{
-#ifdef FEAT_FOLDING
- linenr_T lnum;
- linenr_T first, last;
-
- lnum = tv_get_lnum(argvars);
- if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count)
- {
- if (hasFoldingWin(curwin, lnum, &first, &last, FALSE, NULL))
- {
- if (end)
- rettv->vval.v_number = (varnumber_T)last;
- else
- rettv->vval.v_number = (varnumber_T)first;
- return;
- }
- }
-#endif
- rettv->vval.v_number = -1;
-}
-
-/*
- * "foldclosed()" function
- */
- static void
-f_foldclosed(typval_T *argvars, typval_T *rettv)
-{
- foldclosed_both(argvars, rettv, FALSE);
-}
-
-/*
- * "foldclosedend()" function
- */
- static void
-f_foldclosedend(typval_T *argvars, typval_T *rettv)
-{
- foldclosed_both(argvars, rettv, TRUE);
-}
-
-/*
- * "foldlevel()" function
- */
- static void
-f_foldlevel(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
-{
-#ifdef FEAT_FOLDING
- linenr_T lnum;
-
- lnum = tv_get_lnum(argvars);
- if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count)
- rettv->vval.v_number = foldLevel(lnum);
-#endif
-}
-
-/*
- * "foldtext()" function
- */
- static void
-f_foldtext(typval_T *argvars UNUSED, typval_T *rettv)
-{
-#ifdef FEAT_FOLDING
- linenr_T foldstart;
- linenr_T foldend;
- char_u *dashes;
- linenr_T lnum;
- char_u *s;
- char_u *r;
- int len;
- char *txt;
- long count;
-#endif
-
- rettv->v_type = VAR_STRING;
- rettv->vval.v_string = NULL;
-#ifdef FEAT_FOLDING
- foldstart = (linenr_T)get_vim_var_nr(VV_FOLDSTART);
- foldend = (linenr_T)get_vim_var_nr(VV_FOLDEND);
- dashes = get_vim_var_str(VV_FOLDDASHES);
- if (foldstart > 0 && foldend <= curbuf->b_ml.ml_line_count
- && dashes != NULL)
- {
- /* Find first non-empty line in the fold. */
- for (lnum = foldstart; lnum < foldend; ++lnum)
- if (!linewhite(lnum))
- break;
-
- /* Find interesting text in this line. */
- s = skipwhite(ml_get(lnum));
- /* skip C comment-start */
- if (s[0] == '/' && (s[1] == '*' || s[1] == '/'))
- {
- s = skipwhite(s + 2);
- if (*skipwhite(s) == NUL
- && lnum + 1 < (linenr_T)get_vim_var_nr(VV_FOLDEND))
- {
- s = skipwhite(ml_get(lnum + 1));
- if (*s == '*')
- s = skipwhite(s + 1);
- }
- }
- count = (long)(foldend - foldstart + 1);
- txt = NGETTEXT("+-%s%3ld line: ", "+-%s%3ld lines: ", count);
- r = alloc(STRLEN(txt)
- + STRLEN(dashes) // for %s
- + 20 // for %3ld
- + STRLEN(s)); // concatenated
- if (r != NULL)
- {
- sprintf((char *)r, txt, dashes, count);
- len = (int)STRLEN(r);
- STRCAT(r, s);
- /* remove 'foldmarker' and 'commentstring' */
- foldtext_cleanup(r + len);
- rettv->vval.v_string = r;
- }
- }
-#endif
-}
-
-/*
- * "foldtextresult(lnum)" function
- */
- static void
-f_foldtextresult(typval_T *argvars UNUSED, typval_T *rettv)
-{
-#ifdef FEAT_FOLDING
- linenr_T lnum;
- char_u *text;
- char_u buf[FOLD_TEXT_LEN];
- foldinfo_T foldinfo;
- int fold_count;
- static int entered = FALSE;
-#endif
-
- rettv->v_type = VAR_STRING;
- rettv->vval.v_string = NULL;
-#ifdef FEAT_FOLDING
- if (entered)
- return; /* reject recursive use */
- entered = TRUE;
-
- lnum = tv_get_lnum(argvars);
- /* treat illegal types and illegal string values for {lnum} the same */
- if (lnum < 0)
- lnum = 0;
- fold_count = foldedCount(curwin, lnum, &foldinfo);
- if (fold_count > 0)
- {
- text = get_foldtext(curwin, lnum, lnum + fold_count - 1,
- &foldinfo, buf);
- if (text == buf)
- text = vim_strsave(text);
- rettv->vval.v_string = text;
- }
-
- entered = FALSE;
-#endif
-}
-
-/*
* "foreground()" function
*/
static void
diff --git a/src/fold.c b/src/fold.c
index 6200578fc..14c664042 100644
--- a/src/fold.c
+++ b/src/fold.c
@@ -244,10 +244,11 @@ hasFoldingWin(
}
/* foldLevel() {{{2 */
+#ifdef FEAT_EVAL
/*
* Return fold level at line number "lnum" in the current window.
*/
- int
+ static int
foldLevel(linenr_T lnum)
{
/* While updating the folds lines between invalid_top and invalid_bot have
@@ -265,6 +266,7 @@ foldLevel(linenr_T lnum)
return foldLevelWin(curwin, lnum);
}
+#endif
/* lineFolded() {{{2 */
/*
@@ -1989,10 +1991,11 @@ get_foldtext(
}
/* foldtext_cleanup() {{{2 */
+#ifdef FEAT_EVAL
/*
* Remove 'foldmarker' and 'commentstring' from "str" (in-place).
*/
- void
+ static void
foldtext_cleanup(char_u *str)
{
char_u *cms_start; /* first part or the whole comment */
@@ -2078,6 +2081,7 @@ foldtext_cleanup(char_u *str)
}
}
}
+#endif
/* Folding by indent, expr, marker and syntax. {{{1 */
/* Define "fline_T", passed to get fold level for a line. {{{2 */
@@ -3616,4 +3620,175 @@ put_fold_open_close(FILE *fd, fold_T *fp, linenr_T off)
#endif /* FEAT_SESSION */
/* }}}1 */
-#endif /* defined(FEAT_FOLDING) || defined(PROTO) */
+#endif // defined(FEAT_FOLDING) || defined(PROTO)
+
+#if defined(FEAT_EVAL) || defined(PROTO)
+
+/*
+ * "foldclosed()" and "foldclosedend()" functions
+ */
+ static void
+foldclosed_both(
+ typval_T *argvars UNUSED,
+ typval_T *rettv,
+ int end UNUSED)
+{
+# ifdef FEAT_FOLDING
+ linenr_T lnum;
+ linenr_T first, last;
+
+ lnum = tv_get_lnum(argvars);
+ if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count)
+ {
+ if (hasFoldingWin(curwin, lnum, &first, &last, FALSE, NULL))
+ {
+ if (end)
+ rettv->vval.v_number = (varnumber_T)last;
+ else
+ rettv->vval.v_number = (varnumber_T)first;
+ return;
+ }
+ }
+#endif
+ rettv->vval.v_number = -1;
+}
+
+/*
+ * "foldclosed()" function
+ */
+ void
+f_foldclosed(typval_T *argvars, typval_T *rettv)
+{
+ foldclosed_both(argvars, rettv, FALSE);
+}
+
+/*
+ * "foldclosedend()" function
+ */
+ void
+f_foldclosedend(typval_T *argvars, typval_T *rettv)
+{
+ foldclosed_both(argvars, rettv, TRUE);
+}
+
+/*
+ * "foldlevel()" function
+ */
+ void
+f_foldlevel(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
+{
+# ifdef FEAT_FOLDING
+ linenr_T lnum;
+
+ lnum = tv_get_lnum(argvars);
+ if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count)
+ rettv->vval.v_number = foldLevel(lnum);
+# endif
+}
+
+/*
+ * "foldtext()" function
+ */
+ void
+f_foldtext(typval_T *argvars UNUSED, typval_T *rettv)
+{
+# ifdef FEAT_FOLDING
+ linenr_T foldstart;
+ linenr_T foldend;
+ char_u *dashes;
+ linenr_T lnum;
+ char_u *s;
+ char_u *r;
+ int len;
+ char *txt;
+ long count;
+# endif
+
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = NULL;
+# ifdef FEAT_FOLDING
+ foldstart = (linenr_T)get_vim_var_nr(VV_FOLDSTART);
+ foldend = (linenr_T)get_vim_var_nr(VV_FOLDEND);
+ dashes = get_vim_var_str(VV_FOLDDASHES);
+ if (foldstart > 0 && foldend <= curbuf->b_ml.ml_line_count
+ && dashes != NULL)
+ {
+ // Find first non-empty line in the fold.
+ for (lnum = foldstart; lnum < foldend; ++lnum)
+ if (!linewhite(lnum))
+ break;
+
+ // Find interesting text in this line.
+ s = skipwhite(ml_get(lnum));
+ // skip C comment-start
+ if (s[0] == '/' && (s[1] == '*' || s[1] == '/'))
+ {
+ s = skipwhite(s + 2);
+ if (*skipwhite(s) == NUL
+ && lnum + 1 < (linenr_T)get_vim_var_nr(VV_FOLDEND))
+ {
+ s = skipwhite(ml_get(lnum + 1));
+ if (*s == '*')
+ s = skipwhite(s + 1);
+ }
+ }
+ count = (long)(foldend - foldstart + 1);
+ txt = NGETTEXT("+-%s%3ld line: ", "+-%s%3ld lines: ", count);
+ r = alloc(STRLEN(txt)
+ + STRLEN(dashes) // for %s
+ + 20 // for %3ld
+ + STRLEN(s)); // concatenated
+ if (r != NULL)
+ {
+ sprintf((char *)r, txt, dashes, count);
+ len = (int)STRLEN(r);
+ STRCAT(r, s);
+ // remove 'foldmarker' and 'commentstring'
+ foldtext_cleanup(r + len);
+ rettv->vval.v_string = r;
+ }
+ }
+# endif
+}
+
+/*
+ * "foldtextresult(lnum)" function
+ */
+ void
+f_foldtextresult(typval_T *argvars UNUSED, typval_T *rettv)
+{
+# ifdef FEAT_FOLDING
+ linenr_T lnum;
+ char_u *text;
+ char_u buf[FOLD_TEXT_LEN];
+ foldinfo_T foldinfo;
+ int fold_count;
+ static int entered = FALSE;
+# endif
+
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = NULL;
+# ifdef FEAT_FOLDING
+ if (entered)
+ return; // reject recursive use
+ entered = TRUE;
+
+ lnum = tv_get_lnum(argvars);
+ // treat illegal types and illegal string values for {lnum} the same
+ if (lnum < 0)
+ lnum = 0;
+ fold_count = foldedCount(curwin, lnum, &foldinfo);
+ if (fold_count > 0)
+ {
+ text = get_foldtext(curwin, lnum, lnum + fold_count - 1,
+ &foldinfo, buf);
+ if (text == buf)
+ text = vim_strsave(text);
+ rettv->vval.v_string = text;
+ }
+
+ entered = FALSE;
+# endif
+}
+
+#endif // FEAT_EVAL
diff --git a/src/proto/fold.pro b/src/proto/fold.pro
index d8e349420..93d1dc5cb 100644
--- a/src/proto/fold.pro
+++ b/src/proto/fold.pro
@@ -3,7 +3,6 @@ void copyFoldingState(win_T *wp_from, win_T *wp_to);
int hasAnyFolding(win_T *win);
int hasFolding(linenr_T lnum, linenr_T *firstp, linenr_T *lastp);
int hasFoldingWin(win_T *win, linenr_T lnum, linenr_T *firstp, linenr_T *lastp, int cache, foldinfo_T *infop);
-int foldLevel(linenr_T lnum);
int lineFolded(win_T *win, linenr_T lnum);
long foldedCount(win_T *win, linenr_T lnum, foldinfo_T *infop);
int foldmethodIsManual(win_T *wp);
@@ -36,7 +35,11 @@ void deleteFoldRecurse(garray_T *gap);
void foldMarkAdjust(win_T *wp, linenr_T line1, linenr_T line2, long amount, long amount_after);
int getDeepestNesting(void);
char_u *get_foldtext(win_T *wp, linenr_T lnum, linenr_T lnume, foldinfo_T *foldinfo, char_u *buf);
-void foldtext_cleanup(char_u *str);
void foldMoveRange(garray_T *gap, linenr_T line1, linenr_T line2, linenr_T dest);
int put_folds(FILE *fd, win_T *wp);
+void f_foldclosed(typval_T *argvars, typval_T *rettv);
+void f_foldclosedend(typval_T *argvars, typval_T *rettv);
+void f_foldlevel(typval_T *argvars, typval_T *rettv);
+void f_foldtext(typval_T *argvars, typval_T *rettv);
+void f_foldtextresult(typval_T *argvars, typval_T *rettv);
/* vim: set ft=c : */
diff --git a/src/version.c b/src/version.c
index 485af136d..443531443 100644
--- a/src/version.c
+++ b/src/version.c
@@ -762,6 +762,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1960,
+/**/
1959,
/**/
1958,