Changeset 696b405 in mainline for common/stdc/wchar.c


Ignore:
Timestamp:
2025-04-13T12:54:10Z (4 weeks 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.

File:
1 moved

Legend:

Unmodified
Added
Removed
  • 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}
Note: See TracChangeset for help on using the changeset viewer.