1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2024-11-29 07:24:13 +01:00
LibrePilot/flight/libraries/PyMite/vm/strobj.h
2013-04-25 13:13:36 +03:00

223 lines
6.6 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 __STRING_H__
#define __STRING_H__
/**
* \file
* \brief String Object Type
*
* String object type header.
*/
/** Set to nonzero to enable string cache. DO NOT REMOVE THE DEFINITION. */
#define USE_STRING_CACHE 1
/**
* Loads a string from image
*
* @param ms memoryspace paddr points to
* @param paddr address in memoryspace of source string
* @param r_pstring Return by reference; a new string object
* @return Return status
*/
#define string_loadFromImg(ms, paddr, r_pstring) \
string_create((ms), (paddr), (int16_t)-1, (int16_t)1, (r_pstring))
/**
* Creates String object from character array in RAM
*
* @param paddr pointer to address of source string
* @param r_pstring Return arg; addr of ptr to string
*/
#define string_new(paddr, r_pstring) \
string_create(MEMSPACE_RAM, (uint8_t const **)(paddr), 0, (int16_t)1, (r_pstring))
/**
* Creates String object from character array in RAM which may contain
* embedded null characters.
*
* @param paddr pointer to address of source string
* @param len length of source string
* @param r_pstring Return arg; addr of ptr to string
*/
#define string_newWithLen(paddr, len, r_pstring) \
string_create(MEMSPACE_RAM, (uint8_t const **)(paddr), (len), (int16_t)1, \
(r_pstring))
/**
* Creates String object by replicating an existing C string, n times
*
* @param paddr pointer to address of source string
* @param n number of times to replicate the source string
* @param r_pstring Return arg; addr of ptr to string
*/
#define string_replicate(paddr, n, r_pstring) \
string_create(MEMSPACE_RAM, (paddr), (uint8_t)0, (n), (r_pstring))
/***************************************************************
* Types
**************************************************************/
/**
* String obj
*
* Null terminated array of chars.
*/
typedef struct PmString_s
{
/** Object descriptor */
PmObjDesc_t od;
/** Length of string */
uint16_t length;
#if USE_STRING_CACHE
/** Ptr to next string in cache */
struct PmString_s *next;
#endif /* USE_STRING_CACHE */
/**
* Null-term char array
*
* Use length 1 here so that string-alloc function can use
* "sizeof(PmString_t) + len" and there will be room for the null-term
*/
uint8_t val[1];
} PmString_t,
*pPmString_t;
/***************************************************************
* Prototypes
**************************************************************/
/**
* Creates a new String obj.
* If len is less than zero, load from a String image.
* If len is zero, copy from a C string (which has a null terminator)
* If len is positive, copy as many chars as given in the len argument
* A string image has the following structure:
* -type: int8 - OBJ_TYPE_STRING
* -length: uint16 - number of bytes in the string
* -val: uint8[] - array of chars with null term
*
* Returns by reference a ptr to String obj.
*
* Obtain space for String from the heap.
* Copy string from memspace.
* Leave contents of paddr pointing one byte past end of str.
*
* THE PROGRAMMER SHOULD NOT CALL THIS FUNCTION DIRECTLY.
* Instead, use one of the two macros string_loadFromImg()
* or string_new().
*
* @param memspace memory space where *paddr points
* @param paddr ptr to ptr to null term character array or image.
* @param len length of the C character array
* (use -1 for string images, 0 for C strings)
* @param n Number of times to replicate the given string argument
* @param r_pstring Return by reference; ptr to String obj
* @return Return status
*/
PmReturn_t string_create(PmMemSpace_t memspace, uint8_t const **paddr,
int16_t len, int16_t n, pPmObj_t *r_pstring);
/**
* Creates a new String object from a single character.
*
* @param c The character to become the string
* @param r_pstring Return by reference; ptr to String obj
* @return Return status
*/
PmReturn_t string_newFromChar(uint8_t const c, pPmObj_t *r_pstring);
/**
* Compares two String objects for equality.
*
* @param pstr1 Ptr to first string
* @param pstr2 Ptr to second string
* @return C_SAME if the strings are equivalent, C_DIFFER otherwise
*/
int8_t string_compare(pPmString_t pstr1, pPmString_t pstr2);
#ifdef HAVE_PRINT
/**
* Sends out a string object bytewise. Escaping and framing is configurable
* via is_escaped.
*
* @param pstr Ptr to string object
* @param is_escaped If 0, print out string as is. Otherwise escape unprintable
* characters and surround string with single quotes.
* @return Return status
*/
PmReturn_t string_print(pPmObj_t pstr, uint8_t is_escaped);
#endif /* HAVE_PRINT */
/**
* Clears the string cache if one exists.
* Called by heap_init()
*
* @return Return status
*/
PmReturn_t string_cacheInit(void);
/** Returns a pointer to the base of the string cache */
PmReturn_t string_getCache(pPmString_t **r_ppstrcache);
/**
* Returns a new string object that is the concatenation
* of the two given strings.
*
* @param pstr1 First source string
* @param pstr2 Second source string
* @param r_pstring Return arg; ptr to new string object
* @return Return status
*/
PmReturn_t
string_concat(pPmString_t pstr1, pPmString_t pstr2, pPmObj_t *r_pstring);
#ifdef HAVE_STRING_FORMAT
/**
* Returns a new string object that is created from the given format string
* and the argument(s).
*
* @param pstr Format string object
* @param parg Single argument or tuple of arguments
* @param r_pstring Return arg; ptr to new string object
* @return Return status
*/
PmReturn_t string_format(pPmString_t pstr, pPmObj_t parg, pPmObj_t *r_pstring);
/**
* Prints n bytes, formatting them if is_escaped is true
*
* @param pb Pointer to C bytes
* @param is_escaped Boolean true if string is to be escaped
* @param n Number of bytes to print
* @return Return status
*/
PmReturn_t string_printFormattedBytes(uint8_t *pb,
uint8_t is_escaped,
uint16_t n);
#endif /* HAVE_STRING_FORMAT */
#endif /* __STRING_H__ */