src/cx/string.h

Mon, 20 Feb 2023 19:55:42 +0100

author
Mike Becker <universe@uap-core.de>
date
Mon, 20 Feb 2023 19:55:42 +0100
changeset 657
3eeadf666d6b
parent 645
ec50abb285ad
child 677
b09aae58bba4
permissions
-rw-r--r--

add CxListComparator compatible string compare functions

universe@576 1 /*
universe@576 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
universe@576 3 *
universe@576 4 * Copyright 2021 Mike Becker, Olaf Wintermann All rights reserved.
universe@576 5 *
universe@576 6 * Redistribution and use in source and binary forms, with or without
universe@576 7 * modification, are permitted provided that the following conditions are met:
universe@576 8 *
universe@576 9 * 1. Redistributions of source code must retain the above copyright
universe@576 10 * notice, this list of conditions and the following disclaimer.
universe@576 11 *
universe@576 12 * 2. Redistributions in binary form must reproduce the above copyright
universe@576 13 * notice, this list of conditions and the following disclaimer in the
universe@576 14 * documentation and/or other materials provided with the distribution.
universe@576 15 *
universe@576 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
universe@576 17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
universe@576 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
universe@576 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
universe@576 20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
universe@576 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
universe@576 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
universe@576 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
universe@576 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
universe@576 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
universe@576 26 * POSSIBILITY OF SUCH DAMAGE.
universe@576 27 */
universe@576 28 /**
universe@576 29 * \file string.h
universe@576 30 * \brief Strings that know their length.
universe@576 31 * \author Mike Becker
universe@576 32 * \author Olaf Wintermann
universe@576 33 * \version 3.0
universe@576 34 * \copyright 2-Clause BSD License
universe@576 35 */
universe@576 36
universe@576 37 #ifndef UCX_STRING_H
universe@576 38 #define UCX_STRING_H
universe@576 39
universe@576 40 #include "common.h"
universe@576 41 #include "allocator.h"
universe@576 42
universe@576 43 /**
universe@576 44 * The UCX string structure.
universe@576 45 */
universe@577 46 struct cx_mutstr_s {
universe@576 47 /**
universe@576 48 * A pointer to the string.
universe@576 49 * \note The string is not necessarily \c NULL terminated.
universe@576 50 * Always use the length.
universe@576 51 */
universe@576 52 char *ptr;
universe@576 53 /** The length of the string */
universe@576 54 size_t length;
universe@577 55 };
universe@576 56
universe@576 57 /**
universe@576 58 * A mutable string.
universe@576 59 */
universe@576 60 typedef struct cx_mutstr_s cxmutstr;
universe@576 61
universe@576 62 /**
universe@576 63 * The UCX string structure for immutable (constant) strings.
universe@576 64 */
universe@577 65 struct cx_string_s {
universe@576 66 /**
universe@576 67 * A pointer to the immutable string.
universe@576 68 * \note The string is not necessarily \c NULL terminated.
universe@576 69 * Always use the length.
universe@576 70 */
universe@576 71 char const *ptr;
universe@576 72 /** The length of the string */
universe@576 73 size_t length;
universe@577 74 };
universe@576 75
universe@576 76 /**
universe@576 77 * An immutable string.
universe@576 78 */
universe@576 79 typedef struct cx_string_s cxstring;
universe@576 80
universe@583 81 /**
universe@645 82 * Context for string tokenizing.
universe@645 83 */
universe@645 84 struct cx_strtok_ctx_s {
universe@645 85 /**
universe@645 86 * The string to tokenize.
universe@645 87 */
universe@645 88 cxstring str;
universe@645 89 /**
universe@645 90 * The primary delimiter.
universe@645 91 */
universe@645 92 cxstring delim;
universe@645 93 /**
universe@645 94 * Optional array of more delimiters.
universe@645 95 */
universe@645 96 cxstring const *delim_more;
universe@645 97 /**
universe@645 98 * Length of the array containing more delimiters.
universe@645 99 */
universe@645 100 size_t delim_more_count;
universe@645 101 /**
universe@645 102 * Position of the currently active token in the source string.
universe@645 103 */
universe@645 104 size_t pos;
universe@645 105 /**
universe@645 106 * Position of next delimiter in the source string.
universe@645 107 *
universe@645 108 * If the tokenizer has not yet returned a token, the content of this field
universe@645 109 * is undefined. If the tokenizer reached the end of the string, this field
universe@645 110 * contains the length of the source string.
universe@645 111 */
universe@645 112 size_t delim_pos;
universe@645 113 /**
universe@645 114 * The position of the next token in the source string.
universe@645 115 */
universe@645 116 size_t next_pos;
universe@645 117 /**
universe@645 118 * The number of already found tokens.
universe@645 119 */
universe@645 120 size_t found;
universe@645 121 /**
universe@645 122 * The maximum number of tokens that shall be returned.
universe@645 123 */
universe@645 124 size_t limit;
universe@645 125 };
universe@645 126
universe@645 127 /**
universe@645 128 * A string tokenizing context.
universe@645 129 */
universe@645 130 typedef struct cx_strtok_ctx_s CxStrtokCtx;
universe@645 131
universe@645 132 /**
universe@583 133 * A literal initializer for an UCX string structure.
universe@583 134 *
universe@583 135 * The argument MUST be a string (const char*) \em literal.
universe@583 136 *
universe@583 137 * @param literal the string literal
universe@583 138 */
universe@583 139 #define CX_STR(literal) {literal, sizeof(literal) - 1}
universe@583 140
universe@576 141 #ifdef __cplusplus
universe@576 142 extern "C" {
universe@576 143 #endif
universe@576 144
universe@576 145
universe@576 146 /**
universe@576 147 * Wraps a mutable string that must be zero-terminated.
universe@576 148 *
universe@576 149 * The length is implicitly inferred by using a call to \c strlen().
universe@576 150 *
universe@576 151 * \note the wrapped string will share the specified pointer to the string.
universe@576 152 * If you do want a copy, use cx_strdup() on the return value of this function.
universe@576 153 *
universe@576 154 * If you need to wrap a constant string, use cx_str().
universe@576 155 *
universe@584 156 * @param cstring the string to wrap, must be zero-terminated
universe@576 157 * @return the wrapped string
universe@576 158 *
universe@576 159 * @see cx_mutstrn()
universe@576 160 */
universe@584 161 __attribute__((__warn_unused_result__, __nonnull__))
universe@576 162 cxmutstr cx_mutstr(char *cstring);
universe@576 163
universe@576 164 /**
universe@576 165 * Wraps a string that does not need to be zero-terminated.
universe@576 166 *
universe@576 167 * The argument may be \c NULL if the length is zero.
universe@576 168 *
universe@576 169 * \note the wrapped string will share the specified pointer to the string.
universe@576 170 * If you do want a copy, use cx_strdup() on the return value of this function.
universe@576 171 *
universe@576 172 * If you need to wrap a constant string, use cx_strn().
universe@576 173 *
universe@584 174 * @param cstring the string to wrap (or \c NULL, only if the length is zero)
universe@576 175 * @param length the length of the string
universe@576 176 * @return the wrapped string
universe@576 177 *
universe@576 178 * @see cx_mutstr()
universe@576 179 */
universe@576 180 __attribute__((__warn_unused_result__))
universe@576 181 cxmutstr cx_mutstrn(
universe@576 182 char *cstring,
universe@576 183 size_t length
universe@576 184 );
universe@576 185
universe@576 186 /**
universe@576 187 * Wraps a string that must be zero-terminated.
universe@576 188 *
universe@576 189 * The length is implicitly inferred by using a call to \c strlen().
universe@576 190 *
universe@576 191 * \note the wrapped string will share the specified pointer to the string.
universe@576 192 * If you do want a copy, use cx_strdup() on the return value of this function.
universe@576 193 *
universe@576 194 * If you need to wrap a non-constant string, use cx_mutstr().
universe@576 195 *
universe@584 196 * @param cstring the string to wrap, must be zero-terminated
universe@576 197 * @return the wrapped string
universe@576 198 *
universe@576 199 * @see cx_strn()
universe@576 200 */
universe@584 201 __attribute__((__warn_unused_result__, __nonnull__))
universe@576 202 cxstring cx_str(char const *cstring);
universe@576 203
universe@576 204
universe@576 205 /**
universe@576 206 * Wraps a string that does not need to be zero-terminated.
universe@576 207 *
universe@576 208 * The argument may be \c NULL if the length is zero.
universe@576 209 *
universe@576 210 * \note the wrapped string will share the specified pointer to the string.
universe@576 211 * If you do want a copy, use cx_strdup() on the return value of this function.
universe@576 212 *
universe@576 213 * If you need to wrap a non-constant string, use cx_mutstrn().
universe@576 214 *
universe@584 215 * @param cstring the string to wrap (or \c NULL, only if the length is zero)
universe@576 216 * @param length the length of the string
universe@576 217 * @return the wrapped string
universe@576 218 *
universe@576 219 * @see cx_str()
universe@576 220 */
universe@576 221 __attribute__((__warn_unused_result__))
universe@576 222 cxstring cx_strn(
universe@576 223 char const *cstring,
universe@576 224 size_t length
universe@576 225 );
universe@576 226
universe@576 227 /**
universe@576 228 * Casts a mutable string to an immutable string.
universe@576 229 *
universe@576 230 * \note This is not seriously a cast. Instead you get a copy
universe@576 231 * of the struct with the desired pointer type. Both structs still
universe@576 232 * point to the same location, though!
universe@576 233 *
universe@576 234 * @param str the mutable string to cast
universe@576 235 * @return an immutable copy of the string pointer
universe@576 236 */
universe@576 237 __attribute__((__warn_unused_result__))
universe@576 238 cxstring cx_strcast(cxmutstr str);
universe@576 239
universe@576 240 /**
universe@576 241 * Passes the pointer in this string to \c free().
universe@576 242 *
universe@576 243 * The pointer in the struct is set to \c NULL and the length is set to zero.
universe@576 244 *
universe@576 245 * \note There is no implementation for cxstring, because it is unlikely that
universe@576 246 * you ever have a \c char \c const* you are really supposed to free. If you
universe@576 247 * encounter such situation, you should double-check your code.
universe@576 248 *
universe@576 249 * @param str the string to free
universe@576 250 */
universe@583 251 __attribute__((__nonnull__))
universe@576 252 void cx_strfree(cxmutstr *str);
universe@576 253
universe@576 254 /**
universe@583 255 * Passes the pointer in this string to the allocators free function.
universe@583 256 *
universe@583 257 * The pointer in the struct is set to \c NULL and the length is set to zero.
universe@583 258 *
universe@583 259 * \note There is no implementation for cxstring, because it is unlikely that
universe@583 260 * you ever have a \c char \c const* you are really supposed to free. If you
universe@583 261 * encounter such situation, you should double-check your code.
universe@583 262 *
universe@583 263 * @param alloc the allocator
universe@583 264 * @param str the string to free
universe@583 265 */
universe@583 266 __attribute__((__nonnull__))
universe@583 267 void cx_strfree_a(
universe@583 268 CxAllocator *alloc,
universe@583 269 cxmutstr *str
universe@583 270 );
universe@583 271
universe@583 272 /**
universe@576 273 * Returns the accumulated length of all specified strings.
universe@576 274 *
universe@576 275 * \attention if the count argument is larger than the number of the
universe@576 276 * specified strings, the behavior is undefined.
universe@576 277 *
universe@576 278 * @param count the total number of specified strings
universe@576 279 * @param ... all strings
universe@576 280 * @return the accumulated length of all strings
universe@576 281 */
universe@576 282 __attribute__((__warn_unused_result__))
universe@576 283 size_t cx_strlen(
universe@576 284 size_t count,
universe@576 285 ...
universe@576 286 );
universe@576 287
universe@576 288 /**
universe@576 289 * Concatenates two or more strings.
universe@576 290 *
universe@576 291 * The resulting string will be allocated by the specified allocator.
universe@576 292 * So developers \em must pass the return value to cx_strfree() eventually.
universe@576 293 *
universe@576 294 * \note It is guaranteed that there is only one allocation.
universe@589 295 * It is also guaranteed that the returned string is zero-terminated.
universe@576 296 *
universe@576 297 * @param alloc the allocator to use
universe@576 298 * @param count the total number of strings to concatenate
universe@576 299 * @param ... all strings
universe@576 300 * @return the concatenated string
universe@576 301 */
universe@576 302 __attribute__((__warn_unused_result__, __nonnull__))
universe@576 303 cxmutstr cx_strcat_a(
universe@576 304 CxAllocator *alloc,
universe@576 305 size_t count,
universe@576 306 ...
universe@576 307 );
universe@576 308
universe@576 309 /**
universe@576 310 * Concatenates two or more strings.
universe@576 311 *
universe@576 312 * The resulting string will be allocated by standard \c malloc().
universe@576 313 * So developers \em must pass the return value to cx_strfree() eventually.
universe@576 314 *
universe@589 315 * \note It is guaranteed that there is only one allocation.
universe@589 316 * It is also guaranteed that the returned string is zero-terminated.
universe@589 317 *
universe@576 318 * @param count the total number of strings to concatenate
universe@576 319 * @param ... all strings
universe@576 320 * @return the concatenated string
universe@576 321 */
universe@576 322 #define cx_strcat(count, ...) \
universe@576 323 cx_strcat_a(cxDefaultAllocator, count, __VA_ARGS__)
universe@576 324
universe@576 325 /**
universe@576 326 * Returns a substring starting at the specified location.
universe@576 327 *
universe@576 328 * \attention the new string references the same memory area as the
universe@576 329 * input string and is usually \em not zero-terminated.
universe@576 330 * Use cx_strdup() to get a copy.
universe@576 331 *
universe@576 332 * @param string input string
universe@576 333 * @param start start location of the substring
universe@576 334 * @return a substring of \p string starting at \p start
universe@576 335 *
universe@576 336 * @see cx_strsubsl()
universe@576 337 * @see cx_strsubs_m()
universe@576 338 * @see cx_strsubsl_m()
universe@576 339 */
universe@576 340 __attribute__((__warn_unused_result__))
universe@576 341 cxstring cx_strsubs(
universe@576 342 cxstring string,
universe@576 343 size_t start
universe@576 344 );
universe@576 345
universe@576 346 /**
universe@576 347 * Returns a substring starting at the specified location.
universe@576 348 *
universe@576 349 * The returned string will be limited to \p length bytes or the number
universe@576 350 * of bytes available in \p string, whichever is smaller.
universe@576 351 *
universe@576 352 * \attention the new string references the same memory area as the
universe@576 353 * input string and is usually \em not zero-terminated.
universe@576 354 * Use cx_strdup() to get a copy.
universe@576 355 *
universe@576 356 * @param string input string
universe@576 357 * @param start start location of the substring
universe@576 358 * @param length the maximum length of the returned string
universe@576 359 * @return a substring of \p string starting at \p start
universe@576 360 *
universe@576 361 * @see cx_strsubs()
universe@576 362 * @see cx_strsubs_m()
universe@576 363 * @see cx_strsubsl_m()
universe@576 364 */
universe@576 365 __attribute__((__warn_unused_result__))
universe@576 366 cxstring cx_strsubsl(
universe@576 367 cxstring string,
universe@576 368 size_t start,
universe@576 369 size_t length
universe@576 370 );
universe@576 371
universe@576 372 /**
universe@576 373 * Returns a substring starting at the specified location.
universe@576 374 *
universe@576 375 * \attention the new string references the same memory area as the
universe@576 376 * input string and is usually \em not zero-terminated.
universe@576 377 * Use cx_strdup() to get a copy.
universe@576 378 *
universe@576 379 * @param string input string
universe@576 380 * @param start start location of the substring
universe@576 381 * @return a substring of \p string starting at \p start
universe@576 382 *
universe@576 383 * @see cx_strsubsl_m()
universe@576 384 * @see cx_strsubs()
universe@576 385 * @see cx_strsubsl()
universe@576 386 */
universe@576 387 __attribute__((__warn_unused_result__))
universe@576 388 cxmutstr cx_strsubs_m(
universe@576 389 cxmutstr string,
universe@576 390 size_t start
universe@576 391 );
universe@576 392
universe@576 393 /**
universe@576 394 * Returns a substring starting at the specified location.
universe@576 395 *
universe@576 396 * The returned string will be limited to \p length bytes or the number
universe@576 397 * of bytes available in \p string, whichever is smaller.
universe@576 398 *
universe@576 399 * \attention the new string references the same memory area as the
universe@576 400 * input string and is usually \em not zero-terminated.
universe@576 401 * Use cx_strdup() to get a copy.
universe@576 402 *
universe@576 403 * @param string input string
universe@576 404 * @param start start location of the substring
universe@576 405 * @param length the maximum length of the returned string
universe@576 406 * @return a substring of \p string starting at \p start
universe@576 407 *
universe@576 408 * @see cx_strsubs_m()
universe@576 409 * @see cx_strsubs()
universe@576 410 * @see cx_strsubsl()
universe@576 411 */
universe@576 412 __attribute__((__warn_unused_result__))
universe@576 413 cxmutstr cx_strsubsl_m(
universe@576 414 cxmutstr string,
universe@576 415 size_t start,
universe@576 416 size_t length
universe@576 417 );
universe@576 418
universe@576 419 /**
universe@576 420 * Returns a substring starting at the location of the first occurrence of the
universe@576 421 * specified character.
universe@576 422 *
universe@576 423 * If the string does not contain the character, an empty string is returned.
universe@576 424 *
universe@576 425 * @param string the string where to locate the character
universe@576 426 * @param chr the character to locate
universe@576 427 * @return a substring starting at the first location of \p chr
universe@576 428 *
universe@576 429 * @see cx_strchr_m()
universe@576 430 */
universe@576 431 __attribute__((__warn_unused_result__))
universe@576 432 cxstring cx_strchr(
universe@576 433 cxstring string,
universe@576 434 int chr
universe@576 435 );
universe@576 436
universe@576 437 /**
universe@576 438 * Returns a substring starting at the location of the first occurrence of the
universe@576 439 * specified character.
universe@576 440 *
universe@576 441 * If the string does not contain the character, an empty string is returned.
universe@576 442 *
universe@576 443 * @param string the string where to locate the character
universe@576 444 * @param chr the character to locate
universe@576 445 * @return a substring starting at the first location of \p chr
universe@576 446 *
universe@576 447 * @see cx_strchr()
universe@576 448 */
universe@576 449 __attribute__((__warn_unused_result__))
universe@576 450 cxmutstr cx_strchr_m(
universe@576 451 cxmutstr string,
universe@576 452 int chr
universe@576 453 );
universe@576 454
universe@576 455 /**
universe@576 456 * Returns a substring starting at the location of the last occurrence of the
universe@576 457 * specified character.
universe@576 458 *
universe@576 459 * If the string does not contain the character, an empty string is returned.
universe@576 460 *
universe@576 461 * @param string the string where to locate the character
universe@576 462 * @param chr the character to locate
universe@576 463 * @return a substring starting at the last location of \p chr
universe@576 464 *
universe@576 465 * @see cx_strrchr_m()
universe@576 466 */
universe@576 467 __attribute__((__warn_unused_result__))
universe@576 468 cxstring cx_strrchr(
universe@576 469 cxstring string,
universe@576 470 int chr
universe@576 471 );
universe@576 472
universe@576 473 /**
universe@576 474 * Returns a substring starting at the location of the last occurrence of the
universe@576 475 * specified character.
universe@576 476 *
universe@576 477 * If the string does not contain the character, an empty string is returned.
universe@576 478 *
universe@576 479 * @param string the string where to locate the character
universe@576 480 * @param chr the character to locate
universe@576 481 * @return a substring starting at the last location of \p chr
universe@576 482 *
universe@576 483 * @see cx_strrchr()
universe@576 484 */
universe@576 485 __attribute__((__warn_unused_result__))
universe@576 486 cxmutstr cx_strrchr_m(
universe@576 487 cxmutstr string,
universe@576 488 int chr
universe@576 489 );
universe@576 490
universe@576 491 /**
universe@576 492 * Returns a substring starting at the location of the first occurrence of the
universe@576 493 * specified string.
universe@576 494 *
universe@576 495 * If \p haystack does not contain \p needle, an empty string is returned.
universe@576 496 *
universe@576 497 * If \p needle is an empty string, the complete \p haystack is
universe@576 498 * returned.
universe@576 499 *
universe@576 500 * @param haystack the string to be scanned
universe@576 501 * @param needle string containing the sequence of characters to match
universe@576 502 * @return a substring starting at the first occurrence of
universe@576 503 * \p needle, or an empty string, if the sequence is not
universe@576 504 * contained
universe@576 505 * @see cx_strstr_m()
universe@576 506 */
universe@576 507 __attribute__((__warn_unused_result__))
universe@576 508 cxstring cx_strstr(
universe@576 509 cxstring haystack,
universe@576 510 cxstring needle
universe@576 511 );
universe@576 512
universe@576 513 /**
universe@576 514 * Returns a substring starting at the location of the first occurrence of the
universe@576 515 * specified string.
universe@576 516 *
universe@576 517 * If \p haystack does not contain \p needle, an empty string is returned.
universe@576 518 *
universe@576 519 * If \p needle is an empty string, the complete \p haystack is
universe@576 520 * returned.
universe@576 521 *
universe@576 522 * @param haystack the string to be scanned
universe@576 523 * @param needle string containing the sequence of characters to match
universe@576 524 * @return a substring starting at the first occurrence of
universe@576 525 * \p needle, or an empty string, if the sequence is not
universe@576 526 * contained
universe@576 527 * @see cx_strstr()
universe@576 528 */
universe@576 529 __attribute__((__warn_unused_result__))
universe@576 530 cxmutstr cx_strstr_m(
universe@576 531 cxmutstr haystack,
universe@576 532 cxstring needle
universe@576 533 );
universe@576 534
universe@576 535 /**
universe@576 536 * Splits a given string using a delimiter string.
universe@576 537 *
universe@576 538 * \note The resulting array contains strings that point to the source
universe@576 539 * \p string. Use cx_strdup() to get copies.
universe@576 540 *
universe@576 541 * @param string the string to split
universe@576 542 * @param delim the delimiter
universe@576 543 * @param limit the maximum number of split items
universe@576 544 * @param output a pre-allocated array of at least \p limit length
universe@576 545 * @return the actual number of split items
universe@576 546 */
universe@576 547 __attribute__((__warn_unused_result__, __nonnull__))
universe@576 548 size_t cx_strsplit(
universe@576 549 cxstring string,
universe@576 550 cxstring delim,
universe@576 551 size_t limit,
universe@576 552 cxstring *output
universe@576 553 );
universe@576 554
universe@576 555 /**
universe@576 556 * Splits a given string using a delimiter string.
universe@576 557 *
universe@576 558 * The array pointed to by \p output will be allocated by \p allocator.
universe@576 559 *
universe@576 560 * \note The resulting array contains strings that point to the source
universe@576 561 * \p string. Use cx_strdup() to get copies.
universe@576 562 *
universe@576 563 * \attention If allocation fails, the \c NULL pointer will be written to
universe@576 564 * \p output and the number returned will be zero.
universe@576 565 *
universe@576 566 * @param allocator the allocator to use for allocating the resulting array
universe@576 567 * @param string the string to split
universe@576 568 * @param delim the delimiter
universe@576 569 * @param limit the maximum number of split items
universe@576 570 * @param output a pointer where the address of the allocated array shall be
universe@576 571 * written to
universe@576 572 * @return the actual number of split items
universe@576 573 */
universe@576 574 __attribute__((__warn_unused_result__, __nonnull__))
universe@576 575 size_t cx_strsplit_a(
universe@576 576 CxAllocator *allocator,
universe@576 577 cxstring string,
universe@576 578 cxstring delim,
universe@576 579 size_t limit,
universe@576 580 cxstring **output
universe@576 581 );
universe@576 582
universe@576 583
universe@576 584 /**
universe@576 585 * Splits a given string using a delimiter string.
universe@576 586 *
universe@576 587 * \note The resulting array contains strings that point to the source
universe@576 588 * \p string. Use cx_strdup() to get copies.
universe@576 589 *
universe@576 590 * @param string the string to split
universe@576 591 * @param delim the delimiter
universe@576 592 * @param limit the maximum number of split items
universe@576 593 * @param output a pre-allocated array of at least \p limit length
universe@576 594 * @return the actual number of split items
universe@576 595 */
universe@576 596 __attribute__((__warn_unused_result__, __nonnull__))
universe@576 597 size_t cx_strsplit_m(
universe@576 598 cxmutstr string,
universe@576 599 cxstring delim,
universe@576 600 size_t limit,
universe@576 601 cxmutstr *output
universe@576 602 );
universe@576 603
universe@576 604 /**
universe@576 605 * Splits a given string using a delimiter string.
universe@576 606 *
universe@576 607 * The array pointed to by \p output will be allocated by \p allocator.
universe@576 608 *
universe@576 609 * \note The resulting array contains strings that point to the source
universe@576 610 * \p string. Use cx_strdup() to get copies.
universe@576 611 *
universe@576 612 * \attention If allocation fails, the \c NULL pointer will be written to
universe@576 613 * \p output and the number returned will be zero.
universe@576 614 *
universe@576 615 * @param allocator the allocator to use for allocating the resulting array
universe@576 616 * @param string the string to split
universe@576 617 * @param delim the delimiter
universe@576 618 * @param limit the maximum number of split items
universe@576 619 * @param output a pointer where the address of the allocated array shall be
universe@576 620 * written to
universe@576 621 * @return the actual number of split items
universe@576 622 */
universe@576 623 __attribute__((__warn_unused_result__, __nonnull__))
universe@576 624 size_t cx_strsplit_ma(
universe@576 625 CxAllocator *allocator,
universe@576 626 cxmutstr string,
universe@576 627 cxstring delim,
universe@576 628 size_t limit,
universe@576 629 cxmutstr **output
universe@576 630 );
universe@576 631
universe@576 632 /**
universe@576 633 * Compares two strings.
universe@576 634 *
universe@576 635 * @param s1 the first string
universe@576 636 * @param s2 the second string
universe@576 637 * @return negative if \p s1 is smaller than \p s2, positive if \p s1 is larger
universe@576 638 * than \p s2, zero if both strings equal
universe@576 639 */
universe@576 640 __attribute__((__warn_unused_result__))
universe@576 641 int cx_strcmp(
universe@576 642 cxstring s1,
universe@576 643 cxstring s2
universe@576 644 );
universe@576 645
universe@576 646 /**
universe@576 647 * Compares two strings ignoring case.
universe@576 648 *
universe@576 649 * @param s1 the first string
universe@576 650 * @param s2 the second string
universe@576 651 * @return negative if \p s1 is smaller than \p s2, positive if \p s1 is larger
universe@576 652 * than \p s2, zero if both strings equal ignoring case
universe@576 653 */
universe@576 654 __attribute__((__warn_unused_result__))
universe@576 655 int cx_strcasecmp(
universe@576 656 cxstring s1,
universe@576 657 cxstring s2
universe@576 658 );
universe@576 659
universe@657 660 /**
universe@657 661 * Compares two strings.
universe@657 662 *
universe@657 663 * This function has a compatible signature for the use as a CxListComparator.
universe@657 664 *
universe@657 665 * @param s1 the first string
universe@657 666 * @param s2 the second string
universe@657 667 * @return negative if \p s1 is smaller than \p s2, positive if \p s1 is larger
universe@657 668 * than \p s2, zero if both strings equal
universe@657 669 */
universe@657 670 __attribute__((__warn_unused_result__, __nonnull__))
universe@657 671 int cx_strcmp_p(
universe@657 672 void const *s1,
universe@657 673 void const *s2
universe@657 674 );
universe@657 675
universe@657 676 /**
universe@657 677 * Compares two strings ignoring case.
universe@657 678 *
universe@657 679 * This function has a compatible signature for the use as a CxListComparator.
universe@657 680 *
universe@657 681 * @param s1 the first string
universe@657 682 * @param s2 the second string
universe@657 683 * @return negative if \p s1 is smaller than \p s2, positive if \p s1 is larger
universe@657 684 * than \p s2, zero if both strings equal ignoring case
universe@657 685 */
universe@657 686 __attribute__((__warn_unused_result__, __nonnull__))
universe@657 687 int cx_strcasecmp_p(
universe@657 688 void const *s1,
universe@657 689 void const *s2
universe@657 690 );
universe@657 691
universe@576 692
universe@576 693 /**
universe@576 694 * Creates a duplicate of the specified string.
universe@576 695 *
universe@576 696 * The new string will contain a copy allocated by \p allocator.
universe@576 697 *
universe@589 698 * \note The returned string is guaranteed to be zero-terminated.
universe@576 699 *
universe@576 700 * @param allocator the allocator to use
universe@576 701 * @param string the string to duplicate
universe@576 702 * @return a duplicate of the string
universe@576 703 * @see cx_strdup()
universe@576 704 */
universe@576 705 __attribute__((__warn_unused_result__, __nonnull__))
universe@576 706 cxmutstr cx_strdup_a(
universe@576 707 CxAllocator *allocator,
universe@576 708 cxstring string
universe@576 709 );
universe@576 710
universe@576 711 /**
universe@578 712 * Creates a duplicate of the specified string.
universe@578 713 *
universe@578 714 * The new string will contain a copy allocated by standard
universe@578 715 * \c malloc(). So developers \em must pass the return value to cx_strfree().
universe@578 716 *
universe@589 717 * \note The returned string is guaranteed to be zero-terminated.
universe@578 718 *
universe@578 719 * @param string the string to duplicate
universe@578 720 * @return a duplicate of the string
universe@578 721 * @see cx_strdup_a()
universe@578 722 */
universe@578 723 #define cx_strdup(string) cx_strdup_a(cxDefaultAllocator, string)
universe@578 724
universe@578 725 /**
universe@576 726 * Omits leading and trailing spaces.
universe@576 727 *
universe@576 728 * \note the returned string references the same memory, thus you
universe@576 729 * must \em not free the returned memory.
universe@576 730 *
universe@576 731 * @param string the string that shall be trimmed
universe@576 732 * @return the trimmed string
universe@576 733 */
universe@576 734 __attribute__((__warn_unused_result__))
universe@576 735 cxstring cx_strtrim(cxstring string);
universe@576 736
universe@576 737 /**
universe@576 738 * Omits leading and trailing spaces.
universe@576 739 *
universe@576 740 * \note the returned string references the same memory, thus you
universe@576 741 * must \em not free the returned memory.
universe@576 742 *
universe@576 743 * @param string the string that shall be trimmed
universe@576 744 * @return the trimmed string
universe@576 745 */
universe@576 746 __attribute__((__warn_unused_result__))
universe@576 747 cxmutstr cx_strtrim_m(cxmutstr string);
universe@576 748
universe@576 749 /**
universe@576 750 * Checks, if a string has a specific prefix.
universe@576 751 *
universe@576 752 * @param string the string to check
universe@576 753 * @param prefix the prefix the string should have
universe@576 754 * @return \c true, if and only if the string has the specified prefix,
universe@576 755 * \c false otherwise
universe@576 756 */
universe@576 757 __attribute__((__warn_unused_result__))
universe@576 758 bool cx_strprefix(
universe@576 759 cxstring string,
universe@576 760 cxstring prefix
universe@576 761 );
universe@576 762
universe@576 763 /**
universe@576 764 * Checks, if a string has a specific suffix.
universe@576 765 *
universe@576 766 * @param string the string to check
universe@576 767 * @param suffix the suffix the string should have
universe@576 768 * @return \c true, if and only if the string has the specified suffix,
universe@576 769 * \c false otherwise
universe@576 770 */
universe@576 771 __attribute__((__warn_unused_result__))
universe@581 772 bool cx_strsuffix(
universe@576 773 cxstring string,
universe@576 774 cxstring suffix
universe@576 775 );
universe@576 776
universe@576 777 /**
universe@576 778 * Checks, if a string has a specific prefix, ignoring the case.
universe@576 779 *
universe@576 780 * @param string the string to check
universe@576 781 * @param prefix the prefix the string should have
universe@576 782 * @return \c true, if and only if the string has the specified prefix,
universe@576 783 * \c false otherwise
universe@576 784 */
universe@576 785 __attribute__((__warn_unused_result__))
universe@581 786 bool cx_strcaseprefix(
universe@576 787 cxstring string,
universe@576 788 cxstring prefix
universe@576 789 );
universe@576 790
universe@576 791 /**
universe@576 792 * Checks, if a string has a specific suffix, ignoring the case.
universe@576 793 *
universe@576 794 * @param string the string to check
universe@576 795 * @param suffix the suffix the string should have
universe@576 796 * @return \c true, if and only if the string has the specified suffix,
universe@576 797 * \c false otherwise
universe@576 798 */
universe@576 799 __attribute__((__warn_unused_result__))
universe@581 800 bool cx_strcasesuffix(
universe@576 801 cxstring string,
universe@576 802 cxstring suffix
universe@576 803 );
universe@576 804
universe@576 805 /**
universe@576 806 * Converts the string to lower case.
universe@576 807 *
universe@576 808 * The change is made in-place. If you want a copy, use cx_strdup(), first.
universe@576 809 *
universe@576 810 * @param string the string to modify
universe@576 811 * @see cx_strdup()
universe@576 812 */
universe@576 813 void cx_strlower(cxmutstr string);
universe@576 814
universe@576 815 /**
universe@576 816 * Converts the string to upper case.
universe@576 817 *
universe@576 818 * The change is made in-place. If you want a copy, use cx_strdup(), first.
universe@576 819 *
universe@576 820 * @param string the string to modify
universe@576 821 * @see cx_strdup()
universe@576 822 */
universe@576 823 void cx_strupper(cxmutstr string);
universe@576 824
universe@576 825 /**
universe@576 826 * Replaces a pattern in a string with another string.
universe@576 827 *
universe@576 828 * The pattern is taken literally and is no regular expression.
universe@576 829 * Replaces at most \p replmax occurrences.
universe@576 830 *
universe@589 831 * The returned string will be allocated by \p allocator and is guaranteed
universe@589 832 * to be zero-terminated.
universe@576 833 *
universe@576 834 * If allocation fails, or the input string is empty,
universe@583 835 * the returned string will be empty.
universe@576 836 *
universe@576 837 * @param allocator the allocator to use
universe@576 838 * @param str the string where replacements should be applied
universe@576 839 * @param pattern the pattern to search for
universe@576 840 * @param replacement the replacement string
universe@576 841 * @param replmax maximum number of replacements
universe@576 842 * @return the resulting string after applying the replacements
universe@576 843 */
universe@576 844 __attribute__((__warn_unused_result__, __nonnull__))
universe@583 845 cxmutstr cx_strreplacen_a(
universe@576 846 CxAllocator *allocator,
universe@576 847 cxstring str,
universe@576 848 cxstring pattern,
universe@576 849 cxstring replacement,
universe@576 850 size_t replmax
universe@576 851 );
universe@576 852
universe@578 853 /**
universe@578 854 * Replaces a pattern in a string with another string.
universe@578 855 *
universe@578 856 * The pattern is taken literally and is no regular expression.
universe@578 857 * Replaces at most \p replmax occurrences.
universe@578 858 *
universe@589 859 * The returned string will be allocated by \c malloc() and is guaranteed
universe@589 860 * to be zero-terminated.
universe@578 861 *
universe@578 862 * If allocation fails, or the input string is empty,
universe@583 863 * the returned string will be empty.
universe@578 864 *
universe@578 865 * @param str the string where replacements should be applied
universe@578 866 * @param pattern the pattern to search for
universe@578 867 * @param replacement the replacement string
universe@578 868 * @param replmax maximum number of replacements
universe@578 869 * @return the resulting string after applying the replacements
universe@578 870 */
universe@583 871 #define cx_strreplacen(str, pattern, replacement, replmax) \
universe@583 872 cx_strreplacen_a(cxDefaultAllocator, str, pattern, replacement, replmax)
universe@583 873
universe@583 874 /**
universe@583 875 * Replaces a pattern in a string with another string.
universe@583 876 *
universe@583 877 * The pattern is taken literally and is no regular expression.
universe@583 878 *
universe@589 879 * The returned string will be allocated by \p allocator and is guaranteed
universe@589 880 * to be zero-terminated.
universe@583 881 *
universe@583 882 * If allocation fails, or the input string is empty,
universe@583 883 * the returned string will be empty.
universe@583 884 *
universe@583 885 * @param allocator the allocator to use
universe@583 886 * @param str the string where replacements should be applied
universe@583 887 * @param pattern the pattern to search for
universe@583 888 * @param replacement the replacement string
universe@583 889 * @return the resulting string after applying the replacements
universe@583 890 */
universe@583 891 #define cx_strreplace_a(allocator, str, pattern, replacement) \
universe@583 892 cx_strreplacen_a(allocator, str, pattern, replacement, SIZE_MAX)
universe@583 893
universe@583 894 /**
universe@583 895 * Replaces a pattern in a string with another string.
universe@583 896 *
universe@583 897 * The pattern is taken literally and is no regular expression.
universe@583 898 * Replaces at most \p replmax occurrences.
universe@583 899 *
universe@589 900 * The returned string will be allocated by \c malloc() and is guaranteed
universe@589 901 * to be zero-terminated.
universe@583 902 *
universe@583 903 * If allocation fails, or the input string is empty,
universe@583 904 * the returned string will be empty.
universe@583 905 *
universe@583 906 * @param str the string where replacements should be applied
universe@583 907 * @param pattern the pattern to search for
universe@583 908 * @param replacement the replacement string
universe@583 909 * @return the resulting string after applying the replacements
universe@583 910 */
universe@583 911 #define cx_strreplace(str, pattern, replacement) \
universe@583 912 cx_strreplacen_a(cxDefaultAllocator, str, pattern, replacement, SIZE_MAX)
universe@578 913
universe@645 914 /**
universe@645 915 * Creates a string tokenization context.
universe@645 916 *
universe@645 917 * @param str the string to tokenize
universe@645 918 * @param delim the delimiter (must not be empty)
universe@645 919 * @param limit the maximum number of tokens that shall be returned
universe@645 920 * @return a new string tokenization context
universe@645 921 */
universe@645 922 __attribute__((__warn_unused_result__))
universe@645 923 CxStrtokCtx cx_strtok(
universe@645 924 cxstring str,
universe@645 925 cxstring delim,
universe@645 926 size_t limit
universe@645 927 );
universe@645 928
universe@645 929 /**
universe@645 930 * Creates a string tokenization context for a mutable string.
universe@645 931 *
universe@645 932 * @param str the string to tokenize
universe@645 933 * @param delim the delimiter (must not be empty)
universe@645 934 * @param limit the maximum number of tokens that shall be returned
universe@645 935 * @return a new string tokenization context
universe@645 936 */
universe@645 937 __attribute__((__warn_unused_result__))
universe@645 938 CxStrtokCtx cx_strtok_m(
universe@645 939 cxmutstr str,
universe@645 940 cxstring delim,
universe@645 941 size_t limit
universe@645 942 );
universe@645 943
universe@645 944 /**
universe@645 945 * Returns the next token.
universe@645 946 *
universe@645 947 * The token will point to the source string.
universe@645 948 *
universe@645 949 * @param ctx the tokenization context
universe@645 950 * @param token a pointer to memory where the next token shall be stored
universe@645 951 * @return true if successful, false if the limit or the end of the string
universe@645 952 * has been reached
universe@645 953 */
universe@645 954 __attribute__((__warn_unused_result__, __nonnull__))
universe@645 955 bool cx_strtok_next(
universe@645 956 CxStrtokCtx *ctx,
universe@645 957 cxstring *token
universe@645 958 );
universe@645 959
universe@645 960 /**
universe@645 961 * Returns the next token of a mutable string.
universe@645 962 *
universe@645 963 * The token will point to the source string.
universe@645 964 * If the context was not initialized over a mutable string, modifying
universe@645 965 * the data of the returned token is undefined behavior.
universe@645 966 *
universe@645 967 * @param ctx the tokenization context
universe@645 968 * @param token a pointer to memory where the next token shall be stored
universe@645 969 * @return true if successful, false if the limit or the end of the string
universe@645 970 * has been reached
universe@645 971 */
universe@645 972 __attribute__((__warn_unused_result__, __nonnull__))
universe@645 973 bool cx_strtok_next_m(
universe@645 974 CxStrtokCtx *ctx,
universe@645 975 cxmutstr *token
universe@645 976 );
universe@645 977
universe@645 978 /**
universe@645 979 * Defines an array of more delimiters for the specified tokenization context.
universe@645 980 *
universe@645 981 * @param ctx the tokenization context
universe@645 982 * @param delim array of more delimiters
universe@645 983 * @param count number of elements in the array
universe@645 984 */
universe@645 985 __attribute__((__nonnull__))
universe@645 986 void cx_strtok_delim(
universe@645 987 CxStrtokCtx *ctx,
universe@645 988 cxstring const *delim,
universe@645 989 size_t count
universe@645 990 );
universe@645 991
universe@645 992
universe@576 993 #ifdef __cplusplus
universe@576 994 } // extern "C"
universe@576 995 #endif
universe@576 996
universe@576 997 #endif //UCX_STRING_H

mercurial