patch 9.1.1591: VMS support can be improved
Problem:  VMS support can be improved
Solution: Merge chagnes from Steven M. Schweda
          (Zoltan)
closes: #17810
Co-authored-by: Steven M. Schweda <sms@antinode.info>
Signed-off-by: Zoltan Arpadffy <zoltan.arpadffy@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
			
			
This commit is contained in:
		
				
					committed by
					
						 Christian Brabandt
						Christian Brabandt
					
				
			
			
				
	
			
			
			
						parent
						
							af9a7a04f1
						
					
				
				
					commit
					e9d1259111
				
			
							
								
								
									
										1231
									
								
								src/Make_vms.mms
									
									
									
									
									
								
							
							
						
						
									
										1231
									
								
								src/Make_vms.mms
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -1694,6 +1694,7 @@ extern char_u *all_lflags; | ||||
| # ifdef VMS | ||||
| extern char_u *compiler_version; | ||||
| extern char_u *compiled_arch; | ||||
| extern char_u *compiled_vers; | ||||
| # endif | ||||
| extern char_u *compiled_user; | ||||
| extern char_u *compiled_sys; | ||||
|  | ||||
							
								
								
									
										30
									
								
								src/main.c
									
									
									
									
									
								
							
							
						
						
									
										30
									
								
								src/main.c
									
									
									
									
									
								
							| @ -2096,7 +2096,19 @@ command_line_scan(mparm_T *parmp) | ||||
