.. highlightlang:: c

.. _marshalling-utils:

Data marshalling support
========================

These routines allow C code to work with serialized objects using the same
data format as the :mod:`marshal` module.  There are functions to write data
into the serialization format, and additional functions that can be used to
read the data back.  Files used to store marshalled data must be opened in
binary mode.

Numeric values are stored with the least significant byte first.

The module supports two versions of the data format: version 0 is the
historical version, version 1 (new in Python 2.4) shares interned strings in
the file, and upon unmarshalling.  Version 2 (new in Python 2.5) uses a binary
format for floating point numbers.  *Py_MARSHAL_VERSION* indicates the current
file format (currently 2).


.. c:function:: void PyMarshal_WriteLongToFile(long value, FILE *file, int version)

   Marshal a :c:type:`long` integer, *value*, to *file*.  This will only write
   the least-significant 32 bits of *value*; regardless of the size of the
   native :c:type:`long` type.

   .. versionchanged:: 2.4
      *version* indicates the file format.


.. c:function:: void PyMarshal_WriteObjectToFile(PyObject *value, FILE *file, int version)

   Marshal a Python object, *value*, to *file*.

   .. versionchanged:: 2.4
      *version* indicates the file format.


.. c:function:: PyObject* PyMarshal_WriteObjectToString(PyObject *value, int version)

   Return a string object containing the marshalled representation of *value*.

   .. versionchanged:: 2.4
      *version* indicates the file format.


The following functions allow marshalled values to be read back in.

XXX What about error detection?  It appears that reading past the end of the
file will always result in a negative numeric value (where that's relevant),
but it's not clear that negative values won't be handled properly when there's
no error.  What's the right way to tell? Should only non-negative values be
written using these routines?


.. c:function:: long PyMarshal_ReadLongFromFile(FILE *file)

   Return a C :c:type:`long` from the data stream in a :c:type:`FILE\*` opened
   for reading.  Only a 32-bit value can be read in using this function,
   regardless of the native size of :c:type:`long`.


.. c:function:: int PyMarshal_ReadShortFromFile(FILE *file)

   Return a C :c:type:`short` from the data stream in a :c:type:`FILE\*` opened
   for reading.  Only a 16-bit value can be read in using this function,
   regardless of the native size of :c:type:`short`.


.. c:function:: PyObject* PyMarshal_ReadObjectFromFile(FILE *file)

   Return a Python object from the data stream in a :c:type:`FILE\*` opened for
   reading.  On error, sets the appropriate exception (:exc:`EOFError` or
   :exc:`TypeError`) and returns *NULL*.


.. c:function:: PyObject* PyMarshal_ReadLastObjectFromFile(FILE *file)

   Return a Python object from the data stream in a :c:type:`FILE\*` opened for
   reading.  Unlike :c:func:`PyMarshal_ReadObjectFromFile`, this function
   assumes that no further objects will be read from the file, allowing it to
   aggressively load file data into memory so that the de-serialization can
   operate from data in memory rather than reading a byte at a time from the
   file.  Only use these variant if you are certain that you won't be reading
   anything else from the file.  On error, sets the appropriate exception
   (:exc:`EOFError` or :exc:`TypeError`) and returns *NULL*.


.. c:function:: PyObject* PyMarshal_ReadObjectFromString(char *string, Py_ssize_t len)

   Return a Python object from the data stream in a character buffer
   containing *len* bytes pointed to by *string*.  On error, sets the
   appropriate exception (:exc:`EOFError` or :exc:`TypeError`) and returns
   *NULL*.

   .. versionchanged:: 2.5
      This function used an :c:type:`int` type for *len*. This might require
      changes in your code for properly supporting 64-bit systems.
