Subversion Repositories planix.SVN

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
100 7u83 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_FOLDING
221
	"+folding",
222
#else
223
	"-folding",
224
#endif
225
#ifdef FEAT_FOOTER
226
	"+footer",
227
#else
228
	"-footer",
229
#endif
230
	    /* only interesting on Unix systems */
231
#if !defined(USE_SYSTEM) && defined(UNIX)
232
	"+fork()",
233
#endif
234
#ifdef FEAT_GETTEXT
235
# ifdef DYNAMIC_GETTEXT
236
	"+gettext/dyn",
237
# else
238
	"+gettext",
239
# endif
240
#else
241
	"-gettext",
242
#endif
243
#ifdef FEAT_HANGULIN
244
	"+hangul_input",
245
#else
246
	"-hangul_input",
247
#endif
248
#if (defined(HAVE_ICONV_H) && defined(USE_ICONV)) || defined(DYNAMIC_ICONV)
249
# ifdef DYNAMIC_ICONV
250
	"+iconv/dyn",
251
# else
252
	"+iconv",
253
# endif
254
#else
255
	"-iconv",
256
#endif
257
#ifdef FEAT_INS_EXPAND
258
	"+insert_expand",
259
#else
260
	"-insert_expand",
261
#endif
262
#ifdef FEAT_JUMPLIST
263
	"+jumplist",
264
#else
265
	"-jumplist",
266
#endif
267
#ifdef FEAT_KEYMAP
268
	"+keymap",
269
#else
270
	"-keymap",
271
#endif
272
#ifdef FEAT_LANGMAP
273
	"+langmap",
274
#else
275
	"-langmap",
276
#endif
277
#ifdef FEAT_LIBCALL
278
	"+libcall",
279
#else
280
	"-libcall",
281
#endif
282
#ifdef FEAT_LINEBREAK
283
	"+linebreak",
284
#else
285
	"-linebreak",
286
#endif
287
#ifdef FEAT_LISP
288
	"+lispindent",
289
#else
290
	"-lispindent",
291
#endif
292
#ifdef FEAT_LISTCMDS
293
	"+listcmds",
294
#else
295
	"-listcmds",
296
#endif
297
#ifdef FEAT_LOCALMAP
298
	"+localmap",
299
#else
300
	"-localmap",
301
#endif
302
#ifdef FEAT_MENU
303
	"+menu",
304
#else
305
	"-menu",
306
#endif
307
#ifdef FEAT_SESSION
308
	"+mksession",
309
#else
310
	"-mksession",
311
#endif
312
#ifdef FEAT_MODIFY_FNAME
313
	"+modify_fname",
314
#else
315
	"-modify_fname",
316
#endif
317
#ifdef FEAT_MOUSE
318
	"+mouse",
319
#  ifdef FEAT_MOUSESHAPE
320
	"+mouseshape",
321
#  else
322
	"-mouseshape",
323
#  endif
324
# else
325
	"-mouse",
326
#endif
327
#if defined(UNIX) || defined(VMS)
328
# ifdef FEAT_MOUSE_DEC
329
	"+mouse_dec",
330
# else
331
	"-mouse_dec",
332
# endif
333
# ifdef FEAT_MOUSE_GPM
334
	"+mouse_gpm",
335
# else
336
	"-mouse_gpm",
337
# endif
338
# ifdef FEAT_MOUSE_JSB
339
	"+mouse_jsbterm",
340
# else
341
	"-mouse_jsbterm",
342
# endif
343
# ifdef FEAT_MOUSE_NET
344
	"+mouse_netterm",
345
# else
346
	"-mouse_netterm",
347
# endif
348
# ifdef FEAT_MOUSE_XTERM
349
	"+mouse_xterm",
350
# else
351
	"-mouse_xterm",
352
# endif
353
#endif
354
#ifdef __QNX__
355
# ifdef FEAT_MOUSE_PTERM
356
	"+mouse_pterm",
357
# else
358
	"-mouse_pterm",
359
# endif
360
#endif
361
#ifdef FEAT_MBYTE_IME
362
# ifdef DYNAMIC_IME
363
	"+multi_byte_ime/dyn",
364
# else
365
	"+multi_byte_ime",
