virstring.h 10.7 KB
Newer Older
1
/*
2
 * Copyright (C) 2007-2014 Red Hat, Inc.
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library.  If not, see
 * <http://www.gnu.org/licenses/>.
 *
 * Authors:
 *     Daniel P. Berrange <berrange@redhat.com>
 */

#ifndef __VIR_STRING_H__
# define __VIR_STRING_H__

25 26
# include <stdarg.h>

27
# include "internal.h"
28 29 30
# include "viralloc.h"

typedef char *virString;
31

32 33 34 35 36 37
char **virStringSplitCount(const char *string,
                           const char *delim,
                           size_t max_tokens,
                           size_t *tokcount)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);

38 39 40 41 42
char **virStringSplit(const char *string,
                      const char *delim,
                      size_t max_tokens)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);

43 44
char *virStringListJoin(const char **strings,
                        const char *delim)
45 46
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);

M
Michal Privoznik 已提交
47 48
int virStringListAdd(char ***strings,
                     const char *item);
49 50
void virStringListRemove(char ***strings,
                         const char *item);
51

52 53 54
int virStringListMerge(char ***dst,
                       char ***src);

J
Jiri Denemark 已提交
55 56 57
int virStringListCopy(char ***dst,
                      const char **src);

58 59 60
void virStringListFree(char **strings);
void virStringListFreeCount(char **strings,
                            size_t count);
61

62 63 64 65
bool virStringListHasString(const char **strings,
                            const char *needle);
char *virStringListGetFirstWithPrefix(char **strings,
                                      const char *prefix)
66
    ATTRIBUTE_NONNULL(2);
67

68 69 70
int virStrToLong_i(char const *s,
                   char **end_ptr,
                   int base,
71 72
                   int *result)
    ATTRIBUTE_RETURN_CHECK;
73 74 75 76

int virStrToLong_ui(char const *s,
                    char **end_ptr,
                    int base,
77 78
                    unsigned int *result)
    ATTRIBUTE_RETURN_CHECK;
79 80 81
int virStrToLong_uip(char const *s,
                     char **end_ptr,
                     int base,
82 83
                     unsigned int *result)
    ATTRIBUTE_RETURN_CHECK;
84 85 86
int virStrToLong_l(char const *s,
                   char **end_ptr,
                   int base,
87 88
                   long *result)
    ATTRIBUTE_RETURN_CHECK;
89 90 91
int virStrToLong_ul(char const *s,
                    char **end_ptr,
                    int base,
92 93
                    unsigned long *result)
    ATTRIBUTE_RETURN_CHECK;
94 95 96
int virStrToLong_ulp(char const *s,
                     char **end_ptr,
                     int base,
97 98
                     unsigned long *result)
    ATTRIBUTE_RETURN_CHECK;
99 100 101
int virStrToLong_ll(char const *s,
                    char **end_ptr,
                    int base,
102 103
                    long long *result)
    ATTRIBUTE_RETURN_CHECK;
104 105 106
int virStrToLong_ull(char const *s,
                     char **end_ptr,
                     int base,
107 108
                     unsigned long long *result)
    ATTRIBUTE_RETURN_CHECK;
109 110 111
int virStrToLong_ullp(char const *s,
                      char **end_ptr,
                      int base,
112 113
                      unsigned long long *result)
    ATTRIBUTE_RETURN_CHECK;
114 115
int virStrToDouble(char const *s,
                   char **end_ptr,
116 117
                   double *result)
    ATTRIBUTE_RETURN_CHECK;
118

119 120 121
int virDoubleToStr(char **strp, double number)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;

122 123 124 125 126 127
void virSkipSpaces(const char **str) ATTRIBUTE_NONNULL(1);
void virSkipSpacesAndBackslash(const char **str) ATTRIBUTE_NONNULL(1);
void virTrimSpaces(char *str, char **endp) ATTRIBUTE_NONNULL(1);
void virSkipSpacesBackwards(const char *str, char **endp)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);

128 129
bool virStringIsEmpty(const char *str);

130
int virStrncpy(char *dest, const char *src, size_t n, size_t destbytes)
131
    ATTRIBUTE_RETURN_CHECK;
