src/cx/string.h

Tue, 04 Oct 2022 18:49:14 +0200

author
Mike Becker <universe@uap-core.de>
date
Tue, 04 Oct 2022 18:49:14 +0200
changeset 589
c290f8fd979e
parent 584
184e9ebfc3cc
child 645
ec50abb285ad
permissions
-rw-r--r--

add zero-termination guarantees

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@583 82 * A literal initializer for an UCX string structure.
universe@583 83 *
universe@583 84 * The argument MUST be a string (const char*) \em literal.
universe@583 85 *
universe@583 86 * @param literal the string literal
universe@583 87 */
universe@583 88 #define CX_STR(literal) {literal, sizeof(literal) - 1}
universe@583 89
universe@576 90 #ifdef __cplusplus
universe@576 91 extern "C" {
universe@576 92 #endif
universe@576 93
universe@576 94
universe@576 95 /**
universe@576 96 * Wraps a mutable string that must be zero-terminated.
universe@576 97 *
universe@576 98 * The length is implicitly inferred by using a call to \c strlen().
universe@576 99 *
universe@576 100 * \note the wrapped string will share the specified pointer to the string.
universe@576 101 * If you do want a copy, use cx_strdup() on the return value of this function.
universe@576 102 *
universe@576 103 * If you need to wrap a constant string, use cx_str().
universe@576 104 *
universe@584 105 * @param cstring the string to wrap, must be zero-terminated
universe@576 106 * @return the wrapped string
universe@576 107 *
universe@576 108 * @see cx_mutstrn()
universe@576 109 */
universe@584 110 __attribute__((__warn_unused_result__, __nonnull__))
universe@576 111 cxmutstr cx_mutstr(char *cstring);
universe@576 112
universe@576 113 /**
universe@576 114 * Wraps a string that does not need to be zero-terminated.
universe@576 115 *
universe@576 116 * The argument may be \c NULL if the length is zero.
universe@576 117 *
universe@576 118 * \note the wrapped string will share the specified pointer to the string.
universe@576 119 * If you do want a copy, use cx_strdup() on the return value of this function.
universe@576 120 *
universe@576 121 * If you need to wrap a constant string, use cx_strn().
universe@576 122 *
universe@584 123 * @param cstring the string to wrap (or \c NULL, only if the length is zero)
universe@576 124 * @param length the length of the string
universe@576 125 * @return the wrapped string
universe@576 126 *
universe@576 127 * @see cx_mutstr()
universe@576 128 */
universe@576 129 __attribute__((__warn_unused_result__))
universe@576 130 cxmutstr cx_mutstrn(
universe@576 131 char *cstring,
universe@576 132 size_t length
universe@576 133 );
universe@576 134
universe@576 135 /**
universe@576 136 * Wraps a string that must be zero-terminated.
universe@576 137 *
universe@576 138 * The length is implicitly inferred by using a call to \c strlen().
universe@576 139 *
universe@576 140 * \note the wrapped string will share the specified pointer to the string.
universe@576 141 * If you do want a copy, use cx_strdup() on the return value of this function.
universe@576 142 *
universe@576 143 * If you need to wrap a non-constant string, use cx_mutstr().
universe@576 144 *
universe@584 145 * @param cstring the string to wrap, must be zero-terminated
universe@576 146 * @return the wrapped string
universe@576 147 *
universe@576 148 * @see cx_strn()
universe@576 149 */
universe@584 150 __attribute__((__warn_unused_result__, __nonnull__))
universe@576 151 cxstring cx_str(char const *cstring);
universe@576 152
universe@576 153
universe@576 154 /**
universe@576 155 * Wraps a string that does not need to be zero-terminated.
universe@576 156 *
universe@576 157 * The argument may be \c NULL if the length is zero.
universe@576 158 *
universe@576 159 * \note the wrapped string will share the specified pointer to the string.
universe@576 160 * If you do want a copy, use cx_strdup() on the return value of this function.
universe@576 161 *
universe@576 162 * If you need to wrap a non-constant string, use cx_mutstrn().
universe@576 163 *
universe@584 164 * @param cstring the string to wrap (or \c NULL, only if the length is zero)
universe@576 165 * @param length the length of the string
universe@576 166 * @return the wrapped string
universe@576 167 *
universe@576 168 * @see cx_str()
universe@576 169 */
universe@576 170 __attribute__((__warn_unused_result__))
universe@576 171 cxstring cx_strn(
universe@576 172 char const *cstring,
universe@576 173 size_t length
universe@576 174 );
universe@576 175
universe@576 176 /**
universe@576 177 * Casts a mutable string to an immutable string.
universe@576 178 *
universe@576 179 * \note This is not seriously a cast. Instead you get a copy
universe@576 180 * of the struct with the desired pointer type. Both structs still
universe@576 181 * point to the same location, though!
universe@576 182 *
universe@576 183 * @param str the mutable string to cast
universe@576 184 * @return an immutable copy of the string pointer
universe@576 185 */
universe@576 186 __attribute__((__warn_unused_result__))
universe@576 187 cxstring cx_strcast(cxmutstr str);
universe@576 188
universe@576 189 /**
universe@576 190 * Passes the pointer in this string to \c free().
universe@576 191 *
universe@576 192 * The pointer in the struct is set to \c NULL and the length is set to zero.
universe@576 193 *
universe@576 194 * \note There is no implementation for cxstring, because it is unlikely that
universe@576 195 * you ever have a \c char \c const* you are really supposed to free. If you
universe@576 196 * encounter such situation, you should double-check your code.
universe@576 197 *
universe@576 198 * @param str the string to free
universe@576 199 */
universe@583 200 __attribute__((__nonnull__))
universe@576 201 void cx_strfree(cxmutstr *str);
universe@576 202
universe@576 203 /**
universe@583 204 * Passes the pointer in this string to the allocators free function.
universe@583 205 *
universe@583 206 * The pointer in the struct is set to \c NULL and the length is set to zero.
universe@583 207 *
universe@583 208 * \note There is no implementation for cxstring, because it is unlikely that
universe@583 209 * you ever have a \c char \c const* you are really supposed to free. If you
universe@583 210 * encounter such situation, you should double-check your code.
universe@583 211 *
universe@583 212 * @param alloc the allocator
universe@583 213 * @param str the string to free
universe@583 214 */
universe@583 215 __attribute__((__nonnull__))
universe@583 216 void cx_strfree_a(
universe@583 217 CxAllocator *alloc,
universe@583 218 cxmutstr *str
universe@583 219 );
universe@583 220
universe@583 221 /**
universe@576 222 * Returns the accumulated length of all specified strings.
universe@576 223 *
universe@576 224 * \attention if the count argument is larger than the number of the
universe@576 225 * specified strings, the behavior is undefined.
universe@576 226 *
universe@576 227 * @param count the total number of specified strings
universe@576 228 * @param ... all strings
universe@576 229 * @return the accumulated length of all strings
universe@576 230 */
universe@576 231 __attribute__((__warn_unused_result__))
universe@576 232 size_t cx_strlen(
universe@576 233 size_t count,
universe@576 234 ...
universe@576 235 );
universe@576 236
universe@576 237 /**
universe@576 238 * Concatenates two or more strings.
universe@576 239 *
universe@576 240 * The resulting string will be allocated by the specified allocator.
universe@576 241 * So developers \em must pass the return value to cx_strfree() eventually.
universe@576 242 *
universe@576 243 * \note It is guaranteed that there is only one allocation.
universe@589 244 * It is also guaranteed that the returned string is zero-terminated.
universe@576 245 *
universe@576 246 * @param alloc the allocator to use
universe@576 247 * @param count the total number of strings to concatenate
universe@576 248 * @param ... all strings
universe@576 249 * @return the concatenated string
universe@576 250 */
universe@576 251 __attribute__((__warn_unused_result__, __nonnull__))
universe@576 252 cxmutstr cx_strcat_a(
universe@576 253 CxAllocator *alloc,
universe@576 254 size_t count,
universe@576 255 ...
universe@576 256 );
universe@576 257
universe@576 258 /**
universe@576 259 * Concatenates two or more strings.
universe@576 260 *
universe@576 261 * The resulting string will be allocated by standard \c malloc().
universe@576 262 * So developers \em must pass the return value to cx_strfree() eventually.
universe@576 263 *
universe@589 264 * \note It is guaranteed that there is only one allocation.
universe@589 265 * It is also guaranteed that the returned string is zero-terminated.
universe@589 266 *
universe@576 267 * @param count the total number of strings to concatenate
universe@576 268 * @param ... all strings
universe@576 269 * @return the concatenated string
universe@576 270 */
universe@576 271 #define cx_strcat(count, ...) \
universe@576 272 cx_strcat_a(cxDefaultAllocator, count, __VA_ARGS__)
universe@576 273
universe@576 274 /**
universe@576 275 * Returns a substring starting at the specified location.
universe@576 276 *
universe@576 277 * \attention the new string references the same memory area as the
universe@576 278 * input string and is usually \em not zero-terminated.
universe@576 279 * Use cx_strdup() to get a copy.
universe@576 280 *
universe@576 281 * @param string input string
universe@576 282 * @param start start location of the substring
universe@576 283 * @return a substring of \p string starting at \p start
universe@576 284 *
universe@576 285 * @see cx_strsubsl()
universe@576 286 * @see cx_strsubs_m()
universe@576 287 * @see cx_strsubsl_m()
universe@576 288 */
universe@576 289 __attribute__((__warn_unused_result__))
universe@576 290 cxstring cx_strsubs(
universe@576 291 cxstring string,
universe@576 292 size_t start
universe@576 293 );
universe@576 294
universe@576 295 /**
universe@576 296 * Returns a substring starting at the specified location.
universe@576 297 *
universe@576 298 * The returned string will be limited to \p length bytes or the number
universe@576 299 * of bytes available in \p string, whichever is smaller.
universe@576 300 *
universe@576 301 * \attention the new string references the same memory area as the
universe@576 302 * input string and is usually \em not zero-terminated.
universe@576 303 * Use cx_strdup() to get a copy.
universe@576 304 *
universe@576 305 * @param string input string
universe@576 306 * @param start start location of the substring
universe@576 307 * @param length the maximum length of the returned string
universe@576 308 * @return a substring of \p string starting at \p start
universe@576 309 *
universe@576 310 * @see cx_strsubs()
universe@576 311 * @see cx_strsubs_m()
universe@576 312 * @see cx_strsubsl_m()
universe@576 313 */
universe@576 314 __attribute__((__warn_unused_result__))
universe@576 315 cxstring cx_strsubsl(
universe@576 316 cxstring string,
universe@576 317 size_t start,
universe@576 318 size_t length
universe@576 319 );
universe@576 320
universe@576 321 /**
universe@576 322 * Returns a substring starting at the specified location.
universe@576 323 *
universe@576 324 * \attention the new string references the same memory area as the
universe@576 325 * input string and is usually \em not zero-terminated.
universe@576 326 * Use cx_strdup() to get a copy.
universe@576 327 *
universe@576 328 * @param string input string
universe@576 329 * @param start start location of the substring
universe@576 330 * @return a substring of \p string starting at \p start
universe@576 331 *
universe@576 332 * @see cx_strsubsl_m()
universe@576 333 * @see cx_strsubs()
universe@576 334 * @see cx_strsubsl()
universe@576 335 */
universe@576 336 __attribute__((__warn_unused_result__))
universe@576 337 cxmutstr cx_strsubs_m(
universe@576 338 cxmutstr string,
universe@576 339 size_t start
universe@576 340 );
universe@576 341
universe@576 342 /**
universe@576 343 * Returns a substring starting at the specified location.
universe@576 344 *
universe@576 345 * The returned string will be limited to \p length bytes or the number
universe@576 346 * of bytes available in \p string, whichever is smaller.
universe@576 347 *
universe@576 348 * \attention the new string references the same memory area as the
universe@576 349 * input string and is usually \em not zero-terminated.
universe@576 350 * Use cx_strdup() to get a copy.
universe@576 351 *
universe@576 352 * @param string input string
universe@576 353 * @param start start location of the substring
universe@576 354 * @param length the maximum length of the returned string
universe@576 355 * @return a substring of \p string starting at \p start
universe@576 356 *
universe@576 357 * @see cx_strsubs_m()
universe@576 358 * @see cx_strsubs()
universe@576 359 * @see cx_strsubsl()
universe@576 360 */
universe@576 361 __attribute__((__warn_unused_result__))
universe@576 362 cxmutstr cx_strsubsl_m(
universe@576 363 cxmutstr string,
universe@576 364 size_t start,
universe@576 365 size_t length
universe@576 366 );
universe@576 367
universe@576 368 /**
universe@576 369 * Returns a substring starting at the location of the first occurrence of the
universe@576 370 * specified character.
universe@576 371 *
universe@576 372 * If the string does not contain the character, an empty string is returned.
universe@576 373 *
universe@576 374 * @param string the string where to locate the character
universe@576 375 * @param chr the character to locate
universe@576 376 * @return a substring starting at the first location of \p chr
universe@576 377 *
universe@576 378 * @see cx_strchr_m()
universe@576 379 */
universe@576 380 __attribute__((__warn_unused_result__))
universe@576 381 cxstring cx_strchr(
universe@576 382 cxstring string,
universe@576 383 int chr
universe@576 384 );
universe@576 385
universe@576 386 /**
universe@576 387 * Returns a substring starting at the location of the first occurrence of the
universe@576 388 * specified character.
universe@576 389 *
universe@576 390 * If the string does not contain the character, an empty string is returned.
universe@576 391 *
universe@576 392 * @param string the string where to locate the character
universe@576 393 * @param chr the character to locate
universe@576 394 * @return a substring starting at the first location of \p chr
universe@576 395 *
universe@576 396 * @see cx_strchr()
universe@576 397 */
universe@576 398 __attribute__((__warn_unused_result__))
universe@576 399 cxmutstr cx_strchr_m(
universe@576 400 cxmutstr string,
universe@576 401 int chr
universe@576 402 );
universe@576 403
universe@576 404 /**
universe@576 405 * Returns a substring starting at the location of the last occurrence of the
universe@576 406 * specified character.
universe@576 407 *
universe@576 408 * If the string does not contain the character, an empty string is returned.
universe@576 409 *
universe@576 410 * @param string the string where to locate the character
universe@576 411 * @param chr the character to locate
universe@576 412 * @return a substring starting at the last location of \p chr
universe@576 413 *
universe@576 414 * @see cx_strrchr_m()
universe@576 415 */
universe@576 416 __attribute__((__warn_unused_result__))
universe@576 417 cxstring cx_strrchr(
universe@576 418 cxstring string,
universe@576 419 int chr
universe@576 420 );
universe@576 421
universe@576 422 /**
universe@576 423 * Returns a substring starting at the location of the last occurrence of the
universe@576 424 * specified character.
universe@576 425 *
universe@576 426 * If the string does not contain the character, an empty string is returned.
universe@576 427 *
universe@576 428 * @param string the string where to locate the character
universe@576 429 * @param chr the character to locate
universe@576 430 * @return a substring starting at the last location of \p chr
universe@576 431 *
universe@576 432 * @see cx_strrchr()
universe@576 433 */
universe@576 434 __attribute__((__warn_unused_result__))
universe@576 435 cxmutstr cx_strrchr_m(
universe@576 436 cxmutstr string,
universe@576 437 int chr
universe@576 438 );
universe@576 439
universe@576 440 /**
universe@576 441 * Returns a substring starting at the location of the first occurrence of the
universe@576 442 * specified string.
universe@576 443 *
universe@576 444 * If \p haystack does not contain \p needle, an empty string is returned.
universe@576 445 *
universe@576 446 * If \p needle is an empty string, the complete \p haystack is
universe@576 447 * returned.
universe@576 448 *
universe@576 449 * @param haystack the string to be scanned
universe@576 450 * @param needle string containing the sequence of characters to match
universe@576 451 * @return a substring starting at the first occurrence of
universe@576 452 * \p needle, or an empty string, if the sequence is not
universe@576 453 * contained
universe@576 454 * @see cx_strstr_m()
universe@576 455 */
universe@576 456 __attribute__((__warn_unused_result__))
universe@576 457 cxstring cx_strstr(
universe@576 458 cxstring haystack,
universe@576 459 cxstring needle
universe@576 460 );
universe@576 461
universe@576 462 /**
universe@576 463 * Returns a substring starting at the location of the first occurrence of the
universe@576 464 * specified string.
universe@576 465 *
universe@576 466 * If \p haystack does not contain \p needle, an empty string is returned.
universe@576 467 *
universe@576 468 * If \p needle is an empty string, the complete \p haystack is
universe@576 469 * returned.
universe@576 470 *
universe@576 471 * @param haystack the string to be scanned
universe@576 472 * @param needle string containing the sequence of characters to match
universe@576 473 * @return a substring starting at the first occurrence of
universe@576 474 * \p needle, or an empty string, if the sequence is not
universe@576 475 * contained
universe@576 476 * @see cx_strstr()
universe@576 477 */
universe@576 478 __attribute__((__warn_unused_result__))
universe@576 479 cxmutstr cx_strstr_m(
universe@576 480 cxmutstr haystack,
universe@576 481 cxstring needle
universe@576 482 );
universe@576 483
universe@576 484 /**
universe@576 485 * Splits a given string using a delimiter string.
universe@576 486 *
universe@576 487 * \note The resulting array contains strings that point to the source
universe@576 488 * \p string. Use cx_strdup() to get copies.
universe@576 489 *
universe@576 490 * @param string the string to split
universe@576 491 * @param delim the delimiter
universe@576 492 * @param limit the maximum number of split items
universe@576 493 * @param output a pre-allocated array of at least \p limit length
universe@576 494 * @return the actual number of split items
universe@576 495 */
universe@576 496 __attribute__((__warn_unused_result__, __nonnull__))
universe@576 497 size_t cx_strsplit(
universe@576 498 cxstring string,
universe@576 499 cxstring delim,
universe@576 500 size_t limit,
universe@576 501 cxstring *output
universe@576 502 );
universe@576 503
universe@576 504 /**
universe@576 505 * Splits a given string using a delimiter string.
universe@576 506 *
universe@576 507 * The array pointed to by \p output will be allocated by \p allocator.
universe@576 508 *
universe@576 509 * \note The resulting array contains strings that point to the source
universe@576 510 * \p string. Use cx_strdup() to get copies.
universe@576 511 *
universe@576 512 * \attention If allocation fails, the \c NULL pointer will be written to
universe@576 513 * \p output and the number returned will be zero.
universe@576 514 *
universe@576 515 * @param allocator the allocator to use for allocating the resulting array
universe@576 516 * @param string the string to split
universe@576 517 * @param delim the delimiter
universe@576 518 * @param limit the maximum number of split items
universe@576 519 * @param output a pointer where the address of the allocated array shall be
universe@576 520 * written to
universe@576 521 * @return the actual number of split items
universe@576 522 */
universe@576 523 __attribute__((__warn_unused_result__, __nonnull__))
universe@576 524 size_t cx_strsplit_a(
universe@576 525 CxAllocator *allocator,
universe@576 526 cxstring string,
universe@576 527 cxstring delim,
universe@576 528 size_t limit,
universe@576 529 cxstring **output
universe@576 530 );
universe@576 531
universe@576 532
universe@576 533 /**
universe@576 534 * Splits a given string using a delimiter string.
universe@576 535 *
universe@576 536 * \note The resulting array contains strings that point to the source
universe@576 537 * \p string. Use cx_strdup() to get copies.
universe@576 538 *
universe@576 539 * @param string the string to split
universe@576 540 * @param delim the delimiter
universe@576 541 * @param limit the maximum number of split items
universe@576 542 * @param output a pre-allocated array of at least \p limit length
universe@576 543 * @return the actual number of split items
universe@576 544 */
universe@576 545 __attribute__((__warn_unused_result__, __nonnull__))
universe@576 546 size_t cx_strsplit_m(
universe@576 547 cxmutstr string,
universe@576 548 cxstring delim,
universe@576 549 size_t limit,
universe@576 550 cxmutstr *output
universe@576 551 );
universe@576 552
universe@576 553 /**
universe@576 554 * Splits a given string using a delimiter string.
universe@576 555 *
universe@576 556 * The array pointed to by \p output will be allocated by \p allocator.
universe@576 557 *
universe@576 558 * \note The resulting array contains strings that point to the source
universe@576 559 * \p string. Use cx_strdup() to get copies.
universe@576 560 *
universe@576 561 * \attention If allocation fails, the \c NULL pointer will be written to
universe@576 562 * \p output and the number returned will be zero.
universe@576 563 *
universe@576 564 * @param allocator the allocator to use for allocating the resulting array
universe@576 565 * @param string the string to split
universe@576 566 * @param delim the delimiter
universe@576 567 * @param limit the maximum number of split items
universe@576 568 * @param output a pointer where the address of the allocated array shall be
universe@576 569 * written to
universe@576 570 * @return the actual number of split items
universe@576 571 */
universe@576 572 __attribute__((__warn_unused_result__, __nonnull__))
universe@576 573 size_t cx_strsplit_ma(
universe@576 574 CxAllocator *allocator,
universe@576 575 cxmutstr string,
universe@576 576 cxstring delim,
universe@576 577 size_t limit,
universe@576 578 cxmutstr **output
universe@576 579 );
universe@576 580
universe@576 581 /**
universe@576 582 * Compares two strings.
universe@576 583 *
universe@576 584 * @param s1 the first string
universe@576 585 * @param s2 the second string
universe@576 586 * @return negative if \p s1 is smaller than \p s2, positive if \p s1 is larger
universe@576 587 * than \p s2, zero if both strings equal
universe@576 588 */
universe@576 589 __attribute__((__warn_unused_result__))
universe@576 590 int cx_strcmp(
universe@576 591 cxstring s1,
universe@576 592 cxstring s2
universe@576 593 );
universe@576 594
universe@576 595 /**
universe@576 596 * Compares two strings ignoring case.
universe@576 597 *
universe@576 598 * @param s1 the first string
universe@576 599 * @param s2 the second string
universe@576 600 * @return negative if \p s1 is smaller than \p s2, positive if \p s1 is larger
universe@576 601 * than \p s2, zero if both strings equal ignoring case
universe@576 602 */
universe@576 603 __attribute__((__warn_unused_result__))
universe@576 604 int cx_strcasecmp(
universe@576 605 cxstring s1,
universe@576 606 cxstring s2
universe@576 607 );
universe@576 608
universe@576 609
universe@576 610 /**
universe@576 611 * Creates a duplicate of the specified string.
universe@576 612 *
universe@576 613 * The new string will contain a copy allocated by \p allocator.
universe@576 614 *
universe@589 615 * \note The returned string is guaranteed to be zero-terminated.
universe@576 616 *
universe@576 617 * @param allocator the allocator to use
universe@576 618 * @param string the string to duplicate
universe@576 619 * @return a duplicate of the string
universe@576 620 * @see cx_strdup()
universe@576 621 */
universe@576 622 __attribute__((__warn_unused_result__, __nonnull__))
universe@576 623 cxmutstr cx_strdup_a(
universe@576 624 CxAllocator *allocator,
universe@576 625 cxstring string
universe@576 626 );
universe@576 627
universe@576 628 /**
universe@578 629 * Creates a duplicate of the specified string.
universe@578 630 *
universe@578 631 * The new string will contain a copy allocated by standard
universe@578 632 * \c malloc(). So developers \em must pass the return value to cx_strfree().
universe@578 633 *
universe@589 634 * \note The returned string is guaranteed to be zero-terminated.
universe@578 635 *
universe@578 636 * @param string the string to duplicate
universe@578 637 * @return a duplicate of the string
universe@578 638 * @see cx_strdup_a()
universe@578 639 */
universe@578 640 #define cx_strdup(string) cx_strdup_a(cxDefaultAllocator, string)
universe@578 641
universe@578 642 /**
universe@576 643 * Omits leading and trailing spaces.
universe@576 644 *
universe@576 645 * \note the returned string references the same memory, thus you
universe@576 646 * must \em not free the returned memory.
universe@576 647 *
universe@576 648 * @param string the string that shall be trimmed
universe@576 649 * @return the trimmed string
universe@576 650 */
universe@576 651 __attribute__((__warn_unused_result__))
universe@576 652 cxstring cx_strtrim(cxstring string);
universe@576 653
universe@576 654 /**
universe@576 655 * Omits leading and trailing spaces.
universe@576 656 *
universe@576 657 * \note the returned string references the same memory, thus you
universe@576 658 * must \em not free the returned memory.
universe@576 659 *
universe@576 660 * @param string the string that shall be trimmed
universe@576 661 * @return the trimmed string
universe@576 662 */
universe@576 663 __attribute__((__warn_unused_result__))
universe@576 664 cxmutstr cx_strtrim_m(cxmutstr string);
universe@576 665
universe@576 666 /**
universe@576 667 * Checks, if a string has a specific prefix.
universe@576 668 *
universe@576 669 * @param string the string to check
universe@576 670 * @param prefix the prefix the string should have
universe@576 671 * @return \c true, if and only if the string has the specified prefix,
universe@576 672 * \c false otherwise
universe@576 673 */
universe@576 674 __attribute__((__warn_unused_result__))
universe@576 675 bool cx_strprefix(
universe@576 676 cxstring string,
universe@576 677 cxstring prefix
universe@576 678 );
universe@576 679
universe@576 680 /**
universe@576 681 * Checks, if a string has a specific suffix.
universe@576 682 *
universe@576 683 * @param string the string to check
universe@576 684 * @param suffix the suffix the string should have
universe@576 685 * @return \c true, if and only if the string has the specified suffix,
universe@576 686 * \c false otherwise
universe@576 687 */
universe@576 688 __attribute__((__warn_unused_result__))
universe@581 689 bool cx_strsuffix(
universe@576 690 cxstring string,
universe@576 691 cxstring suffix
universe@576 692 );
universe@576 693
universe@576 694 /**
universe@576 695 * Checks, if a string has a specific prefix, ignoring the case.
universe@576 696 *
universe@576 697 * @param string the string to check
universe@576 698 * @param prefix the prefix the string should have
universe@576 699 * @return \c true, if and only if the string has the specified prefix,
universe@576 700 * \c false otherwise
universe@576 701 */
universe@576 702 __attribute__((__warn_unused_result__))
universe@581 703 bool cx_strcaseprefix(
universe@576 704 cxstring string,
universe@576 705 cxstring prefix
universe@576 706 );
universe@576 707
universe@576 708 /**
universe@576 709 * Checks, if a string has a specific suffix, ignoring the case.
universe@576 710 *
universe@576 711 * @param string the string to check
universe@576 712 * @param suffix the suffix the string should have
universe@576 713 * @return \c true, if and only if the string has the specified suffix,
universe@576 714 * \c false otherwise
universe@576 715 */
universe@576 716 __attribute__((__warn_unused_result__))
universe@581 717 bool cx_strcasesuffix(
universe@576 718 cxstring string,
universe@576 719 cxstring suffix
universe@576 720 );
universe@576 721
universe@576 722 /**
universe@576 723 * Converts the string to lower case.
universe@576 724 *
universe@576 725 * The change is made in-place. If you want a copy, use cx_strdup(), first.
universe@576 726 *
universe@576 727 * @param string the string to modify
universe@576 728 * @see cx_strdup()
universe@576 729 */
universe@576 730 void cx_strlower(cxmutstr string);
universe@576 731
universe@576 732 /**
universe@576 733 * Converts the string to upper case.
universe@576 734 *
universe@576 735 * The change is made in-place. If you want a copy, use cx_strdup(), first.
universe@576 736 *
universe@576 737 * @param string the string to modify
universe@576 738 * @see cx_strdup()
universe@576 739 */
universe@576 740 void cx_strupper(cxmutstr string);
universe@576 741
universe@576 742 /**
universe@576 743 * Replaces a pattern in a string with another string.
universe@576 744 *
universe@576 745 * The pattern is taken literally and is no regular expression.
universe@576 746 * Replaces at most \p replmax occurrences.
universe@576 747 *
universe@589 748 * The returned string will be allocated by \p allocator and is guaranteed
universe@589 749 * to be zero-terminated.
universe@576 750 *
universe@576 751 * If allocation fails, or the input string is empty,
universe@583 752 * the returned string will be empty.
universe@576 753 *
universe@576 754 * @param allocator the allocator to use
universe@576 755 * @param str the string where replacements should be applied
universe@576 756 * @param pattern the pattern to search for
universe@576 757 * @param replacement the replacement string
universe@576 758 * @param replmax maximum number of replacements
universe@576 759 * @return the resulting string after applying the replacements
universe@576 760 */
universe@576 761 __attribute__((__warn_unused_result__, __nonnull__))
universe@583 762 cxmutstr cx_strreplacen_a(
universe@576 763 CxAllocator *allocator,
universe@576 764 cxstring str,
universe@576 765 cxstring pattern,
universe@576 766 cxstring replacement,
universe@576 767 size_t replmax
universe@576 768 );
universe@576 769
universe@578 770 /**
universe@578 771 * Replaces a pattern in a string with another string.
universe@578 772 *
universe@578 773 * The pattern is taken literally and is no regular expression.
universe@578 774 * Replaces at most \p replmax occurrences.
universe@578 775 *
universe@589 776 * The returned string will be allocated by \c malloc() and is guaranteed
universe@589 777 * to be zero-terminated.
universe@578 778 *
universe@578 779 * If allocation fails, or the input string is empty,
universe@583 780 * the returned string will be empty.
universe@578 781 *
universe@578 782 * @param str the string where replacements should be applied
universe@578 783 * @param pattern the pattern to search for
universe@578 784 * @param replacement the replacement string
universe@578 785 * @param replmax maximum number of replacements
universe@578 786 * @return the resulting string after applying the replacements
universe@578 787 */
universe@583 788 #define cx_strreplacen(str, pattern, replacement, replmax) \
universe@583 789 cx_strreplacen_a(cxDefaultAllocator, str, pattern, replacement, replmax)
universe@583 790
universe@583 791 /**
universe@583 792 * Replaces a pattern in a string with another string.
universe@583 793 *
universe@583 794 * The pattern is taken literally and is no regular expression.
universe@583 795 *
universe@589 796 * The returned string will be allocated by \p allocator and is guaranteed
universe@589 797 * to be zero-terminated.
universe@583 798 *
universe@583 799 * If allocation fails, or the input string is empty,
universe@583 800 * the returned string will be empty.
universe@583 801 *
universe@583 802 * @param allocator the allocator to use
universe@583 803 * @param str the string where replacements should be applied
universe@583 804 * @param pattern the pattern to search for
universe@583 805 * @param replacement the replacement string
universe@583 806 * @return the resulting string after applying the replacements
universe@583 807 */
universe@583 808 #define cx_strreplace_a(allocator, str, pattern, replacement) \
universe@583 809 cx_strreplacen_a(allocator, str, pattern, replacement, SIZE_MAX)
universe@583 810
universe@583 811 /**
universe@583 812 * Replaces a pattern in a string with another string.
universe@583 813 *
universe@583 814 * The pattern is taken literally and is no regular expression.
universe@583 815 * Replaces at most \p replmax occurrences.
universe@583 816 *
universe@589 817 * The returned string will be allocated by \c malloc() and is guaranteed
universe@589 818 * to be zero-terminated.
universe@583 819 *
universe@583 820 * If allocation fails, or the input string is empty,
universe@583 821 * the returned string will be empty.
universe@583 822 *
universe@583 823 * @param str the string where replacements should be applied
universe@583 824 * @param pattern the pattern to search for
universe@583 825 * @param replacement the replacement string
universe@583 826 * @return the resulting string after applying the replacements
universe@583 827 */
universe@583 828 #define cx_strreplace(str, pattern, replacement) \
universe@583 829 cx_strreplacen_a(cxDefaultAllocator, str, pattern, replacement, SIZE_MAX)
universe@578 830
universe@576 831 #ifdef __cplusplus
universe@576 832 } // extern "C"
universe@576 833 #endif
universe@576 834
universe@576 835 #endif //UCX_STRING_H

mercurial