366
# endif
367
#else
368
# ifdef FEAT_MBYTE
369
	"+multi_byte",
370
# else
371
	"-multi_byte",
372
# endif
373
#endif
374
#ifdef FEAT_MULTI_LANG
375
	"+multi_lang",
376
#else
377
	"-multi_lang",
378
#endif
379
#ifdef FEAT_MZSCHEME
380
# ifdef DYNAMIC_MZSCHEME
381
	"+mzscheme/dyn",
382
# else
383
	"+mzscheme",
384
# endif
385
#else
386
	"-mzscheme",
387
#endif
388
#ifdef FEAT_NETBEANS_INTG
389
	"+netbeans_intg",
390
#else
391
	"-netbeans_intg",
392
#endif
393
#ifdef FEAT_GUI_W32
394
# ifdef FEAT_OLE
395
	"+ole",
396
# else
397
	"-ole",
398
# endif
399
#endif
400
#ifdef FEAT_OSFILETYPE
401
	"+osfiletype",
402
#else
403
	"-osfiletype",
404
#endif
405
#ifdef FEAT_PATH_EXTRA
406
	"+path_extra",
407
#else
408
	"-path_extra",
409
#endif
410
#ifdef FEAT_PERL
411
# ifdef DYNAMIC_PERL
412
	"+perl/dyn",
413
# else
414
	"+perl",
415
# endif
416
#else
417
	"-perl",
418
#endif
419
#ifdef FEAT_PRINTER
420
# ifdef FEAT_POSTSCRIPT
421
	"+postscript",
422
# else
423
	"-postscript",
424
# endif
425
	"+printer",
426
#else
427
	"-printer",
428
#endif
429
#ifdef FEAT_PROFILE
430
	"+profile",
431
#else
432
	"-profile",
433
#endif
434
#ifdef FEAT_PYTHON
435
# ifdef DYNAMIC_PYTHON
436
	"+python/dyn",
437
# else
438
	"+python",
439
# endif
440
#else
441
	"-python",
442
#endif
443
#ifdef FEAT_QUICKFIX
444
	"+quickfix",
445
#else
446
	"-quickfix",
447
#endif
448
#ifdef FEAT_RELTIME
449
	"+reltime",
450
#else
451
	"-reltime",
452
#endif
453
#ifdef FEAT_RIGHTLEFT
454
	"+rightleft",
455
#else
456
	"-rightleft",
457
#endif
458
#ifdef FEAT_RUBY
459
# ifdef DYNAMIC_RUBY
460
	"+ruby/dyn",
461
# else
462
	"+ruby",
463
# endif
464
#else
465
	"-ruby",
466
#endif
467
#ifdef FEAT_SCROLLBIND
468
	"+scrollbind",
469
#else
470
	"-scrollbind",
471
#endif
472
#ifdef FEAT_SIGNS
473
	"+signs",
474
#else
475
	"-signs",
476
#endif
477
#ifdef FEAT_SMARTINDENT
478
	"+smartindent",
479
#else
480
	"-smartindent",
481
#endif
482
#ifdef FEAT_SNIFF
483
	"+sniff",
484
#else
485
	"-sniff",
486
#endif
487
#ifdef FEAT_STL_OPT
488
	"+statusline",
489
#else
490
	"-statusline",
491
#endif
492
#ifdef FEAT_SUN_WORKSHOP
493
	"+sun_workshop",
494
#else
495
	"-sun_workshop",
496
#endif
497
#ifdef FEAT_SYN_HL
498
	"+syntax",
499
#else
500
	"-syntax",
501
#endif
502
	    /* only interesting on Unix systems */
503
#if defined(USE_SYSTEM) && (defined(UNIX) || defined(__EMX__))
504
	"+system()",
505
#endif
506
#ifdef FEAT_TAG_BINS
507
	"+tag_binary",
508
#else
509
	"-tag_binary",
510
#endif
511
#ifdef FEAT_TAG_OLDSTATIC
512
	"+tag_old_static",
513
#else
514
	"-tag_old_static",
515
#endif
516
#ifdef FEAT_TAG_ANYWHITE
517
	"+tag_any_white",
518
#else
519
	"-tag_any_white",