| 	{ | ||||
| 	    want_argument = FALSE; | ||||
| 	    c = argv[0][argv_idx++]; | ||||
| #ifdef VMS | ||||
| #if defined( VMS) | ||||
| 	    /* 2025-05-13  SMS | ||||
| 	     * On sufficiently recent non-VAX systems, case preservation | ||||
| 	     * of the command line is possible/routine.  And quotation | ||||
| 	     * always works, and is the expected method in such cases. | ||||
| 	     * However, leaving this slash-prefix scheme available is | ||||
| 	     * nearly harmless.  But note that it doesn't help with the | ||||
| 	     * case of other command-line arguments, such as file names. | ||||
| 	     * For details, see os_vms.c:vms_init(). | ||||
| 	     * On VAX and old non-VAX systems, or with SET PROC/PARSE=TRAD, | ||||
| 	     * DCL upcases the command line, and the C RTL downcases it. | ||||
| 	     * I would not say "only uses upper case command lines". | ||||
| 	     */ | ||||
| 	    /* | ||||
| 	     * VMS only uses upper case command lines.  Interpret "-X" as "-x" | ||||
| 	     * and "-/X" as "-X". | ||||
| @ -2106,9 +2118,12 @@ command_line_scan(mparm_T *parmp) | ||||
| 		c = argv[0][argv_idx++]; | ||||
| 		c = TOUPPER_ASC(c); | ||||
| 	    } | ||||
| 	    else | ||||
| 		c = TOLOWER_ASC(c); | ||||
| #endif | ||||
| 	    /* Note that although DCL might upcase things, the C RTL | ||||
| 	     * will only downcase them, so there should be no need for | ||||
| 	     * the following (additional?) downcasing (which spoils the | ||||
| 	     * preserve-case results): | ||||
| 	     */ | ||||
| #endif /* defined( VMS) */ | ||||
| 	    switch (c) | ||||
| 	    { | ||||
| 	    case NUL:		// "vim -"  read from stdin | ||||
| @ -3610,9 +3625,10 @@ usage(void) | ||||
| 	    break; | ||||
| 	mch_msg(_("\n   or:")); | ||||
|     } | ||||
| #ifdef VMS | ||||
|     mch_msg(_("\nWhere case is ignored prepend / to make flag upper case")); | ||||
| #endif | ||||
| #if defined( VMS) | ||||
|     mch_msg(_("\nWhere command is down-cased, prepend / (like: -/R) to treat flag as upper-case.")); | ||||
|     mch_msg(_("\nOr, where supported, SET PROC/PARSE=EXT, or else quote upper-case material.")); | ||||
| #endif /* defined( VMS) */ | ||||
|  | ||||
|     mch_msg(_("\n\nArguments:\n")); | ||||
|     main_msg(_("--\t\t\tOnly file names after this")); | ||||
|  | ||||
							
								
								
									
										259
									
								
								src/os_vms.c
									
									
									
									
									
								
							
							
						
						
									
										259
									
								
								src/os_vms.c
									
									
									
									
									
								
							| @ -9,7 +9,7 @@ | ||||
|  * See README.txt for an overview of the Vim source code. | ||||
|  */ | ||||
|  | ||||
| #include	"vim.h" | ||||
| #include "vim.h" | ||||
|  | ||||
| // define _generic_64 for use in time functions | ||||
| #if !defined(VAX) && !defined(PROTO) | ||||
| @ -18,11 +18,11 @@ | ||||
| // based on Alpha's gen64def.h; the file is absent on VAX | ||||
| typedef struct _generic_64 { | ||||
| #   pragma __nomember_alignment | ||||
|     __union  {				// You can treat me as... | ||||
|     __union  {				     // You can treat me as... | ||||
| 	// long long is not available on VAXen | ||||
| 	// unsigned __int64 gen64$q_quadword; ...a single 64-bit value, or | ||||
|  | ||||
| 	unsigned int gen64$l_longword [2]; // ...two 32-bit values, or | ||||
| 	unsigned int gen64$l_longword [2];   // ...two 32-bit values, or | ||||
| 	unsigned short int gen64$w_word [4]; // ...four 16-bit values | ||||
|     } gen64$r_quad_overlay; | ||||
| } GENERIC_64; | ||||
| @ -583,7 +583,7 @@ vms_unix_mixed_filespec(char *in, char *out) | ||||
| 	ch = '['; | ||||
| 	SKIP_FOLLOWING_SLASHES(in); | ||||
|     } | ||||
|     else if (EQN(in, "../", 3)) // Unix parent directory? | ||||
|     else if (EQN(in, "../", 3))      // Unix parent directory? | ||||
|     { | ||||
| 	*out++ = '['; | ||||
| 	*out++ = '-'; | ||||
| @ -593,20 +593,20 @@ vms_unix_mixed_filespec(char *in, char *out) | ||||
| 	SKIP_FOLLOWING_SLASHES(in); | ||||
|     } | ||||
|     else | ||||
|     {		    // not a special character | ||||
| 	while (EQN(in, "./", 2))	// Ignore Unix "current dir" | ||||
|     {                                // not a special character | ||||
| 	while (EQN(in, "./", 2))     // Ignore Unix "current dir" | ||||
| 	{ | ||||
| 	    in += 2; | ||||
| 	    SKIP_FOLLOWING_SLASHES(in); | ||||
|     } | ||||
|     if (strchr(in, '/') == NULL)  // any more Unix directories ? | ||||
|     if (strchr(in, '/') == NULL)     // any more Unix directories ? | ||||
|     { | ||||
| 	strcpy(out, in);	// No - get rest of the spec | ||||
| 	strcpy(out, in);             // No - get rest of the spec | ||||
| 	return; | ||||
|     } | ||||
|     else | ||||
|     { | ||||
| 	*out++ = '[';	    // Yes, denote a Vms subdirectory | ||||
| 	*out++ = '[';                // Yes, denote a Vms subdirectory | ||||
| 	ch = '.'; | ||||
| 	--in; | ||||
| 	} | ||||
| @ -627,7 +627,7 @@ vms_unix_mixed_filespec(char *in, char *out) | ||||
| 	    ch = '.'; | ||||
| 	    SKIP_FOLLOWING_SLASHES(in); | ||||
| 	    } | ||||
| 	else if (EQN(in, "../", 3))	// Unix parent directory? | ||||
| 	else if (EQN(in, "../", 3))     // Unix parent directory? | ||||
| 	{ | ||||
| 	    *out++ = '-'; | ||||
| 	    end_of_dir = out; | ||||
| @ -637,7 +637,7 @@ vms_unix_mixed_filespec(char *in, char *out) | ||||
| 	    } | ||||
| 	else | ||||
| 	{ | ||||
| 	    while (EQN(in, "./", 2))  // Ignore Unix "current dir" | ||||
| 	    while (EQN(in, "./", 2))    // Ignore Unix "current dir" | ||||
| 	    { | ||||
| 		end_of_dir = out; | ||||
| 		in += 2; | ||||
| @ -651,7 +651,7 @@ vms_unix_mixed_filespec(char *in, char *out) | ||||
| 	++in; | ||||
|     } | ||||
|  | ||||
|     *out = '\0';    // Terminate output file spec | ||||
|     *out = '\0';            // Terminate output file spec | ||||
|  | ||||
|     if (end_of_dir != NULL) // Terminate directory portion | ||||
| 	*end_of_dir = ']'; | ||||
| @ -725,28 +725,82 @@ vms_fixfilename(void *instring) | ||||
|  * Remove version number from file name | ||||
|  * we need it in some special cases as: | ||||
|  * creating swap file name and writing new file | ||||
|  */ | ||||
|  | ||||
| /* | ||||
|  * 2025-05-13 SMS. | ||||
|  * Using $PARSE would be simpler and more accurate, if all-VMS (not | ||||
|  * mixed UNIX+VMS) path were ensured.  Meanwhile, to improve (imperfect) | ||||
|  * handling of extended name syntax: | ||||
|  *     o All characters (up to five (32767)) after semi-colon (or last | ||||
|  *       of multiple dots) must be numeric. | ||||
|  *     o Caret-escaped semi-colon (^;) or dot (^.) does not delimit | ||||
|  *       version. | ||||
|  * Whether it makes sense to detect syntax errors here is not entirely | ||||
|  * clear.  Currently, many invalid version strings are not treated as | ||||
|  * version strings.  (More could be.) | ||||
|  */ | ||||
|     void | ||||
| vms_remove_version(void * fname) | ||||
| { | ||||
|     char_u	*cp; | ||||
|     char_u	*fp; | ||||
|     char_u	*dp;	        // Dot pointer | ||||
|     char_u	*rp;            // Right pointer | ||||
|     int		done = 0; | ||||
|     int		vdigits = 0; | ||||
|  | ||||
|     if ((cp = vim_strchr( fname, ';')) != NULL) // remove version | ||||
| 	*cp = '\0'; | ||||
|     else if ((cp = vim_strrchr( fname, '.')) != NULL ) | ||||
|     rp = (char_u *)fname+ strlen( (char *)fname)- 1;    // Rightmost char | ||||
|     while ((done == 0) && (rp > (char_u *)fname))       // Count digits | ||||
|     { | ||||
| 	if      ((fp = vim_strrchr( fname, ']')) != NULL ) | ||||
| 	    {;} | ||||
| 	else if ((fp = vim_strrchr( fname, '>')) != NULL ) | ||||
| 	    {;} | ||||
| 	if (isdigit( *rp)) | ||||
| 	{ | ||||
| 	    vdigits++; | ||||
| 	    *rp--; | ||||
| 	} | ||||
| 	else | ||||
| 	    fp = fname; | ||||
| 	{ | ||||
| 	    done = 1;                                   // Quit at non-digit | ||||
| 	} | ||||
|     } // while (Count digits) | ||||
|  | ||||
|     if (vdigits  <= 5)                  // If likely version digits, check delimiter | ||||
|     {                                   // (Could check for <= 32767, not just five digits or fewer.) | ||||
| 	if (*rp == (char_u)';') | ||||
| 	{ | ||||
| 	    if ((rp >= (char_u *)fname) && (*(rp- 1) != (char_u)'^')) | ||||
| 	    {                           // Unescaped ";" | ||||
| 		*rp = '\0';             // Trim off ";nnn" | ||||
| 	    } | ||||
| 	} | ||||
| 	else if (*rp == (char_u)'.')    // Last of multiple dots? | ||||
| 	{ | ||||
| 	    if ((rp >= (char_u *)fname) && (*(rp- 1) != '^')) | ||||
| 	    {                           // Unescaped dot.  Version requires previous one | ||||
| 		dp = rp- 1;             // Scan chars before "." | ||||
| 		done = 0; | ||||
| 		while ((done == 0) && (dp >= (char_u *)fname)) | ||||
| 		{ | ||||
| 		    if ((*dp == ']') || (*dp == '>') || (*dp == ':') || (*dp == '/')) | ||||
| 		    {                   // Possible VMS dev:[dir] delimiter (or UNIX "/") | ||||
| 			if ((dp >= (char_u *)fname) && (*(dp- 1) != '^')) | ||||
| 			{               // Unescaped dev:[dir] (or /) delimiter | ||||
| 			    done = 1;   // No previous dot found in name | ||||
| 			} | ||||
| 		    } | ||||
| 		    else if (*dp == '.') | ||||
| 		    {                   // Possible dot delimiter | ||||
| 			if ((dp >= (char_u *)fname) && (*(dp- 1) != '^')) | ||||
| 			{               // Unescaped dot delimiter | ||||
| 			    done = 1;   // Previous dot found in name | ||||
| 			    *rp = '\0'; // Trim off ".nnn" | ||||
| 			} | ||||
| 		    } | ||||
| 		    dp--;               // Next char to right | ||||
| 		} // while | ||||
| 	    } | ||||
| 	} | ||||
| 	// Else no version found to remove | ||||
|     } // if (vdigits  <= 5) | ||||
|  | ||||
| 	while ( *fp != '\0' && fp < cp ) | ||||
| 	    if ( *fp++ == '.' ) | ||||
| 		*cp = '\0'; | ||||
|     } | ||||
|     return ; | ||||
| } | ||||
|  | ||||
| @ -783,23 +837,29 @@ RealWaitForChar( | ||||
|     if (sec > 0) | ||||
|     { | ||||
| 	// time-out specified; convert it to absolute time | ||||
| 	// sec>0 requirement of lib$cvtf_to_internal_time() | ||||
| 	// sec>0 requirement of lib$cvt[fs]_to_internal_time() | ||||
|  | ||||
| 	// get current time (number of 100ns ticks since the VMS Epoch) | ||||
| 	status = sys$gettim(&time_curr); | ||||
| 	if (status != SS$_NORMAL) | ||||
| 	    return 0; // error | ||||
| 	// construct the delta time | ||||
| #if __G_FLOAT==0 | ||||
| # ifndef VAX | ||||
| 	// IEEE is default on IA64, but can be used on Alpha too - but not on VAX | ||||
| 	status = lib$cvts_to_internal_time( | ||||
|  | ||||
| /* On all non-VAX hardware architectures, the "CC /FLOAT=option" | ||||
|  * determines the floating-point format.  The default format on Alpha | ||||
|  * is VAX; on IA64 and x86_64 it's IEEE.  But, except on VAX, the user | ||||
|  * can specify either.   What matters here is the actual floating-point | ||||
|  * format being used, not the hardware architecture.  Choose the | ||||
|  * appropriate time conversion function accordingly. | ||||
|  */ | ||||
| #if __IEEE_FLOAT | ||||
| # define LIB_CVTX_TO_INTERNAL_TIME lib$cvts_to_internal_time // IEEE | ||||
| #else | ||||
| # define LIB_CVTX_TO_INTERNAL_TIME lib$cvtf_to_internal_time // VAX | ||||
| #endif // __IEEE_FLOAT CVTS | ||||
|  | ||||
| 	status = LIB_CVTX_TO_INTERNAL_TIME( | ||||
| 		&convert_operation, &sec, &time_diff); | ||||
| # endif | ||||
| #else   // default on Alpha and VAX | ||||
| 	status = lib$cvtf_to_internal_time( | ||||
| 		&convert_operation, &sec, &time_diff); | ||||
| #endif | ||||
| 	if (status != LIB$_NORMAL) | ||||
| 	    return 0; // error | ||||
| 	// add them up | ||||
| @ -851,3 +911,130 @@ RealWaitForChar( | ||||
| 	} | ||||
|     } | ||||
| } | ||||
|  | ||||
| #if !defined( __VAX) && (__CRTL_VER >= 70301000) | ||||
|  | ||||
| #include <stdio.h> | ||||
| #include <unixlib.h> | ||||
|  | ||||
| // Structure to hold a DECC$* feature name and its desired value | ||||
|  | ||||
| typedef struct | ||||
|    { | ||||
|    char *name; | ||||
|    int value; | ||||
|    } decc_feat_t; | ||||
|  | ||||
| int vms_init_done = -1; | ||||
|  | ||||
| decc_feat_t decc_feat_array[] = { | ||||
|  | ||||
|    // Preserve command-line case with SET PROCESS/PARSE_STYLE=EXTENDED | ||||
|  { "DECC$ARGV_PARSE_STYLE", 1 }, | ||||
|  | ||||
|    // Preserve case for file names on ODS5 disks | ||||
|  { "DECC$EFS_CASE_PRESERVE", 1 }, | ||||
|  | ||||
|    // Enable multiple dots (and most characters) in ODS5 file names, | ||||
|    // while preserving VMS-ness of ";version" | ||||
|  { "DECC$EFS_CHARSET", 1 }, | ||||
|  | ||||
|    // List terminator | ||||
|  { (char *)NULL, 0 } }; | ||||
|  | ||||
|  | ||||
| /* LIB$INITIALIZE initialization. | ||||
|  * | ||||
|  * On sufficiently recent non-VAX systems, set a collection of C RTL | ||||
|  * features without using the DECC$* logical name method. | ||||
|  * | ||||
|  * Note: Old VAX VMS versions may suffer from a linker complaint like | ||||
|  * this: | ||||
|  * | ||||
|  * %LINK-W-MULPSC, conflicting attributes for psect LIB$INITIALIZE | ||||
|  * in module LIB$INITIALIZE file SYS$COMMON:[SYSLIB]STARLET.OLB;1 | ||||
|  * | ||||
|  * Using a LINK options file which includes a line like this one should | ||||
|  * stop this complaint: | ||||
|  * | ||||
|  * PSECT_ATTR=LIB$INITIALIZE,NOPIC | ||||
|  */ | ||||
|  | ||||
| /* vms_init() | ||||
|  * | ||||
|  * Uses LIB$INITIALIZE to set a collection of C RTL features without | ||||
|  * requiring the user to define the corresponding logical names. | ||||
|  * | ||||
|  * LIB$INITIALIZE initialization function | ||||
|  */ | ||||
|  | ||||
| static void | ||||
| vms_init(void) | ||||
| { | ||||
|     // Set the global flag to indicate that LIB$INITIALIZE worked | ||||
|  | ||||
|     vms_init_done = 1; | ||||
|  | ||||
|     int feat_index; | ||||
|     int feat_value; | ||||
|     int feat_value_max; | ||||
|     int feat_value_min; | ||||
|     int i; | ||||
|     int sts; | ||||
|  | ||||
|     // Loop through all items in the decc_feat_array[] | ||||
|     for (i = 0; decc_feat_array[i].name != NULL; i++) | ||||
|     { | ||||
| 	// Get the feature index | ||||
| 	feat_index = decc$feature_get_index(decc_feat_array[i].name); | ||||
| 	if (feat_index >= 0) | ||||
| 	{ | ||||
| 	    // Valid item.  Collect its properties | ||||
| 	    feat_value = decc$feature_get_value(feat_index, 1); | ||||
| 	    feat_value_min = decc$feature_get_value(feat_index, 2); | ||||
| 	    feat_value_max = decc$feature_get_value(feat_index, 3); | ||||
|  | ||||
| 	    if ((decc_feat_array[i].value >= feat_value_min) && (decc_feat_array[i].value <= feat_value_max)) | ||||
| 		// Valid value.  Set it if necessary | ||||
| 		if (feat_value != decc_feat_array[i].value) | ||||
| 		    sts = decc$feature_set_value(feat_index, 1, decc_feat_array[i].value); | ||||
| 	    else | ||||
| 		// Invalid DECC feature value | ||||
| 		printf("INVALID DECC FEATURE VALUE, %d: %d <= %s <= %d.\n", | ||||
| 			feat_value, feat_value_min, decc_feat_array[i].name, feat_value_max); | ||||
| 	} | ||||
| 	else | ||||
| 	    // Invalid DECC feature name | ||||
| 	    printf("UNKNOWN DECC FEATURE: %s.\n", decc_feat_array[i].name); | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| /* Get "vms_init()" into a valid, loaded LIB$INITIALIZE PSECT. */ | ||||
|  | ||||
| #pragma nostandard | ||||
|  | ||||
| /* Establish the LIB$INITIALIZE PSECTs, with proper alignment and | ||||
|  * other attributes.  Note that "nopic" is significant only on VAX. | ||||
|  */ | ||||
| #pragma extern_model save | ||||
|  | ||||
| #pragma extern_model strict_refdef "LIB$INITIALIZE" 2, nopic, nowrt | ||||
| void (*const x_vms_init)() = vms_init; | ||||
|  | ||||
| #pragma extern_model strict_refdef "LIB$INITIALIZ" 2, nopic, nowrt | ||||
| const int spare[ 8] = { 0 }; | ||||
|  | ||||
| #pragma extern_model restore | ||||
|  | ||||
| // Fake reference to ensure loading the LIB$INITIALIZE PSECT | ||||
|  | ||||
| #pragma extern_model save | ||||
| int LIB$INITIALIZE(void); | ||||
| #pragma extern_model strict_refdef | ||||
| int dmy_lib$initialize = (int) LIB$INITIALIZE; | ||||
| #pragma extern_model restore | ||||
|  | ||||
| #pragma standard | ||||
|  | ||||
| #endif // !defined( __VAX) && (__CRTL_VER >= 70301000) | ||||
|  | ||||
| @ -9,10 +9,12 @@ | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| #include <decc$types.h>             // Required early for large-file support | ||||
|  | ||||
| #define CASE_INSENSITIVE_FILENAME   // Open VMS is case insensitive | ||||
| #define SPACE_IN_FILENAME	    // There could be space between user and passwd | ||||
| #define SPACE_IN_FILENAME           // There could be space between user and passwd | ||||
| #define FNAME_ILLEGAL "|*#?%"       // Illegal characters in a file name | ||||
| #define BINARY_FILE_IO		    // Use binary fileio | ||||
| #define BINARY_FILE_IO              // Use binary fileio | ||||
| #define USE_GETCWD | ||||
| #define USE_SYSTEM | ||||
| #define XPMATTRIBUTES_TYPE XpmAttributes | ||||
| @ -146,6 +148,15 @@ | ||||
| #define FEAT_IPV6 | ||||
| #define FEAT_XTERM_SAVE | ||||
|  | ||||
| #define VIM_SIZEOF_INT  4 | ||||
| #define VIM_SIZEOF_LONG 4 | ||||
|  | ||||
| #if __USE_OFF64_T | ||||
| # define SIZEOF_OFF_T 8 | ||||
| #else | ||||
| # define SIZEOF_OFF_T 4 | ||||
| #endif | ||||
|  | ||||
| // Hardware specific | ||||
| #if defined(__VAX) || defined(VAX) | ||||
| #undef  HAVE_GETTIMEOFDAY | ||||
| @ -156,36 +167,31 @@ | ||||
| #undef  HAVE_ISNAN | ||||
| #undef  HAVE_XOS_R_H | ||||
| #define HAVE_NO_LONG_LONG | ||||
| #define VIM_SIZEOF_INT  4 | ||||
| #define VIM_SIZEOF_LONG 4 | ||||
| #define LONG_LONG_MIN  (-2147483647-1) | ||||
| #define LONG_LONG_MAX  (2147483647) | ||||
| #define ULONG_LONG_MAX (4294967295U) | ||||
|  | ||||
| #else // ALPHA, IA64, X86_64 | ||||
| #define HAVE_FSEEKO             /* Use off_t. */ | ||||
| #define HAVE_GETTIMEOFDAY | ||||
| #define HAVE_USLEEP | ||||
| #define HAVE_STRCASECMP | ||||
| #define HAVE_STRINGS_H | ||||
| #define HAVE_SIGSETJMP | ||||
| #define HAVE_ISNAN | ||||
| #undef  HAVE_XOS_R_H | ||||
| #undef  HAVE_NO_LONG_LONG | ||||
| #define VIM_SIZEOF_INT  4 | ||||
| #define VIM_SIZEOF_LONG 8 | ||||
| #define LONG_LONG_MIN  (-9223372036854775807-1) | ||||
| #define LONG_LONG_MAX  (9223372036854775807) | ||||
| #define ULONG_LONG_MAX (18446744073709551615U) | ||||
|  | ||||
| #if defined(__x86_64) || defined(__x86_64__) | ||||
| #if !defined(X86_64) | ||||
| #define X86_64 | ||||
| #endif | ||||
| #define HAVE_ISNAN | ||||
| #if defined(__DECC) && (__CRTL_VER >= 80500000) && (__STDC_VERSION__ >= 199901L) /* C99 */ | ||||
| #define HAVE_ISINF | ||||
| #define HAVE_ISNAN | ||||
| #endif | ||||
|  | ||||
| #define HAVE_XOS_R_H | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| #endif /* VAX [else] */ | ||||
|  | ||||
| // Compiler specific | ||||
| #if defined(VAXC) || defined(__VAXC) | ||||
| @ -218,7 +224,7 @@ | ||||
|  | ||||
| // GUI support defines | ||||
| #if defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_GTK) | ||||
| #define X_INCLUDE_GRP_H		// To use getgrgid | ||||
| #define X_INCLUDE_GRP_H  // To use getgrgid | ||||
| #define XUSE_MTSAFE_API | ||||
| #define HAVE_X11 | ||||
| #define WANT_X11 | ||||
|  | ||||
							
								
								
									
										12
									
								
								src/po/vim.pot
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										12
									
								
								src/po/vim.pot
									
									
									
										generated
									
									
									
								
							| @ -8,7 +8,7 @@ msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: PACKAGE VERSION\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2025-07-25 18:40+0200\n" | ||||
| "POT-Creation-Date: 2025-07-25 19:14+0200\n" | ||||
| "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" | ||||
| "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" | ||||
| "Language-Team: LANGUAGE <LL@li.org>\n" | ||||
| @ -1540,7 +1540,13 @@ msgstr "" | ||||
|  | ||||
| msgid "" | ||||
| "\n" | ||||
| "Where case is ignored prepend / to make flag upper case" | ||||
| "Where command is down-cased, prepend / (like: -/R) to treat flag as upper-" | ||||
| "case." | ||||
| msgstr "" | ||||
|  | ||||
| msgid "" | ||||
| "\n" | ||||
| "Or, where supported, SET PROC/PARSE=EXT, or else quote upper-case material." | ||||
| msgstr "" | ||||
|  | ||||
| msgid "" | ||||
| @ -3386,7 +3392,7 @@ msgstr "" | ||||
|  | ||||
| msgid "" | ||||
| "\n" | ||||
| "OpenVMS version" | ||||
| "OpenVMS (build) arch, version" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "" | ||||
|  | ||||
| @ -719,6 +719,8 @@ static char *(features[]) = | ||||
|  | ||||
| static int included_patches[] = | ||||
| {   /* Add new patch number below this line */ | ||||
| /**/ | ||||
|     1591, | ||||
| /**/ | ||||
|     1590, | ||||
| /**/ | ||||
| @ -4158,13 +4160,19 @@ list_version(void) | ||||
| #endif | ||||
|  | ||||
| #ifdef VMS | ||||
|     msg_puts(_("\nOpenVMS version")); | ||||
|     msg_puts(_("\nOpenVMS (build) arch, version")); | ||||
| # ifdef HAVE_PATHDEF | ||||
|     if (*compiled_arch != NUL) | ||||
|     { | ||||
| 	msg_puts(" - "); | ||||
| 	msg_puts(": "); | ||||
| 	msg_puts((char *)compiled_arch); | ||||
| 	if (*compiled_vers != NUL) | ||||
| 	{ | ||||
| 	    msg_puts(", "); | ||||
| 	    msg_puts((char *)compiled_vers); | ||||
| 	} | ||||
|     } | ||||
|  | ||||
| # endif | ||||
|  | ||||
| #endif | ||||
|  | ||||
| @ -24,7 +24,11 @@ | ||||
| // ============ the header file puzzle: order matters ========= | ||||
|  | ||||
| #ifdef HAVE_CONFIG_H	// GNU autoconf (or something else) was here | ||||
| # include "auto/config.h" | ||||
| # ifdef VMS | ||||
| #  include "config.h"   /* Rely on /INCLUDE to find it. */ | ||||
| # else | ||||
| #  include "auto/config.h" | ||||
| # endif /* def VMS [else] */ | ||||
| # define HAVE_PATHDEF | ||||
|  | ||||
| /* | ||||
|  | ||||
| @ -25,7 +25,7 @@ | ||||
| // defines HAVE_ATTRIBUTE_UNUSED | ||||
| #ifdef HAVE_CONFIG_H | ||||
| # ifdef VMS | ||||
| #  include "[.auto]config.h" | ||||
| #  include "config.h" | ||||
| # else | ||||
| #  include "../auto/config.h" | ||||
| # endif | ||||
|  | ||||
| @ -1,7 +1,10 @@ | ||||
| # VMS MM[KS] makefile for XXD | ||||
| # tested with MMK and MMS as well. | ||||
| # | ||||
| # Maintained by Zoltan Arpadffy <arpadffy@polarhome.com> | ||||
| # Maintained by Zoltan Arpadffy <zoltan.arpadffy@gmail.com> | ||||
| #               2025-05-24  Steven M. Schweda <sms@antinode.info> | ||||
| # | ||||
| ###################################################################### | ||||
| # | ||||
| # Edit the lines in the Configuration section below to select. | ||||
| # | ||||
| @ -16,12 +19,6 @@ | ||||
| ###################################################################### | ||||
| # Configuration section. | ||||
| ###################################################################### | ||||
| # Compiler selection. | ||||
| # Comment out if you use the VAXC compiler | ||||
| ###################################################################### | ||||
| # DECC = YES | ||||
|  | ||||
| ##################################################################### | ||||
| # Uncomment if want a debug version. Resulting executable is DVIM.EXE | ||||
| ###################################################################### | ||||
| # DEBUG = YES | ||||
| @ -32,41 +29,209 @@ | ||||
| # Please, do not change anything below without programming experience. | ||||
| ###################################################################### | ||||
|  | ||||
| CC      = cc | ||||
| # Define old MMK architecture macros when using MMS. | ||||
| # | ||||
| ###################################################################### | ||||
| # Architecture identification and product destination selection. | ||||
| # Define old MMK architecture macros when using MMS. | ||||
| # | ||||
| .IFDEF MMS$ARCH_NAME            # MMS$ARCH_NAME | ||||
| ALPHA_X_ALPHA = 1 | ||||
| IA64_X_IA64 = 1 | ||||
| VAX_X_VAX = 1 | ||||
| X86_64_X_X86_64 = 1 | ||||
| .IFDEF ARCH                         # ARCH | ||||
| ARCH_NAME = $(ARCH) | ||||
| .ELSE                               # ARCH | ||||
| ARCH_NAME = $(MMS$ARCH_NAME) | ||||
| .ENDIF                              # ARCH | ||||
| .IFDEF $(ARCH_NAME)_X_ALPHA         # $(ARCH_NAME)_X_ALPHA | ||||
| __ALPHA__ = 1 | ||||
| .ENDIF                              # $(ARCH_NAME)_X_ALPHA | ||||
| .IFDEF $(ARCH_NAME)_X_IA64          # $(ARCH_NAME)_X_IA64 | ||||
| __IA64__ = 1 | ||||
| .ENDIF                              # $(ARCH_NAME)_X_IA64 | ||||
| .IFDEF $(ARCH_NAME)_X_VAX           # $(ARCH_NAME)_X_VAX | ||||
| __VAX__ = 1 | ||||
| .ENDIF                              # $(ARCH_NAME)_X_VAX | ||||
| .IFDEF $(ARCH_NAME)_X_X86_64        # $(ARCH_NAME)_X_X86_64 | ||||
| __X86_64__ = 1 | ||||
| .ENDIF                              # $(ARCH_NAME)_X_X86_64 | ||||
| .ELSE                           # MMS$ARCH_NAME | ||||
| .IFDEF __MMK__                      # __MMK__ | ||||
| .IFDEF ARCH                             # ARCH | ||||
| .IFDEF __$(ARCH)__                          # __$(ARCH)__ | ||||
| .ELSE                                       # __$(ARCH)__ | ||||
| __$(ARCH)__ = 1 | ||||
| .ENDIF                                      # __$(ARCH)__                       | ||||
| .ENDIF                                  # ARCH | ||||
| .ENDIF                              # __MMK__ | ||||
| .ENDIF                          # MMS$ARCH_NAME | ||||
| # | ||||
| # Combine command-line VAX C compiler macros. | ||||
| # | ||||
| .IFDEF VAXC                     # VAXC | ||||
| VAXC_OR_FORCE_VAXC = 1 | ||||
| .ELSE                           # VAXC | ||||
| .IFDEF FORCE_VAXC                   # FORCE_VAXC | ||||
| VAXC_OR_FORCE_VAXC = 1 | ||||
| .ENDIF                              # FORCE_VAXC | ||||
| .ENDIF                          # VAXC | ||||
| # | ||||
| # Analyze architecture-related and option macros. | ||||
| # (Sense x86_64 before IA64 for old MMK and x86_64 cross tools.) | ||||
| # | ||||
| .IFDEF __X86_64__               # __X86_64__ | ||||
| DECC = 1 | ||||
| DESTM = X86_64 | ||||
| .ELSE                           # __X86_64__ | ||||
| .IFDEF __IA64__                     # __IA64__ | ||||
| DECC = 1 | ||||
| DESTM = IA64 | ||||
| .ELSE                               # __IA64__ | ||||
| .IFDEF __ALPHA__                        # __ALPHA__ | ||||
| DECC = 1 | ||||
| DESTM = ALPHA | ||||
| .ELSE                                   # __ALPHA__ | ||||
| .IFDEF __VAX__                              # __VAX__ | ||||
| .IFDEF VAXC_OR_FORCE_VAXC                       # VAXC_OR_FORCE_VAXC | ||||
| DESTM = VAXV | ||||
| .ELSE                                           # VAXC_OR_FORCE_VAXC | ||||
| DECC = 1 | ||||
| DESTM = VAX | ||||
| .ENDIF                                          # VAXC_OR_FORCE_VAXC | ||||
| .ELSE                                       # __VAX__ | ||||
| DESTM = UNK | ||||
| UNK_DEST = 1 | ||||
| .ENDIF                                      # __VAX__ | ||||
| .ENDIF                                  # __ALPHA__ | ||||
| .ENDIF                              # __IA64__ | ||||
| .ENDIF                          # __X86_64__ | ||||
|  | ||||
| .IFDEF DECC | ||||
| CC_DEF  = $(CC)/decc | ||||
| .IFDEF PROD                     # PROD | ||||
| DEST = $(PROD) | ||||
| .ELSE                           # PROD | ||||
| DEST = $(DESTM) | ||||
| .ENDIF                          # PROD | ||||
|  | ||||
| .FIRST | ||||
| .IFDEF __MMK__                  # __MMK__ | ||||
| 	@ write sys$output "" | ||||
| .ENDIF                          # __MMK__ | ||||
| # | ||||
| # Create destination directory. | ||||
| 	@ write sys$output "Destination: [.$(DEST)]" | ||||
| 	@ write sys$output "" | ||||
| 	@ if (f$search( "$(DEST).DIR;1") .eqs. "") then - | ||||
|          create /directory [.$(DEST)] | ||||
| # | ||||
| # Compiler setup | ||||
|  | ||||
| # Optimization.  The .c.obj rule will override this for specific modules | ||||
| # where the VAX C compilers hang.   See VAX_NOOPTIM_LIST, below. | ||||
| OPTIMIZE= /optim | ||||
|  | ||||
| .IFDEF __VAX__                  # __VAX__ | ||||
|  | ||||
| # List of modules for which "Compaq C V6.4-005 on OpenVMS VAX V7.3" | ||||
| # hangs.  Add more as needed (plus-separated). | ||||
| VAX_NOOPTIM_LIST = blowfish+regexp+sha256 | ||||
|  | ||||
| # Compiler command. | ||||
| # Default: CC /DECC.  On non-VAX, or VAX with only DEC C installed, | ||||
| # /DECC is harmless.  If both DEC C and VAX C are installed, and VAX C | ||||
| # was selected as the default, then /DECC must be specified explicitly.  | ||||
| # If both are installed, and DEC C is the default, but VAX C is desired, | ||||
| # then define FORCE_VAXC to get VAX C (CC /VAXC).  If only VAX C is | ||||
| # installed, then define VAXC to get (plain) CC. | ||||
|  | ||||
| .IFDEF DECC                         # DECC | ||||
| CC_DEF = cc /decc | ||||
| PREFIX = /prefix=all | ||||
| .ELSE                               # DECC | ||||
| .IFDEF FORCE_VAXC                       # FORCE_VAXC | ||||
| CC_DEF = cc /vaxc | ||||
| .ELSE                                   # FORCE_VAXC | ||||
| CC_DEF = cc | ||||
| .ENDIF                                  # FORCE_VAXC | ||||
| .ENDIF                              # DECC | ||||
| .ELSE                           # __VAX__ | ||||
|  | ||||
| # Not VAX, therefore DEC C (/PREFIX). | ||||
|  | ||||
| CC_DEF = cc /decc | ||||
| PREFIX  = /prefix=all | ||||
|  | ||||
| # These floating-point options are the defaults on IA64 and x86_64. | ||||
| # This makes Alpha consistent. | ||||
| FLOAT   = /float = ieee_float /ieee_mode = denorm_results | ||||
|  | ||||
| # Large-file support.  Unavailable on VAX and very old Alpha.  To | ||||
| # disable, define NOLARGE. | ||||
| .IFDEF NOLARGE | ||||
| .ELSE | ||||
| CC_DEF  = $(CC) | ||||
| PREFIX  = | ||||
| .ENDIF | ||||
| LARGE_DEF = , "_LARGEFILE" | ||||
| .ENDIF # NOLARGE [ELSE] | ||||
| .ENDIF                          # __VAX__ [ELSE] | ||||
|  | ||||
| .IFDEF VAXC_OR_FORCE_VAXC       # VAXC_OR_FORCE_VAXC | ||||
| .ELSE                           # VAXC_OR_FORCE_VAXC | ||||
| CCVER = YES     # Unreliable with VAX C. | ||||
| .ENDIF                          # VAXC_OR_FORCE_VAXC [ELSE] | ||||
|  | ||||
| CDEFS = VMS $(LARGE_DEF) | ||||
| DEFS = /define = ($(CDEFS)) | ||||
|  | ||||
| .IFDEF LIST                     # LIST | ||||
| LIST_OPT = /list=[.$(DEST)] /show=(all, nomessages) | ||||
| .ENDIF                          # LIST | ||||
|  | ||||
| .IFDEF DEBUG                    # DEBUG | ||||
| TARGET  =  [.$(DEST)]dxxd.exe | ||||
| CFLAGS  = /debug/noopt$(PREFIX) $(LIST_OPT) /cross_reference/include=[] | ||||
| LDFLAGS = /debug | ||||
| .ELSE                           # DEBUG | ||||
| TARGET  =  [.$(DEST)]xxd.exe | ||||
| CFLAGS  = $(OPTIMIZE) $(PREFIX) $(LIST_OPT) /include=[] | ||||
|  | ||||
| LDFLAGS = | ||||
| .ENDIF                          # DEBUG [ELSE] | ||||
|  | ||||
| CC = $(CC_DEF) $(CFLAGS) | ||||
|  | ||||
| LD_DEF  = link | ||||
|  | ||||
| .IFDEF DEBUG | ||||
| TARGET  = dxxd.exe | ||||
| CFLAGS  = /debug/noopt$(PREFIX)/cross_reference/include=[] | ||||
| LDFLAGS = /debug | ||||
| .ELSE | ||||
| TARGET  = xxd.exe | ||||
| CFLAGS  = /opt$(PREFIX)/include=[] | ||||
| LDFLAGS = | ||||
| .ENDIF | ||||
|  | ||||
| .SUFFIXES : .obj .c | ||||
|  | ||||
| SOURCES	= xxd.c | ||||
| OBJ     = xxd.obj | ||||
| OBJ_BASE = xxd.obj | ||||
| OBJ     = [.$(DEST)]$(OBJ_BASE) | ||||
|  | ||||
| .c.obj : | ||||
| 	$(CC_DEF) $(CFLAGS) $< | ||||
| 	$(CC) $(DEFS) $< /object = $@ | ||||
|  | ||||
| $(TARGET) : $(OBJ) | ||||
| 	$(LD_DEF) $(LDFLAGS) /exe=$(TARGET) $+ | ||||
|         -@ def_dev_dir_orig = f$environment( "default") | ||||
| 	-@ target_name_type = - | ||||
|          f$parse( "$(TARGET)", , , "NAME", "SYNTAX_ONLY")+ - | ||||
|          f$parse( "$(TARGET)", , , "TYPE", "SYNTAX_ONLY") | ||||
| 	-@ set default [.$(DEST)] | ||||
| 	$(LD_DEF) $(LDFLAGS) /exe = 'target_name_type' $(OBJ_BASE) | ||||
| 	-@ set default 'def_dev_dir_orig' | ||||
|  | ||||
| clean : | ||||
| 	-@ if "''F$SEARCH("*.obj")'" .NES. ""  then delete/noconfirm/nolog *.obj;* | ||||
| 	-@ if "''F$SEARCH("*.exe")'" .NES. ""  then delete/noconfirm/nolog *.exe;* | ||||
| 	-@ if (f$search( "[.$(DEST)]*.*") .nes. "") then - | ||||
|          delete /noconfirm [.$(DEST)]*.*;* | ||||
| 	-@ if (f$search( "$(DEST).DIR") .nes. "") then - | ||||
|          set protection = w:d $(DEST).DIR;* | ||||
| 	-@ if (f$search( "$(DEST).DIR") .nes. "") then - | ||||
|          delete /noconfirm $(DEST).DIR;* | ||||
|  | ||||
| xxd.obj : xxd.c | ||||
| help : | ||||
|         mcr sys$disk:$(TARGET) -h | ||||
|  | ||||
| version : | ||||
|         mcr sys$disk:$(TARGET) -v | ||||
|  | ||||
|  | ||||
| [.$(DEST)]xxd.obj : xxd.c | ||||
|  | ||||
		Reference in New Issue
	
	Block a user