diff src/os_vms.c @ 694:07d199fe02ed v7.0209

updated for version 7.0209
author vimboss
date Mon, 27 Feb 2006 23:58:35 +0000
parents aa550d9d2403
children b526e10493b1
line wrap: on
line diff
--- 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();
 
-    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);
-
-    function = (IO$_READLBLK | IO$M_EXTEND);
+    /* important: clean the inbuf */
     memset(inbuf, 0, nbytes);
 
-    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;
-    }
+    /* set up the itemlist for the first read */
+    vul_item(&itmlst[0], 0, TRM$_MODIFIERS,
+         (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);
+    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 */
+
     return len;
 }
 
@@ -510,7 +515,7 @@ vms_unix_mixed_filespec(char *in, char *
 
     /* 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? */