132
int virStrcpy(char *dest, const char *src, size_t destbytes)
133 134
    ATTRIBUTE_RETURN_CHECK;
# define virStrcpyStatic(dest, src) virStrcpy((dest), (src), sizeof(dest))
135 136 137 138

/* Don't call these directly - use the macros below */
int virStrdup(char **dest, const char *src, bool report, int domcode,
              const char *filename, const char *funcname, size_t linenr)
139
    ATTRIBUTE_RETURN_CHECK ATTRIBUTE_NONNULL(1);
140

141
int virStrndup(char **dest, const char *src, ssize_t n, bool report, int domcode,
142
               const char *filename, const char *funcname, size_t linenr)
143
    ATTRIBUTE_RETURN_CHECK ATTRIBUTE_NONNULL(1);
144 145 146 147 148 149 150 151 152 153
int virAsprintfInternal(bool report, int domcode, const char *filename,
                        const char *funcname, size_t linenr, char **strp,
                        const char *fmt, ...)
    ATTRIBUTE_NONNULL(6) ATTRIBUTE_NONNULL(7) ATTRIBUTE_FMT_PRINTF(7, 8)
    ATTRIBUTE_RETURN_CHECK;
int virVasprintfInternal(bool report, int domcode, const char *filename,
                         const char *funcname, size_t linenr, char **strp,
                         const char *fmt, va_list list)
    ATTRIBUTE_NONNULL(6) ATTRIBUTE_NONNULL(7) ATTRIBUTE_FMT_PRINTF(7, 0)
    ATTRIBUTE_RETURN_CHECK;
154 155 156 157 158 159 160 161

/**
 * VIR_STRDUP:
 * @dst: variable to hold result (char*, not char**)
 * @src: string to duplicate
 *
 * Duplicate @src string and store it into @dst.
 *
162 163 164 165
 * This macro is safe to use on arguments with side effects.
 *
 * Returns -1 on failure (with OOM error reported), 0 if @src was NULL,
 * 1 if @src was copied
166 167 168 169 170 171 172 173 174 175 176
 */
# define VIR_STRDUP(dst, src) virStrdup(&(dst), src, true, VIR_FROM_THIS, \
                                        __FILE__, __FUNCTION__, __LINE__)

/**
 * VIR_STRDUP_QUIET:
 * @dst: variable to hold result (char*, not char**)
 * @src: string to duplicate
 *
 * Duplicate @src string and store it into @dst.
 *
177 178 179
 * This macro is safe to use on arguments with side effects.
 *
 * Returns -1 on failure, 0 if @src was NULL, 1 if @src was copied
180 181 182 183 184 185 186 187 188 189
 */
# define VIR_STRDUP_QUIET(dst, src) virStrdup(&(dst), src, false, 0, NULL, NULL, 0)

/**
 * VIR_STRNDUP:
 * @dst: variable to hold result (char*, not char**)
 * @src: string to duplicate
 * @n: the maximum number of bytes to copy
 *
 * Duplicate @src string and store it into @dst. If @src is longer than @n,
190 191 192
 * only @n bytes are copied and terminating null byte '\0' is added. If @n
 * is a negative number, then the whole @src string is copied. That is,
 * VIR_STRDUP(dst, src) and VIR_STRNDUP(dst, src, -1) are equal.
193
 *
194 195 196 197
 * This macro is safe to use on arguments with side effects.
 *
 * Returns -1 on failure (with OOM error reported), 0 if @src was NULL,
 * 1 if @src was copied
198
 */
199
# define VIR_STRNDUP(dst, src, n) virStrndup(&(dst), src, n, true, \
200 201 202 203 204 205 206 207 208 209
                                             VIR_FROM_THIS, __FILE__, \
                                             __FUNCTION__, __LINE__)

/**
 * VIR_STRNDUP_QUIET:
 * @dst: variable to hold result (char*, not char**)
 * @src: string to duplicate
 * @n: the maximum number of bytes to copy
 *
 * Duplicate @src string and store it into @dst. If @src is longer than @n,
210 211 212 213
 * only @n bytes are copied and terminating null byte '\0' is added. If @n
 * is a negative number, then the whole @src string is copied. That is,
 * VIR_STRDUP_QUIET(dst, src) and VIR_STRNDUP_QUIET(dst, src, -1) are
 * equal.
214
 *
215 216 217
 * This macro is safe to use on arguments with side effects.
 *
 * Returns -1 on failure, 0 if @src was NULL, 1 if @src was copied
218 219 220
 */
