Ignore:
File:
1 edited

Legend:

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

    r568693b r1772e6d  
    136136}
    137137
    138 /** Decode a single character from a string to the left.
    139  *
    140  * Decode a single character from a string of size @a size. Decoding starts
    141  * at @a offset and this offset is moved to the beginning of the previous
    142  * character. In case of decoding error, offset generally decreases at least
    143  * by one. However, offset is never moved before 0.
    144  *
    145  * @param str    String (not necessarily NULL-terminated).
    146  * @param offset Byte offset in string where to start decoding.
    147  * @param size   Size of the string (in bytes).
    148  *
    149  * @return Value of decoded character, U_SPECIAL on decoding error or
    150  *         NULL if attempt to decode beyond @a start of str.
    151  *
    152  */
    153 wchar_t str_decode_reverse(const char *str, size_t *offset, size_t size)
    154 {
    155         if (*offset == 0)
    156                 return 0;
    157        
    158         size_t processed = 0;
    159         /* Continue while continuation bytes found */
    160         while (*offset > 0 && processed < 4) {
    161                 uint8_t b = (uint8_t) str[--(*offset)];
    162                
    163                 if (processed == 0 && (b & 0x80) == 0) {
    164                         /* 0xxxxxxx (Plain ASCII) */
    165                         return b & 0x7f;
    166                 }
    167                 else if ((b & 0xe0) == 0xc0 || (b & 0xf0) == 0xe0 ||
    168                     (b & 0xf8) == 0xf0) {
    169                         /* Start byte */
    170                         size_t start_offset = *offset;
    171                         return str_decode(str, &start_offset, size);
    172                 }
    173                 else if ((b & 0xc0) != 0x80) {
    174                         /* Not a continuation byte */
    175                         return U_SPECIAL;
    176                 }
    177                 processed++;
    178         }
    179         /* Too many continuation bytes */
    180         return U_SPECIAL;
    181 }
    182 
    183138/** Encode a single character to string representation.
    184139 *
     
    442397       
    443398        return len;
    444 }
    445 
    446 /** Get character display width on a character cell display.
    447  *
    448  * @param ch    Character
    449  * @return      Width of character in cells.
    450  */
    451 size_t chr_width(wchar_t ch)
    452 {
    453         return 1;
    454 }
    455 
    456 /** Get string display width on a character cell display.
    457  *
    458  * @param str   String
    459  * @return      Width of string in cells.
    460  */
    461 size_t str_width(const char *str)
    462 {
    463         size_t width = 0;
    464         size_t offset = 0;
    465         wchar_t ch;
    466        
    467         while ((ch = str_decode(str, &offset, STR_NO_LIMIT)) != 0)
    468                 width += chr_width(ch);
    469        
    470         return width;
    471399}
    472400
Note: See TracChangeset for help on using the changeset viewer.