Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/str.c

    rdcb74c0a r933cadf  
    540540
    541541        dstr_size = str_size(dest);
    542         if (dstr_size >= size)
    543                 return;
    544        
    545542        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 into
    551  * a fixed-with byte buffer (bit 7 always zero), right-padded with spaces
    552  * (ASCII 0x20). Convert space-padded ascii to string representation.
    553  *
    554  * If the text does not fit into the destination buffer, the function converts
    555  * as many characters as possible and returns EOVERFLOW.
    556  *
    557  * If the text contains non-ASCII bytes (with bit 7 set), the whole string is
    558  * converted anyway and invalid characters are replaced with question marks
    559  * (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 buffer
    564  * @param size          Size of destination buffer
    565  * @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 fit
    569  *                      destination buffer, EIO if the text contains
    570  *                      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;
    609543}
    610544
Note: See TracChangeset for help on using the changeset viewer.