comparison src/os_vms.c @ 5541:2f99966971b0 v7.4.119

updated for version 7.4.119 Problem: Vim doesn't work well on OpenVMS. Solution: Fix various problems. (Samuel Ferencik)
author Bram Moolenaar <bram@vim.org>
date Wed, 11 Dec 2013 17:12:37 +0100
parents 0b3be97064e5
children 47a673b20e49
comparison
equal deleted inserted replaced
5540:b82c264281a8 5541:2f99966971b0
8 * Do ":help credits" in Vim to see a list of people who contributed. 8 * Do ":help credits" in Vim to see a list of people who contributed.
9 * See README.txt for an overview of the Vim source code. 9 * See README.txt for an overview of the Vim source code.
10 */ 10 */
11 11
12 #include "vim.h" 12 #include "vim.h"
13
14 /* define _generic_64 for use in time functions */
15 #ifndef VAX
16 # include <gen64def.h>
17 #else
18 /* based on Alpha's gen64def.h; the file is absent on VAX */
19 typedef struct _generic_64 {
20 # pragma __nomember_alignment
21 __union { /* You can treat me as... */
22 /* long long is not available on VAXen */
23 /* unsigned __int64 gen64$q_quadword; ...a single 64-bit value, or */
24
25 unsigned int gen64$l_longword [2]; /* ...two 32-bit values, or */
26 unsigned short int gen64$w_word [4]; /* ...four 16-bit values */
27 } gen64$r_quad_overlay;
28 } GENERIC_64;
29 #endif
13 30
14 typedef struct 31 typedef struct
15 { 32 {
16 char class; 33 char class;
17 char type; 34 char type;
667 if ( *fp++ == '.' ) 684 if ( *fp++ == '.' )
668 *cp = '\0'; 685 *cp = '\0';
669 } 686 }
670 return ; 687 return ;
671 } 688 }
689
690 struct typeahead_st {
691 unsigned short numchars;
692 unsigned char firstchar;
693 unsigned char reserved0;
694 unsigned long reserved1;
695 } typeahead;
696
697 /*
698 * Wait "msec" msec until a character is available from file descriptor "fd".
699 * "msec" == 0 will check for characters once.
700 * "msec" == -1 will block until a character is available.
701 */
702 int
703 RealWaitForChar(fd, msec, check_for_gpm)
704 int fd UNUSED; /* always read from iochan */
705 long msec;
706 int *check_for_gpm UNUSED;
707 {
708 int status;
709 struct _generic_64 time_curr;
710 struct _generic_64 time_diff;
711 struct _generic_64 time_out;
712 unsigned int convert_operation = LIB$K_DELTA_SECONDS_F;
713 float sec = (float) msec / 1000;
714
715 /* make sure the iochan is set */
716 if (!iochan)
717 get_tty();
718
719 if (msec > 0) {
720 /* time-out specified; convert it to absolute time */
721
722 /* get current time (number of 100ns ticks since the VMS Epoch) */
723 status = sys$gettim(&time_curr);
724 if (status != SS$_NORMAL)
725 return 0; /* error */
726
727 /* construct the delta time */
728 status = lib$cvtf_to_internal_time(
729 &convert_operation, &sec, &time_diff);
730 if (status != LIB$_NORMAL)
731 return 0; /* error */
732
733 /* add them up */
734 status = lib$add_times(
735 &time_curr,
736 &time_diff,
737 &time_out);
738 if (status != LIB$_NORMAL)
739 return 0; /* error */
740 }
741
742 while (TRUE) {
743 /* select() */
744 status = sys$qiow(0, iochan, IO$_SENSEMODE | IO$M_TYPEAHDCNT, iosb,
745 0, 0, &typeahead, 8, 0, 0, 0, 0);
746 if (status != SS$_NORMAL || (iosb[0] & 0xFFFF) != SS$_NORMAL)
747 return 0; /* error */
748
749 if (typeahead.numchars)
750 return 1; /* ready to read */
751
752 /* there's nothing to read; what now? */
753 if (msec == 0) {
754 /* immediate time-out; return impatiently */
755 return 0;
756 }
757 else if (msec < 0) {
758 /* no time-out; wait on indefinitely */
759 continue;
760 }
761 else {
762 /* time-out needs to be checked */
763 status = sys$gettim(&time_curr);
764 if (status != SS$_NORMAL)
765 return 0; /* error */
766
767 status = lib$sub_times(
768 &time_out,
769 &time_curr,
770 &time_diff);
771 if (status != LIB$_NORMAL)
772 return 0; /* error, incl. time_diff < 0 (i.e. time-out) */
773
774 /* otherwise wait some more */
775 }
776 }
777 }