aboutsummaryrefslogtreecommitdiff
path: root/src/version.c
diff options
context:
space:
mode:
authorThiago de Arruda <tpadilha84@gmail.com>2014-01-31 10:39:15 -0300
committerThiago de Arruda <tpadilha84@gmail.com>2014-01-31 10:39:15 -0300
commit72cf89bce8e4230dbc161dc5606f48ef9884ba70 (patch)
tree3ee06dbd8c57e291a8713289670ae1cb51397d44 /src/version.c
downloadrneovim-72cf89bce8e4230dbc161dc5606f48ef9884ba70.tar.gz
rneovim-72cf89bce8e4230dbc161dc5606f48ef9884ba70.tar.bz2
rneovim-72cf89bce8e4230dbc161dc5606f48ef9884ba70.zip
Import vim from changeset v5628:c9cad40b4181
- Cleanup source tree, leaving only files necessary for compilation/testing - Process files through unifdef to remove tons of FEAT_* macros - Process files through uncrustify to normalize source code formatting. - Port the build system to cmake
Diffstat (limited to 'src/version.c')
-rw-r--r--src/version.c978
1 files changed, 978 insertions, 0 deletions
diff --git a/src/version.c b/src/version.c
new file mode 100644
index 0000000000..62a7aa8bc8
--- /dev/null
+++ b/src/version.c
@@ -0,0 +1,978 @@
+/* vi:set ts=8 sts=4 sw=4:
+ *
+ * VIM - Vi IMproved by Bram Moolenaar
+ *
+ * Do ":help uganda" in Vim to read copying and usage conditions.
+ * Do ":help credits" in Vim to see a list of people who contributed.
+ * See README.txt for an overview of the Vim source code.
+ */
+
+#include "vim.h"
+
+
+/*
+ * Vim originated from Stevie version 3.6 (Fish disk 217) by GRWalter (Fred)
+ * It has been changed beyond recognition since then.
+ *
+ * Differences between version 6.x and 7.x can be found with ":help version7".
+ * Differences between version 5.x and 6.x can be found with ":help version6".
+ * Differences between version 4.x and 5.x can be found with ":help version5".
+ * Differences between version 3.0 and 4.x can be found with ":help version4".
+ * All the remarks about older versions have been removed, they are not very
+ * interesting.
+ */
+
+#include "version.h"
+
+char *Version = VIM_VERSION_SHORT;
+static char *mediumVersion = VIM_VERSION_MEDIUM;
+
+#if defined(HAVE_DATE_TIME) || defined(PROTO)
+char *longVersion = VIM_VERSION_LONG_DATE __DATE__ " " __TIME__ ")";
+#else
+char *longVersion = VIM_VERSION_LONG;
+#endif
+
+static void list_features __ARGS((void));
+static void version_msg __ARGS((char *s));
+
+static char *(features[]) =
+{
+#ifdef HAVE_ACL
+ "+acl",
+#else
+ "-acl",
+#endif
+ "+arabic",
+ "+autocmd",
+ "-balloon_eval",
+ "-browse",
+#ifdef NO_BUILTIN_TCAPS
+ "-builtin_terms",
+#endif
+#ifdef SOME_BUILTIN_TCAPS
+ "+builtin_terms",
+#endif
+#ifdef ALL_BUILTIN_TCAPS
+ "++builtin_terms",
+#endif
+ "+byte_offset",
+ "+cindent",
+ "-clientserver",
+ "-clipboard",
+ "+cmdline_compl",
+ "+cmdline_hist",
+ "+cmdline_info",
+ "+comments",
+ "+conceal",
+ "+cryptv",
+ "+cscope",
+ "+cursorbind",
+#ifdef CURSOR_SHAPE
+ "+cursorshape",
+#else
+ "-cursorshape",
+#endif
+ "+dialog_con",
+ "+diff",
+ "+digraphs",
+ "-dnd",
+ "-ebcdic",
+ "-emacs_tags",
+ "+eval",
+ "+ex_extra",
+ "+extra_search",
+ "+farsi",
+ "+file_in_path",
+ "+find_in_path",
+ "+float",
+ "+folding",
+ "-footer",
+ /* only interesting on Unix systems */
+#if !defined(USE_SYSTEM) && defined(UNIX)
+ "+fork()",
+#endif
+ "+gettext",
+ "+hangul_input",
+#if (defined(HAVE_ICONV_H) && defined(USE_ICONV)) || defined(DYNAMIC_ICONV)
+# ifdef DYNAMIC_ICONV
+ "+iconv/dyn",
+# else
+ "+iconv",
+# endif
+#else
+ "-iconv",
+#endif
+ "+insert_expand",
+ "+jumplist",
+ "+keymap",
+ "+langmap",
+#ifdef FEAT_LIBCALL
+ "+libcall",
+#else
+ "-libcall",
+#endif
+ "+linebreak",
+ "+lispindent",
+ "+listcmds",
+ "+localmap",
+ "-lua",
+ "+menu",
+ "+mksession",
+ "+modify_fname",
+ "+mouse",
+ "-mouseshape",
+
+#if defined(UNIX) || defined(VMS)
+ "+mouse_dec",
+ "-mouse_gpm",
+# ifdef FEAT_MOUSE_JSB
+ "+mouse_jsbterm",
+# else
+ "-mouse_jsbterm",
+# endif
+ "+mouse_netterm",
+#endif
+
+
+#if defined(UNIX) || defined(VMS)
+ "+mouse_sgr",
+ "-mouse_sysmouse",
+ "+mouse_urxvt",
+ "+mouse_xterm",
+#endif
+
+ "+multi_byte",
+ "+multi_lang",
+ "-mzscheme",
+ "-netbeans_intg",
+ "+path_extra",
+ "-perl",
+ "+persistent_undo",
+ "+postscript",
+ "+printer",
+ "+profile",
+ "-python",
+ "-python3",
+ "+quickfix",
+ "+reltime",
+ "+rightleft",
+ "-ruby",
+ "+scrollbind",
+ "-signs",
+ "+smartindent",
+ "-sniff",
+#ifdef STARTUPTIME
+ "+startuptime",
+#else
+ "-startuptime",
+#endif
+ "+statusline",
+ "-sun_workshop",
+ "+syntax",
+ /* only interesting on Unix systems */
+#if defined(USE_SYSTEM) && (defined(UNIX) || defined(__EMX__))
+ "+system()",
+#endif
+ "+tag_binary",
+ "+tag_old_static",
+#ifdef FEAT_TAG_ANYWHITE
+ "+tag_any_white",
+#else
+ "-tag_any_white",
+#endif
+ "-tcl",
+#if defined(UNIX) || defined(__EMX__)
+ /* only Unix (or OS/2 with EMX!) can have terminfo instead of termcap */
+# ifdef TERMINFO
+ "+terminfo",
+# else
+ "-terminfo",
+# endif
+#else /* unix always includes termcap support */
+# ifdef HAVE_TGETENT
+ "+tgetent",
+# else
+ "-tgetent",
+# endif
+#endif
+ "+termresponse",
+ "+textobjects",
+ "+title",
+ "-toolbar",
+ "+user_commands",
+ "+vertsplit",
+ "+virtualedit",
+ "+visual",
+ "+visualextra",
+ "+viminfo",
+ "+vreplace",
+ "+wildignore",
+ "+wildmenu",
+ "+windows",
+ "+writebackup",
+#if defined(UNIX) || defined(VMS)
+ "-X11",
+#endif
+ "-xfontset",
+ "-xim",
+#if defined(UNIX) || defined(VMS)
+ "-xsmp",
+ "-xterm_clipboard",
+#endif
+#ifdef FEAT_XTERM_SAVE
+ "+xterm_save",
+#else
+ "-xterm_save",
+#endif
+ "-xpm",
+ NULL
+};
+
+static int included_patches[] =
+{ /* Add new patch number below this line */
+ /**/
+ 160,
+ /**/
+ 159,
+ /**/
+ 158,
+ /**/
+ 157,
+ /**/
+ 156,
+ /**/
+ 155,
+ /**/
+ 154,
+ /**/
+ 153,
+ /**/
+ 152,
+ /**/
+ 151,
+ /**/
+ 150,
+ /**/
+ 149,
+ /**/
+ 148,
+ /**/
+ 147,
+ /**/
+ 146,
+ /**/
+ 145,
+ /**/
+ 144,
+ /**/
+ 143,
+ /**/
+ 142,
+ /**/
+ 141,
+ /**/
+ 140,
+ /**/
+ 139,
+ /**/
+ 138,
+ /**/
+ 137,
+ /**/
+ 136,
+ /**/
+ 135,
+ /**/
+ 134,
+ /**/
+ 133,
+ /**/
+ 132,
+ /**/
+ 131,
+ /**/
+ 130,
+ /**/
+ 129,
+ /**/
+ 128,
+ /**/
+ 127,
+ /**/
+ 126,
+ /**/
+ 125,
+ /**/
+ 124,
+ /**/
+ 123,
+ /**/
+ 122,
+ /**/
+ 121,
+ /**/
+ 120,
+ /**/
+ 119,
+ /**/
+ 118,
+ /**/
+ 117,
+ /**/
+ 116,
+ /**/
+ 115,
+ /**/
+ 114,
+ /**/
+ 113,
+ /**/
+ 112,
+ /**/
+ 111,
+ /**/
+ 110,
+ /**/
+ 109,
+ /**/
+ 108,
+ /**/
+ 107,
+ /**/
+ 106,
+ /**/
+ 105,
+ /**/
+ 104,
+ /**/
+ 103,
+ /**/
+ 102,
+ /**/
+ 101,
+ /**/
+ 100,
+ /**/
+ 99,
+ /**/
+ 98,
+ /**/
+ 97,
+ /**/
+ 96,
+ /**/
+ 95,
+ /**/
+ 94,
+ /**/
+ 93,
+ /**/
+ 92,
+ /**/
+ 91,
+ /**/
+ 90,
+ /**/
+ 89,
+ /**/
+ 88,
+ /**/
+ 87,
+ /**/
+ 86,
+ /**/
+ 85,
+ /**/
+ 84,
+ /**/
+ 83,
+ /**/
+ 82,
+ /**/
+ 81,
+ /**/
+ 80,
+ /**/
+ 79,
+ /**/
+ 78,
+ /**/
+ 77,
+ /**/
+ 76,
+ /**/
+ 75,
+ /**/
+ 74,
+ /**/
+ 73,
+ /**/
+ 72,
+ /**/
+ 71,
+ /**/
+ 70,
+ /**/
+ 69,
+ /**/
+ 68,
+ /**/
+ 67,
+ /**/
+ 66,
+ /**/
+ 65,
+ /**/
+ 64,
+ /**/
+ 63,
+ /**/
+ 62,
+ /**/
+ 61,
+ /**/
+ 60,
+ /**/
+ 59,
+ /**/
+ 58,
+ /**/
+ 57,
+ /**/
+ 56,
+ /**/
+ 55,
+ /**/
+ 54,
+ /**/
+ 53,
+ /**/
+ 52,
+ /**/
+ 51,
+ /**/
+ 50,
+ /**/
+ 49,
+ /**/
+ 48,
+ /**/
+ 47,
+ /**/
+ 46,
+ /**/
+ 45,
+ /**/
+ 44,
+ /**/
+ 43,
+ /**/
+ 42,
+ /**/
+ 41,
+ /**/
+ 40,
+ /**/
+ 39,
+ /**/
+ 38,
+ /**/
+ 37,
+ /**/
+ 36,
+ /**/
+ 35,
+ /**/
+ 34,
+ /**/
+ 33,
+ /**/
+ 32,
+ /**/
+ 31,
+ /**/
+ 30,
+ /**/
+ 29,
+ /**/
+ 28,
+ /**/
+ 27,
+ /**/
+ 26,
+ /**/
+ 25,
+ /**/
+ 24,
+ /**/
+ 23,
+ /**/
+ 22,
+ /**/
+ 21,
+ /**/
+ 20,
+ /**/
+ 19,
+ /**/
+ 18,
+ /**/
+ 17,
+ /**/
+ 16,
+ /**/
+ 15,
+ /**/
+ 14,
+ /**/
+ 13,
+ /**/
+ 12,
+ /**/
+ 11,
+ /**/
+ 10,
+ /**/
+ 9,
+ /**/
+ 8,
+ /**/
+ 7,
+ /**/
+ 6,
+ /**/
+ 5,
+ /**/
+ 4,
+ /**/
+ 3,
+ /**/
+ 2,
+ /**/
+ 1,
+ /**/
+ 0
+};
+
+/*
+ * Place to put a short description when adding a feature with a patch.
+ * Keep it short, e.g.,: "relative numbers", "persistent undo".
+ * Also add a comment marker to separate the lines.
+ * See the official Vim patches for the diff format: It must use a context of
+ * one line only. Create it by hand or use "diff -C2" and edit the patch.
+ */
+static char *(extra_patches[]) =
+{ /* Add your patch description below this line */
+ /**/
+ NULL
+};
+
+int highest_patch() {
+ int i;
+ int h = 0;
+
+ for (i = 0; included_patches[i] != 0; ++i)
+ if (included_patches[i] > h)
+ h = included_patches[i];
+ return h;
+}
+
+/*
+ * Return TRUE if patch "n" has been included.
+ */
+int has_patch(n)
+int n;
+{
+ int i;
+
+ for (i = 0; included_patches[i] != 0; ++i)
+ if (included_patches[i] == n)
+ return TRUE;
+ return FALSE;
+}
+
+void ex_version(eap)
+exarg_T *eap;
+{
+ /*
+ * Ignore a ":version 9.99" command.
+ */
+ if (*eap->arg == NUL) {
+ msg_putchar('\n');
+ list_version();
+ }
+}
+
+/*
+ * List all features aligned in columns, dictionary style.
+ */
+static void list_features() {
+ int i;
+ int ncol;
+ int nrow;
+ int nfeat = 0;
+ int width = 0;
+
+ /* Find the length of the longest feature name, use that + 1 as the column
+ * width */
+ for (i = 0; features[i] != NULL; ++i) {
+ int l = (int)STRLEN(features[i]);
+
+ if (l > width)
+ width = l;
+ ++nfeat;
+ }
+ width += 1;
+
+ if (Columns < width) {
+ /* Not enough screen columns - show one per line */
+ for (i = 0; features[i] != NULL; ++i) {
+ version_msg(features[i]);
+ if (msg_col > 0)
+ msg_putchar('\n');
+ }
+ return;
+ }
+
+ /* The rightmost column doesn't need a separator.
+ * Sacrifice it to fit in one more column if possible. */
+ ncol = (int) (Columns + 1) / width;
+ nrow = nfeat / ncol + (nfeat % ncol ? 1 : 0);
+
+ /* i counts columns then rows. idx counts rows then columns. */
+ for (i = 0; !got_int && i < nrow * ncol; ++i) {
+ int idx = (i / ncol) + (i % ncol) * nrow;
+
+ if (idx < nfeat) {
+ int last_col = (i + 1) % ncol == 0;
+
+ msg_puts((char_u *)features[idx]);
+ if (last_col) {
+ if (msg_col > 0)
+ msg_putchar('\n');
+ } else {
+ while (msg_col % width)
+ msg_putchar(' ');
+ }
+ } else {
+ if (msg_col > 0)
+ msg_putchar('\n');
+ }
+ }
+}
+
+void list_version() {
+ int i;
+ int first;
+ char *s = "";
+
+ /*
+ * When adding features here, don't forget to update the list of
+ * internal variables in eval.c!
+ */
+ MSG(longVersion);
+
+
+ /* Print the list of patch numbers if there is at least one. */
+ /* Print a range when patches are consecutive: "1-10, 12, 15-40, 42-45" */
+ if (included_patches[0] != 0) {
+ MSG_PUTS(_("\nIncluded patches: "));
+ first = -1;
+ /* find last one */
+ for (i = 0; included_patches[i] != 0; ++i)
+ ;
+ while (--i >= 0) {
+ if (first < 0)
+ first = included_patches[i];
+ if (i == 0 || included_patches[i - 1] != included_patches[i] + 1) {
+ MSG_PUTS(s);
+ s = ", ";
+ msg_outnum((long)first);
+ if (first != included_patches[i]) {
+ MSG_PUTS("-");
+ msg_outnum((long)included_patches[i]);
+ }
+ first = -1;
+ }
+ }
+ }
+
+ /* Print the list of extra patch descriptions if there is at least one. */
+ if (extra_patches[0] != NULL) {
+ MSG_PUTS(_("\nExtra patches: "));
+ s = "";
+ for (i = 0; extra_patches[i] != NULL; ++i) {
+ MSG_PUTS(s);
+ s = ", ";
+ MSG_PUTS(extra_patches[i]);
+ }
+ }
+
+#ifdef MODIFIED_BY
+ MSG_PUTS("\n");
+ MSG_PUTS(_("Modified by "));
+ MSG_PUTS(MODIFIED_BY);
+#endif
+
+#ifdef HAVE_PATHDEF
+ if (*compiled_user != NUL || *compiled_sys != NUL) {
+ MSG_PUTS(_("\nCompiled "));
+ if (*compiled_user != NUL) {
+ MSG_PUTS(_("by "));
+ MSG_PUTS(compiled_user);
+ }
+ if (*compiled_sys != NUL) {
+ MSG_PUTS("@");
+ MSG_PUTS(compiled_sys);
+ }
+ }
+#endif
+
+ MSG_PUTS(_("\nHuge version "));
+ MSG_PUTS(_("without GUI."));
+ version_msg(_(" Features included (+) or not (-):\n"));
+
+ list_features();
+
+#ifdef SYS_VIMRC_FILE
+ version_msg(_(" system vimrc file: \""));
+ version_msg(SYS_VIMRC_FILE);
+ version_msg("\"\n");
+#endif
+#ifdef USR_VIMRC_FILE
+ version_msg(_(" user vimrc file: \""));
+ version_msg(USR_VIMRC_FILE);
+ version_msg("\"\n");
+#endif
+#ifdef USR_VIMRC_FILE2
+ version_msg(_(" 2nd user vimrc file: \""));
+ version_msg(USR_VIMRC_FILE2);
+ version_msg("\"\n");
+#endif
+#ifdef USR_VIMRC_FILE3
+ version_msg(_(" 3rd user vimrc file: \""));
+ version_msg(USR_VIMRC_FILE3);
+ version_msg("\"\n");
+#endif
+#ifdef USR_EXRC_FILE
+ version_msg(_(" user exrc file: \""));
+ version_msg(USR_EXRC_FILE);
+ version_msg("\"\n");
+#endif
+#ifdef USR_EXRC_FILE2
+ version_msg(_(" 2nd user exrc file: \""));
+ version_msg(USR_EXRC_FILE2);
+ version_msg("\"\n");
+#endif
+#ifdef HAVE_PATHDEF
+ if (*default_vim_dir != NUL) {
+ version_msg(_(" fall-back for $VIM: \""));
+ version_msg((char *)default_vim_dir);
+ version_msg("\"\n");
+ }
+ if (*default_vimruntime_dir != NUL) {
+ version_msg(_(" f-b for $VIMRUNTIME: \""));
+ version_msg((char *)default_vimruntime_dir);
+ version_msg("\"\n");
+ }
+ version_msg(_("Compilation: "));
+ version_msg((char *)all_cflags);
+ version_msg("\n");
+ version_msg(_("Linking: "));
+ version_msg((char *)all_lflags);
+#endif
+#ifdef DEBUG
+ version_msg("\n");
+ version_msg(_(" DEBUG BUILD"));
+#endif
+}
+
+/*
+ * Output a string for the version message. If it's going to wrap, output a
+ * newline, unless the message is too long to fit on the screen anyway.
+ */
+static void version_msg(s)
+char *s;
+{
+ int len = (int)STRLEN(s);
+
+ if (!got_int && len < (int)Columns && msg_col + len >= (int)Columns
+ && *s != '\n')
+ msg_putchar('\n');
+ if (!got_int)
+ MSG_PUTS(s);
+}
+
+static void do_intro_line __ARGS((int row, char_u *mesg, int add_version,
+ int attr));
+
+/*
+ * Show the intro message when not editing a file.
+ */
+void maybe_intro_message() {
+ if (bufempty()
+ && curbuf->b_fname == NULL
+ && firstwin->w_next == NULL
+ && vim_strchr(p_shm, SHM_INTRO) == NULL)
+ intro_message(FALSE);
+}
+
+/*
+ * Give an introductory message about Vim.
+ * Only used when starting Vim on an empty file, without a file name.
+ * Or with the ":intro" command (for Sven :-).
+ */
+void intro_message(colon)
+int colon; /* TRUE for ":intro" */
+{
+ int i;
+ int row;
+ int blanklines;
+ int sponsor;
+ char *p;
+ static char *(lines[]) =
+ {
+ N_("VIM - Vi IMproved"),
+ "",
+ N_("version "),
+ N_("by Bram Moolenaar et al."),
+#ifdef MODIFIED_BY
+ " ",
+#endif
+ N_("Vim is open source and freely distributable"),
+ "",
+ N_("Help poor children in Uganda!"),
+ N_("type :help iccf<Enter> for information "),
+ "",
+ N_("type :q<Enter> to exit "),
+ N_("type :help<Enter> or <F1> for on-line help"),
+ N_("type :help version7<Enter> for version info"),
+ NULL,
+ "",
+ N_("Running in Vi compatible mode"),
+ N_("type :set nocp<Enter> for Vim defaults"),
+ N_("type :help cp-default<Enter> for info on this"),
+ };
+
+ /* blanklines = screen height - # message lines */
+ blanklines = (int)Rows - ((sizeof(lines) / sizeof(char *)) - 1);
+ if (!p_cp)
+ blanklines += 4; /* add 4 for not showing "Vi compatible" message */
+
+ /* Don't overwrite a statusline. Depends on 'cmdheight'. */
+ if (p_ls > 1)
+ blanklines -= Rows - topframe->fr_height;
+ if (blanklines < 0)
+ blanklines = 0;
+
+ /* Show the sponsor and register message one out of four times, the Uganda
+ * message two out of four times. */
+ sponsor = (int)time(NULL);
+ sponsor = ((sponsor & 2) == 0) - ((sponsor & 4) == 0);
+
+ /* start displaying the message lines after half of the blank lines */
+ row = blanklines / 2;
+ if ((row >= 2 && Columns >= 50) || colon) {
+ for (i = 0; i < (int)(sizeof(lines) / sizeof(char *)); ++i) {
+ p = lines[i];
+ if (p == NULL) {
+ if (!p_cp)
+ break;
+ continue;
+ }
+ if (sponsor != 0) {
+ if (strstr(p, "children") != NULL)
+ p = sponsor < 0
+ ? N_("Sponsor Vim development!")
+ : N_("Become a registered Vim user!");
+ else if (strstr(p, "iccf") != NULL)
+ p = sponsor < 0
+ ? N_("type :help sponsor<Enter> for information ")
+ : N_("type :help register<Enter> for information ");
+ else if (strstr(p, "Orphans") != NULL)
+ p = N_("menu Help->Sponsor/Register for information ");
+ }
+ if (*p != NUL)
+ do_intro_line(row, (char_u *)_(p), i == 2, 0);
+ ++row;
+ }
+ }
+
+ /* Make the wait-return message appear just below the text. */
+ if (colon)
+ msg_row = row;
+}
+
+static void do_intro_line(row, mesg, add_version, attr)
+int row;
+char_u *mesg;
+int add_version;
+int attr;
+{
+ char_u vers[20];
+ int col;
+ char_u *p;
+ int l;
+ int clen;
+#ifdef MODIFIED_BY
+# define MODBY_LEN 150
+ char_u modby[MODBY_LEN];
+
+ if (*mesg == ' ') {
+ vim_strncpy(modby, (char_u *)_("Modified by "), MODBY_LEN - 1);
+ l = STRLEN(modby);
+ vim_strncpy(modby + l, (char_u *)MODIFIED_BY, MODBY_LEN - l - 1);
+ mesg = modby;
+ }
+#endif
+
+ /* Center the message horizontally. */
+ col = vim_strsize(mesg);
+ if (add_version) {
+ STRCPY(vers, mediumVersion);
+ if (highest_patch()) {
+ /* Check for 9.9x or 9.9xx, alpha/beta version */
+ if (isalpha((int)vers[3])) {
+ int len = (isalpha((int)vers[4])) ? 5 : 4;
+ sprintf((char *)vers + len, ".%d%s", highest_patch(),
+ mediumVersion + len);
+ } else
+ sprintf((char *)vers + 3, ".%d", highest_patch());
+ }
+ col += (int)STRLEN(vers);
+ }
+ col = (Columns - col) / 2;
+ if (col < 0)
+ col = 0;
+
+ /* Split up in parts to highlight <> items differently. */
+ for (p = mesg; *p != NUL; p += l) {
+ clen = 0;
+ for (l = 0; p[l] != NUL
+ && (l == 0 || (p[l] != '<' && p[l - 1] != '>')); ++l) {
+ if (has_mbyte) {
+ clen += ptr2cells(p + l);
+ l += (*mb_ptr2len)(p + l) - 1;
+ } else
+ clen += byte2cells(p[l]);
+ }
+ screen_puts_len(p, l, row, col, *p == '<' ? hl_attr(HLF_8) : attr);
+ col += clen;
+ }
+
+ /* Add the version number to the version line. */
+ if (add_version)
+ screen_puts(vers, row, col, 0);
+}
+
+/*
+ * ":intro": clear screen, display intro screen and wait for return.
+ */
+void ex_intro(eap)
+exarg_T *eap UNUSED;
+{
+ screenclear();
+ intro_message(TRUE);
+ wait_return(TRUE);
+}