520
#endif
521
#ifdef FEAT_TCL
522
# ifdef DYNAMIC_TCL
523
	"+tcl/dyn",
524
# else
525
	"+tcl",
526
# endif
527
#else
528
	"-tcl",
529
#endif
530
#if defined(UNIX) || defined(__EMX__)
531
/* only Unix (or OS/2 with EMX!) can have terminfo instead of termcap */
532
# ifdef TERMINFO
533
	"+terminfo",
534
# else
535
	"-terminfo",
536
# endif
537
#else		    /* unix always includes termcap support */
538
# ifdef HAVE_TGETENT
539
	"+tgetent",
540
# else
541
	"-tgetent",
542
# endif
543
#endif
544
#ifdef FEAT_TERMRESPONSE
545
	"+termresponse",
546
#else
547
	"-termresponse",
548
#endif
549
#ifdef FEAT_TEXTOBJ
550
	"+textobjects",
551
#else
552
	"-textobjects",
553
#endif
554
#ifdef FEAT_TITLE
555
	"+title",
556
#else
557
	"-title",
558
#endif
559
#ifdef FEAT_TOOLBAR
560
	"+toolbar",
561
#else
562
	"-toolbar",
563
#endif
564
#ifdef FEAT_USR_CMDS
565
	"+user_commands",
566
#else
567
	"-user_commands",
568
#endif
569
#ifdef FEAT_VERTSPLIT
570
	"+vertsplit",
571
#else
572
	"-vertsplit",
573
#endif
574
#ifdef FEAT_VIRTUALEDIT
575
	"+virtualedit",
576
#else
577
	"-virtualedit",
578
#endif
579
#ifdef FEAT_VISUAL
580
	"+visual",
581
# ifdef FEAT_VISUALEXTRA
582
	"+visualextra",
583
# else
584
	"-visualextra",
585
# endif
586
#else
587
	"-visual",
588
#endif
589
#ifdef FEAT_VIMINFO
590
	"+viminfo",
591
#else
592
	"-viminfo",
593
#endif
594
#ifdef FEAT_VREPLACE
595
	"+vreplace",
596
#else
597
	"-vreplace",
598
#endif
599
#ifdef FEAT_WILDIGN
600
	"+wildignore",
601
#else
602
	"-wildignore",
603
#endif
604
#ifdef FEAT_WILDMENU
605
	"+wildmenu",
606
#else
607
	"-wildmenu",
608
#endif
609
#ifdef FEAT_WINDOWS
610
	"+windows",
611
#else
612
	"-windows",
613
#endif
614
#ifdef FEAT_WRITEBACKUP
615
	"+writebackup",
616
#else
617
	"-writebackup",
618
#endif
619
#if defined(UNIX) || defined(VMS)
620
# ifdef FEAT_X11
621
	"+X11",
622
# else
623
	"-X11",
624
# endif
625
#endif
626
#ifdef FEAT_XFONTSET
627
	"+xfontset",
628
#else
629
	"-xfontset",
630
#endif
631
#ifdef FEAT_XIM
632
	"+xim",
633
#else
634
	"-xim",
635
#endif
636
#if defined(UNIX) || defined(VMS)
637
# ifdef USE_XSMP_INTERACT
638
	"+xsmp_interact",
639
# else
640
#  ifdef USE_XSMP
641
	"+xsmp",
642
#  else
643
	"-xsmp",
644
#  endif
645
# endif
646
# ifdef FEAT_XCLIPBOARD
647
	"+xterm_clipboard",
648
# else
649
	"-xterm_clipboard",
650
# endif
651
#endif
652
#ifdef FEAT_XTERM_SAVE
653
	"+xterm_save",
654
#else
655
	"-xterm_save",
656
#endif
657
#ifdef WIN3264
658
# ifdef FEAT_XPM_W32
659
	"+xpm_w32",
660
# else
661
	"-xpm_w32",
662
# endif
663
#endif
664
	NULL
665
};
666
 
667
static int included_patches[] =
668
{   /* Add new patch number below this line */
669
/**/
670
 
671
};
672
 
673
    int
