1
1
/* strbuf.h - The string buffer data-structure.
3
* Copyright (C) 2001 Oskar Liljeblad
5
* This file is part of the file renaming utilities (renameutils)
8
* This software is copyrighted work licensed under the terms of the
9
* GNU General Public License. Please consult the file `COPYING' for
17
#include <sys/types.h>
25
* A buffer holding any characters of any length, even null-bytes.
26
* The buffer is however always null-terminated.
28
* A user may modify any characters in the buffer.
31
void strbuf_append_char(char **buf, char ch);
32
void strbuf_append(char **buf, const char *string);
33
int strbuf_appendf(char **buf, const char *format, ...);
35
void strbuf_insert_char(char **buf, uint32_t offset, char ch);
36
void strbuf_insert(char **buf, uint32_t offset, const char *string);
37
int strbuf_insertf(char **buf, uint32_t offset, const char *format, ...);
39
#define strbuf_prepend_char(buf,ch) strbuf_insert_char(buf,0,ch)
40
#define strbuf_prepend(buf,string) strbuf_append(buf,string)
41
#define strbuf_appendf(buf,format,...) strbuf_appendf(buf,format,__VA_ARGS__)
43
void strbuf_delete(char **buf, uint32_t start, uint32_t end);
44
void strbuf_delete_char(char **buf, uint32_t index);
45
void strbuf_replace(char **buf, uint32_t start, uint32_t end, const char *string);
47
uint32_t strbuf_length(char **buf); /* strlen won't check beyond nullbytes */
48
void strbuf_set_length(char **buf, uint32_t new_length);
49
void strbuf_update_length(char **buf);
50
uint32_t strbuf_capacity(char **buf);
51
void strbuf_ensure_capacity(char **buf, uint32_t minimum_capacity);
53
char *strbuf_new(void);
54
char *strbuf_new_with_capacity(uint32_t capacity);
55
char *strbuf_new_from_string(const char *str);
57
void strbuf_free(char **buf);
58
char *strbuf_free_to_string(char **buf);
60
char *strbuf_substring_to_end(char **buf, uint32_t beginIndex);
61
char *strbuf_substring(char **buf, uint32_t beginIndex, uint32_t endIndex);
62
void strbuf_get_chars(char **buf, uint32_t src_offset, uint32_t src_end, char *dst, uint32_t dst_offset);
63
char *strbuf_to_string(char **buf);
65
void strbuf_set(char **buf, const char *string);
66
int strbuf_setf(char **buf, const char *format, ...);
68
void strbuf_replace_substring(char **buf, uint32_t start, uint32_t end,
69
const char *string, uint32_t substart, uint32_t subend);
70
char *strbuf_new_from_substring(const char *string, uint32_t substart,
72
void strbuf_insert_substring(char **buf, uint32_t offset, const char *string,
73
uint32_t substart, uint32_t subend);
74
void strbuf_append_substring(char **buf, const char *string,
75
uint32_t substart, uint32_t subend);
76
#define strbuf_prepend_substring(buf,string,substart,subend) \
77
strbuf_insert_substring(buf,0,string,substart,subend)
79
char *strbuf_new_from_substring_to_end(const char *string, uint32_t substart);
80
void strbuf_insert_substring_to_end(char **buf, uint32_t offset,
81
const char *string, uint32_t substart);
82
void strbuf_append_substring_to_end(char **buf, const char *string,
84
#define strbuf_prepend_substring_to_end(buf,string,substart) \
85
strbuf_insert_substring_to_end(buf,0,string,substart)
88
strbuf_char_at(char **buf, uint32_t index)
94
strbuf_set_char_at(char **buf, uint32_t index, char ch)
100
strbuf_clear(char **buf)
102
strbuf_set_length(buf, 0);
3
* Copyright (C) 2004, 2005 Oskar Liljeblad
5
* This program is free software; you can redistribute it and/or modify
6
* it under the terms of the GNU General Public License as published by
7
* the Free Software Foundation; either version 2 of the License, or
8
* (at your option) any later version.
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU Library General Public License for more details.
15
* You should have received a copy of the GNU General Public License along
16
* with this program; if not, write to the Free Software Foundation,
17
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20
/* TODO: add datatype (many functions): strbuf_substring / substrbuf */
25
#include <stdint.h> /* Gnulib/C99 */
26
#include <stdarg.h> /* C89 */
28
typedef struct _StrBuf StrBuf;
36
void strbuf_free(StrBuf *sb);
37
#define strbuf_free_to_string(sb) strbuf_free_to_substring(sb,0,-1)
38
char *strbuf_free_to_substring(StrBuf *sb, int32_t sp, int32_t ep);
40
StrBuf *strbuf_new(void);
41
StrBuf *strbuf_new_with_capacity(uint32_t capacity);
43
#define strbuf_new_from_char(chr) strbuf_new_from_char_n(1,chr)
44
#define strbuf_new_from_string(str) strbuf_new_from_substring(str,0,-1)
45
#define strbuf_new_from_data(mem,len) strbuf_new_from_data_n(str,1,mem,len)
46
#define strbuf_new_from_strbuf(strbuf) strbuf_new_from_strbuf_n(1,strbuf)
47
#define strbuf_new_from_substring(str,ssp,sep) strbuf_new_from_substring_n(1,str,ssp,sep)
48
#define strbuf_newf(fmt...) strbuf_newf_n(1,fmt)
49
#define strbuf_vnewf(fmt,ap) strbuf_vnewf_n(1,fmt,ap)
50
StrBuf *strbuf_new_from_char_n(uint32_t times, char ch);
51
#define strbuf_new_from_string_n(n,str) strbuf_new_from_substring_n(n,str,0,-1)
52
StrBuf *strbuf_new_from_substring_n(uint32_t times, const char *str, int32_t sp, int32_t ep);
53
StrBuf *strbuf_new_from_data_n(uint32_t times, const void *mem, uint32_t len);
54
StrBuf *strbuf_newf_n(uint32_t times, const char *fmt, ...) __attribute__ ((format (printf, 2, 3)));
55
StrBuf *strbuf_vnewf_n(uint32_t times, const char *fmt, va_list ap) __attribute__ ((format (printf, 2, 0)));
57
#define strbuf_append_char(sb,chr) strbuf_append_char_n(sb,1,chr)
58
#define strbuf_append(sb,str) strbuf_append_n(sb,1,str)
59
#define strbuf_append_data(sb,mem,len) strbuf_append_data_n(sb,1,mem,len)
60
#define strbuf_append_strbuf(sb,strbuf) strbuf_append_strbuf_n(sb,1,strbuf)
61
#define strbuf_append_substring(sb,str,ssp,sep) strbuf_append_substring_n(sb,1,str,ssp,sep)
62
#define strbuf_appendf(sb,fmt...) strbuf_appendf_n(sb,1,fmt)
63
#define strbuf_vappendf(sb,fmt,ap) strbuf_vappendf_n(sb,1,fmt,ap)
64
#define strbuf_append_char_n(sb,n,chr) strbuf_replace_char_n(sb,-1,-1,n,chr)
65
#define strbuf_append_n(sb,n,str) strbuf_replace_n(sb,-1,-1,n,str)
66
#define strbuf_append_data_n(sb,n,mem,len) strbuf_replace_data_n(sb,-1,-1,n,mem,len)
67
#define strbuf_append_strbuf_n(sb,n,strbuf) strbuf_replace_strbuf_n(sb,-1,-1,n,strbuf)
68
#define strbuf_append_substring_n(sb,n,str,ssp,sep) strbuf_replace_substring_n(sb,-1,-1,n,str,ssp,sep)
69
#define strbuf_appendf_n(sb,n,fmt...) strbuf_replacef_n(sb,-1,-1,n,fmt)
70
#define strbuf_vappendf_n(sb,n,fmt,ap) strbuf_vreplacef_n(sb,-1,-1,n,fmt,ap)
72
#define strbuf_prepend_char(sb,chr) strbuf_prepend_char_n(sb,1,chr)
73
#define strbuf_prepend(sb,str) strbuf_prepend_n(sb,1,str)
74
#define strbuf_prepend_data(sb,mem,len) strbuf_prepend_data_n(sb,1,mem,len)
75
#define strbuf_prepend_strbuf(sb,strbuf) strbuf_prepend_strbuf_n(sb,1,strbuf)
76
#define strbuf_prepend_substring(sb,str,ssp,sep) strbuf_prepend_substring_n(sb,1,str,ssp,sep)
77
#define strbuf_prependf(sb,fmt...) strbuf_prependf_n(sb,1,fmt)
78
#define strbuf_vprependf(sb,fmt,ap) strbuf_vprependf_n(sb,1,fmt,ap)
79
#define strbuf_prepend_char_n(sb,n,chr) strbuf_replace_char_n(sb,0,0,n,chr)
80
#define strbuf_prepend_n(sb,n,str) strbuf_replace_n(sb,0,0,n,str)
81
#define strbuf_prepend_data_n(sb,n,mem,len) strbuf_replace_data_n(sb,0,0,n,mem,len)
82
#define strbuf_prepend_strbuf_n(sb,n,strbuf) strbuf_replace_strbuf_n(sb,0,0,n,strbuf)
83
#define strbuf_prepend_substring_n(sb,n,str,ssp,sep) strbuf_replace_substring_n(sb,0,0,n,str,ssp,sep)
84
#define strbuf_prependf_n(sb,n,fmt...) strbuf_replacef_n(sb,0,0,n,fmt)
85
#define strbuf_vprependf_n(sb,n,fmt,ap) strbuf_vreplacef_n(sb,0,0,n,fmt,ap)
87
#define strbuf_insert_char(sb,sp,chr) strbuf_insert_char_n(sb,sp,1,chr)
88
#define strbuf_insert(sb,sp,str) strbuf_insert_n(sb,sp,1,str)
89
#define strbuf_insert_data(sb,sp,mem,len) strbuf_insert_data_n(sb,sp,1,mem,len)
90
#define strbuf_insert_strbuf(sb,sp,strbuf) strbuf_insert_strbuf_n(sb,sp,1,strbuf)
91
#define strbuf_insert_substring(sb,sp,str,ssp,sep) strbuf_insert_substring_n(sb,sp,1,str,ssp,sep)
92
#define strbuf_insertf(sb,sp,fmt...) strbuf_insertf_n(sb,sp,1,fmt)
93
#define strbuf_vinsertf(sb,sp,fmt,ap) strbuf_vinsertf_n(sb,sp,1,fmt,ap)
94
#define strbuf_insert_char_n(sb,sp,n,chr) strbuf_replace_char_n(sb,sp,sp,n,chr)
95
#define strbuf_insert_n(sb,sp,n,str) strbuf_replace_n(sb,sp,sp,n,str)
96
#define strbuf_insert_data_n(sb,sp,n,mem,len) strbuf_replace_data_n(sb,sp,sp,n,mem,len)
97
#define strbuf_insert_strbuf_n(sb,sp,n,strbuf) strbuf_replace_strbuf_n(sb,sp,sp,n,strbuf)
98
#define strbuf_insert_substring_n(sb,sp,n,str,ssp,sep) strbuf_replace_substring_n(sb,sp,sp,n,str,ssp,sep)
99
#define strbuf_insertf_n(sb,sp,n,fmt...) strbuf_replacef_n(sb,sp,sp,n,fmt)
100
#define strbuf_vinsertf_n(sb,sp,n,fmt,ap) strbuf_vreplacef_n(sb,sp,sp,n,fmt,ap)
102
#define strbuf_set_char(sb,chr) strbuf_set_char_n(sb,1,chr)
103
#define strbuf_set(sb,str) strbuf_set_n(sb,1,str)
104
#define strbuf_set_data(sb,mem,len) strbuf_set_data_n(sb,1,mem,len)
105
#define strbuf_set_strbuf(sb,strbuf) strbuf_set_strbuf(sb,1,strbuf)
106
#define strbuf_set_substring(sb,str,ssp,sep) strbuf_set_substring_n(sb,1,str,ssp,sep)
107
#define strbuf_setf(sb,fmt...) strbuf_setf_n(sb,1,fmt)
108
#define strbuf_vsetf(sb,fmt,ap) strbuf_vsetf_n(sb,1,fmt,ap)
109
#define strbuf_set_char_n(sb,n,chr) strbuf_replace_char_n(sb,0,-1,n,chr)
110
#define strbuf_set_n(sb,n,str) strbuf_replace_n(sb,0,-1,n,str)
111
#define strbuf_set_data_n(sb,n,mem,len) strbuf_replace_data_n(sb,0,-1,n,mem,len)
112
#define strbuf_set_strbuf_n(sb,n,strbuf) strbuf_replace_strbuf_n(sb,0,-1,n,strbuf)
113
#define strbuf_set_substring_n(sb,n,str,ssp,sep) strbuf_replace_substring_n(sb,0,-1,n,str,ssp,sep)
114
#define strbuf_setf_n(sb,n,fmt...) strbuf_replacef_n(sb,0,-1,n,fmt)
115
#define strbuf_vsetf_n(sb,n,fmt,ap) strbuf_vreplacef_n(sb,0,-1,n,fmt,ap)
117
#define strbuf_replace_char(sb,sp,ep,ch) strbuf_replace_char_n(sb,sp,ep,1,ch)
118
#define strbuf_replace(sb,sp,ep,str) strbuf_replace_n(sb,sp,ep,1,str)
119
#define strbuf_replace_data(sb,sp,ep,mem,len) strbuf_replace_data_n(sb,sp,ep,1,mem,len)
120
#define strbuf_replace_strbuf(sb,sp,ep,strbuf) strbuf_replace_data_n(sb,sp,ep,1,strbuf_buffer(strbuf),strbuf_length(strbuf))
121
#define strbuf_replace_substring(sb,sp,ep,str,ssp,sep) strbuf_replace_substring_n(sb,sp,ep,1,str,ssp,sep)
122
#define strbuf_replacef(sb,sp,ep,fmt...) strbuf_replacef_n(sb,sp,ep,1,fmt)
123
#define strbuf_vreplacef(sb,sp,ep,fmt,ap) strbuf_vreplacef_n(sb,sp,ep,1,fmt,ap)
124
void strbuf_replace_char_n(StrBuf *sb, int32_t sp, int32_t ep, uint32_t times, char ch);
125
#define strbuf_replace_n(sb,sp,ep,n,str) strbuf_replace_substring_n(sb,sp,ep,n,str,0,-1)
126
void strbuf_replace_substring_n(StrBuf *sb, int32_t sp, int32_t ep, uint32_t times, const char *str, int32_t ssp, int32_t sep);
127
void strbuf_replace_data_n(StrBuf *sb, int32_t sp, int32_t ep, uint32_t times, const void *mem, uint32_t len);
128
int strbuf_replacef_n(StrBuf *sb, int32_t sp, int32_t ep, uint32_t times, const char *fmt, ...) __attribute__ ((format (printf, 5, 6)));
129
int strbuf_vreplacef_n(StrBuf *sb, int32_t sp, int32_t ep, uint32_t times, const char *fmt, va_list ap) __attribute__ ((format (printf, 5, 0)));
131
char strbuf_set_char_at(StrBuf *sb, int32_t sp, char chr); /* or strbuf_replace_char(sb,sp,strbuf_next_pos(sb,sp),chr) */
132
char strbuf_delete_char(StrBuf *sb, int32_t sp); /* or strbuf_replace(sb,sp,strbuf_next_pos(sb,sp),NULL) */
133
#define strbuf_delete(sb,sp,ep) strbuf_replace(sb,sp,ep,NULL)
134
#define strbuf_clear(sb) strbuf_replace(sb,0,-1,NULL)
136
void strbuf_reverse_substring(StrBuf *sb, int32_t sp, int32_t ep);
137
#define strbuf_reverse(sb) strbuf_reverse_substring(sb,0,-1)
139
void strbuf_repeat_substring(StrBuf *sb, int32_t sp, int32_t ep, uint32_t times);
140
#define strbuf_repeat(sb,n) strbuf_repeat_substring(sb,0,-1,n)
142
uint32_t strbuf_length(StrBuf *sb);
143
uint32_t strbuf_capacity(StrBuf *sb);
144
char *strbuf_buffer(StrBuf *sb);
145
#define strbuf_is_empty(sb) (strbuf_length(sb) == 0)
147
void strbuf_set_length(StrBuf *sb, uint32_t new_length);
148
void strbuf_ensure_capacity(StrBuf *sb, uint32_t minimum_capacity);
150
char *strbuf_substring(StrBuf *sb, int32_t sp, int32_t ep);
151
#define strbuf_to_string(sb) strbuf_substring(sb,0,-1)
152
char strbuf_char_at(StrBuf *sb, int32_t index);