xref: /vim-8.2.3635/src/version.c (revision 147e7d0c)
1 /* vi:set ts=8 sts=4 sw=4 noet:
2  *
3  * VIM - Vi IMproved		by Bram Moolenaar
4  *
5  * Do ":help uganda"  in Vim to read copying and usage conditions.
6  * Do ":help credits" in Vim to see a list of people who contributed.
7  * See README.txt for an overview of the Vim source code.
8  */
9 
10 #include "vim.h"
11 
12 #ifdef AMIGA
13 # include <time.h>	/* for time() */
14 #endif
15 
16 /*
17  * Vim originated from Stevie version 3.6 (Fish disk 217) by GRWalter (Fred)
18  * It has been changed beyond recognition since then.
19  *
20  * Differences between version 7.4 and 8.x can be found with ":help version8".
21  * Differences between version 6.4 and 7.x can be found with ":help version7".
22  * Differences between version 5.8 and 6.x can be found with ":help version6".
23  * Differences between version 4.x and 5.x can be found with ":help version5".
24  * Differences between version 3.0 and 4.x can be found with ":help version4".
25  * All the remarks about older versions have been removed, they are not very
26  * interesting.
27  */
28 
29 #include "version.h"
30 
31 char		*Version = VIM_VERSION_SHORT;
32 static char	*mediumVersion = VIM_VERSION_MEDIUM;
33 
34 #if defined(HAVE_DATE_TIME) || defined(PROTO)
35 # if (defined(VMS) && defined(VAXC)) || defined(PROTO)
36 char	longVersion[sizeof(VIM_VERSION_LONG_DATE) + sizeof(__DATE__)
37 						      + sizeof(__TIME__) + 3];
38 
39     void
40 init_longVersion(void)
41 {
42     /*
43      * Construct the long version string.  Necessary because
44      * VAX C can't catenate strings in the preprocessor.
45      */
46     strcpy(longVersion, VIM_VERSION_LONG_DATE);
47     strcat(longVersion, __DATE__);
48     strcat(longVersion, " ");
49     strcat(longVersion, __TIME__);
50     strcat(longVersion, ")");
51 }
52 
53 # else
54     void
55 init_longVersion(void)
56 {
57     char *date_time = __DATE__ " " __TIME__;
58     char *msg = _("%s (%s, compiled %s)");
59     size_t len = strlen(msg)
60 		+ strlen(VIM_VERSION_LONG_ONLY)
61 		+ strlen(VIM_VERSION_DATE_ONLY)
62 		+ strlen(date_time);
63 
64     longVersion = (char *)alloc((unsigned)len);
65     if (longVersion == NULL)
66 	longVersion = VIM_VERSION_LONG;
67     else
68 	vim_snprintf(longVersion, len, msg,
69 		      VIM_VERSION_LONG_ONLY, VIM_VERSION_DATE_ONLY, date_time);
70 }
71 # endif
72 #else
73 char	*longVersion = VIM_VERSION_LONG;
74 
75     void
76 init_longVersion(void)
77 {
78     // nothing to do
79 }
80 #endif
81 
82 static char *(features[]) =
83 {
84 #ifdef HAVE_ACL
85 	"+acl",
86 #else
87 	"-acl",
88 #endif
89 #ifdef AMIGA		/* only for Amiga systems */
90 # ifdef FEAT_ARP
91 	"+ARP",
92 # else
93 	"-ARP",
94 # endif
95 #endif
96 #ifdef FEAT_ARABIC
97 	"+arabic",
98 #else
99 	"-arabic",
100 #endif
101 	"+autocmd",
102 #ifdef FEAT_AUTOCHDIR
103        "+autochdir",
104 #else
105        "-autochdir",
106 #endif
107 #ifdef FEAT_AUTOSERVERNAME
108 	"+autoservername",
109 #else
110 	"-autoservername",
111 #endif
112 #ifdef FEAT_BEVAL_GUI
113 	"+balloon_eval",
114 #else
115 	"-balloon_eval",
116 #endif
117 #ifdef FEAT_BEVAL_TERM
118 	"+balloon_eval_term",
119 #else
120 	"-balloon_eval_term",
121 #endif
122 #ifdef FEAT_BROWSE
123 	"+browse",
124 #else
125 	"-browse",
126 #endif
127 #ifdef NO_BUILTIN_TCAPS
128 	"-builtin_terms",
129 #endif
130 #ifdef SOME_BUILTIN_TCAPS
131 	"+builtin_terms",
132 #endif
133 #ifdef ALL_BUILTIN_TCAPS
134 	"++builtin_terms",
135 #endif
136 #ifdef FEAT_BYTEOFF
137 	"+byte_offset",
138 #else
139 	"-byte_offset",
140 #endif
141 #ifdef FEAT_JOB_CHANNEL
142 	"+channel",
143 #else
144 	"-channel",
145 #endif
146 #ifdef FEAT_CINDENT
147 	"+cindent",
148 #else
149 	"-cindent",
150 #endif
151 #ifdef FEAT_CLIENTSERVER
152 	"+clientserver",
153 #else
154 	"-clientserver",
155 #endif
156 #ifdef FEAT_CLIPBOARD
157 	"+clipboard",
158 #else
159 	"-clipboard",
160 #endif
161 #ifdef FEAT_CMDL_COMPL
162 	"+cmdline_compl",
163 #else
164 	"-cmdline_compl",
165 #endif
166 #ifdef FEAT_CMDHIST
167 	"+cmdline_hist",
168 #else
169 	"-cmdline_hist",
170 #endif
171 #ifdef FEAT_CMDL_INFO
172 	"+cmdline_info",
173 #else
174 	"-cmdline_info",
175 #endif
176 #ifdef FEAT_COMMENTS
177 	"+comments",
178 #else
179 	"-comments",
180 #endif
181 #ifdef FEAT_CONCEAL
182 	"+conceal",
183 #else
184 	"-conceal",
185 #endif
186 #ifdef FEAT_CRYPT
187 	"+cryptv",
188 #else
189 	"-cryptv",
190 #endif
191 #ifdef FEAT_CSCOPE
192 	"+cscope",
193 #else
194 	"-cscope",
195 #endif
196 	"+cursorbind",
197 #ifdef CURSOR_SHAPE
198 	"+cursorshape",
199 #else
200 	"-cursorshape",
201 #endif
202 #if defined(FEAT_CON_DIALOG) && defined(FEAT_GUI_DIALOG)
203 	"+dialog_con_gui",
204 #else
205 # if defined(FEAT_CON_DIALOG)
206 	"+dialog_con",
207 # else
208 #  if defined(FEAT_GUI_DIALOG)
209 	"+dialog_gui",
210 #  else
211 	"-dialog",
212 #  endif
213 # endif
214 #endif
215 #ifdef FEAT_DIFF
216 	"+diff",
217 #else
218 	"-diff",
219 #endif
220 #ifdef FEAT_DIGRAPHS
221 	"+digraphs",
222 #else
223 	"-digraphs",
224 #endif
225 #ifdef FEAT_GUI_W32
226 # ifdef FEAT_DIRECTX
227 	"+directx",
228 # else
229 	"-directx",
230 # endif
231 #endif
232 #ifdef FEAT_DND
233 	"+dnd",
234 #else
235 	"-dnd",
236 #endif
237 #ifdef EBCDIC
238 	"+ebcdic",
239 #else
240 	"-ebcdic",
241 #endif
242 #ifdef FEAT_EMACS_TAGS
243 	"+emacs_tags",
244 #else
245 	"-emacs_tags",
246 #endif
247 #ifdef FEAT_EVAL
248 	"+eval",
249 #else
250 	"-eval",
251 #endif
252 	"+ex_extra",
253 #ifdef FEAT_SEARCH_EXTRA
254 	"+extra_search",
255 #else
256 	"-extra_search",
257 #endif
258 #ifdef FEAT_FKMAP
259 	"+farsi",
260 #else
261 	"-farsi",
262 #endif
263 #ifdef FEAT_SEARCHPATH
264 	"+file_in_path",
265 #else
266 	"-file_in_path",
267 #endif
268 #ifdef FEAT_FIND_ID
269 	"+find_in_path",
270 #else
271 	"-find_in_path",
272 #endif
273 #ifdef FEAT_FLOAT
274 	"+float",
275 #else
276 	"-float",
277 #endif
278 #ifdef FEAT_FOLDING
279 	"+folding",
280 #else
281 	"-folding",
282 #endif
283 #ifdef FEAT_FOOTER
284 	"+footer",
285 #else
286 	"-footer",
287 #endif
288 	    /* only interesting on Unix systems */
289 #if !defined(USE_SYSTEM) && defined(UNIX)
290 	"+fork()",
291 #endif
292 #ifdef FEAT_GETTEXT
293 # ifdef DYNAMIC_GETTEXT
294 	"+gettext/dyn",
295 # else
296 	"+gettext",
297 # endif
298 #else
299 	"-gettext",
300 #endif
301 #ifdef FEAT_HANGULIN
302 	"+hangul_input",
303 #else
304 	"-hangul_input",
305 #endif
306 #if (defined(HAVE_ICONV_H) && defined(USE_ICONV)) || defined(DYNAMIC_ICONV)
307 # ifdef DYNAMIC_ICONV
308 	"+iconv/dyn",
309 # else
310 	"+iconv",
311 # endif
312 #else
313 	"-iconv",
314 #endif
315 #ifdef FEAT_INS_EXPAND
316 	"+insert_expand",
317 #else
318 	"-insert_expand",
319 #endif
320 #ifdef FEAT_JOB_CHANNEL
321 	"+job",
322 #else
323 	"-job",
324 #endif
325 #ifdef FEAT_JUMPLIST
326 	"+jumplist",
327 #else
328 	"-jumplist",
329 #endif
330 #ifdef FEAT_KEYMAP
331 	"+keymap",
332 #else
333 	"-keymap",
334 #endif
335 #ifdef FEAT_EVAL
336 	"+lambda",
337 #else
338 	"-lambda",
339 #endif
340 #ifdef FEAT_LANGMAP
341 	"+langmap",
342 #else
343 	"-langmap",
344 #endif
345 #ifdef FEAT_LIBCALL
346 	"+libcall",
347 #else
348 	"-libcall",
349 #endif
350 #ifdef FEAT_LINEBREAK
351 	"+linebreak",
352 #else
353 	"-linebreak",
354 #endif
355 #ifdef FEAT_LISP
356 	"+lispindent",
357 #else
358 	"-lispindent",
359 #endif
360 	"+listcmds",
361 #ifdef FEAT_LOCALMAP
362 	"+localmap",
363 #else
364 	"-localmap",
365 #endif
366 #ifdef FEAT_LUA
367 # ifdef DYNAMIC_LUA
368 	"+lua/dyn",
369 # else
370 	"+lua",
371 # endif
372 #else
373 	"-lua",
374 #endif
375 #ifdef FEAT_MENU
376 	"+menu",
377 #else
378 	"-menu",
379 #endif
380 #ifdef FEAT_SESSION
381 	"+mksession",
382 #else
383 	"-mksession",
384 #endif
385 #ifdef FEAT_MODIFY_FNAME
386 	"+modify_fname",
387 #else
388 	"-modify_fname",
389 #endif
390 #ifdef FEAT_MOUSE
391 	"+mouse",
392 #  ifdef FEAT_MOUSESHAPE
393 	"+mouseshape",
394 #  else
395 	"-mouseshape",
396 #  endif
397 # else
398 	"-mouse",
399 #endif
400 
401 #if defined(UNIX) || defined(VMS)
402 # ifdef FEAT_MOUSE_DEC
403 	"+mouse_dec",
404 # else
405 	"-mouse_dec",
406 # endif
407 # ifdef FEAT_MOUSE_GPM
408 	"+mouse_gpm",
409 # else
410 	"-mouse_gpm",
411 # endif
412 # ifdef FEAT_MOUSE_JSB
413 	"+mouse_jsbterm",
414 # else
415 	"-mouse_jsbterm",
416 # endif
417 # ifdef FEAT_MOUSE_NET
418 	"+mouse_netterm",
419 # else
420 	"-mouse_netterm",
421 # endif
422 #endif
423 
424 #ifdef __QNX__
425 # ifdef FEAT_MOUSE_PTERM
426 	"+mouse_pterm",
427 # else
428 	"-mouse_pterm",
429 # endif
430 #endif
431 
432 #if defined(UNIX) || defined(VMS)
433 # ifdef FEAT_MOUSE_SGR
434 	"+mouse_sgr",
435 # else
436 	"-mouse_sgr",
437 # endif
438 # ifdef FEAT_SYSMOUSE
439 	"+mouse_sysmouse",
440 # else
441 	"-mouse_sysmouse",
442 # endif
443 # ifdef FEAT_MOUSE_URXVT
444 	"+mouse_urxvt",
445 # else
446 	"-mouse_urxvt",
447 # endif
448 # ifdef FEAT_MOUSE_XTERM
449 	"+mouse_xterm",
450 # else
451 	"-mouse_xterm",
452 # endif
453 #endif
454 
455 #ifdef FEAT_MBYTE_IME
456 # ifdef DYNAMIC_IME
457 	"+multi_byte_ime/dyn",
458 # else
459 	"+multi_byte_ime",
460 # endif
461 #else
462 # ifdef FEAT_MBYTE
463 	"+multi_byte",
464 # else
465 	"-multi_byte",
466 # endif
467 #endif
468 #ifdef FEAT_MULTI_LANG
469 	"+multi_lang",
470 #else
471 	"-multi_lang",
472 #endif
473 #ifdef FEAT_MZSCHEME
474 # ifdef DYNAMIC_MZSCHEME
475 	"+mzscheme/dyn",
476 # else
477 	"+mzscheme",
478 # endif
479 #else
480 	"-mzscheme",
481 #endif
482 #ifdef FEAT_NETBEANS_INTG
483 	"+netbeans_intg",
484 #else
485 	"-netbeans_intg",
486 #endif
487 #ifdef FEAT_NUM64
488 	"+num64",
489 #else
490 	"-num64",
491 #endif
492 #ifdef FEAT_GUI_W32
493 # ifdef FEAT_OLE
494 	"+ole",
495 # else
496 	"-ole",
497 # endif
498 #endif
499 #ifdef FEAT_EVAL
500 	"+packages",
501 #else
502 	"-packages",
503 #endif
504 #ifdef FEAT_PATH_EXTRA
505 	"+path_extra",
506 #else
507 	"-path_extra",
508 #endif
509 #ifdef FEAT_PERL
510 # ifdef DYNAMIC_PERL
511 	"+perl/dyn",
512 # else
513 	"+perl",
514 # endif
515 #else
516 	"-perl",
517 #endif
518 #ifdef FEAT_PERSISTENT_UNDO
519 	"+persistent_undo",
520 #else
521 	"-persistent_undo",
522 #endif
523 #ifdef FEAT_PRINTER
524 # ifdef FEAT_POSTSCRIPT
525 	"+postscript",
526 # else
527 	"-postscript",
528 # endif
529 	"+printer",
530 #else
531 	"-printer",
532 #endif
533 #ifdef FEAT_PROFILE
534 	"+profile",
535 #else
536 	"-profile",
537 #endif
538 #ifdef FEAT_PYTHON
539 # ifdef DYNAMIC_PYTHON
540 	"+python/dyn",
541 # else
542 	"+python",
543 # endif
544 #else
545 	"-python",
546 #endif
547 #ifdef FEAT_PYTHON3
548 # ifdef DYNAMIC_PYTHON3
549 	"+python3/dyn",
550 # else
551 	"+python3",
552 # endif
553 #else
554 	"-python3",
555 #endif
556 #ifdef FEAT_QUICKFIX
557 	"+quickfix",
558 #else
559 	"-quickfix",
560 #endif
561 #ifdef FEAT_RELTIME
562 	"+reltime",
563 #else
564 	"-reltime",
565 #endif
566 #ifdef FEAT_RIGHTLEFT
567 	"+rightleft",
568 #else
569 	"-rightleft",
570 #endif
571 #ifdef FEAT_RUBY
572 # ifdef DYNAMIC_RUBY
573 	"+ruby/dyn",
574 # else
575 	"+ruby",
576 # endif
577 #else
578 	"-ruby",
579 #endif
580 	"+scrollbind",
581 #ifdef FEAT_SIGNS
582 	"+signs",
583 #else
584 	"-signs",
585 #endif
586 #ifdef FEAT_SMARTINDENT
587 	"+smartindent",
588 #else
589 	"-smartindent",
590 #endif
591 #ifdef STARTUPTIME
592 	"+startuptime",
593 #else
594 	"-startuptime",
595 #endif
596 #ifdef FEAT_STL_OPT
597 	"+statusline",
598 #else
599 	"-statusline",
600 #endif
601 	"-sun_workshop",
602 #ifdef FEAT_SYN_HL
603 	"+syntax",
604 #else
605 	"-syntax",
606 #endif
607 	    /* only interesting on Unix systems */
608 #if defined(USE_SYSTEM) && defined(UNIX)
609 	"+system()",
610 #endif
611 #ifdef FEAT_TAG_BINS
612 	"+tag_binary",
613 #else
614 	"-tag_binary",
615 #endif
616 #ifdef FEAT_TAG_OLDSTATIC
617 	"+tag_old_static",
618 #else
619 	"-tag_old_static",
620 #endif
621 #ifdef FEAT_TAG_ANYWHITE
622 	"+tag_any_white",
623 #else
624 	"-tag_any_white",
625 #endif
626 #ifdef FEAT_TCL
627 # ifdef DYNAMIC_TCL
628 	"+tcl/dyn",
629 # else
630 	"+tcl",
631 # endif
632 #else
633 	"-tcl",
634 #endif
635 #ifdef FEAT_TERMGUICOLORS
636 	"+termguicolors",
637 #else
638 	"-termguicolors",
639 #endif
640 #ifdef FEAT_TERMINAL
641 	"+terminal",
642 #else
643 	"-terminal",
644 #endif
645 #if defined(UNIX)
646 /* only Unix can have terminfo instead of termcap */
647 # ifdef TERMINFO
648 	"+terminfo",
649 # else
650 	"-terminfo",
651 # endif
652 #endif
653 #ifdef FEAT_TERMRESPONSE
654 	"+termresponse",
655 #else
656 	"-termresponse",
657 #endif
658 #ifdef FEAT_TEXTOBJ
659 	"+textobjects",
660 #else
661 	"-textobjects",
662 #endif
663 #ifdef FEAT_TEXT_PROP
664 	"+textprop",
665 #else
666 	"-textprop",
667 #endif
668 #if !defined(UNIX)
669 /* unix always includes termcap support */
670 # ifdef HAVE_TGETENT
671 	"+tgetent",
672 # else
673 	"-tgetent",
674 # endif
675 #endif
676 #ifdef FEAT_TIMERS
677 	"+timers",
678 #else
679 	"-timers",
680 #endif
681 #ifdef FEAT_TITLE
682 	"+title",
683 #else
684 	"-title",
685 #endif
686 #ifdef FEAT_TOOLBAR
687 	"+toolbar",
688 #else
689 	"-toolbar",
690 #endif
691 #ifdef FEAT_USR_CMDS
692 	"+user_commands",
693 #else
694 	"-user_commands",
695 #endif
696 #ifdef FEAT_VARTABS
697 	"+vartabs",
698 #else
699 	"-vartabs",
700 #endif
701 	"+vertsplit",
702 #ifdef FEAT_VIRTUALEDIT
703 	"+virtualedit",
704 #else
705 	"-virtualedit",
706 #endif
707 	"+visual",
708 	"+visualextra",
709 #ifdef FEAT_VIMINFO
710 	"+viminfo",
711 #else
712 	"-viminfo",
713 #endif
714 	"+vreplace",
715 #ifdef WIN3264
716 # ifdef FEAT_VTP
717 	"+vtp",
718 # else
719 	"-vtp",
720 # endif
721 #endif
722 #ifdef FEAT_WILDIGN
723 	"+wildignore",
724 #else
725 	"-wildignore",
726 #endif
727 #ifdef FEAT_WILDMENU
728 	"+wildmenu",
729 #else
730 	"-wildmenu",
731 #endif
732 	"+windows",
733 #ifdef FEAT_WRITEBACKUP
734 	"+writebackup",
735 #else
736 	"-writebackup",
737 #endif
738 #if defined(UNIX) || defined(VMS)
739 # ifdef FEAT_X11
740 	"+X11",
741 # else
742 	"-X11",
743 # endif
744 #endif
745 #ifdef FEAT_XFONTSET
746 	"+xfontset",
747 #else
748 	"-xfontset",
749 #endif
750 #ifdef FEAT_XIM
751 	"+xim",
752 #else
753 	"-xim",
754 #endif
755 #ifdef WIN3264
756 # ifdef FEAT_XPM_W32
757 	"+xpm_w32",
758 # else
759 	"-xpm_w32",
760 # endif
761 #else
762 # ifdef HAVE_XPM
763 	"+xpm",
764 # else
765 	"-xpm",
766 # endif
767 #endif
768 #if defined(UNIX) || defined(VMS)
769 # ifdef USE_XSMP_INTERACT
770 	"+xsmp_interact",
771 # else
772 #  ifdef USE_XSMP
773 	"+xsmp",
774 #  else
775 	"-xsmp",
776 #  endif
777 # endif
778 # ifdef FEAT_XCLIPBOARD
779 	"+xterm_clipboard",
780 # else
781 	"-xterm_clipboard",
782 # endif
783 #endif
784 #ifdef FEAT_XTERM_SAVE
785 	"+xterm_save",
786 #else
787 	"-xterm_save",
788 #endif
789 	NULL
790 };
791 
792 static int included_patches[] =
793 {   /* Add new patch number below this line */
794 /**/
795     771,
796 /**/
797     770,
798 /**/
799     769,
800 /**/
801     768,
802 /**/
803     767,
804 /**/
805     766,
806 /**/
807     765,
808 /**/
809     764,
810 /**/
811     763,
812 /**/
813     762,
814 /**/
815     761,
816 /**/
817     760,
818 /**/
819     759,
820 /**/
821     758,
822 /**/
823     757,
824 /**/
825     756,
826 /**/
827     755,
828 /**/
829     754,
830 /**/
831     753,
832 /**/
833     752,
834 /**/
835     751,
836 /**/
837     750,
838 /**/
839     749,
840 /**/
841     748,
842 /**/
843     747,
844 /**/
845     746,
846 /**/
847     745,
848 /**/
849     744,
850 /**/
851     743,
852 /**/
853     742,
854 /**/
855     741,
856 /**/
857     740,
858 /**/
859     739,
860 /**/
861     738,
862 /**/
863     737,
864 /**/
865     736,
866 /**/
867     735,
868 /**/
869     734,
870 /**/
871     733,
872 /**/
873     732,
874 /**/
875     731,
876 /**/
877     730,
878 /**/
879     729,
880 /**/
881     728,
882 /**/
883     727,
884 /**/
885     726,
886 /**/
887     725,
888 /**/
889     724,
890 /**/
891     723,
892 /**/
893     722,
894 /**/
895     721,
896 /**/
897     720,
898 /**/
899     719,
900 /**/
901     718,
902 /**/
903     717,
904 /**/
905     716,
906 /**/
907     715,
908 /**/
909     714,
910 /**/
911     713,
912 /**/
913     712,
914 /**/
915     711,
916 /**/
917     710,
918 /**/
919     709,
920 /**/
921     708,
922 /**/
923     707,
924 /**/
925     706,
926 /**/
927     705,
928 /**/
929     704,
930 /**/
931     703,
932 /**/
933     702,
934 /**/
935     701,
936 /**/
937     700,
938 /**/
939     699,
940 /**/
941     698,
942 /**/
943     697,
944 /**/
945     696,
946 /**/
947     695,
948 /**/
949     694,
950 /**/
951     693,
952 /**/
953     692,
954 /**/
955     691,
956 /**/
957     690,
958 /**/
959     689,
960 /**/
961     688,
962 /**/
963     687,
964 /**/
965     686,
966 /**/
967     685,
968 /**/
969     684,
970 /**/
971     683,
972 /**/
973     682,
974 /**/
975     681,
976 /**/
977     680,
978 /**/
979     679,
980 /**/
981     678,
982 /**/
983     677,
984 /**/
985     676,
986 /**/
987     675,
988 /**/
989     674,
990 /**/
991     673,
992 /**/
993     672,
994 /**/
995     671,
996 /**/
997     670,
998 /**/
999     669,
1000 /**/
1001     668,
1002 /**/
1003     667,
1004 /**/
1005     666,
1006 /**/
1007     665,
1008 /**/
1009     664,
1010 /**/
1011     663,
1012 /**/
1013     662,
1014 /**/
1015     661,
1016 /**/
1017     660,
1018 /**/
1019     659,
1020 /**/
1021     658,
1022 /**/
1023     657,
1024 /**/
1025     656,
1026 /**/
1027     655,
1028 /**/
1029     654,
1030 /**/
1031     653,
1032 /**/
1033     652,
1034 /**/
1035     651,
1036 /**/
1037     650,
1038 /**/
1039     649,
1040 /**/
1041     648,
1042 /**/
1043     647,
1044 /**/
1045     646,
1046 /**/
1047     645,
1048 /**/
1049     644,
1050 /**/
1051     643,
1052 /**/
1053     642,
1054 /**/
1055     641,
1056 /**/
1057     640,
1058 /**/
1059     639,
1060 /**/
1061     638,
1062 /**/
1063     637,
1064 /**/
1065     636,
1066 /**/
1067     635,
1068 /**/
1069     634,
1070 /**/
1071     633,
1072 /**/
1073     632,
1074 /**/
1075     631,
1076 /**/
1077     630,
1078 /**/
1079     629,
1080 /**/
1081     628,
1082 /**/
1083     627,
1084 /**/
1085     626,
1086 /**/
1087     625,
1088 /**/
1089     624,
1090 /**/
1091     623,
1092 /**/
1093     622,
1094 /**/
1095     621,
1096 /**/
1097     620,
1098 /**/
1099     619,
1100 /**/
1101     618,
1102 /**/
1103     617,
1104 /**/
1105     616,
1106 /**/
1107     615,
1108 /**/
1109     614,
1110 /**/
1111     613,
1112 /**/
1113     612,
1114 /**/
1115     611,
1116 /**/
1117     610,
1118 /**/
1119     609,
1120 /**/
1121     608,
1122 /**/
1123     607,
1124 /**/
1125     606,
1126 /**/
1127     605,
1128 /**/
1129     604,
1130 /**/
1131     603,
1132 /**/
1133     602,
1134 /**/
1135     601,
1136 /**/
1137     600,
1138 /**/
1139     599,
1140 /**/
1141     598,
1142 /**/
1143     597,
1144 /**/
1145     596,
1146 /**/
1147     595,
1148 /**/
1149     594,
1150 /**/
1151     593,
1152 /**/
1153     592,
1154 /**/
1155     591,
1156 /**/
1157     590,
1158 /**/
1159     589,
1160 /**/
1161     588,
1162 /**/
1163     587,
1164 /**/
1165     586,
1166 /**/
1167     585,
1168 /**/
1169     584,
1170 /**/
1171     583,
1172 /**/
1173     582,
1174 /**/
1175     581,
1176 /**/
1177     580,
1178 /**/
1179     579,
1180 /**/
1181     578,
1182 /**/
1183     577,
1184 /**/
1185     576,
1186 /**/
1187     575,
1188 /**/
1189     574,
1190 /**/
1191     573,
1192 /**/
1193     572,
1194 /**/
1195     571,
1196 /**/
1197     570,
1198 /**/
1199     569,
1200 /**/
1201     568,
1202 /**/
1203     567,
1204 /**/
1205     566,
1206 /**/
1207     565,
1208 /**/
1209     564,
1210 /**/
1211     563,
1212 /**/
1213     562,
1214 /**/
1215     561,
1216 /**/
1217     560,
1218 /**/
1219     559,
1220 /**/
1221     558,
1222 /**/
1223     557,
1224 /**/
1225     556,
1226 /**/
1227     555,
1228 /**/
1229     554,
1230 /**/
1231     553,
1232 /**/
1233     552,
1234 /**/
1235     551,
1236 /**/
1237     550,
1238 /**/
1239     549,
1240 /**/
1241     548,
1242 /**/
1243     547,
1244 /**/
1245     546,
1246 /**/
1247     545,
1248 /**/
1249     544,
1250 /**/
1251     543,
1252 /**/
1253     542,
1254 /**/
1255     541,
1256 /**/
1257     540,
1258 /**/
1259     539,
1260 /**/
1261     538,
1262 /**/
1263     537,
1264 /**/
1265     536,
1266 /**/
1267     535,
1268 /**/
1269     534,
1270 /**/
1271     533,
1272 /**/
1273     532,
1274 /**/
1275     531,
1276 /**/
1277     530,
1278 /**/
1279     529,
1280 /**/
1281     528,
1282 /**/
1283     527,
1284 /**/
1285     526,
1286 /**/
1287     525,
1288 /**/
1289     524,
1290 /**/
1291     523,
1292 /**/
1293     522,
1294 /**/
1295     521,
1296 /**/
1297     520,
1298 /**/
1299     519,
1300 /**/
1301     518,
1302 /**/
1303     517,
1304 /**/
1305     516,
1306 /**/
1307     515,
1308 /**/
1309     514,
1310 /**/
1311     513,
1312 /**/
1313     512,
1314 /**/
1315     511,
1316 /**/
1317     510,
1318 /**/
1319     509,
1320 /**/
1321     508,
1322 /**/
1323     507,
1324 /**/
1325     506,
1326 /**/
1327     505,
1328 /**/
1329     504,
1330 /**/
1331     503,
1332 /**/
1333     502,
1334 /**/
1335     501,
1336 /**/
1337     500,
1338 /**/
1339     499,
1340 /**/
1341     498,
1342 /**/
1343     497,
1344 /**/
1345     496,
1346 /**/
1347     495,
1348 /**/
1349     494,
1350 /**/
1351     493,
1352 /**/
1353     492,
1354 /**/
1355     491,
1356 /**/
1357     490,
1358 /**/
1359     489,
1360 /**/
1361     488,
1362 /**/
1363     487,
1364 /**/
1365     486,
1366 /**/
1367     485,
1368 /**/
1369     484,
1370 /**/
1371     483,
1372 /**/
1373     482,
1374 /**/
1375     481,
1376 /**/
1377     480,
1378 /**/
1379     479,
1380 /**/
1381     478,
1382 /**/
1383     477,
1384 /**/
1385     476,
1386 /**/
1387     475,
1388 /**/
1389     474,
1390 /**/
1391     473,
1392 /**/
1393     472,
1394 /**/
1395     471,
1396 /**/
1397     470,
1398 /**/
1399     469,
1400 /**/
1401     468,
1402 /**/
1403     467,
1404 /**/
1405     466,
1406 /**/
1407     465,
1408 /**/
1409     464,
1410 /**/
1411     463,
1412 /**/
1413     462,
1414 /**/
1415     461,
1416 /**/
1417     460,
1418 /**/
1419     459,
1420 /**/
1421     458,
1422 /**/
1423     457,
1424 /**/
1425     456,
1426 /**/
1427     455,
1428 /**/
1429     454,
1430 /**/
1431     453,
1432 /**/
1433     452,
1434 /**/
1435     451,
1436 /**/
1437     450,
1438 /**/
1439     449,
1440 /**/
1441     448,
1442 /**/
1443     447,
1444 /**/
1445     446,
1446 /**/
1447     445,
1448 /**/
1449     444,
1450 /**/
1451     443,
1452 /**/
1453     442,
1454 /**/
1455     441,
1456 /**/
1457     440,
1458 /**/
1459     439,
1460 /**/
1461     438,
1462 /**/
1463     437,
1464 /**/
1465     436,
1466 /**/
1467     435,
1468 /**/
1469     434,
1470 /**/
1471     433,
1472 /**/
1473     432,
1474 /**/
1475     431,
1476 /**/
1477     430,
1478 /**/
1479     429,
1480 /**/
1481     428,
1482 /**/
1483     427,
1484 /**/
1485     426,
1486 /**/
1487     425,
1488 /**/
1489     424,
1490 /**/
1491     423,
1492 /**/
1493     422,
1494 /**/
1495     421,
1496 /**/
1497     420,
1498 /**/
1499     419,
1500 /**/
1501     418,
1502 /**/
1503     417,
1504 /**/
1505     416,
1506 /**/
1507     415,
1508 /**/
1509     414,
1510 /**/
1511     413,
1512 /**/
1513     412,
1514 /**/
1515     411,
1516 /**/
1517     410,
1518 /**/
1519     409,
1520 /**/
1521     408,
1522 /**/
1523     407,
1524 /**/
1525     406,
1526 /**/
1527     405,
1528 /**/
1529     404,
1530 /**/
1531     403,
1532 /**/
1533     402,
1534 /**/
1535     401,
1536 /**/
1537     400,
1538 /**/
1539     399,
1540 /**/
1541     398,
1542 /**/
1543     397,
1544 /**/
1545     396,
1546 /**/
1547     395,
1548 /**/
1549     394,
1550 /**/
1551     393,
1552 /**/
1553     392,
1554 /**/
1555     391,
1556 /**/
1557     390,
1558 /**/
1559     389,
1560 /**/
1561     388,
1562 /**/
1563     387,
1564 /**/
1565     386,
1566 /**/
1567     385,
1568 /**/
1569     384,
1570 /**/
1571     383,
1572 /**/
1573     382,
1574 /**/
1575     381,
1576 /**/
1577     380,
1578 /**/
1579     379,
1580 /**/
1581     378,
1582 /**/
1583     377,
1584 /**/
1585     376,
1586 /**/
1587     375,
1588 /**/
1589     374,
1590 /**/
1591     373,
1592 /**/
1593     372,
1594 /**/
1595     371,
1596 /**/
1597     370,
1598 /**/
1599     369,
1600 /**/
1601     368,
1602 /**/
1603     367,
1604 /**/
1605     366,
1606 /**/
1607     365,
1608 /**/
1609     364,
1610 /**/
1611     363,
1612 /**/
1613     362,
1614 /**/
1615     361,
1616 /**/
1617     360,
1618 /**/
1619     359,
1620 /**/
1621     358,
1622 /**/
1623     357,
1624 /**/
1625     356,
1626 /**/
1627     355,
1628 /**/
1629     354,
1630 /**/
1631     353,
1632 /**/
1633     352,
1634 /**/
1635     351,
1636 /**/
1637     350,
1638 /**/
1639     349,
1640 /**/
1641     348,
1642 /**/
1643     347,
1644 /**/
1645     346,
1646 /**/
1647     345,
1648 /**/
1649     344,
1650 /**/
1651     343,
1652 /**/
1653     342,
1654 /**/
1655     341,
1656 /**/
1657     340,
1658 /**/
1659     339,
1660 /**/
1661     338,
1662 /**/
1663     337,
1664 /**/
1665     336,
1666 /**/
1667     335,
1668 /**/
1669     334,
1670 /**/
1671     333,
1672 /**/
1673     332,
1674 /**/
1675     331,
1676 /**/
1677     330,
1678 /**/
1679     329,
1680 /**/
1681     328,
1682 /**/
1683     327,
1684 /**/
1685     326,
1686 /**/
1687     325,
1688 /**/
1689     324,
1690 /**/
1691     323,
1692 /**/
1693     322,
1694 /**/
1695     321,
1696 /**/
1697     320,
1698 /**/
1699     319,
1700 /**/
1701     318,
1702 /**/
1703     317,
1704 /**/
1705     316,
1706 /**/
1707     315,
1708 /**/
1709     314,
1710 /**/
1711     313,
1712 /**/
1713     312,
1714 /**/
1715     311,
1716 /**/
1717     310,
1718 /**/
1719     309,
1720 /**/
1721     308,
1722 /**/
1723     307,
1724 /**/
1725     306,
1726 /**/
1727     305,
1728 /**/
1729     304,
1730 /**/
1731     303,
1732 /**/
1733     302,
1734 /**/
1735     301,
1736 /**/
1737     300,
1738 /**/
1739     299,
1740 /**/
1741     298,
1742 /**/
1743     297,
1744 /**/
1745     296,
1746 /**/
1747     295,
1748 /**/
1749     294,
1750 /**/
1751     293,
1752 /**/
1753     292,
1754 /**/
1755     291,
1756 /**/
1757     290,
1758 /**/
1759     289,
1760 /**/
1761     288,
1762 /**/
1763     287,
1764 /**/
1765     286,
1766 /**/
1767     285,
1768 /**/
1769     284,
1770 /**/
1771     283,
1772 /**/
1773     282,
1774 /**/
1775     281,
1776 /**/
1777     280,
1778 /**/
1779     279,
1780 /**/
1781     278,
1782 /**/
1783     277,
1784 /**/
1785     276,
1786 /**/
1787     275,
1788 /**/
1789     274,
1790 /**/
1791     273,
1792 /**/
1793     272,
1794 /**/
1795     271,
1796 /**/
1797     270,
1798 /**/
1799     269,
1800 /**/
1801     268,
1802 /**/
1803     267,
1804 /**/
1805     266,
1806 /**/
1807     265,
1808 /**/
1809     264,
1810 /**/
1811     263,
1812 /**/
1813     262,
1814 /**/
1815     261,
1816 /**/
1817     260,
1818 /**/
1819     259,
1820 /**/
1821     258,
1822 /**/
1823     257,
1824 /**/
1825     256,
1826 /**/
1827     255,
1828 /**/
1829     254,
1830 /**/
1831     253,
1832 /**/
1833     252,
1834 /**/
1835     251,
1836 /**/
1837     250,
1838 /**/
1839     249,
1840 /**/
1841     248,
1842 /**/
1843     247,
1844 /**/
1845     246,
1846 /**/
1847     245,
1848 /**/
1849     244,
1850 /**/
1851     243,
1852 /**/
1853     242,
1854 /**/
1855     241,
1856 /**/
1857     240,
1858 /**/
1859     239,
1860 /**/
1861     238,
1862 /**/
1863     237,
1864 /**/
1865     236,
1866 /**/
1867     235,
1868 /**/
1869     234,
1870 /**/
1871     233,
1872 /**/
1873     232,
1874 /**/
1875     231,
1876 /**/
1877     230,
1878 /**/
1879     229,
1880 /**/
1881     228,
1882 /**/
1883     227,
1884 /**/
1885     226,
1886 /**/
1887     225,
1888 /**/
1889     224,
1890 /**/
1891     223,
1892 /**/
1893     222,
1894 /**/
1895     221,
1896 /**/
1897     220,
1898 /**/
1899     219,
1900 /**/
1901     218,
1902 /**/
1903     217,
1904 /**/
1905     216,
1906 /**/
1907     215,
1908 /**/
1909     214,
1910 /**/
1911     213,
1912 /**/
1913     212,
1914 /**/
1915     211,
1916 /**/
1917     210,
1918 /**/
1919     209,
1920 /**/
1921     208,
1922 /**/
1923     207,
1924 /**/
1925     206,
1926 /**/
1927     205,
1928 /**/
1929     204,
1930 /**/
1931     203,
1932 /**/
1933     202,
1934 /**/
1935     201,
1936 /**/
1937     200,
1938 /**/
1939     199,
1940 /**/
1941     198,
1942 /**/
1943     197,
1944 /**/
1945     196,
1946 /**/
1947     195,
1948 /**/
1949     194,
1950 /**/
1951     193,
1952 /**/
1953     192,
1954 /**/
1955     191,
1956 /**/
1957     190,
1958 /**/
1959     189,
1960 /**/
1961     188,
1962 /**/
1963     187,
1964 /**/
1965     186,
1966 /**/
1967     185,
1968 /**/
1969     184,
1970 /**/
1971     183,
1972 /**/
1973     182,
1974 /**/
1975     181,
1976 /**/
1977     180,
1978 /**/
1979     179,
1980 /**/
1981     178,
1982 /**/
1983     177,
1984 /**/
1985     176,
1986 /**/
1987     175,
1988 /**/
1989     174,
1990 /**/
1991     173,
1992 /**/
1993     172,
1994 /**/
1995     171,
1996 /**/
1997     170,
1998 /**/
1999     169,
2000 /**/
2001     168,
2002 /**/
2003     167,
2004 /**/
2005     166,
2006 /**/
2007     165,
2008 /**/
2009     164,
2010 /**/
2011     163,
2012 /**/
2013     162,
2014 /**/
2015     161,
2016 /**/
2017     160,
2018 /**/
2019     159,
2020 /**/
2021     158,
2022 /**/
2023     157,
2024 /**/
2025     156,
2026 /**/
2027     155,
2028 /**/
2029     154,
2030 /**/
2031     153,
2032 /**/
2033     152,
2034 /**/
2035     151,
2036 /**/
2037     150,
2038 /**/
2039     149,
2040 /**/
2041     148,
2042 /**/
2043     147,
2044 /**/
2045     146,
2046 /**/
2047     145,
2048 /**/
2049     144,
2050 /**/
2051     143,
2052 /**/
2053     142,
2054 /**/
2055     141,
2056 /**/
2057     140,
2058 /**/
2059     139,
2060 /**/
2061     138,
2062 /**/
2063     137,
2064 /**/
2065     136,
2066 /**/
2067     135,
2068 /**/
2069     134,
2070 /**/
2071     133,
2072 /**/
2073     132,
2074 /**/
2075     131,
2076 /**/
2077     130,
2078 /**/
2079     129,
2080 /**/
2081     128,
2082 /**/
2083     127,
2084 /**/
2085     126,
2086 /**/
2087     125,
2088 /**/
2089     124,
2090 /**/
2091     123,
2092 /**/
2093     122,
2094 /**/
2095     121,
2096 /**/
2097     120,
2098 /**/
2099     119,
2100 /**/
2101     118,
2102 /**/
2103     117,
2104 /**/
2105     116,
2106 /**/
2107     115,
2108 /**/
2109     114,
2110 /**/
2111     113,
2112 /**/
2113     112,
2114 /**/
2115     111,
2116 /**/
2117     110,
2118 /**/
2119     109,
2120 /**/
2121     108,
2122 /**/
2123     107,
2124 /**/
2125     106,
2126 /**/
2127     105,
2128 /**/
2129     104,
2130 /**/
2131     103,
2132 /**/
2133     102,
2134 /**/
2135     101,
2136 /**/
2137     100,
2138 /**/
2139     99,
2140 /**/
2141     98,
2142 /**/
2143     97,
2144 /**/
2145     96,
2146 /**/
2147     95,
2148 /**/
2149     94,
2150 /**/
2151     93,
2152 /**/
2153     92,
2154 /**/
2155     91,
2156 /**/
2157     90,
2158 /**/
2159     89,
2160 /**/
2161     88,
2162 /**/
2163     87,
2164 /**/
2165     86,
2166 /**/
2167     85,
2168 /**/
2169     84,
2170 /**/
2171     83,
2172 /**/
2173     82,
2174 /**/
2175     81,
2176 /**/
2177     80,
2178 /**/
2179     79,
2180 /**/
2181     78,
2182 /**/
2183     77,
2184 /**/
2185     76,
2186 /**/
2187     75,
2188 /**/
2189     74,
2190 /**/
2191     73,
2192 /**/
2193     72,
2194 /**/
2195     71,
2196 /**/
2197     70,
2198 /**/
2199     69,
2200 /**/
2201     68,
2202 /**/
2203     67,
2204 /**/
2205     66,
2206 /**/
2207     65,
2208 /**/
2209     64,
2210 /**/
2211     63,
2212 /**/
2213     62,
2214 /**/
2215     61,
2216 /**/
2217     60,
2218 /**/
2219     59,
2220 /**/
2221     58,
2222 /**/
2223     57,
2224 /**/
2225     56,
2226 /**/
2227     55,
2228 /**/
2229     54,
2230 /**/
2231     53,
2232 /**/
2233     52,
2234 /**/
2235     51,
2236 /**/
2237     50,
2238 /**/
2239     49,
2240 /**/
2241     48,
2242 /**/
2243     47,
2244 /**/
2245     46,
2246 /**/
2247     45,
2248 /**/
2249     44,
2250 /**/
2251     43,
2252 /**/
2253     42,
2254 /**/
2255     41,
2256 /**/
2257     40,
2258 /**/
2259     39,
2260 /**/
2261     38,
2262 /**/
2263     37,
2264 /**/
2265     36,
2266 /**/
2267     35,
2268 /**/
2269     34,
2270 /**/
2271     33,
2272 /**/
2273     32,
2274 /**/
2275     31,
2276 /**/
2277     30,
2278 /**/
2279     29,
2280 /**/
2281     28,
2282 /**/
2283     27,
2284 /**/
2285     26,
2286 /**/
2287     25,
2288 /**/
2289     24,
2290 /**/
2291     23,
2292 /**/
2293     22,
2294 /**/
2295     21,
2296 /**/
2297     20,
2298 /**/
2299     19,
2300 /**/
2301     18,
2302 /**/
2303     17,
2304 /**/
2305     16,
2306 /**/
2307     15,
2308 /**/
2309     14,
2310 /**/
2311     13,
2312 /**/
2313     12,
2314 /**/
2315     11,
2316 /**/
2317     10,
2318 /**/
2319     9,
2320 /**/
2321     8,
2322 /**/
2323     7,
2324 /**/
2325     6,
2326 /**/
2327     5,
2328 /**/
2329     4,
2330 /**/
2331     3,
2332 /**/
2333     2,
2334 /**/
2335     1,
2336 /**/
2337     0
2338 };
2339 
2340 /*
2341  * Place to put a short description when adding a feature with a patch.
2342  * Keep it short, e.g.,: "relative numbers", "persistent undo".
2343  * Also add a comment marker to separate the lines.
2344  * See the official Vim patches for the diff format: It must use a context of
2345  * one line only.  Create it by hand or use "diff -C2" and edit the patch.
2346  */
2347 static char *(extra_patches[]) =
2348 {   /* Add your patch description below this line */
2349 /**/
2350     NULL
2351 };
2352 
2353     int
2354 highest_patch(void)
2355 {
2356     int		i;
2357     int		h = 0;
2358 
2359     for (i = 0; included_patches[i] != 0; ++i)
2360 	if (included_patches[i] > h)
2361 	    h = included_patches[i];
2362     return h;
2363 }
2364 
2365 #if defined(FEAT_EVAL) || defined(PROTO)
2366 /*
2367  * Return TRUE if patch "n" has been included.
2368  */
2369     int
2370 has_patch(int n)
2371 {
2372     int		i;
2373 
2374     for (i = 0; included_patches[i] != 0; ++i)
2375 	if (included_patches[i] == n)
2376 	    return TRUE;
2377     return FALSE;
2378 }
2379 #endif
2380 
2381     void
2382 ex_version(exarg_T *eap)
2383 {
2384     /*
2385      * Ignore a ":version 9.99" command.
2386      */
2387     if (*eap->arg == NUL)
2388     {
2389 	msg_putchar('\n');
2390 	list_version();
2391     }
2392 }
2393 
2394 /*
2395  * Output a string for the version message.  If it's going to wrap, output a
2396  * newline, unless the message is too long to fit on the screen anyway.
2397  * When "wrap" is TRUE wrap the string in [].
2398  */
2399     static void
2400 version_msg_wrap(char_u *s, int wrap)
2401 {
2402     int		len = (int)vim_strsize(s) + (wrap ? 2 : 0);
2403 
2404     if (!got_int && len < (int)Columns && msg_col + len >= (int)Columns
2405 								&& *s != '\n')
2406 	msg_putchar('\n');
2407     if (!got_int)
2408     {
2409 	if (wrap)
2410 	    MSG_PUTS("[");
2411 	MSG_PUTS(s);
2412 	if (wrap)
2413 	    MSG_PUTS("]");
2414     }
2415 }
2416 
2417     static void
2418 version_msg(char *s)
2419 {
2420     version_msg_wrap((char_u *)s, FALSE);
2421 }
2422 
2423 /*
2424  * List all features aligned in columns, dictionary style.
2425  */
2426     static void
2427 list_features(void)
2428 {
2429     list_in_columns((char_u **)features, -1, -1);
2430 }
2431 
2432 /*
2433  * List string items nicely aligned in columns.
2434  * When "size" is < 0 then the last entry is marked with NULL.
2435  * The entry with index "current" is inclosed in [].
2436  */
2437     void
2438 list_in_columns(char_u **items, int size, int current)
2439 {
2440     int		i;
2441     int		ncol;
2442     int		nrow;
2443     int		item_count = 0;
2444     int		width = 0;
2445 #ifdef FEAT_SYN_HL
2446     int		use_highlight = (items == (char_u **)features);
2447 #endif
2448 
2449     /* Find the length of the longest item, use that + 1 as the column
2450      * width. */
2451     for (i = 0; size < 0 ? items[i] != NULL : i < size; ++i)
2452     {
2453 	int l = (int)vim_strsize(items[i]) + (i == current ? 2 : 0);
2454 
2455 	if (l > width)
2456 	    width = l;
2457 	++item_count;
2458     }
2459     width += 1;
2460 
2461     if (Columns < width)
2462     {
2463 	/* Not enough screen columns - show one per line */
2464 	for (i = 0; i < item_count; ++i)
2465 	{
2466 	    version_msg_wrap(items[i], i == current);
2467 	    if (msg_col > 0)
2468 		msg_putchar('\n');
2469 	}
2470 	return;
2471     }
2472 
2473     /* The rightmost column doesn't need a separator.
2474      * Sacrifice it to fit in one more column if possible. */
2475     ncol = (int) (Columns + 1) / width;
2476     nrow = item_count / ncol + (item_count % ncol ? 1 : 0);
2477 
2478     /* i counts columns then rows.  idx counts rows then columns. */
2479     for (i = 0; !got_int && i < nrow * ncol; ++i)
2480     {
2481 	int idx = (i / ncol) + (i % ncol) * nrow;
2482 
2483 	if (idx < item_count)
2484 	{
2485 	    int last_col = (i + 1) % ncol == 0;
2486 
2487 	    if (idx == current)
2488 		msg_putchar('[');
2489 #ifdef FEAT_SYN_HL
2490 	    if (use_highlight && items[idx][0] == '-')
2491 		msg_puts_attr(items[idx], HL_ATTR(HLF_W));
2492 	    else
2493 #endif
2494 		msg_puts(items[idx]);
2495 	    if (idx == current)
2496 		msg_putchar(']');
2497 	    if (last_col)
2498 	    {
2499 		if (msg_col > 0)
2500 		    msg_putchar('\n');
2501 	    }
2502 	    else
2503 	    {
2504 		while (msg_col % width)
2505 		    msg_putchar(' ');
2506 	    }
2507 	}
2508 	else
2509 	{
2510 	    if (msg_col > 0)
2511 		msg_putchar('\n');
2512 	}
2513     }
2514 }
2515 
2516     void
2517 list_version(void)
2518 {
2519     int		i;
2520     int		first;
2521     char	*s = "";
2522 
2523     /*
2524      * When adding features here, don't forget to update the list of
2525      * internal variables in eval.c!
2526      */
2527     init_longVersion();
2528     MSG(longVersion);
2529 #ifdef WIN3264
2530 # ifdef FEAT_GUI_W32
2531 #  ifdef _WIN64
2532     MSG_PUTS(_("\nMS-Windows 64-bit GUI version"));
2533 #  else
2534     MSG_PUTS(_("\nMS-Windows 32-bit GUI version"));
2535 #  endif
2536 # ifdef FEAT_OLE
2537     MSG_PUTS(_(" with OLE support"));
2538 # endif
2539 # else
2540 #  ifdef _WIN64
2541     MSG_PUTS(_("\nMS-Windows 64-bit console version"));
2542 #  else
2543     MSG_PUTS(_("\nMS-Windows 32-bit console version"));
2544 #  endif
2545 # endif
2546 #endif
2547 #if defined(MACOS_X)
2548 # if defined(MACOS_X_DARWIN)
2549     MSG_PUTS(_("\nmacOS version"));
2550 # else
2551     MSG_PUTS(_("\nmacOS version w/o darwin feat."));
2552 # endif
2553 #endif
2554 
2555 #ifdef VMS
2556     MSG_PUTS(_("\nOpenVMS version"));
2557 # ifdef HAVE_PATHDEF
2558     if (*compiled_arch != NUL)
2559     {
2560 	MSG_PUTS(" - ");
2561 	MSG_PUTS(compiled_arch);
2562     }
2563 # endif
2564 
2565 #endif
2566 
2567     /* Print the list of patch numbers if there is at least one. */
2568     /* Print a range when patches are consecutive: "1-10, 12, 15-40, 42-45" */
2569     if (included_patches[0] != 0)
2570     {
2571 	MSG_PUTS(_("\nIncluded patches: "));
2572 	first = -1;
2573 	/* find last one */
2574 	for (i = 0; included_patches[i] != 0; ++i)
2575 	    ;
2576 	while (--i >= 0)
2577 	{
2578 	    if (first < 0)
2579 		first = included_patches[i];
2580 	    if (i == 0 || included_patches[i - 1] != included_patches[i] + 1)
2581 	    {
2582 		MSG_PUTS(s);
2583 		s = ", ";
2584 		msg_outnum((long)first);
2585 		if (first != included_patches[i])
2586 		{
2587 		    MSG_PUTS("-");
2588 		    msg_outnum((long)included_patches[i]);
2589 		}
2590 		first = -1;
2591 	    }
2592 	}
2593     }
2594 
2595     /* Print the list of extra patch descriptions if there is at least one. */
2596     if (extra_patches[0] != NULL)
2597     {
2598 	MSG_PUTS(_("\nExtra patches: "));
2599 	s = "";
2600 	for (i = 0; extra_patches[i] != NULL; ++i)
2601 	{
2602 	    MSG_PUTS(s);
2603 	    s = ", ";
2604 	    MSG_PUTS(extra_patches[i]);
2605 	}
2606     }
2607 
2608 #ifdef MODIFIED_BY
2609     MSG_PUTS("\n");
2610     MSG_PUTS(_("Modified by "));
2611     MSG_PUTS(MODIFIED_BY);
2612 #endif
2613 
2614 #ifdef HAVE_PATHDEF
2615     if (*compiled_user != NUL || *compiled_sys != NUL)
2616     {
2617 	MSG_PUTS(_("\nCompiled "));
2618 	if (*compiled_user != NUL)
2619 	{
2620 	    MSG_PUTS(_("by "));
2621 	    MSG_PUTS(compiled_user);
2622 	}
2623 	if (*compiled_sys != NUL)
2624 	{
2625 	    MSG_PUTS("@");
2626 	    MSG_PUTS(compiled_sys);
2627 	}
2628     }
2629 #endif
2630 
2631 #ifdef FEAT_HUGE
2632     MSG_PUTS(_("\nHuge version "));
2633 #else
2634 # ifdef FEAT_BIG
2635     MSG_PUTS(_("\nBig version "));
2636 # else
2637 #  ifdef FEAT_NORMAL
2638     MSG_PUTS(_("\nNormal version "));
2639 #  else
2640 #   ifdef FEAT_SMALL
2641     MSG_PUTS(_("\nSmall version "));
2642 #   else
2643     MSG_PUTS(_("\nTiny version "));
2644 #   endif
2645 #  endif
2646 # endif
2647 #endif
2648 #ifndef FEAT_GUI
2649     MSG_PUTS(_("without GUI."));
2650 #else
2651 # ifdef FEAT_GUI_GTK
2652 #  ifdef USE_GTK3
2653     MSG_PUTS(_("with GTK3 GUI."));
2654 #  else
2655 #   ifdef FEAT_GUI_GNOME
2656      MSG_PUTS(_("with GTK2-GNOME GUI."));
2657 #   else
2658      MSG_PUTS(_("with GTK2 GUI."));
2659 #   endif
2660 # endif
2661 # else
2662 #  ifdef FEAT_GUI_MOTIF
2663     MSG_PUTS(_("with X11-Motif GUI."));
2664 #  else
2665 #   ifdef FEAT_GUI_ATHENA
2666 #    ifdef FEAT_GUI_NEXTAW
2667     MSG_PUTS(_("with X11-neXtaw GUI."));
2668 #    else
2669     MSG_PUTS(_("with X11-Athena GUI."));
2670 #    endif
2671 #   else
2672 #     ifdef FEAT_GUI_PHOTON
2673     MSG_PUTS(_("with Photon GUI."));
2674 #     else
2675 #      if defined(MSWIN)
2676     MSG_PUTS(_("with GUI."));
2677 #      else
2678 #	if defined(TARGET_API_MAC_CARBON) && TARGET_API_MAC_CARBON
2679     MSG_PUTS(_("with Carbon GUI."));
2680 #	else
2681 #	 if defined(TARGET_API_MAC_OSX) && TARGET_API_MAC_OSX
2682     MSG_PUTS(_("with Cocoa GUI."));
2683 #	 else
2684 #	 endif
2685 #	endif
2686 #      endif
2687 #    endif
2688 #   endif
2689 #  endif
2690 # endif
2691 #endif
2692     version_msg(_("  Features included (+) or not (-):\n"));
2693 
2694     list_features();
2695 
2696 #ifdef SYS_VIMRC_FILE
2697     version_msg(_("   system vimrc file: \""));
2698     version_msg(SYS_VIMRC_FILE);
2699     version_msg("\"\n");
2700 #endif
2701 #ifdef USR_VIMRC_FILE
2702     version_msg(_("     user vimrc file: \""));
2703     version_msg(USR_VIMRC_FILE);
2704     version_msg("\"\n");
2705 #endif
2706 #ifdef USR_VIMRC_FILE2
2707     version_msg(_(" 2nd user vimrc file: \""));
2708     version_msg(USR_VIMRC_FILE2);
2709     version_msg("\"\n");
2710 #endif
2711 #ifdef USR_VIMRC_FILE3
2712     version_msg(_(" 3rd user vimrc file: \""));
2713     version_msg(USR_VIMRC_FILE3);
2714     version_msg("\"\n");
2715 #endif
2716 #ifdef USR_EXRC_FILE
2717     version_msg(_("      user exrc file: \""));
2718     version_msg(USR_EXRC_FILE);
2719     version_msg("\"\n");
2720 #endif
2721 #ifdef USR_EXRC_FILE2
2722     version_msg(_("  2nd user exrc file: \""));
2723     version_msg(USR_EXRC_FILE2);
2724     version_msg("\"\n");
2725 #endif
2726 #ifdef FEAT_GUI
2727 # ifdef SYS_GVIMRC_FILE
2728     version_msg(_("  system gvimrc file: \""));
2729     version_msg(SYS_GVIMRC_FILE);
2730     version_msg("\"\n");
2731 # endif
2732     version_msg(_("    user gvimrc file: \""));
2733     version_msg(USR_GVIMRC_FILE);
2734     version_msg("\"\n");
2735 # ifdef USR_GVIMRC_FILE2
2736     version_msg(_("2nd user gvimrc file: \""));
2737     version_msg(USR_GVIMRC_FILE2);
2738     version_msg("\"\n");
2739 # endif
2740 # ifdef USR_GVIMRC_FILE3
2741     version_msg(_("3rd user gvimrc file: \""));
2742     version_msg(USR_GVIMRC_FILE3);
2743     version_msg("\"\n");
2744 # endif
2745 #endif
2746     version_msg(_("       defaults file: \""));
2747     version_msg(VIM_DEFAULTS_FILE);
2748     version_msg("\"\n");
2749 #ifdef FEAT_GUI
2750 # ifdef SYS_MENU_FILE
2751     version_msg(_("    system menu file: \""));
2752     version_msg(SYS_MENU_FILE);
2753     version_msg("\"\n");
2754 # endif
2755 #endif
2756 #ifdef HAVE_PATHDEF
2757     if (*default_vim_dir != NUL)
2758     {
2759 	version_msg(_("  fall-back for $VIM: \""));
2760 	version_msg((char *)default_vim_dir);
2761 	version_msg("\"\n");
2762     }
2763     if (*default_vimruntime_dir != NUL)
2764     {
2765 	version_msg(_(" f-b for $VIMRUNTIME: \""));
2766 	version_msg((char *)default_vimruntime_dir);
2767 	version_msg("\"\n");
2768     }
2769     version_msg(_("Compilation: "));
2770     version_msg((char *)all_cflags);
2771     version_msg("\n");
2772 #ifdef VMS
2773     if (*compiler_version != NUL)
2774     {
2775 	version_msg(_("Compiler: "));
2776 	version_msg((char *)compiler_version);
2777 	version_msg("\n");
2778     }
2779 #endif
2780     version_msg(_("Linking: "));
2781     version_msg((char *)all_lflags);
2782 #endif
2783 #ifdef DEBUG
2784     version_msg("\n");
2785     version_msg(_("  DEBUG BUILD"));
2786 #endif
2787 }
2788 
2789 static void do_intro_line(int row, char_u *mesg, int add_version, int attr);
2790 
2791 /*
2792  * Show the intro message when not editing a file.
2793  */
2794     void
2795 maybe_intro_message(void)
2796 {
2797     if (BUFEMPTY()
2798 	    && curbuf->b_fname == NULL
2799 	    && firstwin->w_next == NULL
2800 	    && vim_strchr(p_shm, SHM_INTRO) == NULL)
2801 	intro_message(FALSE);
2802 }
2803 
2804 /*
2805  * Give an introductory message about Vim.
2806  * Only used when starting Vim on an empty file, without a file name.
2807  * Or with the ":intro" command (for Sven :-).
2808  */
2809     void
2810 intro_message(
2811     int		colon)		/* TRUE for ":intro" */
2812 {
2813     int		i;
2814     int		row;
2815     int		blanklines;
2816     int		sponsor;
2817     char	*p;
2818     static char	*(lines[]) =
2819     {
2820 	N_("VIM - Vi IMproved"),
2821 	"",
2822 	N_("version "),
2823 	N_("by Bram Moolenaar et al."),
2824 #ifdef MODIFIED_BY
2825 	" ",
2826 #endif
2827 	N_("Vim is open source and freely distributable"),
2828 	"",
2829 	N_("Help poor children in Uganda!"),
2830 	N_("type  :help iccf<Enter>       for information "),
2831 	"",
2832 	N_("type  :q<Enter>               to exit         "),
2833 	N_("type  :help<Enter>  or  <F1>  for on-line help"),
2834 	N_("type  :help version8<Enter>   for version info"),
2835 	NULL,
2836 	"",
2837 	N_("Running in Vi compatible mode"),
2838 	N_("type  :set nocp<Enter>        for Vim defaults"),
2839 	N_("type  :help cp-default<Enter> for info on this"),
2840     };
2841 #ifdef FEAT_GUI
2842     static char	*(gui_lines[]) =
2843     {
2844 	NULL,
2845 	NULL,
2846 	NULL,
2847 	NULL,
2848 #ifdef MODIFIED_BY
2849 	NULL,
2850 #endif
2851 	NULL,
2852 	NULL,
2853 	NULL,
2854 	N_("menu  Help->Orphans           for information    "),
2855 	NULL,
2856 	N_("Running modeless, typed text is inserted"),
2857 	N_("menu  Edit->Global Settings->Toggle Insert Mode  "),
2858 	N_("                              for two modes      "),
2859 	NULL,
2860 	NULL,
2861 	NULL,
2862 	N_("menu  Edit->Global Settings->Toggle Vi Compatible"),
2863 	N_("                              for Vim defaults   "),
2864     };
2865 #endif
2866 
2867     /* blanklines = screen height - # message lines */
2868     blanklines = (int)Rows - ((sizeof(lines) / sizeof(char *)) - 1);
2869     if (!p_cp)
2870 	blanklines += 4;  /* add 4 for not showing "Vi compatible" message */
2871 
2872     /* Don't overwrite a statusline.  Depends on 'cmdheight'. */
2873     if (p_ls > 1)
2874 	blanklines -= Rows - topframe->fr_height;
2875     if (blanklines < 0)
2876 	blanklines = 0;
2877 
2878     /* Show the sponsor and register message one out of four times, the Uganda
2879      * message two out of four times. */
2880     sponsor = (int)time(NULL);
2881     sponsor = ((sponsor & 2) == 0) - ((sponsor & 4) == 0);
2882 
2883     /* start displaying the message lines after half of the blank lines */
2884     row = blanklines / 2;
2885     if ((row >= 2 && Columns >= 50) || colon)
2886     {
2887 	for (i = 0; i < (int)(sizeof(lines) / sizeof(char *)); ++i)
2888 	{
2889 	    p = lines[i];
2890 #ifdef FEAT_GUI
2891 	    if (p_im && gui.in_use && gui_lines[i] != NULL)
2892 		p = gui_lines[i];
2893 #endif
2894 	    if (p == NULL)
2895 	    {
2896 		if (!p_cp)
2897 		    break;
2898 		continue;
2899 	    }
2900 	    if (sponsor != 0)
2901 	    {
2902 		if (strstr(p, "children") != NULL)
2903 		    p = sponsor < 0
2904 			? N_("Sponsor Vim development!")
2905 			: N_("Become a registered Vim user!");
2906 		else if (strstr(p, "iccf") != NULL)
2907 		    p = sponsor < 0
2908 			? N_("type  :help sponsor<Enter>    for information ")
2909 			: N_("type  :help register<Enter>   for information ");
2910 		else if (strstr(p, "Orphans") != NULL)
2911 		    p = N_("menu  Help->Sponsor/Register  for information    ");
2912 	    }
2913 	    if (*p != NUL)
2914 		do_intro_line(row, (char_u *)_(p), i == 2, 0);
2915 	    ++row;
2916 	}
2917     }
2918 
2919     /* Make the wait-return message appear just below the text. */
2920     if (colon)
2921 	msg_row = row;
2922 }
2923 
2924     static void
2925 do_intro_line(
2926     int		row,
2927     char_u	*mesg,
2928     int		add_version,
2929     int		attr)
2930 {
2931     char_u	vers[20];
2932     int		col;
2933     char_u	*p;
2934     int		l;
2935     int		clen;
2936 #ifdef MODIFIED_BY
2937 # define MODBY_LEN 150
2938     char_u	modby[MODBY_LEN];
2939 
2940     if (*mesg == ' ')
2941     {
2942 	vim_strncpy(modby, (char_u *)_("Modified by "), MODBY_LEN - 1);
2943 	l = (int)STRLEN(modby);
2944 	vim_strncpy(modby + l, (char_u *)MODIFIED_BY, MODBY_LEN - l - 1);
2945 	mesg = modby;
2946     }
2947 #endif
2948 
2949     /* Center the message horizontally. */
2950     col = vim_strsize(mesg);
2951     if (add_version)
2952     {
2953 	STRCPY(vers, mediumVersion);
2954 	if (highest_patch())
2955 	{
2956 	    /* Check for 9.9x or 9.9xx, alpha/beta version */
2957 	    if (isalpha((int)vers[3]))
2958 	    {
2959 		int len = (isalpha((int)vers[4])) ? 5 : 4;
2960 		sprintf((char *)vers + len, ".%d%s", highest_patch(),
2961 							 mediumVersion + len);
2962 	    }
2963 	    else
2964 		sprintf((char *)vers + 3, ".%d", highest_patch());
2965 	}
2966 	col += (int)STRLEN(vers);
2967     }
2968     col = (Columns - col) / 2;
2969     if (col < 0)
2970 	col = 0;
2971 
2972     /* Split up in parts to highlight <> items differently. */
2973     for (p = mesg; *p != NUL; p += l)
2974     {
2975 	clen = 0;
2976 	for (l = 0; p[l] != NUL
2977 			 && (l == 0 || (p[l] != '<' && p[l - 1] != '>')); ++l)
2978 	{
2979 #ifdef FEAT_MBYTE
2980 	    if (has_mbyte)
2981 	    {
2982 		clen += ptr2cells(p + l);
2983 		l += (*mb_ptr2len)(p + l) - 1;
2984 	    }
2985 	    else
2986 #endif
2987 		clen += byte2cells(p[l]);
2988 	}
2989 	screen_puts_len(p, l, row, col, *p == '<' ? HL_ATTR(HLF_8) : attr);
2990 	col += clen;
2991     }
2992 
2993     /* Add the version number to the version line. */
2994     if (add_version)
2995 	screen_puts(vers, row, col, 0);
2996 }
2997 
2998 /*
2999  * ":intro": clear screen, display intro screen and wait for return.
3000  */
3001     void
3002 ex_intro(exarg_T *eap UNUSED)
3003 {
3004     screenclear();
3005     intro_message(TRUE);
3006     wait_return(TRUE);
3007 }
3008