Rev 4420 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 4420 | Rev 4537 | ||
|---|---|---|---|
| Line 60... | Line 60... | ||
| 60 | * |
60 | * |
| 61 | * [wide] string size number of BYTES in a [wide] string (excluding |
61 | * [wide] string size number of BYTES in a [wide] string (excluding |
| 62 | * the NULL-terminator), size_t |
62 | * the NULL-terminator), size_t |
| 63 | * |
63 | * |
| 64 | * [wide] string length number of CHARACTERS in a [wide] string (excluding |
64 | * [wide] string length number of CHARACTERS in a [wide] string (excluding |
| 65 | * the NULL-terminator), count_t |
65 | * the NULL-terminator), size_t |
| 66 | * |
66 | * |
| 67 | * [wide] string width number of display cells on a monospace display taken |
67 | * [wide] string width number of display cells on a monospace display taken |
| 68 | * by a [wide] string, count_t |
68 | * by a [wide] string, size_t |
| 69 | * |
69 | * |
| 70 | * |
70 | * |
| 71 | * Overview of string metrics:@n |
71 | * Overview of string metrics:@n |
| 72 | * |
72 | * |
| 73 | * Metric Abbrev. Type Meaning |
73 | * Metric Abbrev. Type Meaning |
| 74 | * ------ ------ ------ ------------------------------------------------- |
74 | * ------ ------ ------ ------------------------------------------------- |
| 75 | * size n size_t number of BYTES in a string (excluding the |
75 | * size n size_t number of BYTES in a string (excluding the |
| 76 | * NULL-terminator) |
76 | * NULL-terminator) |
| 77 | * |
77 | * |
| 78 | * length l count_t number of CHARACTERS in a string (excluding the |
78 | * length l size_t number of CHARACTERS in a string (excluding the |
| 79 | * null terminator) |
79 | * null terminator) |
| 80 | * |
80 | * |
| 81 | * width w count_t number of display cells on a monospace display |
81 | * width w size_t number of display cells on a monospace display |
| 82 | * taken by a string |
82 | * taken by a string |
| 83 | * |
83 | * |
| 84 | * |
84 | * |
| 85 | * Function naming prefixes:@n |
85 | * Function naming prefixes:@n |
| 86 | * |
86 | * |
| Line 95... | Line 95... | ||
| 95 | * |
95 | * |
| 96 | * A specific character inside a [wide] string can be referred to by:@n |
96 | * A specific character inside a [wide] string can be referred to by:@n |
| 97 | * |
97 | * |
| 98 | * pointer (char *, wchar_t *) |
98 | * pointer (char *, wchar_t *) |
| 99 | * byte offset (size_t) |
99 | * byte offset (size_t) |
| 100 | * character index (count_t) |
100 | * character index (size_t) |
| 101 | * |
101 | * |
| 102 | */ |
102 | */ |
| 103 | 103 | ||
| 104 | #include <string.h> |
104 | #include <string.h> |
| 105 | #include <print.h> |
105 | #include <print.h> |
| Line 307... | Line 307... | ||
| 307 | * @param max_len Maximum number of characters to measure. |
307 | * @param max_len Maximum number of characters to measure. |
| 308 | * |
308 | * |
| 309 | * @return Number of bytes used by the characters. |
309 | * @return Number of bytes used by the characters. |
| 310 | * |
310 | * |
| 311 | */ |
311 | */ |
| 312 | size_t str_lsize(const char *str, count_t max_len) |
312 | size_t str_lsize(const char *str, size_t max_len) |
| 313 | { |
313 | { |
| 314 | count_t len = 0; |
314 | size_t len = 0; |
| 315 | size_t offset = 0; |
315 | size_t offset = 0; |
| 316 | 316 | ||
| 317 | while (len < max_len) { |
317 | while (len < max_len) { |
| 318 | if (str_decode(str, &offset, STR_NO_LIMIT) == 0) |
318 | if (str_decode(str, &offset, STR_NO_LIMIT) == 0) |
| 319 | break; |
319 | break; |
| Line 335... | Line 335... | ||
| 335 | * @param max_len Maximum number of wide characters to measure. |
335 | * @param max_len Maximum number of wide characters to measure. |
| 336 | * |
336 | * |
| 337 | * @return Number of bytes used by the wide characters. |
337 | * @return Number of bytes used by the wide characters. |
| 338 | * |
338 | * |
| 339 | */ |
339 | */ |
| 340 | size_t wstr_lsize(const wchar_t *str, count_t max_len) |
340 | size_t wstr_lsize(const wchar_t *str, size_t max_len) |
| 341 | { |
341 | { |
| 342 | return (wstr_nlength(str, max_len * sizeof(wchar_t)) * sizeof(wchar_t)); |
342 | return (wstr_nlength(str, max_len * sizeof(wchar_t)) * sizeof(wchar_t)); |
| 343 | } |
343 | } |
| 344 | 344 | ||
| 345 | /** Get number of characters in a string. |
345 | /** Get number of characters in a string. |
| Line 347... | Line 347... | ||
| 347 | * @param str NULL-terminated string. |
347 | * @param str NULL-terminated string. |
| 348 | * |
348 | * |
| 349 | * @return Number of characters in string. |
349 | * @return Number of characters in string. |
| 350 | * |
350 | * |
| 351 | */ |
351 | */ |
| 352 | count_t str_length(const char *str) |
352 | size_t str_length(const char *str) |
| 353 | { |
353 | { |
| 354 | count_t len = 0; |
354 | size_t len = 0; |
| 355 | size_t offset = 0; |
355 | size_t offset = 0; |
| 356 | 356 | ||
| 357 | while (str_decode(str, &offset, STR_NO_LIMIT) != 0) |
357 | while (str_decode(str, &offset, STR_NO_LIMIT) != 0) |
| 358 | len++; |
358 | len++; |
| 359 | 359 | ||
| Line 365... | Line 365... | ||
| 365 | * @param str NULL-terminated wide string. |
365 | * @param str NULL-terminated wide string. |
| 366 | * |
366 | * |
| 367 | * @return Number of characters in @a str. |
367 | * @return Number of characters in @a str. |
| 368 | * |
368 | * |
| 369 | */ |
369 | */ |
| 370 | count_t wstr_length(const wchar_t *wstr) |
370 | size_t wstr_length(const wchar_t *wstr) |
| 371 | { |
371 | { |
| 372 | count_t len = 0; |
372 | size_t len = 0; |
| 373 | 373 | ||
| 374 | while (*wstr++ != 0) |
374 | while (*wstr++ != 0) |
| 375 | len++; |
375 | len++; |
| 376 | 376 | ||
| 377 | return len; |
377 | return len; |
| Line 383... | Line 383... | ||
| 383 | * @param size Maximum number of bytes to consider. |
383 | * @param size Maximum number of bytes to consider. |
| 384 | * |
384 | * |
| 385 | * @return Number of characters in string. |
385 | * @return Number of characters in string. |
| 386 | * |
386 | * |
| 387 | */ |
387 | */ |
| 388 | count_t str_nlength(const char *str, size_t size) |
388 | size_t str_nlength(const char *str, size_t size) |
| 389 | { |
389 | { |
| 390 | count_t len = 0; |
390 | size_t len = 0; |
| 391 | size_t offset = 0; |
391 | size_t offset = 0; |
| 392 | 392 | ||
| 393 | while (str_decode(str, &offset, size) != 0) |
393 | while (str_decode(str, &offset, size) != 0) |
| 394 | len++; |
394 | len++; |
| 395 | 395 | ||
| Line 402... | Line 402... | ||
| 402 | * @param size Maximum number of bytes to consider. |
402 | * @param size Maximum number of bytes to consider. |
| 403 | * |
403 | * |
| 404 | * @return Number of characters in string. |
404 | * @return Number of characters in string. |
| 405 | * |
405 | * |
| 406 | */ |
406 | */ |
| 407 | count_t wstr_nlength(const wchar_t *str, size_t size) |
407 | size_t wstr_nlength(const wchar_t *str, size_t size) |
| 408 | { |
408 | { |
| 409 | count_t len = 0; |
409 | size_t len = 0; |
| 410 | count_t limit = ALIGN_DOWN(size, sizeof(wchar_t)); |
410 | size_t limit = ALIGN_DOWN(size, sizeof(wchar_t)); |
| 411 | count_t offset = 0; |
411 | size_t offset = 0; |
| 412 | 412 | ||
| 413 | while ((offset < limit) && (*str++ != 0)) { |
413 | while ((offset < limit) && (*str++ != 0)) { |
| 414 | len++; |
414 | len++; |
| 415 | offset += sizeof(wchar_t); |
415 | offset += sizeof(wchar_t); |
| 416 | } |
416 | } |
| Line 494... | Line 494... | ||
| 494 | * |
494 | * |
| 495 | * @return 0 if the strings are equal, -1 if first is smaller, |
495 | * @return 0 if the strings are equal, -1 if first is smaller, |
| 496 | * 1 if second smaller. |
496 | * 1 if second smaller. |
| 497 | * |
497 | * |
| 498 | */ |
498 | */ |
| 499 | int str_lcmp(const char *s1, const char *s2, count_t max_len) |
499 | int str_lcmp(const char *s1, const char *s2, size_t max_len) |
| 500 | { |
500 | { |
| 501 | wchar_t c1 = 0; |
501 | wchar_t c1 = 0; |
| 502 | wchar_t c2 = 0; |
502 | wchar_t c2 = 0; |
| 503 | 503 | ||
| 504 | size_t off1 = 0; |
504 | size_t off1 = 0; |
| 505 | size_t off2 = 0; |
505 | size_t off2 = 0; |
| 506 | 506 | ||
| 507 | count_t len = 0; |
507 | size_t len = 0; |
| 508 | 508 | ||
| 509 | while (true) { |
509 | while (true) { |
| 510 | if (len >= max_len) |
510 | if (len >= max_len) |
| 511 | break; |
511 | break; |
| 512 | 512 | ||
| Line 613... | Line 613... | ||
| 613 | /* No space for the NULL-terminator in the buffer */ |
613 | /* No space for the NULL-terminator in the buffer */ |
| 614 | if (size == 0) |
614 | if (size == 0) |
| 615 | return; |
615 | return; |
| 616 | 616 | ||
| 617 | wchar_t ch; |
617 | wchar_t ch; |
| 618 | count_t src_idx = 0; |
618 | size_t src_idx = 0; |
| 619 | size_t dst_off = 0; |
619 | size_t dst_off = 0; |
| 620 | 620 | ||
| 621 | while ((ch = src[src_idx++]) != 0) { |
621 | while ((ch = src[src_idx++]) != 0) { |
| 622 | if (chr_encode(ch, dst, &dst_off, size) != EOK) |
622 | if (chr_encode(ch, dst, &dst_off, size) != EOK) |
| 623 | break; |
623 | break; |
| Line 664... | Line 664... | ||
| 664 | * |
664 | * |
| 665 | * @return True if the insertion was sucessful, false if the position |
665 | * @return True if the insertion was sucessful, false if the position |
| 666 | * is out of bounds. |
666 | * is out of bounds. |
| 667 | * |
667 | * |
| 668 | */ |
668 | */ |
| 669 | bool wstr_linsert(wchar_t *str, wchar_t ch, count_t pos, count_t max_pos) |
669 | bool wstr_linsert(wchar_t *str, wchar_t ch, size_t pos, size_t max_pos) |
| 670 | { |
670 | { |
| 671 | count_t len = wstr_length(str); |
671 | size_t len = wstr_length(str); |
| 672 | 672 | ||
| 673 | if ((pos > len) || (pos + 1 > max_pos)) |
673 | if ((pos > len) || (pos + 1 > max_pos)) |
| 674 | return false; |
674 | return false; |
| 675 | 675 | ||
| 676 | count_t i; |
676 | size_t i; |
| 677 | for (i = len; i + 1 > pos; i--) |
677 | for (i = len; i + 1 > pos; i--) |
| 678 | str[i + 1] = str[i]; |
678 | str[i + 1] = str[i]; |
| 679 | 679 | ||
| 680 | str[pos] = ch; |
680 | str[pos] = ch; |
| 681 | 681 | ||
| Line 692... | Line 692... | ||
| 692 | * |
692 | * |
| 693 | * @return True if the removal was sucessful, false if the position |
693 | * @return True if the removal was sucessful, false if the position |
| 694 | * is out of bounds. |
694 | * is out of bounds. |
| 695 | * |
695 | * |
| 696 | */ |
696 | */ |
| 697 | bool wstr_remove(wchar_t *str, count_t pos) |
697 | bool wstr_remove(wchar_t *str, size_t pos) |
| 698 | { |
698 | { |
| 699 | count_t len = wstr_length(str); |
699 | size_t len = wstr_length(str); |
| 700 | 700 | ||
| 701 | if (pos >= len) |
701 | if (pos >= len) |
| 702 | return false; |
702 | return false; |
| 703 | 703 | ||
| 704 | count_t i; |
704 | size_t i; |
| 705 | for (i = pos + 1; i <= len; i++) |
705 | for (i = pos + 1; i <= len; i++) |
| 706 | str[i - 1] = str[i]; |
706 | str[i - 1] = str[i]; |
| 707 | 707 | ||
| 708 | return true; |
708 | return true; |
| 709 | } |
709 | } |