674
highest_patch()
675
{
676
    int		i;
677
    int		h = 0;
678
 
679
    for (i = 0; included_patches[i] != 0; ++i)
680
	if (included_patches[i] > h)
681
	    h = included_patches[i];
682
    return h;
683
}
684
 
685
#if defined(FEAT_EVAL) || defined(PROTO)
686
/*
687
 * Return TRUE if patch "n" has been included.
688
 */
689
    int
690
has_patch(n)
691
    int		n;
692
{
693
    int		i;
694
 
695
    for (i = 0; included_patches[i] != 0; ++i)
696
	if (included_patches[i] == n)
697
	    return TRUE;
698
    return FALSE;
699
}
700
#endif
701
 
702
    void
703
ex_version(eap)
704
    exarg_T	*eap;
705
{
706
    /*
707
     * Ignore a ":version 9.99" command.
708
     */
709
    if (*eap->arg == NUL)
710
    {
711
	msg_putchar('\n');
712
	list_version();
713
    }
714
}
715
 
716
    void
717
list_version()
718
{
719
    int		i;
720
    int		first;
721
    char	*s = "";
722
 
723
    /*
724
     * When adding features here, don't forget to update the list of
725
     * internal variables in eval.c!
726
     */
727
    MSG(longVersion);
728
#ifdef WIN3264
729
# ifdef FEAT_GUI_W32
730
#  if defined(_MSC_VER) && (_MSC_VER <= 1010)
731
    /* Only MS VC 4.1 and earlier can do Win32s */
732
    MSG_PUTS(_("\nMS-Windows 16/32 bit GUI version"));
733
#  else
734
#   ifdef _WIN64
735
    MSG_PUTS(_("\nMS-Windows 64 bit GUI version"));
736
#   else
737
    MSG_PUTS(_("\nMS-Windows 32 bit GUI version"));
738
#   endif
739
#  endif
740
    if (gui_is_win32s())
741
	MSG_PUTS(_(" in Win32s mode"));
742
# ifdef FEAT_OLE
743
    MSG_PUTS(_(" with OLE support"));
744
# endif
745
# else
746
    MSG_PUTS(_("\nMS-Windows 32 bit console version"));
747
# endif
748
#endif
749
#ifdef WIN16
750
    MSG_PUTS(_("\nMS-Windows 16 bit version"));
751
#endif
752
#ifdef MSDOS
753
# ifdef DJGPP
754
    MSG_PUTS(_("\n32 bit MS-DOS version"));
755
# else
756
    MSG_PUTS(_("\n16 bit MS-DOS version"));
757
# endif
758
#endif
759
#ifdef MACOS
760
# ifdef MACOS_X
761
#  ifdef MACOS_X_UNIX
762
    MSG_PUTS(_("\nMacOS X (unix) version"));
763
#  else
764
    MSG_PUTS(_("\nMacOS X version"));
765
#  endif
766
#else
767
    MSG_PUTS(_("\nMacOS version"));
768
# endif
769
#endif
770
 
771
#ifdef RISCOS
772
    MSG_PUTS(_("\nRISC OS version"));
773
#endif
774
#ifdef VMS
775
    MSG_PUTS("\nOpenVMS version");
776
# ifdef HAVE_PATHDEF
777
    if (*compiled_arch != NUL)
778
    {
779
	MSG_PUTS(" - ");
780
	MSG_PUTS(compiled_arch);
781
    }
782
# endif
783
 
784
#endif
785
 
786
    /* Print the list of patch numbers if there is at least one. */
787
    /* Print a range when patches are consecutive: "1-10, 12, 15-40, 42-45" */
788
    if (included_patches[0] != 0)
789
    {
790
	MSG_PUTS(_("\nIncluded patches: "));
791
	first = -1;
792
	/* find last one */
793
	for (i = 0; included_patches[i] != 0; ++i)
794
	    ;
795
	while (--i >= 0)
796
	{
797
	    if (first < 0)
798
		first = included_patches[i];
799
	    if (i == 0 || included_patches[i - 1] != included_patches[i] + 1)
800
	    {
801
		MSG_PUTS(s);
802
		s = ", ";
803
		msg_outnum((long)first);
804
		if (first != included_patches[i])
805
		{
806
		    MSG_PUTS("-");
807
		    msg_outnum((long)included_patches[i]);
808
		}
809
		first = -1;
810
	    }
811
	}
812
    }
813
 
814
#ifdef MODIFIED_BY
815
    MSG_PUTS("\n");
816
    MSG_PUTS(_("Modified by "));
817
    MSG_PUTS(MODIFIED_BY);
818
#endif
819
 
820
#ifdef HAVE_PATHDEF
821
    if (*compiled_user != NUL || *compiled_sys != NUL)
822
    {
823
	MSG_PUTS(_("\nCompiled "));
824
	if (*compiled_user != NUL)
825
	{
826
	    MSG_PUTS(_("by "));
827
	    MSG_PUTS(compiled_user);
828
	}
829
	if (*compiled_sys != NUL)
830
	{
831
	    MSG_PUTS("@");
832
	    MSG_PUTS(compiled_sys);
833
	}
834
    }
835
#endif
836
 
837
#ifdef FEAT_HUGE
838
    MSG_PUTS(_("\nHuge version "));
839
#else
840
# ifdef FEAT_BIG
841
    MSG_PUTS(_("\nBig version "));
842
# else
843
#  ifdef FEAT_NORMAL
844
    MSG_PUTS(_("\nNormal version "));
845
#  else
846
#   ifdef FEAT_SMALL
847
    MSG_PUTS(_("\nSmall version "));
848
#   else
849
    MSG_PUTS(_("\nTiny version "));
850
#   endif
851
#  endif
852
# endif
853
#endif
854
#ifndef FEAT_GUI
855
    MSG_PUTS(_("without GUI."));
856
#else
857
# ifdef FEAT_GUI_GTK
858
#  ifdef FEAT_GUI_GNOME
859
#   ifdef HAVE_GTK2
860
    MSG_PUTS(_("with GTK2-GNOME GUI."));
861
#   else
862
    MSG_PUTS(_("with GTK-GNOME GUI."));
863
#   endif
864
#  else
865
#   ifdef HAVE_GTK2
866
    MSG_PUTS(_("with GTK2 GUI."));
867
#   else
868
    MSG_PUTS(_("with GTK GUI."));
869
#   endif
870
#  endif
871
# else
872
#  ifdef FEAT_GUI_MOTIF
873
    MSG_PUTS(_("with X11-Motif GUI."));
874
#  else
875
#   ifdef FEAT_GUI_ATHENA
876
#    ifdef FEAT_GUI_NEXTAW
877
    MSG_PUTS(_("with X11-neXtaw GUI."));
878
#    else
879
    MSG_PUTS(_("with X11-Athena GUI."));
880
#    endif
881
#   else
882
#     ifdef FEAT_GUI_PHOTON
883
    MSG_PUTS(_("with Photon GUI."));
884
#     else
885
#      if defined(MSWIN)
886
    MSG_PUTS(_("with GUI."));
887
#      else
888
#	if defined (TARGET_API_MAC_CARBON) && TARGET_API_MAC_CARBON
889
    MSG_PUTS(_("with Carbon GUI."));
890
#	else
891
#	 if defined (TARGET_API_MAC_OSX) && TARGET_API_MAC_OSX
892
    MSG_PUTS(_("with Cocoa GUI."));
893
#	 else
894
#	  if defined (MACOS)
895
    MSG_PUTS(_("with (classic) GUI."));
896
#	  endif
897
#	 endif
898
#	endif
899
#      endif
900
#    endif
901
#   endif
902
#  endif
903
# endif
904
#endif
905
    version_msg(_("  Features included (+) or not (-):\n"));
906
 
907
    /* print all the features */
908
    for (i = 0; features[i] != NULL; ++i)
909
    {
910
	version_msg(features[i]);
911
	if (msg_col > 0)
912
	    version_msg(" ");
913
    }
914
 
915
    version_msg("\n");
916
#ifdef SYS_VIMRC_FILE
917
    version_msg(_("   system vimrc file: \""));
918
    version_msg(SYS_VIMRC_FILE);
919
    version_msg("\"\n");
920
#endif
921
#ifdef USR_VIMRC_FILE
922
    version_msg(_("     user vimrc file: \""));
923
    version_msg(USR_VIMRC_FILE);
924
    version_msg("\"\n");
925
#endif
926
#ifdef USR_VIMRC_FILE2
927
    version_msg(_(" 2nd user vimrc file: \""));
928
    version_msg(USR_VIMRC_FILE2);
929
    version_msg("\"\n");
930
#endif
931
#ifdef USR_VIMRC_FILE3
932
    version_msg(_(" 3rd user vimrc file: \""));
933
    version_msg(USR_VIMRC_FILE3);
934
    version_msg("\"\n");
935
#endif
936
#ifdef USR_EXRC_FILE
937
    version_msg(_("      user exrc file: \""));
938
    version_msg(USR_EXRC_FILE);
939
    version_msg("\"\n");
940
#endif
941
#ifdef USR_EXRC_FILE2
942
    version_msg(_("  2nd user exrc file: \""));
943
    version_msg(USR_EXRC_FILE2);
944
    version_msg("\"\n");
945
#endif
946
#ifdef FEAT_GUI
947
# ifdef SYS_GVIMRC_FILE
948
    version_msg(_("  system gvimrc file: \""));
949
    version_msg(SYS_GVIMRC_FILE);
950
    version_msg("\"\n");
951
# endif
952
    version_msg(_("    user gvimrc file: \""));
953
    version_msg(USR_GVIMRC_FILE);
954
    version_msg("\"\n");
955
# ifdef USR_GVIMRC_FILE2
956
    version_msg(_("2nd user gvimrc file: \""));
957
    version_msg(USR_GVIMRC_FILE2);
958
    version_msg("\"\n");
959
# endif
960
# ifdef USR_GVIMRC_FILE3
961
    version_msg(_("3rd user gvimrc file: \""));
962
    version_msg(USR_GVIMRC_FILE3);
963
    version_msg("\"\n");
964
# endif
965
#endif
966
#ifdef FEAT_GUI
967
# ifdef SYS_MENU_FILE
968
    version_msg(_("    system menu file: \""));
969
    version_msg(SYS_MENU_FILE);
970
    version_msg("\"\n");
971
# endif
972
#endif
973
#ifdef HAVE_PATHDEF
974
    if (*default_vim_dir != NUL)
975
    {
976
	version_msg(_("  fall-back for $VIM: \""));
977
	version_msg((char *)default_vim_dir);
978
	version_msg("\"\n");
979
    }
980
    if (*default_vimruntime_dir != NUL)
981
    {
982
	version_msg(_(" f-b for $VIMRUNTIME: \""));
983
	version_msg((char *)default_vimruntime_dir);
984
	version_msg("\"\n");
985
    }
986
    version_msg(_("Compilation: "));
987
    version_msg((char *)all_cflags);
988
    version_msg("\n");
989
#ifdef VMS
990
    if (*compiler_version != NUL)
991
    {
992
	version_msg(_("Compiler: "));
993
	version_msg((char *)compiler_version);
994
	version_msg("\n");
995
    }
996
#endif
997
    version_msg(_("Linking: "));
998
    version_msg((char *)all_lflags);
999
#endif
1000
#ifdef DEBUG
1001
    version_msg("\n");
1002
    version_msg(_("  DEBUG BUILD"));
1003
#endif
1004
}
1005
 
