0
0
mirror of https://github.com/vim/vim.git synced 2025-07-04 23:07:33 -04:00

updated for version 7.4.119

Problem:    Vim doesn't work well on OpenVMS.
Solution:   Fix various problems. (Samuel Ferencik)
This commit is contained in:
Bram Moolenaar 2013-12-11 17:12:37 +01:00
parent 1d633413e5
commit 4ffa07081f
4 changed files with 112 additions and 11 deletions

View File

@ -168,7 +168,7 @@ typedef int waitstatus;
static pid_t wait4pid __ARGS((pid_t, waitstatus *)); static pid_t wait4pid __ARGS((pid_t, waitstatus *));
static int WaitForChar __ARGS((long)); static int WaitForChar __ARGS((long));
#if defined(__BEOS__) #if defined(__BEOS__) || defined(VMS)
int RealWaitForChar __ARGS((int, long, int *)); int RealWaitForChar __ARGS((int, long, int *));
#else #else
static int RealWaitForChar __ARGS((int, long, int *)); static int RealWaitForChar __ARGS((int, long, int *));
@ -435,7 +435,6 @@ mch_inchar(buf, maxlen, wtime, tb_change_cnt)
/* Process the queued netbeans messages. */ /* Process the queued netbeans messages. */
netbeans_parse_messages(); netbeans_parse_messages();
#endif #endif
#ifndef VMS /* VMS: must try reading, WaitForChar() does nothing. */
/* /*
* We want to be interrupted by the winch signal * We want to be interrupted by the winch signal
* or by an event on the monitored file descriptors. * or by an event on the monitored file descriptors.
@ -446,7 +445,6 @@ mch_inchar(buf, maxlen, wtime, tb_change_cnt)
handle_resize(); handle_resize();
return 0; return 0;
} }
#endif
/* If input was put directly in typeahead buffer bail out here. */ /* If input was put directly in typeahead buffer bail out here. */
if (typebuf_changed(tb_change_cnt)) if (typebuf_changed(tb_change_cnt))
@ -5039,6 +5037,7 @@ WaitForChar(msec)
return avail; return avail;
} }
#ifndef VMS
/* /*
* Wait "msec" msec until a character is available from file descriptor "fd". * Wait "msec" msec until a character is available from file descriptor "fd".
* "msec" == 0 will check for characters once. * "msec" == 0 will check for characters once.
@ -5338,13 +5337,7 @@ select_eintr:
} }
# endif # endif
# ifdef OLD_VMS
/* Old VMS as v6.2 and older have broken select(). It waits more than
* required. Should not be used */
ret = 0;
# else
ret = select(maxfd + 1, &rfds, NULL, &efds, tvp); ret = select(maxfd + 1, &rfds, NULL, &efds, tvp);
# endif
# ifdef EINTR # ifdef EINTR
if (ret == -1 && errno == EINTR) if (ret == -1 && errno == EINTR)
{ {
@ -5466,8 +5459,6 @@ select_eintr:
return (ret > 0); return (ret > 0);
} }
#ifndef VMS
#ifndef NO_EXPANDPATH #ifndef NO_EXPANDPATH
/* /*
* Expand a path into all matching files and/or directories. Handles "*", * Expand a path into all matching files and/or directories. Handles "*",

View File

@ -225,6 +225,8 @@
# include <starlet.h> # include <starlet.h>
# include <socket.h> # include <socket.h>
# include <lib$routines.h> # include <lib$routines.h>
# include <libdef.h>
# include <libdtdef.h>
# ifdef FEAT_GUI_GTK # ifdef FEAT_GUI_GTK
# include "gui_gtk_vms.h" # include "gui_gtk_vms.h"

View File

@ -11,6 +11,23 @@
#include "vim.h" #include "vim.h"
/* define _generic_64 for use in time functions */
#ifndef VAX
# include <gen64def.h>
#else
/* 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... */
/* 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 short int gen64$w_word [4]; /* ...four 16-bit values */
} gen64$r_quad_overlay;
} GENERIC_64;
#endif
typedef struct typedef struct
{ {
char class; char class;
@ -669,3 +686,92 @@ vms_remove_version(void * fname)
} }
return ; return ;
} }
struct typeahead_st {
unsigned short numchars;
unsigned char firstchar;
unsigned char reserved0;
unsigned long reserved1;
} typeahead;
/*
* Wait "msec" msec until a character is available from file descriptor "fd".
* "msec" == 0 will check for characters once.
* "msec" == -1 will block until a character is available.
*/
int
RealWaitForChar(fd, msec, check_for_gpm)
int fd UNUSED; /* always read from iochan */
long msec;
int *check_for_gpm UNUSED;
{
int status;
struct _generic_64 time_curr;
struct _generic_64 time_diff;
struct _generic_64 time_out;
unsigned int convert_operation = LIB$K_DELTA_SECONDS_F;
float sec = (float) msec / 1000;
/* make sure the iochan is set */
if (!iochan)
get_tty();
if (msec > 0) {
/* time-out specified; convert it to absolute 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 */
status = lib$cvtf_to_internal_time(
&convert_operation, &sec, &time_diff);
if (status != LIB$_NORMAL)
return 0; /* error */
/* add them up */
status = lib$add_times(
&time_curr,
&time_diff,
&time_out);
if (status != LIB$_NORMAL)
return 0; /* error */
}
while (TRUE) {
/* select() */
status = sys$qiow(0, iochan, IO$_SENSEMODE | IO$M_TYPEAHDCNT, iosb,
0, 0, &typeahead, 8, 0, 0, 0, 0);
if (status != SS$_NORMAL || (iosb[0] & 0xFFFF) != SS$_NORMAL)
return 0; /* error */
if (typeahead.numchars)
return 1; /* ready to read */
/* there's nothing to read; what now? */
if (msec == 0) {
/* immediate time-out; return impatiently */
return 0;
}
else if (msec < 0) {
/* no time-out; wait on indefinitely */
continue;
}
else {
/* time-out needs to be checked */
status = sys$gettim(&time_curr);
if (status != SS$_NORMAL)
return 0; /* error */
status = lib$sub_times(
&time_out,
&time_curr,
&time_diff);
if (status != LIB$_NORMAL)
return 0; /* error, incl. time_diff < 0 (i.e. time-out) */
/* otherwise wait some more */
}
}
}

View File

@ -738,6 +738,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
119,
/**/ /**/
118, 118,
/**/ /**/