Author: andrewjlawrence
Branch: winconsoleio
Changeset: r97253:2626fc18dc10
Date: 2019-08-23 19:22 +0100
http://bitbucket.org/pypy/pypy/changeset/2626fc18dc10/

Log:    work in progress

diff --git a/pypy/module/_io/interp_win32consoleio.py 
b/pypy/module/_io/interp_win32consoleio.py
--- a/pypy/module/_io/interp_win32consoleio.py
+++ b/pypy/module/_io/interp_win32consoleio.py
@@ -28,8 +28,22 @@
 
 
 def read_console_w(handle, maxlen, readlen):
-    #TODO implement me
-    pass
+    err = 0
+    sig = 0
+    buf = lltype.malloc(rwin32.CWCHARP, maxlen, flavor='raw')
+    try:
+        if not buf:
+            return None
+        
+        off = 0
+        while off < maxlen:
+            n = rffi.cast(rwin32.DWORD, -1)
+            len = m
+    finally:
+        lltype.free(buf, flavor='raw')
+        
+        
+   
 
 def _get_console_type(handle):
     mode = lltype.malloc(rwin32.LPDWORD.TO,0,flavor='raw')
@@ -294,32 +308,63 @@
             raise oefmt(space.w_ValueError,
                         "cannot read more than %d bytes", BUFMAX)
                         
-        wlen = rffi.cast(rffi.DWORD, length / 4)
+        wlen = rffi.cast(rwin32.DWORD, length / 4)
         if not wlen:
             wlen = 1
             
-        read_len = _copyfrombuf(self, buf, rffi.cast(rffi.DWORD, length))
+        read_len = self._copyfrombuf(rwbuffer, rffi.cast(rwin32.DWORD, length))
         if read_len:
-            buf.setslice(read_len, length)
+            rwbuffer.setslice(read_len, length)
             length = length - read_len
             wlen = wlen - 1
             
         if length == read_len or not wlen:
-            return read_len
+            return space.newint(read_len)
             
         with lltype.scoped_alloc(rwin32.LPDWORD.TO, 1) as n:
             wbuf = read_console_w(self.handle, wlen , n)
             
             if not wbuf:
-                return -1
+                return space.newint(-1)
                 
             if n == 0:
-                return read_len
+                return space.newint(read_len)
                 
             u8n = 0
             
-            ##if len < 4:
+            if len < 4:
+                if rwin32.WideCharToMultiByte(rwin32.CP_UTF8,
+                                           0, wbuf, n, self.buf,
+                                           rffi.sizeof(self.buf)/ 
rffi.sizeof(self.buf[0]),
+                                           rffi.NULL, rffi.NULL):
+                    u8n = self._copyfrombuf(rwbuffer, len)
+                else:
+                    u8n = rwin32.WideCharToMultiByte(rwin32.CP_UTF8,
+                                                    0, wbuf, n, buf, len,
+                                                    rffi.NULL, rffi.NULL)
+                                                    
+            if u8n:
+                read_len += u8n
+                u8n = 0
+            else:
+                err = rwin32.GetLastError_saved()
+                if err == rwin32.ERROR_INSUFFICIENT_BUFFER:
+                    u8n = rwin32.WideCharToMultiByte(rwin32.CP_UTF8, 0, wbuf,
+                                                     n, rffi.NULL, 0, 
rffi.NULL, rffi.NULL)
                 
+            if u8n:
+                raise oefmt(space.w_ValueError,
+                        "Buffer had room for %d bytes but %d bytes required",
+                        len, u8n)
+                        
+            if err:
+                raise oefmt(space.w_WindowsError,
+                        err)
+            
+            if len < 0:
+                return None
+            
+            return space.newint(read_len)
             
        
     def get_blksize(self,space):
diff --git a/rpython/rlib/rwin32.py b/rpython/rlib/rwin32.py
--- a/rpython/rlib/rwin32.py
+++ b/rpython/rlib/rwin32.py
@@ -576,6 +576,8 @@
     GetNumberOfConsoleInputEvents = winexternal(
         'GetNumberOfConsoleInputEvents', [HANDLE, LPDWORD], BOOL)
 
+    ERROR_INSUFFICIENT_BUFFER = 122
+    CP_UTF8 = 65001 
     WideCharToMultiByte = winexternal(
         'WideCharToMultiByte', [rffi.UINT, DWORD, rffi.CWCHARP, rffi.INT,
                                 LPSTR, rffi.INT, rffi.CCHARP, LPBOOL], 
rffi.INT,
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to