1006
/*
1007
 * Output a string for the version message.  If it's going to wrap, output a
1008
 * newline, unless the message is too long to fit on the screen anyway.
1009
 */
1010
    static void
1011
version_msg(s)
1012
    char	*s;
1013
{
1014
    int		len = (int)STRLEN(s);
1015
 
1016
    if (!got_int && len < (int)Columns && msg_col + len >= (int)Columns
1017
								&& *s != '\n')
1018
	msg_putchar('\n');
1019
    if (!got_int)
1020
	MSG_PUTS(s);
1021
}
1022
 
1023
static void do_intro_line __ARGS((int row, char_u *mesg, int add_version, int attr));
1024
 
1025
/*
1026
 * Give an introductory message about Vim.
1027
 * Only used when starting Vim on an empty file, without a file name.
1028
 * Or with the ":intro" command (for Sven :-).
1029
 */
1030
    void
1031
intro_message(colon)
1032
    int		colon;		/* TRUE for ":intro" */
1033
{
1034
    int		i;
1035
    int		row;
1036
    int		blanklines;
1037
    int		sponsor;
1038
    char	*p;
1039
    static char	*(lines[]) =
1040
    {
1041
	N_("VIM - Vi IMproved"),
1042
	"",
1043
	N_("version "),
1044
	N_("by Bram Moolenaar et al."),
1045
#ifdef MODIFIED_BY
1046
	" ",
1047
#endif
1048
	N_("Vim is open source and freely distributable"),
1049
	"",
1050
	N_("Help poor children in Uganda!"),
1051
	N_("type  :help iccf<Enter>       for information "),
1052
	"",
1053
	N_("type  :q<Enter>               to exit         "),
1054
	N_("type  :help<Enter>  or  <F1>  for on-line help"),
1055
	N_("type  :help version7<Enter>   for version info"),
1056
	NULL,
1057
	"",
1058
	N_("Running in Vi compatible mode"),
1059
	N_("type  :set nocp<Enter>        for Vim defaults"),
1060
	N_("type  :help cp-default<Enter> for info on this"),
1061
    };
1062
#ifdef FEAT_GUI
1063
    static char	*(gui_lines[]) =
1064
    {
1065
	NULL,
1066
	NULL,
1067
	NULL,
1068
	NULL,
1069
#ifdef MODIFIED_BY
1070
	NULL,
1071
#endif
1072
	NULL,
1073
	NULL,
1074
	NULL,
1075
	N_("menu  Help->Orphans           for information    "),
1076
	NULL,
1077
	N_("Running modeless, typed text is inserted"),
1078
	N_("menu  Edit->Global Settings->Toggle Insert Mode  "),
1079
	N_("                              for two modes      "),
1080
	NULL,
1081
	NULL,
1082
	NULL,
1083
	N_("menu  Edit->Global Settings->Toggle Vi Compatible"),
1084
	N_("                              for Vim defaults   "),
1085
    };
1086
#endif
1087
 
1088
    /* blanklines = screen height - # message lines */
1089
    blanklines = (int)Rows - ((sizeof(lines) / sizeof(char *)) - 1);
1090
    if (!p_cp)
1091
	blanklines += 4;  /* add 4 for not showing "Vi compatible" message */
1092
#if defined(WIN3264) && !defined(FEAT_GUI_W32)
1093
    if (mch_windows95())
1094
	blanklines -= 3;  /* subtract 3 for showing "Windows 95" message */
1095
#endif
1096
 
1097
#ifdef FEAT_WINDOWS
1098
    /* Don't overwrite a statusline.  Depends on 'cmdheight'. */
1099
    if (p_ls > 1)
1100
	blanklines -= Rows - topframe->fr_height;
1101
#endif
1102
    if (blanklines < 0)
1103
	blanklines = 0;
1104
 
1105
    /* Show the sponsor and register message one out of four times, the Uganda
1106
     * message two out of four times. */
1107
    sponsor = (int)time(NULL);
1108
    sponsor = ((sponsor & 2) == 0) - ((sponsor & 4) == 0);
1109
 
1110
    /* start displaying the message lines after half of the blank lines */
1111
    row = blanklines / 2;
1112
    if ((row >= 2 && Columns >= 50) || colon)
1113
    {
1114
	for (i = 0; i < (int)(sizeof(lines) / sizeof(char *)); ++i)
1115
	{
1116
	    p = lines[i];
1117
#ifdef FEAT_GUI
1118
	    if (p_im && gui.in_use && gui_lines[i] != NULL)
1119
		p = gui_lines[i];
1120
#endif
1121
	    if (p == NULL)
1122
	    {
1123
		if (!p_cp)
1124
		    break;
1125
		continue;
1126
	    }
1127
	    if (sponsor != 0)
1128
	    {
1129
		if (strstr(p, "children") != NULL)
1130
		    p = sponsor < 0
1131
			? N_("Sponsor Vim development!")
1132
			: N_("Become a registered Vim user!");
1133
		else if (strstr(p, "iccf") != NULL)
1134
		    p = sponsor < 0
1135
			? N_("type  :help sponsor<Enter>    for information ")
1136
			: N_("type  :help register<Enter>   for information ");
1137
		else if (strstr(p, "Orphans") != NULL)
1138
		    p = N_("menu  Help->Sponsor/Register  for information    ");
1139
	    }
1140
	    if (*p != NUL)
1141
		do_intro_line(row, (char_u *)_(p), i == 2, 0);
1142
	    ++row;
1143
	}
1144
#if defined(WIN3264) && !defined(FEAT_GUI_W32)
1145
	if (mch_windows95())
1146
	{
1147
	    do_intro_line(++row,
1148
		    (char_u *)_("WARNING: Windows 95/98/ME detected"),
1149
							FALSE, hl_attr(HLF_E));
1150
	    do_intro_line(++row,
1151
		(char_u *)_("type  :help windows95<Enter>  for info on this"),
1152
								    FALSE, 0);
1153
	}
1154
#endif
1155
    }
1156
 
1157
    /* Make the wait-return message appear just below the text. */
1158
    if (colon)
1159
	msg_row = row;
1160
}
1161
 