# define VIR_STRNDUP_QUIET(dst, src, n) virStrndup(&(dst), src, n, false, \
                                                   0, NULL, NULL, 0)
221

222
size_t virStringListLength(const char * const *strings);
223

224 225 226 227 228 229
/**
 * virVasprintf
 *
 * Like glibc's vasprintf but makes sure *strp == NULL on failure, in which
 * case the OOM error is reported too.
 *
230 231
 * Returns -1 on failure (with OOM error reported), number of bytes printed
 * on success.
232 233 234 235 236 237 238 239 240 241
 */
# define virVasprintf(strp, fmt, list) \
    virVasprintfInternal(true, VIR_FROM_THIS, __FILE__, __FUNCTION__, \
                         __LINE__, strp, fmt, list)

/**
 * virVasprintfQuiet
 *
 * Like glibc's vasprintf but makes sure *strp == NULL on failure.
 *
242
 * Returns -1 on failure, number of bytes printed on success.
243 244 245 246 247 248 249 250 251
 */
# define virVasprintfQuiet(strp, fmt, list) \
    virVasprintfInternal(false, 0, NULL, NULL, 0, strp, fmt, list)

/**
 * virAsprintf:
 * @strp: variable to hold result (char **)
 * @fmt: printf format
 *
C
Chen Hanxiao 已提交
252
 * Like glibc's asprintf but makes sure *strp == NULL on failure, in which case
253 254
 * the OOM error is reported too.
 *
255 256
 * Returns -1 on failure (with OOM error reported), number of bytes printed
 * on success.
257 258 259 260 261 262 263 264 265 266 267
 */

# define virAsprintf(strp, ...) \
    virAsprintfInternal(true, VIR_FROM_THIS, __FILE__, __FUNCTION__, __LINE__, \
                        strp, __VA_ARGS__)

/**
 * virAsprintfQuiet:
 * @strp: variable to hold result (char **)
 * @fmt: printf format
 *
C
Chen Hanxiao 已提交
268
 * Like glibc's asprintf but makes sure *strp == NULL on failure.
269
 *
270
 * Returns -1 on failure, number of bytes printed on success.
271 272 273 274 275 276
 */

# define virAsprintfQuiet(strp, ...) \
    virAsprintfInternal(false, 0, NULL, NULL, 0, \
                        strp, __VA_ARGS__)

277 278
int virStringSortCompare(const void *a, const void *b);
int virStringSortRevCompare(const void *a, const void *b);
279
int virStringToUpper(char **dst, const char *src);
280

281 282 283 284 285 286
ssize_t virStringSearch(const char *str,
                        const char *regexp,
                        size_t max_results,
                        char ***matches)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(4);

P
Pavel Hrdina 已提交
287 288 289
bool virStringMatch(const char *str,
                    const char *regexp);

290 291 292 293 294
char *virStringReplace(const char *haystack,
                       const char *oldneedle,
                       const char *newneedle)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);

J
Ján Tomko 已提交
295
void virStringStripIPv6Brackets(char *str);
296 297
bool virStringHasChars(const char *str,
                       const char *chars);
298 299
bool virStringHasControlChars(const char *str);
void virStringStripControlChars(char *str);
300
void virStringFilterChars(char *str, const char *valid);
J
Ján Tomko 已提交
301

302
bool virStringIsPrintable(const char *str);
303
bool virStringBufferIsPrintable(const uint8_t *buf, size_t buflen);
304

305 306
char *virStringEncodeBase64(const uint8_t *buf, size_t buflen);

307
void virStringTrimOptionalNewline(char *str);
308

309
int virStringParsePort(const char *str,
310
                       unsigned int *port)
311 312
    ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;

313 314
VIR_DEFINE_AUTOPTR_FUNC(virString, virStringListFree)

315
#endif /* __VIR_STRING_H__ */