3131class StringIO :
3232 def __init__ (self , buf = '' ):
3333 self .buf = buf
34+ self .len = len (buf )
35+ self .buflist = []
3436 self .pos = 0
3537 self .closed = 0
3638 self .softspace = 0
@@ -41,25 +43,34 @@ def close(self):
4143 def isatty (self ):
4244 return 0
4345 def seek (self , pos , mode = 0 ):
46+ if self .buflist :
47+ self .buf = self .buf + string .joinfields (self .buflist , '' )
48+ self .buflist = []
4449 if mode == 1 :
4550 pos = pos + self .pos
4651 elif mode == 2 :
47- pos = pos + len ( self .buf )
52+ pos = pos + self .len
4853 self .pos = max (0 , pos )
4954 def tell (self ):
5055 return self .pos
5156 def read (self , n = - 1 ):
57+ if self .buflist :
58+ self .buf = self .buf + string .joinfields (self .buflist , '' )
59+ self .buflist = []
5260 if n < 0 :
53- newpos = len ( self .buf )
61+ newpos = self .len
5462 else :
55- newpos = min (self .pos + n , len ( self .buf ) )
63+ newpos = min (self .pos + n , self .len )
5664 r = self .buf [self .pos :newpos ]
5765 self .pos = newpos
5866 return r
5967 def readline (self ):
68+ if self .buflist :
69+ self .buf = self .buf + string .joinfields (self .buflist , '' )
70+ self .buflist = []
6071 i = string .find (self .buf , '\n ' , self .pos )
6172 if i < 0 :
62- newpos = len ( self .buf )
73+ newpos = self .len
6374 else :
6475 newpos = i + 1
6576 r = self .buf [self .pos :newpos ]
@@ -74,16 +85,28 @@ def readlines(self):
7485 return lines
7586 def write (self , s ):
7687 if not s : return
77- if self .pos > len (self .buf ):
78- self .buf = self .buf + '\0 ' * (self .pos - len (self .buf ))
88+ if self .pos > self .len :
89+ self .buflist .append ('\0 ' * (self .pos - self .len ))
90+ self .len = self .pos
7991 newpos = self .pos + len (s )
80- self .buf = self .buf [:self .pos ] + s + self .buf [newpos :]
92+ if self .pos < self .len :
93+ if self .buflist :
94+ self .buf = self .buf + string .joinfields (self .buflist , '' )
95+ self .buflist = []
96+ self .buflist = [self .buf [:self .pos ], s , self .buf [newpos :]]
97+ self .buf = ''
98+ else :
99+ self .buflist .append (s )
100+ self .len = newpos
81101 self .pos = newpos
82102 def writelines (self , list ):
83103 self .write (string .joinfields (list , '' ))
84104 def flush (self ):
85105 pass
86106 def getvalue (self ):
107+ if self .buflist :
108+ self .buf = self .buf + string .joinfields (self .buflist , '' )
109+ self .buflist = []
87110 return self .buf
88111
89112
0 commit comments