Changes in uspace/lib/c/generic/str.c [568693b:1772e6d] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified uspace/lib/c/generic/str.c ¶
r568693b r1772e6d 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 starts141 * at @a offset and this offset is moved to the beginning of the previous142 * character. In case of decoding error, offset generally decreases at least143 * 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 or150 * 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 183 138 /** Encode a single character to string representation. 184 139 * … … 442 397 443 398 return len; 444 }445 446 /** Get character display width on a character cell display.447 *448 * @param ch Character449 * @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 String459 * @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;471 399 } 472 400
Note:
See TracChangeset
for help on using the changeset viewer.