Changes in uspace/lib/c/generic/str.c [1772e6d:568693b] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/str.c
r1772e6d r568693b 136 136 } 137 137 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 138 183 /** Encode a single character to string representation. 139 184 * … … 397 442 398 443 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; 399 471 } 400 472
Note:
See TracChangeset
for help on using the changeset viewer.