14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"""Generate the skeleton for cStringIO as an example of framer.""" 24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom framer.bases import Module, Type 44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom framer.member import member 54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass cStringIO(Module): 74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """A simple fast partial StringIO replacement. 84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm This module provides a simple useful replacement for the StringIO 104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm module that is written in C. It does not provide the full 114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm generality of StringIO, but it provides enough for most 124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm applications and is especially useful in conjunction with the 134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pickle module. 144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Usage: 164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm from cStringIO import StringIO 184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm an_output_stream = StringIO() 204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm an_output_stream.write(some_stuff) 214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ... 224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm value = an_output_stream.getvalue() 234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm an_input_stream = StringIO(a_string) 254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm spam = an_input_stream.readline() 264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm spam = an_input_stream.read(5) 274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm an_input_stream.seek(0) # OK, start over 284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm spam = an_input_stream.read() # and read it all 294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm __file__ = "cStringIO.c" 324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def StringIO(o): 344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Return a StringIO-like stream for reading or writing""" 354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm StringIO.pyarg = "|O" 364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class InputType(Type): 384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "Simple type for treating strings as input file streams" 394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm abbrev = "input" 414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm struct = """\ 434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm typedef struct { 444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject_HEAD 454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *buf; 464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int pos; 474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int size; 484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *pbuf; 494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } InputObject; 504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def flush(self): 534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Does nothing""" 544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def getvalue(self): 564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Get the string value. 574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm If use_pos is specified and is a true value, then the 594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm string returned will include only the text up to the 604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm current file position. 614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def isatty(self): 644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Always returns False""" 654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def read(self, s): 674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Return s characters or the rest of the string.""" 684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm read.pyarg = "|i" 694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def readline(self): 714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Read one line.""" 724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def readlines(self, hint): 744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Read all lines.""" 754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm readlines.pyarg = "|i" 764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def reset(self): 784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Reset the file position to the beginning.""" 794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def tell(self): 814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Get the current position.""" 824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def truncate(self, pos): 844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Truncate the file at the current position.""" 854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm truncate.pyarg = "|i" 864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def seek(self, position, mode=0): 884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Set the current position. 894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm The optional mode argument can be 0 for absolute, 1 for relative, 914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm and 2 for relative to EOF. The default is absolute. 924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm seek.pyarg = "i|i" 944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def close(self): 964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass 974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class OutputType(InputType): 994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "Simple type for output strings." 1004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm abbrev = "output" 1024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm struct = """\ 1044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm typedef struct { 1054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject_HEAD 1064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *buf; 1074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int pos; 1084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int size; 1094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int softspace; 1104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } OutputObject; 1114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 1124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm softspace = member() 1144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def close(self): 1164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Explicitly release resources.""" 1174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def write(self, s): 1194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Write a string to the file.""" 1204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # XXX Hack: writing None resets the buffer 1214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def writelines(self, lines): 1234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Write each string in lines.""" 1244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmcStringIO.gen() 127