00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef CU_STR_H
00019 #define CU_STR_H
00020
00021 #include <cu/fwd.h>
00022 #include <cu/clos.h>
00023 #include <cuoo/meta.h>
00024 #include <stdlib.h>
00025 #include <stdarg.h>
00026
00027 CU_BEGIN_DECLARATIONS
00028
00029
00030
00031
00032 struct cu_str
00033 {
00034 CUOO_OBJ
00035 char *arr;
00036 size_t len;
00037 size_t cap;
00038 };
00039
00040 extern cuoo_type_t cuP_str_type;
00041
00042
00043 CU_SINLINE cuoo_type_t cu_str_type()
00044 { return cuP_str_type; }
00045
00046
00047
00048 CU_SINLINE cu_bool_t cu_is_str(void *s)
00049 { return cuex_meta(s) == cuoo_type_to_meta(cu_str_type()); }
00050
00051
00052 CU_SINLINE cu_bool_t cu_str_is_empty(cu_str_t str) { return str->len == 0; }
00053
00054 CU_SINLINE size_t cu_str_size(cu_str_t str) { return str->len; }
00055
00056
00057 CU_SINLINE char cu_str_at(cu_str_t str, size_t i) { return str->arr[i]; }
00058
00059
00060 cu_str_t cu_str_new(void);
00061
00062 cu_str_t cu_str_onew(void);
00063
00064
00065 void cu_str_init(cu_str_t dest);
00066
00067
00068 cu_str_t cu_str_new_charr(char const *cstr, size_t len);
00069
00070 cu_str_t cu_str_onew_charr(char const *cstr, size_t len);
00071
00072 cu_str_t cu_str_new_cstr(char const *cstr);
00073
00074 cu_str_t cu_str_onew_cstr(char const *cstr);
00075
00076
00077 cu_str_t cu_str_new_static_cstr(char const *cstr);
00078
00079 cu_str_t cu_str_onew_static_cstr(char const *cstr);
00080
00081 void cu_str_init_static_cstr(cu_str_t str, char const *cstr);
00082
00083
00084 cu_str_t cu_str_new_fmt(char const *fmt, ...);
00085
00086 cu_str_t cu_str_onew_fmt(char const *fmt, ...);
00087
00088 cu_str_t cu_str_new_vfmt(char const *fmt, va_list va);
00089
00090 cu_str_t cu_str_onew_vfmt(char const *fmt, va_list va);
00091
00092
00093 void cu_str_init_uninit(cu_str_t str, size_t n);
00094
00095 cu_str_t cu_str_new_uninit(size_t n);
00096
00097 cu_str_t cu_str_onew_uninit(size_t n);
00098
00099
00100 cu_str_t cu_str_new_copy(cu_str_t str);
00101
00102 cu_str_t cu_str_onew_copy(cu_str_t str);
00103
00104
00105 void cu_str_assign(cu_str_t dest, cu_str_t src);
00106 #define cu_str_init_copy cu_str_assign
00107
00108
00109
00110 cu_str_t cu_str_new_2str(cu_str_t x, cu_str_t y);
00111
00112 cu_str_t cu_str_onew_2str(cu_str_t x, cu_str_t y);
00113
00114 cu_str_t cu_str_new_str_char(cu_str_t x, char y);
00115
00116 cu_str_t cu_str_onew_str_char(cu_str_t x, char y);
00117
00118 cu_str_t cu_str_new_str_cstr(cu_str_t x, char const *y);
00119
00120 cu_str_t cu_str_onew_str_cstr(cu_str_t x, char const *y);
00121
00122 cu_str_t cu_str_new_cstr_str(char const *x, cu_str_t y);
00123
00124 cu_str_t cu_str_onew_cstr_str(char const *x, cu_str_t y);
00125
00126 cu_str_t cu_str_new_2cstr(char const *x, char const *y);
00127
00128 cu_str_t cu_str_onew_2cstr(char const *x, char const *y);
00129
00130
00131
00132 cu_str_t cu_str_new_2charr(char const *s0, size_t n0,
00133 char const *s1, size_t n1);
00134
00135 cu_str_t cu_str_onew_2charr(char const *s0, size_t n0,
00136 char const *s1, size_t n1);
00137
00138
00139
00140 cu_str_t cu_str_new_3charr(char const *s0, size_t n0,
00141 char const *s1, size_t n1,
00142 char const *s2, size_t n2);
00143
00144 cu_str_t cu_str_onew_3charr(char const *s0, size_t n0,
00145 char const *s1, size_t n1,
00146 char const *s2, size_t n2);
00147
00148 cu_str_t cu_str_new_idr(cu_idr_t idr);
00149
00150 cu_str_t cu_str_onew_idr(cu_idr_t idr);
00151
00152
00153 void cu_str_assign_substr(cu_str_t dest, size_t pos, size_t len);
00154
00155
00156
00157 cu_str_t cu_str_substr(cu_str_t x, size_t pos, size_t len);
00158
00159
00160 cu_str_t cu_str_suffix(cu_str_t x, size_t pos);
00161
00162
00163 void cu_str_append_str(cu_str_t dest, cu_str_t src);
00164
00165
00166 void cu_str_append_char(cu_str_t dest, char ch);
00167
00168
00169 void cu_str_append_charr(cu_str_t dest, char const *s, size_t n);
00170
00171 void cu_str_append_cstr(cu_str_t dest, char const *cstr);
00172
00173
00174 void cu_str_append_vfmt(cu_str_t dst, char const *fmt, va_list va);
00175
00176 void cu_str_append_fmt(cu_str_t dst, char const *fmt, ...);
00177
00178
00179 void cu_str_unappend(cu_str_t str, size_t char_count);
00180
00181
00182 void cu_str_insert_substr(cu_str_t dst, cu_str_t src, size_t pos);
00183
00184
00185 void cu_str_erase_substr(cu_str_t dst, size_t pos, size_t len);
00186
00187
00188 char const *cu_str_to_cstr(cu_str_t x);
00189
00190
00191 cu_idr_t cu_str_to_idr(cu_str_t str);
00192
00193
00194
00195 char const *cu_str_charr(cu_str_t str);
00196 #define cu_str_charr(str) (CU_MARG(cu_str_t, (str))->arr)
00197
00198
00199 cu_bool_t cu_str_eq(cu_str_t x, cu_str_t y);
00200
00201 cu_hash_t cu_str_hash(cu_str_t x);
00202
00203
00204
00205
00206
00207 int cu_str_cmp(cu_str_t x, cu_str_t y);
00208
00209 int cu_str_cmp_charr(cu_str_t x, char const *y_arr, size_t y_size);
00210
00211 int cu_str_cmp_cstr(cu_str_t x, char const *y);
00212
00213
00214 cu_bool_t cu_str_subeq(cu_str_t x, size_t pos, cu_str_t y);
00215
00216 cu_bool_t cu_str_subeq_cstr(cu_str_t x, size_t pos, char const *y);
00217
00218
00219 cu_bool_t cu_str_subeq_charr(cu_str_t x, size_t pos,
00220 char const *y_arr, size_t y_size);
00221
00222
00223
00224 int cu_str_coll(cu_str_t x, cu_str_t y);
00225
00226 int cu_str_coll_charr(cu_str_t x, char const *y_arr, size_t y_size);
00227
00228 int cu_str_coll_cstr(cu_str_t x, char const *y);
00229
00230 #define cu_str_index_none ((size_t)-1)
00231
00232
00233 size_t cu_str_chr(cu_str_t str, char ch);
00234
00235
00236 size_t cu_str_rchr(cu_str_t str, char ch);
00237
00238
00239 size_t cu_str_chr_in_substr(cu_str_t str, size_t pos, size_t len, char ch);
00240
00241
00242 size_t cu_str_rchr_in_substr(cu_str_t str, size_t pos, size_t len, char ch);
00243
00244
00245
00246 void cu_str_chop_space(cu_str_t str);
00247
00248 cu_str_t cu_str_toupper(cu_str_t str);
00249
00250 cu_str_t cu_str_tolower(cu_str_t str);
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264 cu_bool_t cu_str_next_space_delimited(cu_str_t str,
00265 size_t *pos_io, size_t *len_io);
00266
00267
00268
00269
00270 cu_str_t cu_str_quote(cu_str_t str);
00271
00272 extern cu_clop(cu_str_eq_clop, cu_bool_t, cu_str_t, cu_str_t);
00273 extern cu_clop(cu_str_hash_clop, cu_hash_t, cu_str_t);
00274 extern cu_clop(cu_str_cmp_clop, int, cu_str_t, cu_str_t);
00275 extern cu_clop(cu_str_coll_clop, int, cu_str_t, cu_str_t);
00276
00277
00278 #define cu_str_cct cu_str_init
00279
00280 #define cu_str_cct_cstr_static cu_str_init_static_cstr
00281
00282 #define cu_str_cct_uninit cu_str_init_uninit
00283
00284 #define cu_str_cct_copy cu_str_init_copy
00285
00286 #define cu_str_new_cstr_static cu_str_new_static_cstr
00287
00288 #define cu_str_onew_cstr_static cu_str_onew_static_cstr
00289
00290
00291 CU_END_DECLARATIONS
00292 #endif