Author: andrewjlawrence
Branch: winconsoleio
Changeset: r97408:82be22839499
Date: 2019-09-08 22:16 +0100
http://bitbucket.org/pypy/pypy/changeset/82be22839499/

Log:    Added additional read methods

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
@@ -90,6 +90,7 @@
             buf = lltype.malloc(rwin32.CWCHARP, 1, flavor='raw')
             buf[0] = '\0'
             readlen = 0
+        return buf
     finally:
         lltype.free(buf, flavor='raw')
 
@@ -120,7 +121,6 @@
             return '\0'
         return _get_console_type(handle)
 
-    return None
     decoded = space.fsdecode_w(w_path_or_fd)
     if not decoded:
         return '\0'
@@ -190,9 +190,16 @@
         # pass
         
     def _copyfrombuf(self, buf, len):
-        # TODO implement me.
-        pass
-    
+        n = 0
+        while self.buf[0] and len:
+            buf[n] = self.buf[0]
+            for i in range(1, SMALLBUF):
+                self.buf[i-1] = self.buf[i]
+            self.buf[SMALLBUF-1] = 0
+            len -= 1
+            n += 1
+        return n
+
     @unwrap_spec(w_mode=WrappedDefault("r"), w_closefd=WrappedDefault(True), 
w_opener=WrappedDefault(None))
     def descr_init(self, space, w_nameobj, w_mode, w_closefd, w_opener):
         return None
@@ -415,7 +422,58 @@
             
             return space.newint(read_len)
             
-       
+    def read_w(self, space):
+        if self.handle == rwin32.INVALID_HANDLE_VALUE:
+            err_closed()
+        if !self.readable:
+            return err_mode("reading")
+
+        if size < 0:
+            return self.readall_w(space)
+
+        if size > BUFMAX:
+             raise oefmt(space.w_ValueError,
+                        "Cannot read more than %d bytes",
+                        BUFMAX)
+
+        w_buffer = space.call_function(space.w_bytearray, w_size)
+        w_bytes_size = self.readinto_w(space, w_buffer)
+        if w_bytes_size < 0:
+            return None
+        space.delslice(w_buffer, w_bytes_size, space.len(w_buffer))
+        
+        return space.w_bytes(w_buffer)
+
+    def readall_w(self, space):
+        if self.handle == rwin32.INVALID_HANDLE_VALUE:
+            err_closed()
+
+        bufsize = BUFSIZE
+        buf = lltype.malloc(rwin32.CWCHARP, bufsize + 1, flavor='raw')
+        len = 0
+        n = lltype.malloc(rwin32.CWCHARP, 1, flavor='raw')
+        n[0] = 0
+
+        try:
+            while True:
+                if len >= bufsize:
+                    if len > BUFMAX:
+                        break
+                    newsize = len
+                    if newsize < bufsize:
+                        raise oefmt(space.w_OverflowError,
+                                    "unbounded read returned more bytes "
+                                    "than a Python bytes object can hold")
+                    bufsize = newsize
+                    lltype.free(buf, flavor='raw')
+                    buf = lltype.malloc(rwin32.CWCHARP, bufsize + 1, 
flavor='raw')
+                    subbuf = read_console_w(self.handle, bufsize - len, n)
+                
+        finally:
+            lltype.free(buf, flavor='raw')            
+
+        pass
+
     def get_blksize(self,space):
         return space.newint(self.blksize)
         
@@ -427,7 +485,9 @@
     
     readable = interp2app(W_WinConsoleIO.readable_w),
     writable = interp2app(W_WinConsoleIO.writable_w),
-    isatty = interp2app(W_WinConsoleIO.isatty_w),
+    isatty   = interp2app(W_WinConsoleIO.isatty_w),
+    read     = interp2app(W_WinConsoleIO.read_w),
+    readall  = interp2app(W_WinConsoleIO.readall_w),
     readinto = interp2app(W_WinConsoleIO.readinto_w),
     
     _blksize = GetSetProperty(W_WinConsoleIO.get_blksize),
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to