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