Changeset c583970 in mainline for kernel/generic/src/console/console.c


Ignore:
Timestamp:
2009-04-03T08:00:13Z (15 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
9be1d58
Parents:
d6c8ff6
Message:

Unicode support

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/console/console.c

    rd6c8ff6 rc583970  
    5151#include <syscall/copy.h>
    5252#include <errno.h>
     53#include <string.h>
    5354
    5455#define KLOG_SIZE     PAGE_SIZE
     
    155156 *
    156157 */
    157 uint8_t _getc(indev_t *indev)
     158wchar_t _getc(indev_t *indev)
    158159{
    159160        if (atomic_get(&haltstate)) {
     
    179180        ipl_t ipl = interrupts_disable();
    180181        spinlock_lock(&indev->lock);
    181         uint8_t ch = indev->buffer[(indev->index - indev->counter) % INDEV_BUFLEN];
     182        wchar_t ch = indev->buffer[(indev->index - indev->counter) % INDEV_BUFLEN];
    182183        indev->counter--;
    183184        spinlock_unlock(&indev->lock);
     
    193194 *
    194195 * @param indev  Input character device.
    195  * @param buf    Buffer where to store string terminated by '\0'.
     196 * @param buf    Buffer where to store string terminated by NULL.
    196197 * @param buflen Size of the buffer.
    197198 *
     
    201202count_t gets(indev_t *indev, char *buf, size_t buflen)
    202203{
    203         index_t index = 0;
    204        
    205         while (index < buflen) {
    206                 char ch = _getc(indev);
     204        size_t offset = 0;
     205        count_t count = 0;
     206        buf[offset] = 0;
     207       
     208        wchar_t ch;
     209        while ((ch = _getc(indev)) != '\n') {
    207210                if (ch == '\b') {
    208                         if (index > 0) {
    209                                 index--;
    210                                 /* Space backspace, space */
     211                        if (count > 0) {
     212                                /* Space, backspace, space */
    211213                                putchar('\b');
    212214                                putchar(' ');
    213215                                putchar('\b');
     216                               
     217                                count--;
     218                                offset = str_lsize(buf, count);
     219                                buf[offset] = 0;
    214220                        }
    215                         continue;
    216                 }
    217                 putchar(ch);
    218                
    219                 if (ch == '\n') { /* end of string => write 0, return */
    220                         buf[index] = '\0';
    221                         return (count_t) index;
    222221                }
    223                 buf[index++] = ch;
    224         }
    225        
    226         return (count_t) index;
     222                if (chr_encode(ch, buf, &offset, buflen - 1) == EOK) {
     223                        putchar(ch);
     224                        count++;
     225                        buf[offset] = 0;
     226                }
     227        }
     228       
     229        return count;
    227230}
    228231
    229232/** Get character from input device & echo it to screen */
    230 uint8_t getc(indev_t *indev)
    231 {
    232         uint8_t ch = _getc(indev);
     233wchar_t getc(indev_t *indev)
     234{
     235        wchar_t ch = _getc(indev);
    233236        putchar(ch);
    234237        return ch;
     
    296299 *
    297300 */
    298 unative_t sys_klog(int fd, const void * buf, size_t count)
     301unative_t sys_klog(int fd, const void *buf, size_t size)
    299302{
    300303        char *data;
    301304        int rc;
    302305       
    303         if (count > PAGE_SIZE)
     306        if (size > PAGE_SIZE)
    304307                return ELIMIT;
    305308       
    306         if (count > 0) {
    307                 data = (char *) malloc(count + 1, 0);
     309        if (size > 0) {
     310                data = (char *) malloc(size + 1, 0);
    308311                if (!data)
    309312                        return ENOMEM;
    310313               
    311                 rc = copy_from_uspace(data, buf, count);
     314                rc = copy_from_uspace(data, buf, size);
    312315                if (rc) {
    313316                        free(data);
    314317                        return rc;
    315318                }
    316                 data[count] = 0;
     319                data[size] = 0;
    317320               
    318321                printf("%s", data);
     
    321324                klog_update();
    322325       
    323         return count;
     326        return size;
    324327}
    325328
Note: See TracChangeset for help on using the changeset viewer.