CLibs
Loading...
Searching...
No Matches
string_utils.h
Go to the documentation of this file.
1/*
2 * Utility functions and macros for working with C ASCII strings.
3 *
4 *
5 * Created by MacBook on 28.10.2024.
6 */
7
8#ifndef CLIBS_STRING_UTILS_H
9#define CLIBS_STRING_UTILS_H
10
11#include "headers/attributes.h" /* UseResult */
12
13#include <regex.h> /* regex_t */
14#include <stdbool.h> /* bool */
15#include <sys/types.h> /* ssize_t */
16
17/* include for user */
18#include <string.h>
19
20
22typedef const char *string_t;
24typedef char *str_t;
25
26
27#if __STDC_VERSION__ < 202311L && !defined( __APPLE__ )
28#include <stdlib.h> /* malloc */
29
30#define strndup string_nduplicate
31#define strdup string_duplicate
32
35{
36 str_t n = malloc( l + 1 );
37 if ( n == NULL )
38 return NULL;
39
40 strncpy( n, s, l );
41 n[ l ] = '\0';
42 return n;
43}
44
47{
48 size_t l = strlen( s );
49 str_t n = malloc( l + 1 );
50 if ( n == NULL )
51 return NULL;
52
53 n[ l ] = '\0';
54 strcpy( n, s );
55 return n;
56}
57#endif // ndef strdup
58
59#if ( !defined( _GNU_SOURCE ) && !defined( __APPLE__ ) ) \
60 || defined( _POSIX_C_SOURCE ) // non-standard
61#include <stdarg.h>
62#include <stdio.h>
63#include <stdlib.h>
64
65#ifndef vsnprintf
67int vsnprintf( char *str, size_t size, const char *restrict format, va_list ap );
68#endif
69
74LibraryDefined int vasprintf( str_t *strp, const string_t fmt, va_list args )
75{
76 va_list vaList;
77 va_copy( vaList, args );
78
79 int size = vsnprintf( NULL, ( size_t ) 0, fmt, args );
80
81 if ( size < 0 )
82 return size;
83
84 *strp = malloc( size + 1 );
85 if ( !*strp )
86 return -1;
87
88 const int result = vsnprintf( *strp, ( size_t ) size + 1, fmt, vaList );
89 va_end( args );
90
91 return result;
92}
93
98LibraryDefined int asprintf( str_t *strp, const string_t fmt, ... )
99{
100 va_list va;
101 va_start( va, fmt );
102 const int rv = vasprintf( strp, fmt, va );
103 va_end( va );
104 return rv;
105}
106#endif
107
108
121bool string_is_blank_l( string_t, size_t len );
122
130
155
156
158#define ESCAPED_CHARS "\n\t\r\f\v\"\\"
159
185
196void string_reverse( str_t );
197
198
202void string_to_upper( str_t );
208
212void string_to_lower( str_t );
218
219
228
241int string_replace( str_t string, string_t old, string_t new );
244#define STRSPLIT_EXCLUDE_EMPTY ( 1 << 0 )
245#define STRSPLIT_KEEP_DELIM_BEFORE ( 1 << 1 )
246#define STRSPLIT_KEEP_DELIM_AFTER ( 1 << 2 )
249#define STRSPLIT_STRIP_RESULTS ( 1 << 3 )
250
251
271typedef unsigned int strsplit_mode_t;
272
288ssize_t string_split( str_t **str_arr_cont,
289 string_t string,
290 string_t split_tok,
291 strsplit_mode_t mode );
305ssize_t string_split_regex( str_t **str_arr_cont,
306 string_t string,
307 const regex_t *__restrict regexp,
308 strsplit_mode_t mode );
309
318void string_split_destroy( size_t size, str_t **str_arr_cont );
319
320
329UseResult str_t string_join( size_t len, const string_t strarr[ len ], string_t joiner );
332typedef const string_t *strjoin_strarr_t;
333
334
335/* ==== Mathematical stuff ==== */
337UseResult char *add_uint_strings( const char *, const char * );
338UseResult char *mul_uint_strings( const char *, const char * );
340
342
344
345
346#endif //CLIBS_STRING_UTILS_H
Function and variable attributes.
#define LibraryDefined
Definition attributes.h:107
#define UseResult
Function's return value must be used.
Definition attributes.h:52
void string_split_destroy(size_t size, str_t **str_arr_cont)
UseResult char * mul_uint_strings(const char *, const char *)
unsigned int strsplit_mode_t
Definition string_utils.h:269
UseResult str_t string_stripped_l(string_t, size_t length)
UseResult str_t string_stripped(string_t)
bool string_is_empty(string_t s)
LibraryDefined int asprintf(str_t *strp, const string_t fmt,...)
Definition string_utils.h:98
UseResult str_t hex_to_decimal(string_t)
bool string_is_blank(string_t)
ssize_t string_split(str_t **str_arr_cont, string_t string, string_t split_tok, strsplit_mode_t mode)
const string_t * strjoin_strarr_t
String array being passed to string_join may be typecast to this.
Definition string_utils.h:330
void string_strip_lead_zeroes(str_t)
LibraryDefined UseResult str_t string_nduplicate(string_t s, size_t l)
strndup implementation (standard in POSIX and C23+)
Definition string_utils.h:34
UseResult str_t string_reversed(string_t)
void string_to_lower(str_t)
UseResult str_t string_replaced(string_t, string_t old, string_t new)
UseResult char * add_uint_strings(const char *, const char *)
UseResult str_t string_escaped(string_t)
int vsnprintf(char *str, size_t size, const char *restrict format, va_list ap)
va_list version of snprintf()
LibraryDefined UseResult str_t string_duplicate(string_t s)
strdup implementation (standard in POSIX and C23+)
Definition string_utils.h:46
char * str_t
Mutable string.
Definition string_utils.h:24
const char * string_t
Immutable string.
Definition string_utils.h:22
LibraryDefined int vasprintf(str_t *strp, const string_t fmt, va_list args)
Definition string_utils.h:74
bool string_is_blank_l(string_t, size_t len)
int string_replace(str_t string, string_t old, string_t new)
ssize_t string_split_regex(str_t **str_arr_cont, string_t string, const regex_t *__restrict regexp, strsplit_mode_t mode)
void string_to_upper(str_t)
void string_strip(str_t)
UseResult str_t string_as_lower(string_t)
void string_reverse(str_t)
UseResult str_t string_unescaped(string_t)
Opposite of string_escaped()
UseResult str_t string_join(size_t len, const string_t strarr[len], string_t joiner)
UseResult str_t string_as_upper(string_t)