268 lines
7.9 KiB
C
268 lines
7.9 KiB
C
|
/*---------------------------------------------------------------------------*
|
||
|
| PDFlib - A library for generating PDF on the fly |
|
||
|
+---------------------------------------------------------------------------+
|
||
|
| Copyright (c) 1997-2006 Thomas Merz and PDFlib GmbH. All rights reserved. |
|
||
|
+---------------------------------------------------------------------------+
|
||
|
| |
|
||
|
| This software is subject to the PDFlib license. It is NOT in the |
|
||
|
| public domain. Extended versions and commercial licenses are |
|
||
|
| available, please check http://www.pdflib.com. |
|
||
|
| |
|
||
|
*---------------------------------------------------------------------------*/
|
||
|
|
||
|
/* $Id: pc_string.h,v 1.2 2008-10-20 14:35:00 guy Exp $
|
||
|
*
|
||
|
* The core string classes.
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
#ifndef PC_STRING_H
|
||
|
#define PC_STRING_H
|
||
|
|
||
|
#include "pc_core.h"
|
||
|
|
||
|
/* there are two pdcore string classes. the structures "behind"
|
||
|
** these classes are opaque. conceptually, pdc_bstr objects are
|
||
|
** sequences of 'pdc_byte' (unsigned 8-bit entities), whereas
|
||
|
** pdc_ustr objects are sequences of 'pdc_ucval' ("unicode value";
|
||
|
** unsigned 32-bit entities).
|
||
|
*/
|
||
|
#ifndef PDC_STRINGS_DEFINED
|
||
|
#define PDC_STRINGS_DEFINED
|
||
|
typedef struct pdc_bstr_s pdc_bstr; /* byte strings */
|
||
|
typedef struct pdc_ustr_s pdc_ustr; /* unicode strings */
|
||
|
#endif
|
||
|
|
||
|
|
||
|
/* TODO: naming conventions for "per module" init/cleanup */
|
||
|
void pdc_init_strings(pdc_core *pdc);
|
||
|
void pdc_cleanup_strings(pdc_core *pdc);
|
||
|
|
||
|
|
||
|
/************************************************************************/
|
||
|
/* */
|
||
|
/* string object construction and deletion. */
|
||
|
/* */
|
||
|
/************************************************************************/
|
||
|
|
||
|
/* convert raw memory into an (empty) string object.
|
||
|
*/
|
||
|
void pdc_bs_boot(pdc_core *pdc, pdc_bstr *s);
|
||
|
void pdc_us_boot(pdc_core *pdc, pdc_ustr *s);
|
||
|
|
||
|
/* release all resources allocated by a string object (if any).
|
||
|
*/
|
||
|
void pdc_bs_shutdown(pdc_bstr *s);
|
||
|
void pdc_us_shutdown(pdc_ustr *s);
|
||
|
|
||
|
/* allocate a new (empty) pdc_bstr object.
|
||
|
*/
|
||
|
pdc_bstr *pdc_bs_new(pdc_core *pdc);
|
||
|
|
||
|
/* allocate a new pdc_ustr object and initialize its contents with the
|
||
|
** 'n' values from 'src'. if 'src' is null or 'n' is zero,
|
||
|
** an empty string object is constructed.
|
||
|
*/
|
||
|
pdc_ustr *pdc_us_new(pdc_core *pdc, const pdc_ucval *src, size_t n);
|
||
|
|
||
|
/* TODO: more constructors for various "source" types, eg.
|
||
|
**
|
||
|
pdc_ustr *pdc_us_new_utf16(pdc_core *pdc, const pdc_ushort *src, size_t n);
|
||
|
pdc_ustr *pdc_us_new_utf8(pdc_core *pdc, const pdc_byte *src, size_t n);
|
||
|
*/
|
||
|
|
||
|
/* return a copy of string 'src' ("copy constructor").
|
||
|
*/
|
||
|
pdc_bstr *pdc_bs_dup(const pdc_bstr *src);
|
||
|
pdc_ustr *pdc_us_dup(const pdc_ustr *src);
|
||
|
|
||
|
/* delete a string object explicitly ("destructor").
|
||
|
*/
|
||
|
void pdc_bs_delete(pdc_bstr *s);
|
||
|
void pdc_us_delete(pdc_ustr *s);
|
||
|
|
||
|
/************************************************************************/
|
||
|
/* */
|
||
|
/* "getters". */
|
||
|
/* */
|
||
|
/************************************************************************/
|
||
|
|
||
|
/* get the length of a string object in bytes or unicode values, resp.
|
||
|
*/
|
||
|
size_t pdc_bs_length(const pdc_bstr *s);
|
||
|
size_t pdc_us_length(const pdc_ustr *s);
|
||
|
|
||
|
/* string component access (range checked).
|
||
|
*/
|
||
|
pdc_byte pdc_bs_get(const pdc_bstr *s, int idx);
|
||
|
pdc_ucval pdc_us_get(const pdc_ustr *s, int idx);
|
||
|
|
||
|
/* TODO: try to get rid of that. */
|
||
|
const pdc_byte *pdc_bs_get_cptr(const pdc_bstr *s);
|
||
|
const pdc_byte *pdc_us_get_cptr(const pdc_ustr *s);
|
||
|
|
||
|
/************************************************************************/
|
||
|
/* */
|
||
|
/* "modifiers". */
|
||
|
/* */
|
||
|
/************************************************************************/
|
||
|
|
||
|
/* copy 'src' to 'dst' ("assignment operator").
|
||
|
*/
|
||
|
void pdc_bs_copy(pdc_bstr *dst, const pdc_bstr *src);
|
||
|
void pdc_us_copy(pdc_ustr *dst, const pdc_ustr *src);
|
||
|
|
||
|
/* copy part of 'src' to 'dst'.
|
||
|
*/
|
||
|
void pdc_bs_substr(pdc_bstr *dst, const pdc_bstr *src,
|
||
|
size_t pos, size_t len);
|
||
|
void pdc_us_substr(pdc_ustr *dst, const pdc_ustr *src,
|
||
|
size_t pos, size_t len);
|
||
|
|
||
|
/* insert 'src' into 'dst' at 'pos'.
|
||
|
*/
|
||
|
void pdc_bs_insert(pdc_bstr *dst, const pdc_bstr *src, size_t pos);
|
||
|
void pdc_us_insert(pdc_ustr *dst, const pdc_ustr *src, size_t pos);
|
||
|
|
||
|
/* append 'src' to 'dst'.
|
||
|
*/
|
||
|
void pdc_bs_concat(pdc_bstr *dst, const pdc_bstr *src);
|
||
|
void pdc_us_concat(pdc_ustr *dst, const pdc_ustr *src);
|
||
|
|
||
|
/* string component access (range checked).
|
||
|
*/
|
||
|
void pdc_bs_set(pdc_bstr *s, int idx, pdc_byte val);
|
||
|
void pdc_us_set(pdc_ustr *s, int idx, pdc_ucval val);
|
||
|
|
||
|
/* case conversion.
|
||
|
*/
|
||
|
void pdc_bs_tolower(pdc_bstr *s);
|
||
|
void pdc_bs_toupper(pdc_bstr *s);
|
||
|
|
||
|
/************************************************************************/
|
||
|
/* */
|
||
|
/* stream-like functions. */
|
||
|
/* */
|
||
|
/************************************************************************/
|
||
|
|
||
|
/* append 'n' values from 'src' to 'dst'. if 'n' is zero,
|
||
|
** or 'src' is null, 'dst' remains unchanged.
|
||
|
*/
|
||
|
void pdc_bs_write(pdc_bstr *dst, const pdc_byte *src, size_t n);
|
||
|
|
||
|
/* append the null terminated string 'src' to 'dst'.
|
||
|
*/
|
||
|
void pdc_bs_puts(pdc_bstr *dst, const pdc_byte *src);
|
||
|
|
||
|
/* append 'n' values from 'src' to 'dst'. if 'src' is null or 'n'
|
||
|
** is zero, 'dst' remains unchanged.
|
||
|
*/
|
||
|
void pdc_us_write(pdc_ustr *dst, const pdc_ucval *src, size_t n);
|
||
|
|
||
|
void pdc_us_write_utf16(pdc_ustr *dst, const pdc_ushort *src, size_t n);
|
||
|
|
||
|
/* TODO: more writer functions for various "source" types, eg.
|
||
|
**
|
||
|
void pdc_us_write_utf8(pdc_ustr *dst, const pdc_byte *src, size_t n);
|
||
|
*/
|
||
|
|
||
|
/* reset 's' to an empty stream object.
|
||
|
*/
|
||
|
void pdc_bs_rewrite(pdc_bstr *s);
|
||
|
void pdc_us_rewrite(pdc_ustr *s);
|
||
|
|
||
|
/* append a single byte (or unicode value, resp.) to a string object.
|
||
|
*/
|
||
|
void pdc_bs_putc(pdc_bstr *s, pdc_byte val);
|
||
|
void pdc_us_putc(pdc_ustr *s, pdc_ucval val);
|
||
|
|
||
|
/* TODO: stream-like read access. again, the read functions for pdc_ustr
|
||
|
** objects will be available in several flavors in order to support
|
||
|
** conversion to various "external" formats.
|
||
|
**
|
||
|
void pdc_bs_reset(pdc_bstr *s);
|
||
|
void pdc_us_reset(pdc_ustr *s);
|
||
|
void pdc_bs_seek(pdc_bstr *s, size_t pos);
|
||
|
void pdc_us_seek(pdc_ustr *s, size_t pos);
|
||
|
size_t pdc_bs_tell(const pdc_bstr *s);
|
||
|
size_t pdc_us_tell(const pdc_ustr *s);
|
||
|
size_t pdc_bs_read(pdc_bstr *src, pdc_byte *dst, size_t n);
|
||
|
size_t pdc_us_read(pdc_ustr *src, pdc_ucval *dst, size_t n);
|
||
|
size_t pdc_us_read_utf16(pdc_ustr *src, pdc_ushort *dst, size_t n);
|
||
|
size_t pdc_us_read_utf8(pdc_ustr *src, pdc_byte *dst, size_t n);
|
||
|
*/
|
||
|
|
||
|
/************************************************************************/
|
||
|
/* */
|
||
|
/* other utilities. */
|
||
|
/* */
|
||
|
/************************************************************************/
|
||
|
|
||
|
int pdc_bs_compare(const pdc_bstr *s1, const pdc_bstr *s2);
|
||
|
|
||
|
/************************************************************************/
|
||
|
/* */
|
||
|
/* PRIVATE SECTION */
|
||
|
/* */
|
||
|
/* the declarations below are strictly private to the implementation */
|
||
|
/* module, and must not be used by any client modules! */
|
||
|
/* */
|
||
|
/************************************************************************/
|
||
|
|
||
|
#define PDC_STR_INLINE_CAP 16
|
||
|
|
||
|
struct pdc_bstr_s
|
||
|
{
|
||
|
pdc_core * pdc;
|
||
|
|
||
|
pdc_byte buf0[PDC_STR_INLINE_CAP];
|
||
|
pdc_byte * buf;
|
||
|
size_t len;
|
||
|
size_t cap;
|
||
|
};
|
||
|
|
||
|
struct pdc_ustr_s
|
||
|
{
|
||
|
pdc_core * pdc;
|
||
|
|
||
|
pdc_ucval buf0[PDC_STR_INLINE_CAP];
|
||
|
pdc_ucval * buf;
|
||
|
size_t len;
|
||
|
size_t cap;
|
||
|
};
|
||
|
|
||
|
#if 0
|
||
|
/* string representation.
|
||
|
*/
|
||
|
typedef struct
|
||
|
{
|
||
|
pdc_byte * buf; /* contents */
|
||
|
size_t cap; /* capacity (unit: pdc_byte) */
|
||
|
size_t len; /* length (unit: pdc_byte) */
|
||
|
int ref; /* reference count */
|
||
|
} pdc_bs_rep;
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
pdc_ucval * buf; /* contents */
|
||
|
size_t cap; /* capacity (unit: pdc_ucval) */
|
||
|
size_t len; /* length (unit: pdc_ucval) */
|
||
|
int ref; /* reference count */
|
||
|
} pdc_us_rep;
|
||
|
|
||
|
|
||
|
struct pdc_bstr_s
|
||
|
{
|
||
|
pdc_core * pdc;
|
||
|
pdc_bs_rep *rep;
|
||
|
};
|
||
|
|
||
|
struct pdc_ustr_s
|
||
|
{
|
||
|
pdc_core * pdc;
|
||
|
pdc_us_rep *rep;
|
||
|
};
|
||
|
#endif
|
||
|
|
||
|
#endif /* PC_STRING_H */
|