]> mj.ucw.cz Git - libucw.git/blob - ucw/string.h
io-careful: Do not fail if a system call is interrupted by a signal
[libucw.git] / ucw / string.h
1 /*
2  *      UCW Library -- String Routines
3  *
4  *      (c) 2006 Pavel Charvat <pchar@ucw.cz>
5  *      (c) 2007--2012 Martin Mares <mj@ucw.cz>
6  *
7  *      This software may be freely distributed and used according to the terms
8  *      of the GNU Lesser General Public License.
9  */
10
11 #ifndef _UCW_STRING_H
12 #define _UCW_STRING_H
13
14 #ifdef CONFIG_UCW_CLEAN_ABI
15 #define hex_to_mem ucw_hex_to_mem
16 #define mem_to_hex ucw_mem_to_hex
17 #define str_count_char ucw_str_count_char
18 #define str_format_flags ucw_str_format_flags
19 #define str_has_prefix ucw_str_has_prefix
20 #define str_has_suffix ucw_str_has_suffix
21 #define str_hier_prefix ucw_str_hier_prefix
22 #define str_hier_suffix ucw_str_hier_suffix
23 #define str_match_pattern ucw_str_match_pattern
24 #define str_match_pattern_nocase ucw_str_match_pattern_nocase
25 #define str_sepsplit ucw_str_sepsplit
26 #define str_unesc ucw_str_unesc
27 #define str_wordsplit ucw_str_wordsplit
28 #endif
29
30 /* string.c */
31
32 #ifdef CONFIG_DARWIN
33 size_t strnlen(const char *str, size_t n); // NOAPI
34 #endif
35
36 /**
37  * Format a set of flag bits. When the i-th bit of @flags is 1,
38  * set the i-th character of @dest to @fmt[i], otherwise to '-'.
39  **/
40 char *str_format_flags(char *dest, const char *fmt, uint flags);
41
42 /** Counts occurrences of @chr in @str. **/
43 size_t str_count_char(const char *str, uint chr);
44
45 /* str-esc.c */
46
47 /**
48  * Decode a string with backslash escape sequences as in C99 strings.
49  * It is safe to pass @dest equal to @src.
50  **/
51 char *str_unesc(char *dest, const char *src);
52
53 /* str-split.c */
54
55 /**
56  * Split @str to at most @max fields separated by @sep. Occurrences of the
57  * separator are rewritten to string terminators, @rec[i] is set to point
58  * to the i-th field. The total number of fields is returned.
59  *
60  * When there are more than @max fields in @str, the first @max fields
61  * are processed and -1 is returned.
62  **/
63 int str_sepsplit(char *str, uint sep, char **rec, uint max);
64
65 /**
66  * Split @str to words separated by white-space characters. The spaces
67  * are replaced by string terminators, @rec[i] is set to point to the
68  * i-th field. The total number of fields is returned.
69  *
70  * When there are more than @max fields in @str, the first @max fields
71  * are processed and -1 is returned.
72  *
73  * Fields surrounded by double quotes are also recognized. They can contain
74  * spaces, but no mechanism for escaping embedded quotes is defined.
75  **/
76 int str_wordsplit(char *str, char **rec, uint max);
77
78 /* str-(i)match.c: Matching of shell patterns */
79
80 /**
81  * Test whether the string @str matches the shell-like pattern @patt. Only
82  * "*" and "?" meta-characters are supported.
83  **/
84 int str_match_pattern(const char *patt, const char *str);
85
86 /** A case-insensitive version of @str_match_pattern(). **/
87 int str_match_pattern_nocase(const char *patt, const char *str);
88
89 /* str-hex.c */
90
91 /**
92  * Create a hexdump of a memory block of @bytes bytes starting at @src.
93  * The @flags contain an optional separator of bytes (0 if bytes should
94  * not be separated), possibly OR-ed with `MEM_TO_HEX_UPCASE` when upper-case
95  * characters should be used.
96  **/
97 void mem_to_hex(char *dest, const byte *src, size_t bytes, uint flags);
98
99 /**
100  * An inverse function to @mem_to_hex(). Takes a hexdump of at most @max_bytes
101  * bytes and stores the bytes to a buffer starting at @dest. Returns a pointer
102  * at the first character after the dump.
103  **/
104 const char *hex_to_mem(byte *dest, const char *src, size_t max_bytes, uint flags);
105
106 // Bottom 8 bits of flags are an optional separator of bytes, the rest is:
107 #define MEM_TO_HEX_UPCASE 0x100
108
109 /* str-fix.c */
110
111 int str_has_prefix(const char *str, const char *prefix); /** Tests if @str starts with @prefix. **/
112 int str_has_suffix(const char *str, const char *suffix); /** Tests if @str ends with @suffix. **/
113
114 /**
115  * Let @str and @prefix be hierarchical names with components separated by
116  * a character @sep. Returns true if @str starts with @prefix, respecting
117  * component boundaries.
118  *
119  * For example, when @sep is '/' and @str is "/usr/local/bin", then:
120  *
121  * - "/usr/local" is a prefix
122  * - "/usr/local/" is a prefix, too
123  * - "/usr/loc" is not,
124  * - "/usr/local/bin" is a prefix,
125  * - "/usr/local/bin/" is not,
126  * - "/" is a prefix,
127  * - "" is a prefix.
128  **/
129 int str_hier_prefix(const char *str, const char *prefix, uint sep);
130 int str_hier_suffix(const char *str, const char *suffix, uint sep); /** Like @str_hier_prefix(), but for suffixes. **/
131
132 #endif