# HG changeset patch # User Bram Moolenaar # Date 1609754411 -3600 # Node ID 49d866e9b43969bb9bc0784d48ef10f8ba70310c # Parent f2f8c384883111dd40d893a1fce19288deb18ec1 patch 8.2.2294: VMS: a few remaining problems Commit: https://github.com/vim/vim/commit/82c38fe508155c11a904e6111b5bfb6adde3fb9a Author: Bram Moolenaar Date: Mon Jan 4 10:47:26 2021 +0100 patch 8.2.2294: VMS: a few remaining problems Problem: VMS: a few remaining problems. Solution: Add VMS specific changes. Add Lua support. (Zoltan Arpadffy) diff --git a/src/Make_vms.mms b/src/Make_vms.mms --- a/src/Make_vms.mms +++ b/src/Make_vms.mms @@ -2,7 +2,7 @@ # Makefile for Vim on OpenVMS # # Maintainer: Zoltan Arpadffy -# Last change: 2020 Dec 30 +# Last change: 2021 Jan 04 # # This script has been tested on VMS 6.2 to 8.4 on DEC Alpha, VAX and IA64 # with MMS and MMK @@ -38,18 +38,18 @@ MODEL = HUGE # GUI or terminal mode executable. # Comment out if you want just the character terminal mode only. # GUI with Motif -GUI = YES +# GUI = YES # GUI with GTK # If you have GTK installed you might want to enable this option. # NOTE: you will need to properly define GTK_DIR below -# NOTE: since Vim 7.3 GTK 2+ is used that is not ported to VMS, -# therefore this option should not be used +# NOTE: since Vim 7.3 GTK 2+ is used that is not ported to VMS, +# therefore this option should not be used # GTK = YES # GUI/Motif with XPM # If you have XPM installed you might want to build Motif version with toolbar -XPM = YES +# XPM = YES # Comment out if you want the compiler version with :ver command. # NOTE: This part can make some complications if you're using some @@ -59,7 +59,7 @@ CCVER = YES # Uncomment if want a debug version. Resulting executable is DVIM.EXE # Development purpose only! Normally, it should not be defined. !!! -# DEBUG = YES +# DEBUG = YES # Languages support for Perl, Python, TCL etc. # If you don't need it really, leave them behind the comment. @@ -68,6 +68,7 @@ CCVER = YES # VIM_PERL = YES # VIM_PYTHON = YES # VIM_RUBY = YES +# VIM_LUA = YES # X Input Method. For entering special languages like chinese and # Japanese. @@ -180,7 +181,7 @@ XPM_INC = ,[.xpm.include] XPM_LIB = ,OS_VMS_XPM.OPT/OPT .ELSE DEFS = "HAVE_CONFIG_H","FEAT_GUI_MOTIF" -XPM_INC = +XPM_INC = .ENDIF LIBS = ,OS_VMS_MOTIF.OPT/OPT GUI_FLAG = @@ -237,6 +238,15 @@ RUBY_LIB = ,OS_VMS_RUBY.OPT/OPT RUBY_INC = .ENDIF +.IFDEF VIM_LUA +# LUA related setup. +LUA_DEF = ,"FEAT_LUA" +LUA_SRC = if_lua.c +LUA_OBJ = if_lua.obj +LUA_LIB = ,OS_VMS_LUA.OPT/OPT +LUA_INC = ,LUA$ROOT:[INCLUDE] +.ENDIF + .IFDEF VIM_XIM # XIM related setup. .IFDEF GUI @@ -247,7 +257,7 @@ XIM_DEF = ,"FEAT_XIM" .IFDEF VIM_MZSCHEME # MZSCHEME related setup MZSCH_DEF = ,"FEAT_MZSCHEME" -MZSCH_SRC = if_mzsch.c +MZSCH_SRC = if_mzsch.c MZSCH_OBJ = if_mzsch.obj .ENDIF @@ -258,7 +268,7 @@ ICONV_DEF = ,"USE_ICONV" # XDIFF related setup. XDIFF_SRC = xdiffi.c,xemit.c,xprepare.c,xutils.c,xhistogram.c,xpatience.c -XDIFF_OBJ = xdiffi.obj,xemit.obj,xprepare.obj,xutils.obj,xhistogram.obj,xpatience.obj +XDIFF_OBJ = xdiffi.obj,xemit.obj,xprepare.obj,xutils.obj,xhistogram.obj,xpatience.obj XDIFF_INC = ,[.xdiff] ###################################################################### @@ -275,7 +285,7 @@ VIMHOST = "''F$TRNLNM("SYS$NODE")'''F$TR .SUFFIXES : .obj .c ALL_CFLAGS = /def=($(MODEL_DEF)$(DEFS)$(DEBUG_DEF)$(PERL_DEF)$(PYTHON_DEF) - - $(TCL_DEF)$(RUBY_DEF)$(XIM_DEF)$(TAG_DEF)$(MZSCH_DEF) - + $(TCL_DEF)$(RUBY_DEF)$(LUA_DEF)$(XIM_DEF)$(TAG_DEF)$(MZSCH_DEF) - $(ICONV_DEF)) - $(CFLAGS)$(GUI_FLAG) - /include=($(C_INC)$(GUI_INC_DIR)$(GUI_INC)$(PERL_INC)$(PYTHON_INC) - @@ -286,14 +296,14 @@ ALL_CFLAGS = /def=($(MODEL_DEF)$(DEFS)$( # as $(GUI_INC) - replaced with $(GUI_INC_VER) # Otherwise should not be any other difference. ALL_CFLAGS_VER = /def=($(MODEL_DEF)$(DEFS)$(DEBUG_DEF)$(PERL_DEF)$(PYTHON_DEF) - - $(TCL_DEF)$(RUBY_DEF)$(XIM_DEF)$(TAG_DEF)$(MZSCH_DEF) - + $(TCL_DEF)$(RUBY_DEF)$(LUA_DEF)$(XIM_DEF)$(TAG_DEF)$(MZSCH_DEF) - $(ICONV_DEF)) - $(CFLAGS)$(GUI_FLAG) - /include=($(C_INC)$(GUI_INC_DIR)$(GUI_INC_VER)$(PERL_INC)$(PYTHON_INC) - $(TCL_INC)$(XDIFF_INC)$(XPM_INC)) ALL_LIBS = $(LIBS) $(GUI_LIB_DIR) $(GUI_LIB) $(XPM_LIB)\ - $(PERL_LIB) $(PYTHON_LIB) $(TCL_LIB) $(RUBY_LIB) + $(PERL_LIB) $(PYTHON_LIB) $(TCL_LIB) $(RUBY_LIB) $(LUA_LIB) SRC = \ arabic.c \ @@ -408,6 +418,7 @@ SRC = \ $(PYTHON_SRC) \ $(TCL_SRC) \ $(RUBY_SRC) \ + $(LUA_SRC) \ $(MZSCH_SRC) \ $(XDIFF_SRC) @@ -525,11 +536,12 @@ OBJ = \ $(PYTHON_OBJ) \ $(TCL_OBJ) \ $(RUBY_OBJ) \ + $(LUA_OBJ) \ $(MZSCH_OBJ) \ $(XDIFF_OBJ) # Default target is making the executable -all : [.auto]config.h mmk_compat motif_env gtk_env perl_env python_env tcl_env ruby_env $(TARGET) +all : [.auto]config.h mmk_compat motif_env gtk_env perl_env python_env tcl_env ruby_env lua_env $(TARGET) ! $@ [.auto]config.h : $(CONFIG_H) @@ -611,7 +623,7 @@ motif_env : .ENDIF .IFDEF MMSIA64 -@ write opt_file "[.xpm.vms.ia64]libxpm.olb/lib" -.ENDIF +.ENDIF -@ close opt_file .ELSE -@ write sys$output "using DECW/Motif environment." @@ -709,11 +721,24 @@ ruby_env : -@ ! .ENDIF +.IFDEF VIM_LUA +lua_env : + -@ write sys$output "using LUA environment:" + -@ write sys$output " include path: ""$(LUA_INC)""" + -@ write sys$output "creating OS_VMS_LUA.OPT file." + -@ open/write opt_file OS_VMS_LUA.OPT + -@ write opt_file "LUA$ROOT:[LIB]LUA$SHR.EXE /share" + -@ close opt_file +.ELSE +lua_env : + -@ ! +.ENDIF + arabic.obj : arabic.c vim.h arglist.obj : arglist.c vim.h [.auto]config.h feature.h os_unix.h autocmd.obj : autocmd.c vim.h [.auto]config.h feature.h os_unix.h blowfish.obj : blowfish.c vim.h [.auto]config.h feature.h os_unix.h -blob.obj : blob.c vim.h [.auto]config.h feature.h os_unix.h +blob.obj : blob.c vim.h [.auto]config.h feature.h os_unix.h buffer.obj : buffer.c vim.h [.auto]config.h feature.h os_unix.h \ ascii.h keymap.h term.h macros.h structs.h regexp.h \ gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \ @@ -873,7 +898,7 @@ if_xcmdsrv.obj : if_xcmdsrv.c vim.h [.au if_mzsch.obj : if_mzsch.c vim.h [.auto]config.h feature.h os_unix.h \ ascii.h keymap.h term.h macros.h option.h structs.h \ regexp.h gui.h beval.h [.proto]gui_beval.pro ex_cmds.h proto.h \ - errors.h globals.h if_mzsch.h + errors.h globals.h if_mzsch.h indent.obj : indent.c vim.h [.auto]config.h feature.h os_unix.h insexpand.obj : insexpand.c vim.h [.auto]config.h feature.h os_unix.h json.obj : json.c vim.h [.auto]config.h feature.h os_unix.h \ @@ -1167,6 +1192,8 @@ if_ruby.obj : if_ruby.c vim.h [.auto]con ascii.h keymap.h term.h macros.h structs.h regexp.h \ gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \ errors.h globals.h version.h +if_lua.obj : if_lua.c vim.h [.auto]config.h feature.h os_unix.h \ + errors.h globals.h version.h beval.obj : beval.c vim.h [.auto]config.h feature.h os_unix.h \ ascii.h keymap.h term.h macros.h structs.h regexp.h \ gui.h beval.h option.h ex_cmds.h proto.h \ @@ -1186,4 +1213,4 @@ xemit.obj : [.xdiff]xemit.c [.xdiff]xinc xprepare.obj : [.xdiff]xprepare.c [.xdiff]xinclude.h [.auto]config.h vim.h feature.h os_unix.h xutils.obj : [.xdiff]xutils.c [.xdiff]xinclude.h [.auto]config.h vim.h feature.h os_unix.h xhistogram.obj : [.xdiff]xhistogram.c [.xdiff]xinclude.h [.auto]config.h vim.h feature.h os_unix.h -xpatience.obj : [.xdiff]xpatience.c [.xdiff]xinclude.h [.auto]config.h vim.h feature.h os_unix.h +xpatience.obj : [.xdiff]xpatience.c [.xdiff]xinclude.h [.auto]config.h vim.h feature.h os_unix.h diff --git a/src/fileio.c b/src/fileio.c --- a/src/fileio.c +++ b/src/fileio.c @@ -16,10 +16,13 @@ #if defined(__TANDEM) # include // for SSIZE_MAX #endif -#if defined(UNIX) && defined(FEAT_EVAL) +#if (defined(UNIX) || defined(VMS)) && defined(FEAT_EVAL) # include # include #endif +#if defined(VMS) && defined(HAVE_XOS_R_H) +# include +#endif // Is there any system that doesn't have access()? #define USE_MCH_ACCESS @@ -338,7 +341,7 @@ readfile( if (!read_stdin && !read_buffer && !read_fifo) { -#ifdef UNIX +#if defined(UNIX) || defined(VMS) /* * On Unix it is possible to read a directory, so we have to * check for it before the mch_open(). @@ -4623,11 +4626,13 @@ create_readdirex_item(char_u *path, char q = (char_u*)pw->pw_name; if (dict_add_string(item, "user", q) == FAIL) goto theend; +# if !defined(VMS) || (defined(VMS) && defined(HAVE_XOS_R_H)) gr = getgrgid(st.st_gid); if (gr == NULL) q = (char_u*)""; else q = (char_u*)gr->gr_name; +# endif if (dict_add_string(item, "group", q) == FAIL) goto theend; } diff --git a/src/gui_xmebw.c b/src/gui_xmebw.c --- a/src/gui_xmebw.c +++ b/src/gui_xmebw.c @@ -69,6 +69,20 @@ _XmDrawHighlight(a, b, c, d, e, f, g, h, LineSolid) #endif +// Older VMS systems do not have xos_r.h and cannot haldle XtProcessLocking +#if defined(VMS) +# if defined(HAVE_XOS_R_H) +# define XTPROCESS_LOCK XtProcessLock() +# define XTPROCESS_UNLOCK XtProcessUnlock() +# else +# define XTPROCESS_LOCK +# define XTPROCESS_UNLOCK +# endif +#else +# define XTPROCESS_LOCK XtProcessLock() +# define XTPROCESS_UNLOCK XtProcessUnlock() +#endif + /* * Motif internals we have to cheat around with. */ @@ -714,9 +728,9 @@ draw_label(XmEnhancedButtonWidget eb, XE { XtExposeProc expose; - XtProcessLock(); + XTPROCESS_LOCK; expose = xmLabelClassRec.core_class.expose; - XtProcessUnlock(); + XTPROCESS_UNLOCK; (*expose)((Widget) eb, event, region); } @@ -809,9 +823,9 @@ Enter(Widget wid, _XmPrimitiveEnter((Widget) eb, event, NULL, NULL); if (eb->pushbutton.armed == TRUE) { - XtProcessLock(); + XTPROCESS_LOCK; expose = XtClass(eb)->core_class.expose; - XtProcessUnlock(); + XTPROCESS_UNLOCK; (*expose) (wid, event, (Region) NULL); } @@ -887,9 +901,9 @@ Leave(Widget wid, { XtExposeProc expose; eb->pushbutton.armed = FALSE; - XtProcessLock(); + XTPROCESS_LOCK; expose = XtClass(eb)->core_class.expose; - XtProcessUnlock(); + XTPROCESS_UNLOCK; (*expose) (wid, event, (Region)NULL); draw_unhighlight(eb); draw_pixmap(eb, event, NULL); @@ -973,9 +987,9 @@ set_size(XmEnhancedButtonWidget newtb) // Invoke Label's Resize procedure. { XtWidgetProc resize; - XtProcessLock(); + XTPROCESS_LOCK; resize = xmLabelClassRec.core_class.resize; - XtProcessUnlock(); + XTPROCESS_UNLOCK; (* resize) ((Widget) newtb); } @@ -988,9 +1002,9 @@ Initialize(Widget rq, Widget ebw, ArgLis XmEnhancedButtonWidget eb = (XmEnhancedButtonWidget)ebw; XtWidgetProc resize; - XtProcessLock(); + XTPROCESS_LOCK; resize = xmLabelClassRec.core_class.resize; - XtProcessUnlock(); + XTPROCESS_UNLOCK; // Create a bitmap for stippling (Drawable resources are cheap). if (STIPPLE_BITMAP == None) diff --git a/src/macros.h b/src/macros.h --- a/src/macros.h +++ b/src/macros.h @@ -161,7 +161,6 @@ # define mch_fstat(n, p) fstat((n), (p)) # undef HAVE_LSTAT // VMS does not have lstat() # define mch_stat(n, p) stat(vms_fixfilename(n), (p)) -# define mch_rmdir(n) rmdir(vms_fixfilename(n)) #else # ifndef MSWIN # define mch_access(n, p) access((n), (p)) diff --git a/src/os_unix.h b/src/os_unix.h --- a/src/os_unix.h +++ b/src/os_unix.h @@ -73,8 +73,9 @@ // always use unlink() to remove files #ifndef PROTO # ifdef VMS -# define mch_remove(x) delete((char *)(x)) -# define vim_mkdir(x, y) mkdir((char *)(x), y) +# define vim_mkdir(x, y) mkdir((char *)vms_fixfilename(x), y) +# define mch_rmdir(x) delete((char *)vms_fixfilename(x)) +# define mch_remove(x) delete((char *)vms_fixfilename(x)) # else # define vim_mkdir(x, y) mkdir((char *)(x), y) # define mch_rmdir(x) rmdir((char *)(x)) diff --git a/src/os_vms.c b/src/os_vms.c --- a/src/os_vms.c +++ b/src/os_vms.c @@ -672,9 +672,18 @@ vms_fixfilename(void *instring) else if (strchr(instring,'"') == NULL) // password in the path? { // Seems it is a regular file, let guess that it is pure Unix fspec - if (decc$to_vms(instring, vms_fspec_proc, 0, 0) <= 0) - // No... it must be mixed + if ( (strchr(instring,'[') == NULL) && (strchr(instring,'<') == NULL) && + (strchr(instring,']') == NULL) && (strchr(instring,'>') == NULL) && + (strchr(instring,':') == NULL) ) + { + // It must be a truly unix fspec + decc$to_vms(instring, vms_fspec_proc, 0, 0); + } + else + { + // It is a mixed fspec vms_unix_mixed_filespec(instring, buf); + } } else // we have a password in the path diff --git a/src/os_vms_conf.h b/src/os_vms_conf.h --- a/src/os_vms_conf.h +++ b/src/os_vms_conf.h @@ -147,7 +147,6 @@ #undef HAVE_FCHDIR #undef HAVE_LSTAT #undef HAVE_STDINT_H -#undef HAVE_XOS_R_H // Hardware specific #ifdef VAX @@ -157,12 +156,12 @@ #undef HAVE_STRINGS_H #undef HAVE_SIGSETJMP #undef HAVE_ISNAN +#undef HAVE_XOS_R_H #define HAVE_NO_LONG_LONG #define VIM_SIZEOF_LONG 4 -#define LONG_LONG_MIN (-2147483647-1) -#define LONG_LONG_MAX (2147483647) +#define LONG_LONG_MIN (-2147483647-1) +#define LONG_LONG_MAX (2147483647) #define ULONG_LONG_MAX (4294967295U) -#undef XTHREADS #else // AXP and IA64 #define HAVE_GETTIMEOFDAY #define HAVE_USLEEP @@ -170,12 +169,12 @@ #define HAVE_STRINGS_H #define HAVE_SIGSETJMP #define HAVE_ISNAN +#define HAVE_XOS_R_H #define HAVE_NO_LONG_LONG #define VIM_SIZEOF_LONG 8 -#define LONG_LONG_MIN (-9223372036854775807-1) -#define LONG_LONG_MAX (9223372036854775807) +#define LONG_LONG_MIN (-9223372036854775807-1) +#define LONG_LONG_MAX (9223372036854775807) #define ULONG_LONG_MAX (18446744073709551615U) -#define XTHREADS #endif // Compiler specific diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2294, +/**/ 2293, /**/ 2292, diff --git a/src/vim9execute.c b/src/vim9execute.c --- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -3389,7 +3389,7 @@ ex_disassemble(exarg_T *eap) break; case ISN_EXECCONCAT: smsg("%4d EXECCONCAT %lld", current, - (long long)iptr->isn_arg.number); + (varnumber_T)iptr->isn_arg.number); break; case ISN_ECHO: { @@ -3402,15 +3402,15 @@ ex_disassemble(exarg_T *eap) break; case ISN_EXECUTE: smsg("%4d EXECUTE %lld", current, - (long long)(iptr->isn_arg.number)); + (varnumber_T)(iptr->isn_arg.number)); break; case ISN_ECHOMSG: smsg("%4d ECHOMSG %lld", current, - (long long)(iptr->isn_arg.number)); + (varnumber_T)(iptr->isn_arg.number)); break; case ISN_ECHOERR: smsg("%4d ECHOERR %lld", current, - (long long)(iptr->isn_arg.number)); + (varnumber_T)(iptr->isn_arg.number)); break; case ISN_LOAD: case ISN_LOADOUTER: @@ -3419,11 +3419,11 @@ ex_disassemble(exarg_T *eap) if (iptr->isn_arg.number < 0) smsg("%4d LOAD%s arg[%lld]", current, add, - (long long)(iptr->isn_arg.number + (varnumber_T)(iptr->isn_arg.number + STACK_FRAME_SIZE)); else smsg("%4d LOAD%s $%lld", current, add, - (long long)(iptr->isn_arg.number)); + (varnumber_T)(iptr->isn_arg.number)); } break; case ISN_LOADV: @@ -3496,10 +3496,10 @@ ex_disassemble(exarg_T *eap) if (iptr->isn_arg.number < 0) smsg("%4d STORE%s arg[%lld]", current, add, - (long long)(iptr->isn_arg.number + STACK_FRAME_SIZE)); + (varnumber_T)(iptr->isn_arg.number + STACK_FRAME_SIZE)); else smsg("%4d STORE%s $%lld", current, add, - (long long)(iptr->isn_arg.number)); + (varnumber_T)(iptr->isn_arg.number)); } break; case ISN_STOREV: @@ -3578,7 +3578,7 @@ ex_disassemble(exarg_T *eap) // constants case ISN_PUSHNR: smsg("%4d PUSHNR %lld", current, - (long long)(iptr->isn_arg.number)); + (varnumber_T)(iptr->isn_arg.number)); break; case ISN_PUSHBOOL: case ISN_PUSHSPEC: @@ -3653,11 +3653,11 @@ ex_disassemble(exarg_T *eap) break; case ISN_NEWLIST: smsg("%4d NEWLIST size %lld", current, - (long long)(iptr->isn_arg.number)); + (varnumber_T)(iptr->isn_arg.number)); break; case ISN_NEWDICT: smsg("%4d NEWDICT size %lld", current, - (long long)(iptr->isn_arg.number)); + (varnumber_T)(iptr->isn_arg.number)); break; // function call @@ -3924,10 +3924,10 @@ ex_disassemble(exarg_T *eap) smsg("%4d 2BOOL (!!val)", current); break; case ISN_2STRING: smsg("%4d 2STRING stack[%lld]", current, - (long long)(iptr->isn_arg.number)); + (varnumber_T)(iptr->isn_arg.number)); break; case ISN_2STRING_ANY: smsg("%4d 2STRING_ANY stack[%lld]", current, - (long long)(iptr->isn_arg.number)); + (varnumber_T)(iptr->isn_arg.number)); break; case ISN_RANGE: smsg("%4d RANGE %s", current, iptr->isn_arg.string); break;