Rev 4280 | Rev 4312 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 4280 | Rev 4281 | ||
|---|---|---|---|
| Line 33... | Line 33... | ||
| 33 | /** @file |
33 | /** @file |
| 34 | */ |
34 | */ |
| 35 | 35 | ||
| 36 | #include <string.h> |
36 | #include <string.h> |
| 37 | #include <stdlib.h> |
37 | #include <stdlib.h> |
| - | 38 | #include <assert.h> |
|
| 38 | #include <limits.h> |
39 | #include <limits.h> |
| 39 | #include <ctype.h> |
40 | #include <ctype.h> |
| 40 | #include <malloc.h> |
41 | #include <malloc.h> |
| 41 | #include <errno.h> |
42 | #include <errno.h> |
| 42 | #include <align.h> |
43 | #include <align.h> |
| Line 468... | Line 469... | ||
| 468 | * No more than @a size bytes are written. If the size of the output buffer |
469 | * No more than @a size bytes are written. If the size of the output buffer |
| 469 | * is at least one byte, the output string will always be well-formed, i.e. |
470 | * is at least one byte, the output string will always be well-formed, i.e. |
| 470 | * null-terminated and containing only complete characters. |
471 | * null-terminated and containing only complete characters. |
| 471 | * |
472 | * |
| 472 | * @param dst Destination buffer. |
473 | * @param dst Destination buffer. |
| 473 | * @param count Size of the destination buffer. |
474 | * @param count Size of the destination buffer (must be > 0). |
| 474 | * @param src Source string. |
475 | * @param src Source string. |
| 475 | */ |
476 | */ |
| 476 | void str_cpy(char *dest, size_t size, const char *src) |
477 | void str_cpy(char *dest, size_t size, const char *src) |
| 477 | { |
478 | { |
| 478 | wchar_t ch; |
479 | wchar_t ch; |
| 479 | size_t src_off; |
480 | size_t src_off; |
| 480 | size_t dest_off; |
481 | size_t dest_off; |
| 481 | 482 | ||
| 482 | /* No space for the NULL-terminator in the buffer. */ |
483 | /* There must be space for a null terminator in the buffer. */ |
| 483 | if (size == 0) |
484 | assert(size > 0); |
| 484 | return; |
- | |
| 485 | 485 | ||
| 486 | src_off = 0; |
486 | src_off = 0; |
| 487 | dest_off = 0; |
487 | dest_off = 0; |
| 488 | 488 | ||
| 489 | while ((ch = str_decode(src, &src_off, STR_NO_LIMIT)) != 0) { |
489 | while ((ch = str_decode(src, &src_off, STR_NO_LIMIT)) != 0) { |
| Line 494... | Line 494... | ||
| 494 | dest[dest_off] = '\0'; |
494 | dest[dest_off] = '\0'; |
| 495 | } |
495 | } |
| 496 | 496 | ||
| 497 | /** Copy size-limited substring. |
497 | /** Copy size-limited substring. |
| 498 | * |
498 | * |
| 499 | * Copy source string @a src to destination buffer @a dest. |
499 | * Copy prefix of string @a src of max. size @a size to destination buffer |
| 500 | * No more than @a size bytes are written. If the size of the output buffer |
500 | * @a dest. No more than @a size bytes are written. The output string will |
| 501 | * is at least one byte, the output string will always be well-formed, i.e. |
501 | * always be well-formed, i.e. null-terminated and containing only complete |
| 502 | * null-terminated and containing only complete characters. |
502 | * characters. |
| 503 | * |
503 | * |
| 504 | * No more than @a n bytes are read from the input string, so it does not |
504 | * No more than @a n bytes are read from the input string, so it does not |
| 505 | * have to be null-terminated. |
505 | * have to be null-terminated. |
| 506 | * |
506 | * |
| 507 | * @param dst Destination buffer. |
507 | * @param dst Destination buffer. |
| 508 | * @param count Size of the destination buffer. |
508 | * @param count Size of the destination buffer (must be > 0). |
| 509 | * @param src Source string. |
509 | * @param src Source string. |
| - | 510 | * @param n Maximum number of bytes to read from @a src. |
|
| 510 | */ |
511 | */ |
| 511 | void str_ncpy(char *dest, size_t size, const char *src, size_t n) |
512 | void str_ncpy(char *dest, size_t size, const char *src, size_t n) |
| 512 | { |
513 | { |
| 513 | wchar_t ch; |
514 | wchar_t ch; |
| 514 | size_t src_off; |
515 | size_t src_off; |
| 515 | size_t dest_off; |
516 | size_t dest_off; |
| 516 | 517 | ||
| 517 | /* No space for the null terminator in the buffer. */ |
518 | /* There must be space for a null terminator in the buffer. */ |
| 518 | if (size == 0) |
519 | assert(size > 0); |
| 519 | return; |
- | |
| 520 | 520 | ||
| 521 | src_off = 0; |
521 | src_off = 0; |
| 522 | dest_off = 0; |
522 | dest_off = 0; |
| 523 | 523 | ||
| 524 | while ((ch = str_decode(src, &src_off, n)) != 0) { |
524 | while ((ch = str_decode(src, &src_off, n)) != 0) { |