0
0
mirror of https://github.com/vim/vim.git synced 2025-10-22 08:34:29 -04:00

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:
Zoltan Arpadffy
2025-07-25 19:16:09 +02:00
committed by Christian Brabandt
parent af9a7a04f1
commit e9d1259111
10 changed files with 1199 additions and 613 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -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;

View File

@@ -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"));

View File

@@ -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 )
{;}
else
fp = fname;
while ( *fp != '\0' && fp < cp )
if ( *fp++ == '.' )
*cp = '\0';
if (isdigit( *rp))
{
vdigits++;
*rp--;
}
else
{
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)
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)

View File

@@ -9,6 +9,8 @@
#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 FNAME_ILLEGAL "|*#?%" // Illegal characters in a file name
@@ -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)

12
src/po/vim.pot generated
View File

@@ -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 ""

View File

@@ -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

View File

@@ -24,7 +24,11 @@
// ============ the header file puzzle: order matters =========
#ifdef HAVE_CONFIG_H // GNU autoconf (or something else) was here
# ifdef VMS
# include "config.h" /* Rely on /INCLUDE to find it. */
# else
# include "auto/config.h"
# endif /* def VMS [else] */
# define HAVE_PATHDEF
/*

View File

@@ -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

View File

@@ -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