"""Generate the skeleton for cStringIO as an example of framer."""

from framer.bases import Module, Type
from framer.member import member

class cStringIO(Module):
    """A simple fast partial StringIO replacement.

    This module provides a simple useful replacement for the StringIO
    module that is written in C.  It does not provide the full
    generality of StringIO, but it provides enough for most
    applications and is especially useful in conjunction with the
    pickle module.

    Usage:

    from cStringIO import StringIO

    an_output_stream = StringIO()
    an_output_stream.write(some_stuff)
    ...
    value = an_output_stream.getvalue()

    an_input_stream = StringIO(a_string)
    spam = an_input_stream.readline()
    spam = an_input_stream.read(5)
    an_input_stream.seek(0)             # OK, start over
    spam = an_input_stream.read()       # and read it all
    """

    __file__ = "cStringIO.c"

    def StringIO(o):
        """Return a StringIO-like stream for reading or writing"""
    StringIO.pyarg = "|O"

    class InputType(Type):
        "Simple type for treating strings as input file streams"

        abbrev = "input"

        struct = """\
        typedef struct {
                PyObject_HEAD
                char *buf;
                int pos;
                int size;
                PyObject *pbuf;
        } InputObject;
        """

        def flush(self):
            """Does nothing"""

        def getvalue(self):
            """Get the string value.

            If use_pos is specified and is a true value, then the
            string returned will include only the text up to the
            current file position.
            """

        def isatty(self):
            """Always returns False"""

        def read(self, s):
            """Return s characters or the rest of the string."""
        read.pyarg = "|i"

        def readline(self):
            """Read one line."""

        def readlines(self, hint):
            """Read all lines."""
        readlines.pyarg = "|i"

        def reset(self):
            """Reset the file position to the beginning."""

        def tell(self):
            """Get the current position."""

        def truncate(self, pos):
            """Truncate the file at the current position."""
        truncate.pyarg = "|i"

        def seek(self, position, mode=0):
            """Set the current position.

            The optional mode argument can be 0 for absolute, 1 for relative,
            and 2 for relative to EOF.  The default is absolute.
            """
        seek.pyarg = "i|i"

        def close(self):
            pass

    class OutputType(InputType):
        "Simple type for output strings."

        abbrev = "output"

        struct = """\
        typedef struct {
                PyObject_HEAD
                char *buf;
                int pos;
                int size;
                int softspace;
        } OutputObject;
        """

        softspace = member()

        def close(self):
            """Explicitly release resources."""

        def write(self, s):
            """Write a string to the file."""
            # XXX Hack: writing None resets the buffer

        def writelines(self, lines):
            """Write each string in lines."""


cStringIO.gen()
