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