summaryrefslogtreecommitdiff
path: root/liba2ps/dstring.h
blob: 43fba254ac686ad3481ecbc021f0abc508dbf9b7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/* dstring.h - dynamic string handling include file, requires strings.h
   Copyright 1988-2017 Free Software Foundation, Inc.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3, or (at your option)
   any later version.

   This program 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.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
   02110-1301, USA.  */

#ifndef DSTRING_H_
# define DSTRING_H_

extern int ds_exit_error;	/* exit value when encounters an error	*
				 * default is EXIT_FAILURE		*/


/* How the automatic resizing should work */
enum ds_growth {
  ds_steady,		/* Take care of it by yourself	*/
  ds_linear,		/* size += increment		*/
  ds_geometrical	/* size *= increment		*/
};

/* A dynamic string consists of record that records the size of an
   allocated string and the pointer to that string.  The actual string
   is a normal zero byte terminated string that can be used with the
   usual string functions.  The major difference is that the
   dynamic_string routines know how to get more space if it is needed
   by allocating new space and copying the current string.  */

struct dstring {
  size_t len;		/* Really used					*/
  enum ds_growth growth;/* See above					*/
  size_t increment;	/* See above					*/
  size_t size; 		/* Actual amount of storage allocated.		*/
  size_t original_size;	/* size given at creation			*/
  char *content;	/* String. 					*/
} ;


/* Macros that look similar to the original string functions.
   WARNING:  These macros work only on pointers to dynamic string records.
   If used with a real record, an "&" must be used to get the pointer.  */
#define ds_strcmp(s1, s2)	strcmp ((s1)->string, (s2)->string)
#define ds_strncmp(s1, s2, n)	strncmp ((s1)->string, (s2)->string, n)
#define ds_index(s, c)		index ((s)->string, c)
#define ds_rindex(s, c)		rindex ((s)->string, c)

/*
 * Maintaining
 */
struct dstring *
ds_new (size_t size,
		enum ds_growth growth, size_t increment);
void ds_erase (struct dstring *string);
void ds_print_stats (struct dstring * str, FILE * stream);
void ds_resize (struct dstring *string, size_t size);
void ds_grow (struct dstring *string);



/*
 * Testing
 */
int ds_is_full (struct dstring *string);



/*
 * Usual string manipulations
 */
void ds_strcat (struct dstring *s, char *t);
void ds_strncat (struct dstring *s, char *t, size_t n);
void ds_strccat (struct dstring *s, char c);

/*
 * Sprintf variations
 */
/* Sprintf in the dstring, resizing if necessary */
_GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM(2, 0)
void ds_vsprintf (struct dstring *s, const char *format,
                  va_list args);
/* sprintf at the end of the dstring, resize if necessary */
_GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM(2, 0)
void ds_cat_vsprintf (struct dstring *s, const char *format,
                      va_list args);
/* Same as the two previous, but much less care is taken to
 * make sure the dstring is big enough */
_GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM(2, 0)
void ds_unsafe_vsprintf (struct dstring *s, const char *format,
                         va_list args);
_GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM(2, 0)
void ds_unsafe_cat_vsprintf (struct dstring *s, const char *format,
                             va_list args);

/* Same as the previous, but with variable num of args */
_GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM(2, 3)
void ds_sprintf (struct dstring *s, const char *format, ...);
/* Like sprintf, but not too much carre is taken for length */
_GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM(2, 3)
void ds_unsafe_sprintf (struct dstring *s, const char *format, ...);
_GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM(2, 3)
void ds_cat_sprintf (struct dstring *s, const char *format, ...);
/* Like sprintf, but not too much care is taken for length */
_GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM(2, 3)
void ds_unsafe_cat_sprintf (struct dstring *s, const char *format, ...);

/*
 * Dealing with files
 */
char *ds_getline (struct dstring *s, FILE * stream);
char *ds_getdelim (struct dstring *s, char eos, FILE * stream);

#endif /* _DSTRING_H_ */