mirror of
https://bitbucket.org/librepilot/librepilot.git
synced 2024-12-05 13:24:11 +01:00
117 lines
3.0 KiB
C
117 lines
3.0 KiB
C
|
/*
|
||
|
# This file is Copyright 2003, 2006, 2007, 2009, 2010 Dean Hall.
|
||
|
#
|
||
|
# This file is part of the PyMite VM.
|
||
|
# The PyMite VM is free software: you can redistribute it and/or modify
|
||
|
# it under the terms of the GNU GENERAL PUBLIC LICENSE Version 2.
|
||
|
#
|
||
|
# The PyMite VM is distributed in the hope that it will be useful,
|
||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||
|
# A copy of the GNU GENERAL PUBLIC LICENSE Version 2
|
||
|
# is seen in the file COPYING in this directory.
|
||
|
*/
|
||
|
|
||
|
|
||
|
#ifndef __TUPLE_H__
|
||
|
#define __TUPLE_H__
|
||
|
|
||
|
|
||
|
/**
|
||
|
* \file
|
||
|
* \brief Tuple Object Type
|
||
|
*
|
||
|
* Tuple object type header.
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* Tuple obj
|
||
|
*
|
||
|
* Immutable ordered sequence. Contains array of ptrs to objs.
|
||
|
*/
|
||
|
typedef struct PmTuple_s
|
||
|
{
|
||
|
/** Object descriptor */
|
||
|
PmObjDesc_t od;
|
||
|
|
||
|
/**
|
||
|
* Length of tuple
|
||
|
* I don't expect a tuple to ever exceed 255 elements,
|
||
|
* but if I set this type to int8_t, a 0-element tuple
|
||
|
* is too small to be allocated.
|
||
|
*/
|
||
|
int16_t length;
|
||
|
|
||
|
/** Array of ptrs to objs */
|
||
|
pPmObj_t val[1];
|
||
|
} PmTuple_t,
|
||
|
*pPmTuple_t;
|
||
|
|
||
|
|
||
|
#define tuple_copy(src, dest) tuple_replicate((src), 1, (dest))
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Creates a Tuple by loading a tuple image from memory.
|
||
|
*
|
||
|
* Obtain space for tuple from the heap.
|
||
|
* Load all objs within the tuple img.
|
||
|
* Leave contents of paddr pointing one byte past end of
|
||
|
* last obj in tuple.
|
||
|
*
|
||
|
* The tuple image has the following structure:
|
||
|
* -type: S8 - OBJ_TYPE_TUPLE
|
||
|
* -length U8 - N number of objects in the tuple.
|
||
|
* N objects follow in the stream.
|
||
|
*
|
||
|
* @param memspace Memory space.
|
||
|
* @param paddr Ptr to ptr to tuple in memspace
|
||
|
* @param r_ptuple Return by reference; new filled tuple
|
||
|
* @return Return status
|
||
|
*/
|
||
|
PmReturn_t tuple_loadFromImg(PmMemSpace_t memspace,
|
||
|
uint8_t const **paddr, pPmObj_t *r_ptuple);
|
||
|
|
||
|
/**
|
||
|
* Allocates space for a new Tuple. Returns a pointer to the tuple.
|
||
|
*
|
||
|
* @param n the number of elements the tuple will contain
|
||
|
* @param r_ptuple Return by ref, ptr to new tuple
|
||
|
* @return Return status
|
||
|
*/
|
||
|
PmReturn_t tuple_new(uint16_t n, pPmObj_t *r_ptuple);
|
||
|
|
||
|
/**
|
||
|
* Replicates a tuple, n number of times to create a new tuple
|
||
|
*
|
||
|
* Copies the pointers (not the objects).
|
||
|
*
|
||
|
* @param ptup Ptr to source tuple.
|
||
|
* @param n Number of times to replicate the tuple.
|
||
|
* @param r_ptuple Return arg; Ptr to new tuple.
|
||
|
* @return Return status
|
||
|
*/
|
||
|
PmReturn_t tuple_replicate(pPmObj_t ptup, int16_t n, pPmObj_t *r_ptuple);
|
||
|
|
||
|
/**
|
||
|
* Gets the object in the tuple at the index.
|
||
|
*
|
||
|
* @param ptup Ptr to tuple obj
|
||
|
* @param index Index into tuple
|
||
|
* @param r_pobj Return by reference; ptr to item
|
||
|
* @return Return status
|
||
|
*/
|
||
|
PmReturn_t tuple_getItem(pPmObj_t ptup, int16_t index, pPmObj_t *r_pobj);
|
||
|
|
||
|
#ifdef HAVE_PRINT
|
||
|
/**
|
||
|
* Prints out a tuple. Uses obj_print() to print elements.
|
||
|
*
|
||
|
* @param pobj Object to print.
|
||
|
* @return Return status
|
||
|
*/
|
||
|
PmReturn_t tuple_print(pPmObj_t pobj);
|
||
|
#endif /* HAVE_PRINT */
|
||
|
|
||
|
#endif /* __TUPLE_H__ */
|