winedos / Small stdin and stderr fix

Jukka Heinonen jhei at iki.fi
Fri May 9 13:28:23 CDT 2003


This patch makes 4dos.com console handling work correctly.




Changelog:
  Make read from stdin use buffered input code and
  redirect stderr to console.




Index: dlls/winedos/int21.c
===================================================================
RCS file: /home/wine/wine/dlls/winedos/int21.c,v
retrieving revision 1.31
diff -u -r1.31 int21.c
--- dlls/winedos/int21.c	6 May 2003 00:12:52 -0000	1.31
+++ dlls/winedos/int21.c	9 May 2003 18:22:50 -0000
@@ -291,37 +291,23 @@
 /***********************************************************************
  *           INT21_BufferedInput
  *
- * Handler for function 0x0a.
+ * Handler for function 0x0a and reading from console using
+ * function 0x3f.
  *
  * Reads a string of characters from standard input until
- * enter key is pressed.
+ * enter key is pressed. Returns either number of characters 
+ * read from console including terminating CR or 
+ * zero if capacity was zero.
  */
-static void INT21_BufferedInput( CONTEXT86 *context )
+static WORD INT21_BufferedInput( CONTEXT86 *context, BYTE *ptr, WORD capacity )
 {
-    BYTE *ptr = CTX_SEG_OFF_TO_LIN(context,
-                                   context->SegDs,
-                                   context->Edx);
-    BYTE capacity = ptr[0]; /* includes CR */
-    BYTE length = 0;        /* excludes CR */
-
-    TRACE( "BUFFERED INPUT (size=%d)\n", capacity );
+    BYTE length = 0;
 
     /*
      * Return immediately if capacity is zero.
-     *
-     * FIXME: What to return to application?
      */
     if (capacity == 0)
-        return;
-
-    /*
-     * FIXME: Some documents state that
-     *        ptr[1] holds number of chars from last input which 
-     *        may be recalled on entry, other documents do not mention
-     *        this at all.
-     */
-    if (ptr[1])
-        TRACE( "Handle old chars in buffer!\n" );
+        return 0;
 
     while(TRUE)
     {
@@ -337,9 +323,8 @@
              */
             DOSVM_PutChar( '\r' );
             DOSVM_PutChar( '\n' );
-            ptr[1] = length;
-            ptr[2 + length] = '\r';
-            return;
+            ptr[length] = '\r';
+            return length + 1;
         }
 
         /*
@@ -355,7 +340,7 @@
         if (ascii != 0 && length < capacity-1)
         {
             DOSVM_PutChar( ascii );
-            ptr[2 + length] = ascii;
+            ptr[length] = ascii;
             length++;
         }
     }
@@ -1408,7 +1393,33 @@
         break;
 
     case 0x0a: /* BUFFERED INPUT */
-        INT21_BufferedInput( context );
+        {
+            BYTE *ptr = CTX_SEG_OFF_TO_LIN(context,
+                                           context->SegDs,
+                                           context->Edx);
+            WORD result;
+
+            TRACE( "BUFFERED INPUT (size=%d)\n", ptr[0] );
+
+            /*
+             * FIXME: Some documents state that
+             *        ptr[1] holds number of chars from last input which 
+             *        may be recalled on entry, other documents do not mention
+             *        this at all.
+             */
+            if (ptr[1])
+                TRACE( "Handle old chars in buffer!\n" );
+
+            /*
+             * ptr[0] - capacity (includes terminating CR)
+             * ptr[1] - characters read (excludes terminating CR)
+             */
+            result = INT21_BufferedInput( context, ptr + 2, ptr[0] );
+            if (result > 0)
+                ptr[1] = (BYTE)result - 1;
+            else
+                ptr[1] = 0;
+        }
         break;
 
     case 0x0b: /* GET STDIN STATUS */
@@ -1789,8 +1800,13 @@
              *        does not work as it is supposed to work.
              */
 
-            if (ReadFile( DosFileHandleToWin32Handle(BX_reg(context)),
-                          buffer, count, &result, NULL ))
+            if (!DOSVM_IsWin16() && BX_reg(context) == 0)
+            {
+                result = INT21_BufferedInput( context, buffer, count );
+                SET_AX( context, (WORD)result );
+            }
+            else if (ReadFile( DosFileHandleToWin32Handle(BX_reg(context)),
+                               buffer, count, &result, NULL ))
                 SET_AX( context, (WORD)result );
             else
                 bSetDOSExtendedError = TRUE;
@@ -1804,7 +1820,8 @@
         {
             BYTE *ptr = CTX_SEG_OFF_TO_LIN(context, context->SegDs, context->Edx);
 
-            if (!DOSVM_IsWin16() && BX_reg(context) == 1)
+            if (!DOSVM_IsWin16() && 
+                (BX_reg(context) == 1 || BX_reg(context) == 2))
             {
                 int i;
                 for(i=0; i<CX_reg(context); i++)



-- 
Jukka Heinonen <http://www.iki.fi/jhei/>



More information about the wine-patches mailing list