Listing 1

// Structures for the Open-RJ C-API
struct IORJAllocator
{
  /** Defines the "member" function for allocating memory */
  void *(*pfnAlloc)(IORJAllocator *ator, size_t cb);
  /** Defines the "member" function for reallocating memory */
  void *(*pfnRealloc)(IORJAllocator *ator, void *pv, size_t cb);
  /** Defines the "member" function for freeing memory */
  void (*pfnFree)(IORJAllocator *ator, void *pv);
};
struct ORJStringA
{
  /* The number of characters in the string */
  size_t      len;
  /* Pointer to the first element in the string */
  char const  *ptr;
};
struct ORJFieldA
{
  /* Reserved: must be 0 */
  size_t      mbz0;
  /* The field name */
  ORJStringA  name;
  /* The field value */
  ORJStringA  value;
  /* Reserved. Cannot be used by client code */
  void        *reserved0;
};
struct ORJRecordA
{
  /* Reserved: must be 0 */
  size_t    mbz0;
  /* The number of fields in the record */
  size_t    numFields;
  /* The field array */
  ORJFieldA *fields;
  /* Reserved. Cannot be used by client code */
  void      *reserved0;
};
struct ORJDatabaseA
{
  /* Reserved: must be 0 */
  size_t        mbz0;
  /* Holds the flags passed to function used to create database */
  size_t        flags;
  /* The number of lines in the database */
  size_t        numLines;
  /* The number of fields in the database */
  size_t        numFields;
  /* The record array */
  ORJFieldA     *fields;
  /* The number of records in the database */
  size_t        numRecords;
  /* The record array */
  ORJRecordA    *records;
  /* The allocator */
  IORJAllocator *ator;
};
struct ORJError
{
  /* Reserved: must not be accessed */
  size_t          reserved0;
  /* The line on which the parsing error was encountered */
  unsigned        invalidLine;
  /* The column on which the parsing error was encountered */
  unsigned        invalidColumn;
  /* The type of the parsing error */
  ORJ_PARSE_ERROR parseError;
};