| To: vim_dev@googlegroups.com |
| Subject: Patch 7.4.119 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| Mime-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| |
| Patch 7.4.119 |
| Problem: Vim doesn't work well on OpenVMS. |
| Solution: Fix various problems. (Samuel Ferencik) |
| Files: src/os_unix.c, src/os_unix.h, src/os_vms.c |
| |
| |
| |
| |
| |
| *** 168,174 **** |
| static pid_t wait4pid __ARGS((pid_t, waitstatus *)); |
| |
| static int WaitForChar __ARGS((long)); |
| ! #if defined(__BEOS__) |
| int RealWaitForChar __ARGS((int, long, int *)); |
| #else |
| static int RealWaitForChar __ARGS((int, long, int *)); |
| --- 168,174 ---- |
| static pid_t wait4pid __ARGS((pid_t, waitstatus *)); |
| |
| static int WaitForChar __ARGS((long)); |
| ! #if defined(__BEOS__) || defined(VMS) |
| int RealWaitForChar __ARGS((int, long, int *)); |
| #else |
| static int RealWaitForChar __ARGS((int, long, int *)); |
| |
| *** 435,441 **** |
| /* Process the queued netbeans messages. */ |
| netbeans_parse_messages(); |
| #endif |
| - #ifndef VMS /* VMS: must try reading, WaitForChar() does nothing. */ |
| /* |
| * We want to be interrupted by the winch signal |
| * or by an event on the monitored file descriptors. |
| --- 435,440 ---- |
| |
| *** 446,452 **** |
| handle_resize(); |
| return 0; |
| } |
| - #endif |
| |
| /* If input was put directly in typeahead buffer bail out here. */ |
| if (typebuf_changed(tb_change_cnt)) |
| --- 445,450 ---- |
| |
| *** 5039,5044 **** |
| --- 5037,5043 ---- |
| return avail; |
| } |
| |
| + #ifndef VMS |
| /* |
| * Wait "msec" msec until a character is available from file descriptor "fd". |
| * "msec" == 0 will check for characters once. |
| |
| *** 5338,5350 **** |
| } |
| # 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); |
| - # endif |
| # ifdef EINTR |
| if (ret == -1 && errno == EINTR) |
| { |
| --- 5337,5343 ---- |
| |
| *** 5466,5473 **** |
| return (ret > 0); |
| } |
| |
| - #ifndef VMS |
| - |
| #ifndef NO_EXPANDPATH |
| /* |
| * Expand a path into all matching files and/or directories. Handles "*", |
| --- 5459,5464 ---- |
| |
| |
| |
| *** 225,230 **** |
| --- 225,232 ---- |
| # include <starlet.h> |
| # include <socket.h> |
| # include <lib$routines.h> |
| + # include <libdef.h> |
| + # include <libdtdef.h> |
| |
| # ifdef FEAT_GUI_GTK |
| # include "gui_gtk_vms.h" |
| |
| |
| |
| *** 11,16 **** |
| --- 11,33 ---- |
| |
| #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 |
| { |
| char class; |
| |
| *** 669,671 **** |
| --- 686,777 ---- |
| } |
| 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 */ |
| + } |
| + } |
| + } |
| |
| |
| |
| *** 740,741 **** |
| --- 740,743 ---- |
| { /* Add new patch number below this line */ |
| + /**/ |
| + 119, |
| /**/ |
| |
| -- |
| It is hard to understand how a cemetery raised its burial |
| cost and blamed it on the cost of living. |
| |
| /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ |
| /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ |
| \\\ an exciting new programming language -- http://www.Zimbu.org /// |
| \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |