summaryrefslogtreecommitdiff
path: root/src/os_vms.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2006-02-27 23:58:35 +0000
committerBram Moolenaar <Bram@vim.org>2006-02-27 23:58:35 +0000
commit5e3cb7e8699f855193179a8cb799d1087f4a2ac9 (patch)
tree297e019074e2c2b85d5151701fcfae03bf02ceb9 /src/os_vms.c
parenteddf53b02e2b007208b19c74fb616be2c0839b36 (diff)
downloadvim-git-5e3cb7e8699f855193179a8cb799d1087f4a2ac9.tar.gz
updated for version 7.0209v7.0209
Diffstat (limited to 'src/os_vms.c')
-rw-r--r--src/os_vms.c43
1 files changed, 24 insertions, 19 deletions
diff --git a/src/os_vms.c b/src/os_vms.c
index ff3bf2c16..b1706fea3 100644
--- a/src/os_vms.c
+++ b/src/os_vms.c
@@ -298,33 +298,38 @@ vms_sys_status(int status)
int
vms_read(char *inbuf, size_t nbytes)
{
- int status, function, len;
- TT_MODE tt_mode;
- ITEM itmlst[3];
+ int status, function, len;
+ TT_MODE tt_mode;
+ ITEM itmlst[2]; /* terminates on everything */
static long trm_mask[8] = {-1, -1, -1, -1, -1, -1, -1, -1};
/* whatever happened earlier we need an iochan here */
if (!iochan)
- tt_mode = get_tty();
+ tt_mode = get_tty();
+
+ /* important: clean the inbuf */
+ memset(inbuf, 0, nbytes);
+ /* set up the itemlist for the first read */
vul_item(&itmlst[0], 0, TRM$_MODIFIERS,
- (char *)( TRM$M_TM_ESCAPE | TRM$M_TM_TIMED | TRM$M_TM_NOECHO |
- TRM$M_TM_NOEDIT | TRM$M_TM_NOFILTR |
- TRM$M_TM_NORECALL| TRM$M_TM_TRMNOECHO), 0);
- vul_item(&itmlst[1], 0, TRM$_TIMEOUT, (char *) 1, 0 );
- vul_item(&itmlst[2], sizeof(trm_mask), TRM$_TERM, (char *)&trm_mask, 0);
+ (char *)( TRM$M_TM_NOECHO | TRM$M_TM_NOEDIT |
+ TRM$M_TM_NOFILTR | TRM$M_TM_TRMNOECHO |
+ TRM$M_TM_NORECALL) , 0);
+ vul_item(&itmlst[1], sizeof(trm_mask), TRM$_TERM, (char *)&trm_mask, 0);
+ /* wait forever for a char */
function = (IO$_READLBLK | IO$M_EXTEND);
- memset(inbuf, 0, nbytes);
+ status = sys$qiow(0, iochan, function, &iosb, 0, 0,
+ inbuf, nbytes-1, 0, 0, &itmlst, sizeof(itmlst));
+ len = strlen(inbuf); /* how many chars we got? */
+
+ /* read immedatelly the rest in the IO queue */
+ function = (IO$_READLBLK | IO$M_TIMED | IO$M_ESCAPE | IO$M_NOECHO | IO$M_NOFILTR);
+ status = sys$qiow(0, iochan, function, &iosb, 0, 0,
+ inbuf+len, nbytes-1-len, 0, 0, 0, 0);
+
+ len = strlen(inbuf); /* return the total length */
- for (;;)
- {
- status = sys$qiow(0, iochan, function, &iosb, 0, 0, inbuf, nbytes - 1,
- 0, 0, &itmlst, sizeof(itmlst));
- len = strlen(inbuf);
- if (len > 0)
- break;
- }
return len;
}
@@ -510,7 +515,7 @@ vms_unix_mixed_filespec(char *in, char *out)
/* start of directory portion */
ch = *in;
- if ((ch == '[') || (ch == '/') || (ch == '<') ) { /* start of directory(s) ? */
+ if ((ch == '[') || (ch == '/') || (ch == '<')) { /* start of directory(s) ? */
ch = '[';
SKIP_FOLLOWING_SLASHES(in);
} else if (EQN(in, "../", 3)) { /* Unix parent directory? */