]>
git.proxmox.com Git - mirror_frr.git/blob - lib/frrstr.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * FRR string processing utilities.
4 * Copyright (C) 2018 Cumulus Networks, Inc.
12 #include <sys/types.h>
13 #ifdef HAVE_LIBPCRE2_POSIX
14 #ifndef _FRR_PCRE2_POSIX
15 #define _FRR_PCRE2_POSIX
16 #include <pcre2posix.h>
17 #endif /* _FRR_PCRE2_POSIX */
18 #elif defined(HAVE_LIBPCREPOSIX)
19 #include <pcreposix.h>
22 #endif /* HAVE_LIBPCRE2_POSIX */
28 void frrstr_split(const char *string
, const char *delimiter
, char ***result
,
34 unsigned int sz
= 4, idx
= 0;
35 char *copy
, *copystart
;
36 *result
= XCALLOC(MTYPE_TMP
, sizeof(char *) * sz
);
37 copystart
= copy
= XSTRDUP(MTYPE_TMP
, string
);
40 const char *tok
= NULL
;
43 tok
= strsep(©
, delimiter
);
44 (*result
)[idx
] = XSTRDUP(MTYPE_TMP
, tok
);
46 *result
= XREALLOC(MTYPE_TMP
, *result
,
47 (sz
*= 2) * sizeof(char *));
51 XFREE(MTYPE_TMP
, copystart
);
54 vector
frrstr_split_vec(const char *string
, const char *delimiter
)
62 frrstr_split(string
, delimiter
, &result
, &argc
);
64 vector v
= array_to_vector((void **)result
, argc
);
66 XFREE(MTYPE_TMP
, result
);
71 char *frrstr_join(const char **parts
, int argc
, const char *join
)
77 size_t joinlen
= join
? strlen(join
) : 0;
82 for (i
= 0; i
< argc
; i
++)
83 len
+= strlen(parts
[i
]);
84 len
+= argc
* joinlen
+ 1;
89 p
= str
= XMALLOC(MTYPE_TMP
, len
);
91 for (i
= 0; i
< argc
; i
++) {
92 size_t arglen
= strlen(parts
[i
]);
94 memcpy(p
, parts
[i
], arglen
);
96 if (i
+ 1 != argc
&& join
) {
97 memcpy(p
, join
, joinlen
);
107 char *frrstr_join_vec(vector v
, const char *join
)
112 vector_to_array(v
, (void ***)&argv
, &argc
);
114 char *ret
= frrstr_join((const char **)argv
, argc
, join
);
116 XFREE(MTYPE_TMP
, argv
);
121 void frrstr_filter_vec(vector v
, regex_t
*filter
)
123 regmatch_t ignored
[1];
125 for (unsigned int i
= 0; i
< vector_active(v
); i
++) {
126 if (regexec(filter
, vector_slot(v
, i
), 0, ignored
, 0)) {
127 XFREE(MTYPE_TMP
, vector_slot(v
, i
));
133 void frrstr_strvec_free(vector v
)
141 for (i
= 0; i
< vector_active(v
); i
++) {
142 cp
= vector_slot(v
, i
);
143 XFREE(MTYPE_TMP
, cp
);
149 char *frrstr_replace(const char *str
, const char *find
, const char *replace
)
152 char *nustr
= XSTRDUP(MTYPE_TMP
, str
);
154 size_t findlen
= strlen(find
);
155 size_t repllen
= strlen(replace
);
157 while ((ch
= strstr(nustr
, find
))) {
158 if (repllen
> findlen
) {
159 size_t nusz
= strlen(nustr
) + repllen
- findlen
+ 1;
160 nustr
= XREALLOC(MTYPE_TMP
, nustr
, nusz
);
161 ch
= strstr(nustr
, find
);
164 size_t nustrlen
= strlen(nustr
);
165 size_t taillen
= (nustr
+ nustrlen
) - (ch
+ findlen
);
167 memmove(ch
+ findlen
+ (repllen
- findlen
), ch
+ findlen
,
169 memcpy(ch
, replace
, repllen
);
175 bool frrstr_startswith(const char *str
, const char *prefix
)
180 size_t lenstr
= strlen(str
);
181 size_t lenprefix
= strlen(prefix
);
183 if (lenprefix
> lenstr
)
186 return strncmp(str
, prefix
, lenprefix
) == 0;
189 bool frrstr_endswith(const char *str
, const char *suffix
)
194 size_t lenstr
= strlen(str
);
195 size_t lensuffix
= strlen(suffix
);
197 if (lensuffix
> lenstr
)
200 return strncmp(&str
[lenstr
- lensuffix
], suffix
, lensuffix
) == 0;
203 int all_digit(const char *str
)
205 for (; *str
!= '\0'; str
++)
206 if (!isdigit((unsigned char)*str
))
212 char *frrstr_hex(char *buff
, size_t bufsiz
, const uint8_t *str
, size_t num
)
221 for (size_t i
= 0; i
< num
; i
++) {
222 snprintf(tmp
, sizeof(tmp
), "%02x", (unsigned char)str
[i
]);
223 strlcat(buff
, tmp
, bufsiz
);