Changes in uspace/lib/c/generic/str.c [c3d19ac:933cadf] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/str.c
rc3d19ac r933cadf 2 2 * Copyright (c) 2005 Martin Decky 3 3 * Copyright (c) 2008 Jiri Svoboda 4 * Copyright (c) 2011 Martin Sucha5 * Copyright (c) 2011 Oleg Romanenko6 4 * All rights reserved. 7 5 * … … 542 540 543 541 dstr_size = str_size(dest); 544 if (dstr_size >= size)545 return;546 547 542 str_cpy(dest + dstr_size, size - dstr_size, src); 548 }549 550 /** Convert space-padded ASCII to string.551 *552 * Common legacy text encoding in hardware is 7-bit ASCII fitted into553 * a fixed-width byte buffer (bit 7 always zero), right-padded with spaces554 * (ASCII 0x20). Convert space-padded ascii to string representation.555 *556 * If the text does not fit into the destination buffer, the function converts557 * as many characters as possible and returns EOVERFLOW.558 *559 * If the text contains non-ASCII bytes (with bit 7 set), the whole string is560 * converted anyway and invalid characters are replaced with question marks561 * (U_SPECIAL) and the function returns EIO.562 *563 * Regardless of return value upon return @a dest will always be well-formed.564 *565 * @param dest Destination buffer566 * @param size Size of destination buffer567 * @param src Space-padded ASCII.568 * @param n Size of the source buffer in bytes.569 *570 * @return EOK on success, EOVERFLOW if the text does not fit571 * destination buffer, EIO if the text contains572 * non-ASCII bytes.573 */574 int spascii_to_str(char *dest, size_t size, const uint8_t *src, size_t n)575 {576 size_t sidx;577 size_t didx;578 size_t dlast;579 uint8_t byte;580 int rc;581 int result;582 583 /* There must be space for a null terminator in the buffer. */584 assert(size > 0);585 result = EOK;586 587 didx = 0;588 dlast = 0;589 for (sidx = 0; sidx < n; ++sidx) {590 byte = src[sidx];591 if (!ascii_check(byte)) {592 byte = U_SPECIAL;593 result = EIO;594 }595 596 rc = chr_encode(byte, dest, &didx, size - 1);597 if (rc != EOK) {598 assert(rc == EOVERFLOW);599 dest[didx] = '\0';600 return rc;601 }602 603 /* Remember dest index after last non-empty character */604 if (byte != 0x20)605 dlast = didx;606 }607 608 /* Terminate string after last non-empty character */609 dest[dlast] = '\0';610 return result;611 543 } 612 544 … … 640 572 dest[dest_off] = '\0'; 641 573 } 642 643 /** Convert UTF16 string to string.644 *645 * Convert utf16 string @a src to string. The output is written to the buffer646 * specified by @a dest and @a size. @a size must be non-zero and the string647 * written will always be well-formed. Surrogate pairs also supported.648 *649 * @param dest Destination buffer.650 * @param size Size of the destination buffer.651 * @param src Source utf16 string.652 *653 * @return EOK, if success, negative otherwise.654 */655 int utf16_to_str(char *dest, size_t size, const uint16_t *src)656 {657 size_t idx = 0, dest_off = 0;658 wchar_t ch;659 int rc = EOK;660 661 /* There must be space for a null terminator in the buffer. */662 assert(size > 0);663 664 while (src[idx]) {665 if ((src[idx] & 0xfc00) == 0xd800) {666 if (src[idx + 1] && (src[idx + 1] & 0xfc00) == 0xdc00) {667 ch = 0x10000;668 ch += (src[idx] & 0x03FF) << 10;669 ch += (src[idx + 1] & 0x03FF);670 idx += 2;671 }672 else673 break;674 } else {675 ch = src[idx];676 idx++;677 }678 rc = chr_encode(ch, dest, &dest_off, size - 1);679 if (rc != EOK)680 break;681 }682 dest[dest_off] = '\0';683 return rc;684 }685 686 int str_to_utf16(uint16_t *dest, size_t size, const char *src)687 {688 int rc = EOK;689 size_t offset = 0;690 size_t idx = 0;691 wchar_t c;692 693 assert(size > 0);694 695 while ((c = str_decode(src, &offset, STR_NO_LIMIT)) != 0) {696 if (c > 0x10000) {697 if (idx + 2 >= size - 1) {698 rc = EOVERFLOW;699 break;700 }701 c = (c - 0x10000);702 dest[idx] = 0xD800 | (c >> 10);703 dest[idx + 1] = 0xDC00 | (c & 0x3FF);704 idx++;705 } else {706 dest[idx] = c;707 }708 709 idx++;710 if (idx >= size - 1) {711 rc = EOVERFLOW;712 break;713 }714 }715 716 dest[idx] = '\0';717 return rc;718 }719 720 574 721 575 /** Convert wide string to new string. … … 798 652 799 653 dest[dlen - 1] = '\0'; 800 }801 802 /** Convert string to wide string.803 *804 * Convert string @a src to wide string. A new wide NULL-terminated805 * string will be allocated on the heap.806 *807 * @param src Source string.808 */809 wchar_t *str_to_awstr(const char *str)810 {811 size_t len = str_length(str);812 813 wchar_t *wstr = calloc(len+1, sizeof(wchar_t));814 if (wstr == NULL)815 return NULL;816 817 str_to_wstr(wstr, len + 1, str);818 return wstr;819 654 } 820 655 … … 1115 950 return dest; 1116 951 } 952 1117 953 1118 954 /** Convert initial part of string to unsigned long according to given base.
Note:
See TracChangeset
for help on using the changeset viewer.