Changeset 28a5ebd in mainline for kernel/generic/src
- Timestamp:
- 2020-06-18T15:39:50Z (5 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- ce52c333
- Parents:
- 4f663f3e
- Location:
- kernel/generic/src
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/console/chardev.c
r4f663f3e r28a5ebd 65 65 * 66 66 */ 67 void indev_push_character(indev_t *indev, wchar_t ch)67 void indev_push_character(indev_t *indev, char32_t ch) 68 68 { 69 69 assert(indev); … … 92 92 * 93 93 */ 94 wchar_t indev_pop_character(indev_t *indev)94 char32_t indev_pop_character(indev_t *indev) 95 95 { 96 96 if (atomic_load(&haltstate)) { … … 117 117 waitq_sleep(&indev->wq); 118 118 irq_spinlock_lock(&indev->lock, true); 119 wchar_t ch = indev->buffer[(indev->index - indev->counter) %119 char32_t ch = indev->buffer[(indev->index - indev->counter) % 120 120 INDEV_BUFLEN]; 121 121 indev->counter--; -
kernel/generic/src/console/console.c
r4f663f3e r28a5ebd 59 59 60 60 #define KIO_PAGES 8 61 #define KIO_LENGTH (KIO_PAGES * PAGE_SIZE / sizeof( wchar_t))61 #define KIO_LENGTH (KIO_PAGES * PAGE_SIZE / sizeof(char32_t)) 62 62 63 63 /** Kernel log cyclic buffer */ 64 wchar_t kio[KIO_LENGTH] __attribute__((aligned(PAGE_SIZE)));64 char32_t kio[KIO_LENGTH] __attribute__((aligned(PAGE_SIZE))); 65 65 66 66 /** Kernel log initialized */ … … 95 95 }; 96 96 97 static void stdout_write(outdev_t *, wchar_t);97 static void stdout_write(outdev_t *, char32_t); 98 98 static void stdout_redraw(outdev_t *); 99 99 static void stdout_scroll_up(outdev_t *); … … 148 148 } 149 149 150 static void stdout_write(outdev_t *dev, wchar_t ch)150 static void stdout_write(outdev_t *dev, char32_t ch) 151 151 { 152 152 list_foreach(dev->list, link, outdev_t, sink) { … … 261 261 buf[offset] = 0; 262 262 263 wchar_t ch;263 char32_t ch; 264 264 while ((ch = indev_pop_character(indev)) != '\n') { 265 265 if (ch == '\b') { 266 266 if (count > 0) { 267 267 /* Space, backspace, space */ 268 put wchar('\b');269 put wchar(' ');270 put wchar('\b');268 putuchar('\b'); 269 putuchar(' '); 270 putuchar('\b'); 271 271 272 272 count--; … … 277 277 278 278 if (chr_encode(ch, buf, &offset, buflen - 1) == EOK) { 279 put wchar(ch);279 putuchar(ch); 280 280 count++; 281 281 buf[offset] = 0; … … 287 287 288 288 /** Get character from input device & echo it to screen */ 289 wchar_t getc(indev_t *indev)290 { 291 wchar_t ch = indev_pop_character(indev);292 put wchar(ch);289 char32_t getc(indev_t *indev) 290 { 291 char32_t ch = indev_pop_character(indev); 292 putuchar(ch); 293 293 return ch; 294 294 } … … 324 324 /* Print characters that weren't printed earlier */ 325 325 while (kio_stored > 0) { 326 wchar_t tmp = kio[(kio_start + kio_len - kio_stored) % KIO_LENGTH];326 char32_t tmp = kio[(kio_start + kio_len - kio_stored) % KIO_LENGTH]; 327 327 kio_stored--; 328 328 … … 344 344 * The caller is required to hold kio_lock 345 345 */ 346 void kio_push_char(const wchar_t ch)346 void kio_push_char(const char32_t ch) 347 347 { 348 348 kio[(kio_start + kio_len) % KIO_LENGTH] = ch; … … 360 360 } 361 361 362 void put wchar(const wchar_t ch)362 void putuchar(const char32_t ch) 363 363 { 364 364 bool ordy = ((stdout) && (stdout->op->write)); … … 377 377 * for possible future output. 378 378 * 379 * The early_put wchar() function is used to output379 * The early_putuchar() function is used to output 380 380 * the character for low-level debugging purposes. 381 381 * Note that the early_putc() function might be 382 382 * a no-op on certain hardware configurations. 383 383 */ 384 early_put wchar(ch);384 early_putuchar(ch); 385 385 } 386 386 -
kernel/generic/src/console/kconsole.c
r4f663f3e r28a5ebd 86 86 LIST_INITIALIZE(cmd_list); /**< Command list. */ 87 87 88 static wchar_t history[KCONSOLE_HISTORY][MAX_CMDLINE] = { };88 static char32_t history[KCONSOLE_HISTORY][MAX_CMDLINE] = { }; 89 89 static size_t history_pos = 0; 90 90 … … 156 156 157 157 /** Print count times a character */ 158 _NO_TRACE static void print_cc( wchar_t ch, size_t count)158 _NO_TRACE static void print_cc(char32_t ch, size_t count) 159 159 { 160 160 size_t i; 161 161 for (i = 0; i < count; i++) 162 put wchar(ch);162 putuchar(ch); 163 163 } 164 164 … … 290 290 } 291 291 292 _NO_TRACE static cmd_info_t *parse_cmd(const wchar_t *cmdline)292 _NO_TRACE static cmd_info_t *parse_cmd(const char32_t *cmdline) 293 293 { 294 294 size_t start = 0; … … 331 331 } 332 332 333 _NO_TRACE static wchar_t *clever_readline(const char *prompt, indev_t *indev,333 _NO_TRACE static char32_t *clever_readline(const char *prompt, indev_t *indev, 334 334 char *tmp) 335 335 { … … 337 337 338 338 size_t position = 0; 339 wchar_t *current = history[history_pos];339 char32_t *current = history[history_pos]; 340 340 current[0] = 0; 341 341 342 342 while (true) { 343 wchar_t ch = indev_pop_character(indev);343 char32_t ch = indev_pop_character(indev); 344 344 345 345 if (ch == '\n') { 346 346 /* Enter */ 347 put wchar(ch);347 putuchar(ch); 348 348 break; 349 349 } … … 356 356 if (wstr_remove(current, position - 1)) { 357 357 position--; 358 put wchar('\b');358 putuchar('\b'); 359 359 printf("%ls ", current + position); 360 360 print_cc('\b', wstr_length(current) - position + 1); … … 369 369 for (; (current[position] != 0) && (!isspace(current[position])); 370 370 position++) 371 put wchar(current[position]);371 putuchar(current[position]); 372 372 373 373 /* … … 464 464 /* Left */ 465 465 if (position > 0) { 466 put wchar('\b');466 putuchar('\b'); 467 467 position--; 468 468 } … … 473 473 /* Right */ 474 474 if (position < wstr_length(current)) { 475 put wchar(current[position]);475 putuchar(current[position]); 476 476 position++; 477 477 } … … 646 646 size_t offset = *start; 647 647 size_t prev = *start; 648 wchar_t ch;648 char32_t ch; 649 649 650 650 while ((ch = str_decode(cmdline, &offset, size)) != 0) { … … 825 825 826 826 while (true) { 827 wchar_t *tmp = clever_readline((char *) prompt, stdin, buffer);827 char32_t *tmp = clever_readline((char *) prompt, stdin, buffer); 828 828 size_t len = wstr_length(tmp); 829 829 if (!len) -
kernel/generic/src/console/prompt.c
r4f663f3e r28a5ebd 56 56 57 57 while (true) { 58 wchar_t answer = indev_pop_character(indev);58 char32_t answer = indev_pop_character(indev); 59 59 60 60 if ((answer == 'y') || (answer == 'Y')) { … … 87 87 printf("--More--"); 88 88 while (true) { 89 wchar_t continue_showing_hints = indev_pop_character(indev);89 char32_t continue_showing_hints = indev_pop_character(indev); 90 90 /* Display a full page again? */ 91 91 if ((continue_showing_hints == 'y') || -
kernel/generic/src/lib/str.c
r4f663f3e r28a5ebd 42 42 * strings, called just strings are encoded in UTF-8. Wide strings (encoded 43 43 * in UTF-32) are supported to a limited degree. A single character is 44 * represented as wchar_t.@n44 * represented as char32_t.@n 45 45 * 46 46 * Overview of the terminology:@n … … 50 50 * byte 8 bits stored in uint8_t (unsigned 8 bit integer) 51 51 * 52 * character UTF-32 encoded Unicode character, stored in wchar_t53 * ( signed 32 bit integer), code points 0 .. 111411152 * character UTF-32 encoded Unicode character, stored in char32_t 53 * (unsigned 32 bit integer), code points 0 .. 1114111 54 54 * are valid 55 55 * … … 61 61 * 62 62 * wide string UTF-32 encoded NULL-terminated Unicode string, 63 * wchar_t *63 * char32_t * 64 64 * 65 65 * [wide] string size number of BYTES in a [wide] string (excluding … … 100 100 * A specific character inside a [wide] string can be referred to by:@n 101 101 * 102 * pointer (char *, wchar_t *)102 * pointer (char *, char32_t *) 103 103 * byte offset (size_t) 104 104 * character index (size_t) … … 118 118 #include <macros.h> 119 119 120 /** Check the condition if wchar_t is signed */121 #ifdef __WCHAR_UNSIGNED__122 #define WCHAR_SIGNED_CHECK(cond) (true)123 #else124 #define WCHAR_SIGNED_CHECK(cond) (cond)125 #endif126 127 120 /** Byte mask consisting of lowest @n bits (out of 8) */ 128 121 #define LO_MASK_8(n) ((uint8_t) ((1 << (n)) - 1)) … … 152 145 * 153 146 */ 154 wchar_t str_decode(const char *str, size_t *offset, size_t size)147 char32_t str_decode(const char *str, size_t *offset, size_t size) 155 148 { 156 149 if (*offset + 1 > size) … … 189 182 return U_SPECIAL; 190 183 191 wchar_t ch = b0 & LO_MASK_8(b0_bits);184 char32_t ch = b0 & LO_MASK_8(b0_bits); 192 185 193 186 /* Decode continuation bytes */ … … 200 193 201 194 /* Shift data bits to ch */ 202 ch = (ch << CONT_BITS) | ( wchar_t) (b & LO_MASK_8(CONT_BITS));195 ch = (ch << CONT_BITS) | (char32_t) (b & LO_MASK_8(CONT_BITS)); 203 196 cbytes--; 204 197 } … … 222 215 * code was invalid. 223 216 */ 224 errno_t chr_encode(const wchar_t ch, char *str, size_t *offset, size_t size)217 errno_t chr_encode(const char32_t ch, char *str, size_t *offset, size_t size) 225 218 { 226 219 if (*offset >= size) … … 308 301 * 309 302 */ 310 size_t wstr_size(const wchar_t *str)311 { 312 return (wstr_length(str) * sizeof( wchar_t));303 size_t wstr_size(const char32_t *str) 304 { 305 return (wstr_length(str) * sizeof(char32_t)); 313 306 } 314 307 … … 354 347 * 355 348 */ 356 size_t wstr_lsize(const wchar_t *str, size_t max_len)357 { 358 return (wstr_nlength(str, max_len * sizeof( wchar_t)) * sizeof(wchar_t));349 size_t wstr_lsize(const char32_t *str, size_t max_len) 350 { 351 return (wstr_nlength(str, max_len * sizeof(char32_t)) * sizeof(char32_t)); 359 352 } 360 353 … … 384 377 * 385 378 */ 386 size_t wstr_length(const wchar_t *wstr)379 size_t wstr_length(const char32_t *wstr) 387 380 { 388 381 size_t len = 0; … … 421 414 * 422 415 */ 423 size_t wstr_nlength(const wchar_t *str, size_t size)416 size_t wstr_nlength(const char32_t *str, size_t size) 424 417 { 425 418 size_t len = 0; 426 size_t limit = ALIGN_DOWN(size, sizeof( wchar_t));419 size_t limit = ALIGN_DOWN(size, sizeof(char32_t)); 427 420 size_t offset = 0; 428 421 429 422 while ((offset < limit) && (*str++ != 0)) { 430 423 len++; 431 offset += sizeof( wchar_t);424 offset += sizeof(char32_t); 432 425 } 433 426 … … 440 433 * 441 434 */ 442 bool ascii_check( wchar_t ch)443 { 444 if ( WCHAR_SIGNED_CHECK(ch >= 0) && (ch <= 127))435 bool ascii_check(char32_t ch) 436 { 437 if (ch <= 127) 445 438 return true; 446 439 … … 453 446 * 454 447 */ 455 bool chr_check( wchar_t ch)456 { 457 if ( WCHAR_SIGNED_CHECK(ch >= 0) && (ch <= 1114111))448 bool chr_check(char32_t ch) 449 { 450 if (ch <= 1114111) 458 451 return true; 459 452 … … 481 474 int str_cmp(const char *s1, const char *s2) 482 475 { 483 wchar_t c1 = 0;484 wchar_t c2 = 0;476 char32_t c1 = 0; 477 char32_t c2 = 0; 485 478 486 479 size_t off1 = 0; … … 528 521 int str_lcmp(const char *s1, const char *s2, size_t max_len) 529 522 { 530 wchar_t c1 = 0;531 wchar_t c2 = 0;523 char32_t c1 = 0; 524 char32_t c2 = 0; 532 525 533 526 size_t off1 = 0; … … 580 573 size_t dest_off = 0; 581 574 582 wchar_t ch;575 char32_t ch; 583 576 while ((ch = str_decode(src, &src_off, STR_NO_LIMIT)) != 0) { 584 577 if (chr_encode(ch, dest, &dest_off, size - 1) != EOK) … … 613 606 size_t dest_off = 0; 614 607 615 wchar_t ch;608 char32_t ch; 616 609 while ((ch = str_decode(src, &src_off, n)) != 0) { 617 610 if (chr_encode(ch, dest, &dest_off, size - 1) != EOK) … … 628 621 * written will always be well-formed. 629 622 * 630 * @param dest 631 * @param size 632 * @param src 633 */ 634 void wstr_to_str(char *dest, size_t size, const wchar_t *src)635 { 636 wchar_t ch;623 * @param dest Destination buffer. 624 * @param size Size of the destination buffer. 625 * @param src Source wide string. 626 */ 627 void wstr_to_str(char *dest, size_t size, const char32_t *src) 628 { 629 char32_t ch; 637 630 size_t src_idx; 638 631 size_t dest_off; … … 659 652 * @return Pointer to character in @a str or NULL if not found. 660 653 */ 661 char *str_chr(const char *str, wchar_t ch)662 { 663 wchar_t acc;654 char *str_chr(const char *str, char32_t ch) 655 { 656 char32_t acc; 664 657 size_t off = 0; 665 658 size_t last = 0; … … 688 681 * 689 682 */ 690 bool wstr_linsert( wchar_t *str, wchar_t ch, size_t pos, size_t max_pos)683 bool wstr_linsert(char32_t *str, char32_t ch, size_t pos, size_t max_pos) 691 684 { 692 685 size_t len = wstr_length(str); … … 716 709 * 717 710 */ 718 bool wstr_remove( wchar_t *str, size_t pos)711 bool wstr_remove(char32_t *str, size_t pos) 719 712 { 720 713 size_t len = wstr_length(str); -
kernel/generic/src/log/log.c
r4f663f3e r28a5ebd 214 214 } 215 215 216 static int log_printf_wstr_write(const wchar_t *wstr, size_t size, void *data)216 static int log_printf_wstr_write(const char32_t *wstr, size_t size, void *data) 217 217 { 218 218 char buffer[16]; … … 220 220 size_t chars = 0; 221 221 222 for (offset = 0; offset < size; offset += sizeof( wchar_t), chars++) {222 for (offset = 0; offset < size; offset += sizeof(char32_t), chars++) { 223 223 kio_push_char(wstr[chars]); 224 224 -
kernel/generic/src/printf/printf_core.c
r4f663f3e r28a5ebd 139 139 * 140 140 */ 141 static int printf_wputnchars(const wchar_t *buf, size_t size,141 static int printf_wputnchars(const char32_t *buf, size_t size, 142 142 printf_spec_t *ps) 143 143 { … … 185 185 * 186 186 */ 187 static int printf_put wchar(const wchar_t ch, printf_spec_t *ps)187 static int printf_putuchar(const char32_t ch, printf_spec_t *ps) 188 188 { 189 189 if (!chr_check(ch)) 190 190 return ps->str_write((void *) &invalch, 1, ps->data); 191 191 192 return ps->wstr_write(&ch, sizeof( wchar_t), ps->data);192 return ps->wstr_write(&ch, sizeof(char32_t), ps->data); 193 193 } 194 194 … … 240 240 * 241 241 */ 242 static int print_wchar(const wchar_t ch, int width, uint32_t flags, printf_spec_t *ps)242 static int print_wchar(const char32_t ch, int width, uint32_t flags, printf_spec_t *ps) 243 243 { 244 244 size_t counter = 0; … … 254 254 } 255 255 256 if (printf_put wchar(ch, ps) > 0)256 if (printf_putuchar(ch, ps) > 0) 257 257 counter++; 258 258 … … 326 326 * @return Number of wide characters printed, negative value on failure. 327 327 */ 328 static int print_wstr( wchar_t *str, int width, unsigned int precision,328 static int print_wstr(char32_t *str, int width, unsigned int precision, 329 329 uint32_t flags, printf_spec_t *ps) 330 330 { … … 576 576 * - "l" Signed or unsigned long int.@n 577 577 * If conversion is "c", the character is wint_t (wide character).@n 578 * If conversion is "s", the string is wchar_t * (widestring).@n578 * If conversion is "s", the string is char32_t * (UTF-32 string).@n 579 579 * - "ll" Signed or unsigned long long int.@n 580 580 * - "z" Signed or unsigned ssize_t or site_t.@n … … 630 630 while (true) { 631 631 i = nxt; 632 wchar_t uc = str_decode(fmt, &nxt, STR_NO_LIMIT);632 char32_t uc = str_decode(fmt, &nxt, STR_NO_LIMIT); 633 633 634 634 if (uc == 0) … … 789 789 case 's': 790 790 if (qualifier == PrintfQualifierLong) 791 retval = print_wstr(va_arg(ap, wchar_t *), width, precision, flags, ps);791 retval = print_wstr(va_arg(ap, char32_t *), width, precision, flags, ps); 792 792 else 793 793 retval = print_str(va_arg(ap, char *), width, precision, flags, ps); -
kernel/generic/src/printf/vprintf.c
r4f663f3e r28a5ebd 47 47 48 48 while (offset < size) { 49 put wchar(str_decode(str, &offset, size));49 putuchar(str_decode(str, &offset, size)); 50 50 chars++; 51 51 } … … 54 54 } 55 55 56 static int vprintf_wstr_write(const wchar_t *str, size_t size, void *data)56 static int vprintf_wstr_write(const char32_t *str, size_t size, void *data) 57 57 { 58 58 size_t offset = 0; … … 60 60 61 61 while (offset < size) { 62 put wchar(str[chars]);62 putuchar(str[chars]); 63 63 chars++; 64 offset += sizeof( wchar_t);64 offset += sizeof(char32_t); 65 65 } 66 66 … … 72 72 size_t offset = 0; 73 73 size_t chars = 0; 74 wchar_t uc;74 char32_t uc; 75 75 76 76 while ((uc = str_decode(str, &offset, STR_NO_LIMIT)) != 0) { 77 put wchar(uc);77 putuchar(uc); 78 78 chars++; 79 79 } 80 80 81 put wchar('\n');81 putuchar('\n'); 82 82 return chars; 83 83 } -
kernel/generic/src/printf/vsnprintf.c
r4f663f3e r28a5ebd 88 88 89 89 while (index < size) { 90 wchar_t uc = str_decode(str, &index, size);90 char32_t uc = str_decode(str, &index, size); 91 91 92 92 if (chr_encode(uc, data->dst, &data->len, data->size - 1) != EOK) … … 133 133 * 134 134 */ 135 static int vsnprintf_wstr_write(const wchar_t *str, size_t size, vsnprintf_data_t *data)135 static int vsnprintf_wstr_write(const char32_t *str, size_t size, vsnprintf_data_t *data) 136 136 { 137 137 size_t index = 0; 138 138 139 while (index < (size / sizeof( wchar_t))) {139 while (index < (size / sizeof(char32_t))) { 140 140 size_t left = data->size - data->len; 141 141 … … 177 177 printf_spec_t ps = { 178 178 (int (*) (const char *, size_t, void *)) vsnprintf_str_write, 179 (int (*) (const wchar_t *, size_t, void *)) vsnprintf_wstr_write,179 (int (*) (const char32_t *, size_t, void *)) vsnprintf_wstr_write, 180 180 &data 181 181 };
Note:
See TracChangeset
for help on using the changeset viewer.