To: vim_dev@googlegroups.com Subject: Patch 7.4.119 Fcc: outbox From: Bram Moolenaar 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 *** ../vim-7.4.118/src/os_unix.c 2013-12-11 13:21:44.000000000 +0100 --- src/os_unix.c 2013-12-11 16:16:03.000000000 +0100 *************** *** 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 ---- *** ../vim-7.4.118/src/os_unix.h 2013-06-12 20:09:44.000000000 +0200 --- src/os_unix.h 2013-12-11 16:16:03.000000000 +0100 *************** *** 225,230 **** --- 225,232 ---- # include # include # include + # include + # include # ifdef FEAT_GUI_GTK # include "gui_gtk_vms.h" *** ../vim-7.4.118/src/os_vms.c 2010-06-26 06:03:31.000000000 +0200 --- src/os_vms.c 2013-12-11 17:10:24.000000000 +0100 *************** *** 11,16 **** --- 11,33 ---- #include "vim.h" + /* define _generic_64 for use in time functions */ + #ifndef VAX + # include + #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 */ + } + } + } *** ../vim-7.4.118/src/version.c 2013-12-11 15:51:54.000000000 +0100 --- src/version.c 2013-12-11 16:09:16.000000000 +0100 *************** *** 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 ///