Changes in uspace/lib/c/generic/str.c [dcb74c0a:933cadf] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/str.c
rdcb74c0a r933cadf 540 540 541 541 dstr_size = str_size(dest); 542 if (dstr_size >= size)543 return;544 545 542 str_cpy(dest + dstr_size, size - dstr_size, src); 546 }547 548 /** Convert space-padded ASCII to string.549 *550 * Common legacy text encoding in hardware is 7-bit ASCII fitted into551 * a fixed-with byte buffer (bit 7 always zero), right-padded with spaces552 * (ASCII 0x20). Convert space-padded ascii to string representation.553 *554 * If the text does not fit into the destination buffer, the function converts555 * as many characters as possible and returns EOVERFLOW.556 *557 * If the text contains non-ASCII bytes (with bit 7 set), the whole string is558 * converted anyway and invalid characters are replaced with question marks559 * (U_SPECIAL) and the function returns EIO.560 *561 * Regardless of return value upon return @a dest will always be well-formed.562 *563 * @param dest Destination buffer564 * @param size Size of destination buffer565 * @param src Space-padded ASCII.566 * @param n Size of the source buffer in bytes.567 *568 * @return EOK on success, EOVERFLOW if the text does not fit569 * destination buffer, EIO if the text contains570 * non-ASCII bytes.571 */572 int spascii_to_str(char *dest, size_t size, const uint8_t *src, size_t n)573 {574 size_t sidx;575 size_t didx;576 size_t dlast;577 uint8_t byte;578 int rc;579 int result;580 581 /* There must be space for a null terminator in the buffer. */582 assert(size > 0);583 result = EOK;584 585 didx = 0;586 dlast = 0;587 for (sidx = 0; sidx < n; ++sidx) {588 byte = src[sidx];589 if (!ascii_check(byte)) {590 byte = U_SPECIAL;591 result = EIO;592 }593 594 rc = chr_encode(byte, dest, &didx, size - 1);595 if (rc != EOK) {596 assert(rc == EOVERFLOW);597 dest[didx] = '\0';598 return rc;599 }600 601 /* Remember dest index after last non-empty character */602 if (byte != 0x20)603 dlast = didx;604 }605 606 /* Terminate string after last non-empty character */607 dest[dlast] = '\0';608 return result;609 543 } 610 544
Note:
See TracChangeset
for help on using the changeset viewer.