Changeset 696b405 in mainline


Ignore:
Timestamp:
2025-04-13T12:54:10Z (5 days ago)
Author:
Jiří Zárevúcky <zarevucky.jiri@…>
Branches:
master
Children:
9daee3de
Parents:
7d1497c
git-author:
Jiří Zárevúcky <zarevucky.jiri@…> (2025-04-13 10:13:16)
git-committer:
Jiří Zárevúcky <zarevucky.jiri@…> (2025-04-13 12:54:10)
Message:

Implement standard character conversion functions from <uchar.h> and <wchar.h>

These are more somewhat more flexible than the existing functions in <str.h> since
they can process incomplete stream and save unfinished character for next call.

Files:
3 added
3 edited
3 moved

Legend:

Unmodified
Added
Removed
  • abi/include/_bits/mbstate_t.h

    r7d1497c r696b405  
    11/*
    2  * Copyright (c) 2020 Martin Decky
     2 * Copyright (c) 2025 Jiří Zárevúcky
    33 * All rights reserved.
    44 *
     
    2727 */
    2828
    29 /** @addtogroup kernel_generic
     29/** @addtogroup bits
    3030 * @{
    3131 */
     
    3333 */
    3434
    35 #ifndef _KERN_UCHAR_H_
    36 #define _KERN_UCHAR_H_
     35#ifndef _BITS_MBSTATE_T_H_
     36#define _BITS_MBSTATE_T_H_
    3737
    38 #include <_bits/uchar.h>
     38typedef struct {
     39        unsigned short continuation;
     40} mbstate_t;
    3941
    4042#endif
  • abi/include/_bits/uchar.h

    r7d1497c r696b405  
    4646#endif
    4747
    48 typedef uint32_t char32_t;
     48typedef uint_least16_t char16_t;
     49typedef uint_least32_t char32_t;
    4950
    5051#endif
  • common/include/uchar.h

    r7d1497c r696b405  
    11/*
    2  * Copyright (c) 2020 Martin Decky
     2 * Copyright (c) 2025 Jiří Zárevúcky
    33 * All rights reserved.
    44 *
     
    3636#define _LIBC_UCHAR_H_
    3737
     38#include <_bits/mbstate_t.h>
     39#include <_bits/size_t.h>
    3840#include <_bits/uchar.h>
     41#include <stdint.h>
     42
     43size_t mbrtoc8(char8_t *__restrict pc8, const char *__restrict s, size_t n,
     44    mbstate_t *__restrict ps);
     45size_t c8rtomb(char *__restrict s, char8_t c8, mbstate_t *__restrict ps);
     46size_t mbrtoc16(char16_t *__restrict pc16, const char *__restrict s, size_t n,
     47    mbstate_t *__restrict ps);
     48size_t c16rtomb(char *__restrict s, char16_t c16, mbstate_t *__restrict ps);
     49size_t mbrtoc32(char32_t *__restrict pc32, const char *__restrict s, size_t n,
     50    mbstate_t *__restrict ps);
     51size_t c32rtomb(char *__restrict s, char32_t c32, mbstate_t *__restrict ps);
     52
     53#ifdef _HELENOS_SOURCE
     54#define UCHAR_ILSEQ      ((size_t) -1)
     55#define UCHAR_INCOMPLETE ((size_t) -2)
     56#define UCHAR_CONTINUED  ((size_t) -3)
     57#endif
    3958
    4059#endif
  • common/stdc/wchar.c

    r7d1497c r696b405  
    11/*
    2  * Copyright (c) 2017 CZ.NIC, z.s.p.o.
     2 * Copyright (c) 2025 Jiří Zárevúcky
    33 * All rights reserved.
    44 *
     
    2727 */
    2828
    29 /*
    30  * Authors:
    31  *      Jiří Zárevúcky (jzr) <zarevucky.jiri@gmail.com>
    32  */
     29#include <uchar.h>
     30#include <wchar.h>
    3331
    34 /** @addtogroup libc
    35  * @{
    36  */
    37 /** @file
    38  */
    39 
    40 #ifndef _LIBC_WCHAR_H_
    41 #define _LIBC_WCHAR_H_
    42 
    43 #include <_bits/size_t.h>
    44 #include <_bits/wchar_t.h>
    45 #include <_bits/wchar_limits.h>
    46 #include <_bits/wint_t.h>
    47 #include <_bits/NULL.h>
    48 #include <_bits/WEOF.h>
    49 
     32#if __STDC_HOSTED__
     33#include <fibril.h>
    5034#endif
    5135
    52 /** @}
    53  */
     36wint_t btowc(int c)
     37{
     38        return (c < 0x80) ? c : WEOF;
     39}
     40
     41int wctob(wint_t c)
     42{
     43        return c;
     44}
     45
     46int mbsinit(const mbstate_t *ps)
     47{
     48        return ps == NULL || ps->continuation == 0;
     49}
     50
     51size_t mbrlen(const char *s, size_t n, mbstate_t *ps)
     52{
     53#if __STDC_HOSTED__
     54        static fibril_local mbstate_t global_state;
     55        if (!ps)
     56                ps = &global_state;
     57#endif
     58
     59        return mbrtowc(NULL, s, n, ps);
     60}
     61
     62_Static_assert(sizeof(wchar_t) == sizeof(char16_t) || sizeof(wchar_t) == sizeof(char32_t));
     63
     64size_t mbrtowc(wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)
     65{
     66#if __STDC_HOSTED__
     67        static fibril_local mbstate_t global_state;
     68        if (!ps)
     69                ps = &global_state;
     70#endif
     71
     72        if (sizeof(wchar_t) == sizeof(char16_t))
     73                return mbrtoc16((char16_t *) pwc, s, n, ps);
     74        else
     75                return mbrtoc32((char32_t *) pwc, s, n, ps);
     76}
     77
     78size_t wcrtomb(char *s, wchar_t wc, mbstate_t * ps)
     79{
     80#if __STDC_HOSTED__
     81        static fibril_local mbstate_t global_state;
     82        if (!ps)
     83                ps = &global_state;
     84#endif
     85
     86        if (sizeof(wchar_t) == sizeof(char16_t))
     87                return c16rtomb(s, (char16_t) wc, ps);
     88        else
     89                return c32rtomb(s, (char32_t) wc, ps);
     90}
  • uspace/lib/c/meson.build

    r7d1497c r696b405  
    7171        'common/stdc/qsort.c',
    7272        'common/stdc/calloc.c',
     73        'common/stdc/uchar.c',
     74        'common/stdc/wchar.c',
    7375        'common/gsort.c',
    7476        'common/str.c',
     
    196198        'test/string.c',
    197199        'test/strtol.c',
     200        'test/uchar.c',
    198201        'test/uuid.c',
    199202)
  • uspace/lib/c/test/main.c

    r7d1497c r696b405  
    5757PCUT_IMPORT(strtol);
    5858PCUT_IMPORT(table);
     59PCUT_IMPORT(uchar);
    5960PCUT_IMPORT(uuid);
    6061
Note: See TracChangeset for help on using the changeset viewer.