1162
    static void
1163
do_intro_line(row, mesg, add_version, attr)
1164
    int		row;
1165
    char_u	*mesg;
1166
    int		add_version;
1167
    int		attr;
1168
{
1169
    char_u	vers[20];
1170
    int		col;
1171
    char_u	*p;
1172
    int		l;
1173
    int		clen;
1174
#ifdef MODIFIED_BY
1175
# define MODBY_LEN 150
1176
    char_u	modby[MODBY_LEN];
1177
 
1178
    if (*mesg == ' ')
1179
    {
1180
	vim_strncpy(modby, _("Modified by "), MODBY_LEN - 1);
1181
	l = STRLEN(modby);
1182
	vim_strncpy(modby + l, MODIFIED_BY, MODBY_LEN - l - 1);
1183
	mesg = modby;
1184
    }
1185
#endif
1186
 
1187
    /* Center the message horizontally. */
1188
    col = vim_strsize(mesg);
1189
    if (add_version)
1190
    {
1191
	STRCPY(vers, mediumVersion);
1192
	if (highest_patch())
1193
	{
1194
	    /* Check for 9.9x or 9.9xx, alpha/beta version */
1195
	    if (isalpha((int)mediumVersion[3]))
1196
	    {
1197
		if (isalpha((int)mediumVersion[4]))
1198
		    sprintf((char *)vers + 5, ".%d%s", highest_patch(),
1199
							   mediumVersion + 5);
1200
		else
1201
		    sprintf((char *)vers + 4, ".%d%s", highest_patch(),
1202
							   mediumVersion + 4);
1203
	    }
1204
	    else
1205
		sprintf((char *)vers + 3, ".%d", highest_patch());
1206
	}
1207
	col += (int)STRLEN(vers);
1208
    }
1209
    col = (Columns - col) / 2;
1210
    if (col < 0)
1211
	col = 0;
1212
 
1213
    /* Split up in parts to highlight <> items differently. */
1214
    for (p = mesg; *p != NUL; p += l)
1215
    {
1216
	clen = 0;
1217
	for (l = 0; p[l] != NUL
1218
			 && (l == 0 || (p[l] != '<' && p[l - 1] != '>')); ++l)
1219
	{
1220
#ifdef FEAT_MBYTE
1221
	    if (has_mbyte)
1222
	    {
1223
		clen += ptr2cells(p + l);
1224
		l += (*mb_ptr2len)(p + l) - 1;
1225
	    }
1226
	    else
1227
#endif
1228
		clen += byte2cells(p[l]);
1229
	}
1230
	screen_puts_len(p, l, row, col, *p == '<' ? hl_attr(HLF_8) : attr);
1231
	col += clen;
1232
    }
1233
 
1234
    /* Add the version number to the version line. */
1235
    if (add_version)
1236
	screen_puts(vers, row, col, 0);
1237
}
1238
 
1239
/*
1240
 * ":intro": clear screen, display intro screen and wait for return.
1241
 */
1242
/*ARGSUSED*/
1243
    void
1244
ex_intro(eap)
1245
    exarg_T	*eap;
1246
{
1247
    screenclear();
1248
    intro_message(TRUE);
1249
    wait_return(TRUE);
1250
}