1/* $Id$ $Revision$ */
2/* vim:set shiftwidth=4 ts=8: */
3
4/*************************************************************************
5 * Copyright (c) 2011 AT&T Intellectual Property
6 * All rights reserved. This program and the accompanying materials
7 * are made available under the terms of the Eclipse Public License v1.0
8 * which accompanies this distribution, and is available at
9 * http://www.eclipse.org/legal/epl-v10.html
10 *
11 * Contributors: See CVS logs. Details at http://www.graphviz.org/
12 *************************************************************************/
13
14#ifdef __cplusplus
15extern "C" {
16#endif
17
18#ifndef AGXBUF_H
19#define AGXBUF_H
20
21#ifdef _WIN32
22# ifdef EXPORT_AGXBUF
23# define AGXBUF_API __declspec(dllexport)
24# else
25# define AGXBUF_API __declspec(dllimport)
26# endif
27#else
28# define AGXBUF_API extern
29#endif
30
31/* Extensible buffer:
32 * Malloc'ed memory is never released until agxbfree is called.
33 */
34 typedef struct {
35 unsigned char *buf; /* start of buffer */
36 unsigned char *ptr; /* next place to write */
37 unsigned char *eptr; /* end of buffer */
38 int dyna; /* true if buffer is malloc'ed */
39 } agxbuf;
40
41/* agxbinit:
42 * Initializes new agxbuf; caller provides memory.
43 * Assume if init is non-null, hint = sizeof(init[])
44 */
45 AGXBUF_API void agxbinit(agxbuf * xb, unsigned int hint,
46 unsigned char *init);
47
48/* agxbput_n:
49 * Append string s of length n into xb
50 */
51 AGXBUF_API size_t agxbput_n(agxbuf * xb, const char *s, size_t n);
52
53/* agxbput:
54 * Append string s into xb
55 */
56 AGXBUF_API size_t agxbput(agxbuf * xb, const char *s);
57
58/* agxbfree:
59 * Free any malloced resources.
60 */
61 AGXBUF_API void agxbfree(agxbuf * xb);
62
63/* agxbpop:
64 * Removes last character added, if any.
65 */
66 AGXBUF_API int agxbpop(agxbuf * xb);
67
68/* agxbmore:
69 * Expand buffer to hold at least ssz more bytes.
70 */
71 AGXBUF_API int agxbmore(agxbuf * xb, size_t ssz);
72
73/* agxbputc:
74 * Add character to buffer.
75 * int agxbputc(agxbuf*, char)
76 */
77#define agxbputc(X,C) ((((X)->ptr >= (X)->eptr) ? agxbmore(X,1) : 0), (void)(*(X)->ptr++ = ((unsigned char)C)))
78
79/* agxbuse:
80 * Null-terminates buffer; resets and returns pointer to data;
81 * char* agxbuse(agxbuf* xb)
82 */
83#define agxbuse(X) ((void)agxbputc(X,'\0'),(char*)((X)->ptr = (X)->buf))
84
85/* agxbstart:
86 * Return pointer to beginning of buffer.
87 * char* agxbstart(agxbuf* xb)
88 */
89#define agxbstart(X) ((char*)((X)->buf))
90
91/* agxblen:
92 * Return number of characters currently stored.
93 * int agxblen(agxbuf* xb)
94 */
95#define agxblen(X) (((X)->ptr)-((X)->buf))
96
97/* agxbclear:
98 * Resets pointer to data;
99 * void agxbclear(agxbuf* xb)
100 */
101#define agxbclear(X) ((void)((X)->ptr = (X)->buf))
102
103/* agxbnext:
104 * Next position for writing.
105 * char* agxbnext(agxbuf* xb)
106 */
107#define agxbnext(X) ((char*)((X)->ptr))
108
109#endif
110
111#ifdef __cplusplus
112}
113#endif
114