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