libc: Add get/set for mbstate_t - scc - simple c99 compiler
 (HTM) git clone git://git.simple-cc.org/scc
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Submodules
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 7033385eda09474ab9a8e21ae811d916e3856ce6
 (DIR) parent b454c47b530863e732c6100728d35e8e663d3a5d
 (HTM) Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
       Date:   Mon, 10 Mar 2025 13:57:08 +0100
       
       libc: Add get/set for mbstate_t
       
       The definition of mbstate_t depends of the system, and for that reason
       we cannot access directly the content of the data type.  To solve this
       problem different system functions were added making the generic code
       portable between the different implementations.
       
       Diffstat:
         M src/libc/arch/bsd/Makefile          |       4 +++-
         A src/libc/arch/bsd/_mbsget.c         |       9 +++++++++
         A src/libc/arch/bsd/_mbsset.c         |       9 +++++++++
         M src/libc/arch/darwin/Makefile       |       2 ++
         A src/libc/arch/darwin/_mbsget.c      |       9 +++++++++
         A src/libc/arch/darwin/_mbsset.c      |      10 ++++++++++
         M src/libc/arch/linux/Makefile        |       2 ++
         A src/libc/arch/linux/_mbsget.c       |       9 +++++++++
         A src/libc/arch/linux/_mbsset.c       |       9 +++++++++
         M src/libc/libc.h                     |       2 ++
         M src/libc/objs/amd64-linux.mk        |       2 ++
         M src/libc/objs/amd64-netbsd.mk       |       2 ++
         M src/libc/objs/amd64-openbsd.mk      |       2 ++
         M src/libc/wchar/mbsinit.c            |       4 +++-
       
       14 files changed, 73 insertions(+), 2 deletions(-)
       ---
 (DIR) diff --git a/src/libc/arch/bsd/Makefile b/src/libc/arch/bsd/Makefile
       @@ -4,6 +4,8 @@ include $(PROJECTDIR)/scripts/rules.mk
        include ../../rules.mk
        
        OBJS=\
       -        _waitpid.$O\
       +        _mbsget.$O\
       +        _mbsset.$O\
       +        _waitpid.$O\
        
        all: $(OBJS)
 (DIR) diff --git a/src/libc/arch/bsd/_mbsget.c b/src/libc/arch/bsd/_mbsget.c
       @@ -0,0 +1,9 @@
       +#include <wchar.h>
       +
       +#include "../../libc.h"
       +
       +int
       +_mbsget(mbstate_t *ps)
       +{
       +        return ps->__mbstate8[0];
       +}
 (DIR) diff --git a/src/libc/arch/bsd/_mbsset.c b/src/libc/arch/bsd/_mbsset.c
       @@ -0,0 +1,9 @@
       +#include <wchar.h>
       +
       +#include "../../libc.h"
       +
       +int
       +_mbsset(mbstate_t *ps, int ch)
       +{
       +        return ps->__mbstate8[0] = ch;
       +}
 (DIR) diff --git a/src/libc/arch/darwin/Makefile b/src/libc/arch/darwin/Makefile
       @@ -5,5 +5,7 @@ include ../../rules.mk
        
        OBJS=\
                _getheap.$O\
       +        _mbsget.$O\
       +        _mbsset.$O\
        
        all: $(OBJS)
 (DIR) diff --git a/src/libc/arch/darwin/_mbsget.c b/src/libc/arch/darwin/_mbsget.c
       @@ -0,0 +1,9 @@
       +#include <wchar.h>
       +
       +#include "../../libc.h"
       +
       +int
       +_mbsget(mbstate_t *ps)
       +{
       +        return ps->state[0];
       +}
 (DIR) diff --git a/src/libc/arch/darwin/_mbsset.c b/src/libc/arch/darwin/_mbsset.c
       @@ -0,0 +1,10 @@
       +#include <wchar.h>
       +
       +#include "../../libc.h"
       +
       +int
       +_mbsset(mbstate_t *ps, int ch)
       +{
       +        ps-count = 1;
       +        return ps->state[0] = ch;
       +}
 (DIR) diff --git a/src/libc/arch/linux/Makefile b/src/libc/arch/linux/Makefile
       @@ -6,6 +6,8 @@ include ../../rules.mk
        OBJS=\
                _brk.$O\
                _getheap.$O\
       +        _mbsget.$O\
       +        _mbsset.$O\
                _sigaction.$O\
                _waitpid.$O\
        
 (DIR) diff --git a/src/libc/arch/linux/_mbsget.c b/src/libc/arch/linux/_mbsget.c
       @@ -0,0 +1,9 @@
       +#include <wchar.h>
       +
       +#include "../../libc.h"
       +
       +int
       +_mbsget(mbstate_t *ps)
       +{
       +        return ps->__opaque1;
       +}
 (DIR) diff --git a/src/libc/arch/linux/_mbsset.c b/src/libc/arch/linux/_mbsset.c
       @@ -0,0 +1,9 @@
       +#include <wchar.h>
       +
       +#include "../../libc.h"
       +
       +int
       +_mbsset(mbstate_t *ps, int ch)
       +{
       +        return ps->__opaque1 = ch;
       +}
 (DIR) diff --git a/src/libc/libc.h b/src/libc/libc.h
       @@ -61,6 +61,8 @@ extern void (*_atexithdl)(void);
        
        #ifdef _WCHAR_H
        extern int _validutf8(wchar_t, int *);
       +extern int _mbsset(mbstate_t *, int);
       +extern int _mbsget(mbstate_t *);
        #ifdef _STDIO_H
        extern wint_t _fputwc(wchar_t, FILE *, int *);
        #endif
 (DIR) diff --git a/src/libc/objs/amd64-linux.mk b/src/libc/objs/amd64-linux.mk
       @@ -36,6 +36,8 @@ OBJS =\
                arch/amd64/strcpy.$O\
                arch/linux/_brk.$O\
                arch/linux/_getheap.$O\
       +        arch/linux/_mbsget.$O\
       +        arch/linux/_mbsset.$O\
                arch/linux/_sigaction.$O\
                arch/linux/_waitpid.$O\
                arch/posix/_open.$O\
 (DIR) diff --git a/src/libc/objs/amd64-netbsd.mk b/src/libc/objs/amd64-netbsd.mk
       @@ -28,6 +28,8 @@ OBJS =\
                arch/amd64/strcmp.$O\
                arch/amd64/strcpy.$O\
                arch/bsd/_waitpid.$O\
       +        arch/bsd/_mbsget.$O\
       +        arch/bsd/_mbsset.$O\
                arch/netbsd/_sigaction.$O\
                arch/posix/_getheap.$O\
                arch/posix/_open.$O\
 (DIR) diff --git a/src/libc/objs/amd64-openbsd.mk b/src/libc/objs/amd64-openbsd.mk
       @@ -33,6 +33,8 @@ OBJS =\
                arch/amd64/strcmp.$O\
                arch/amd64/strcpy.$O\
                arch/bsd/_waitpid.$O\
       +        arch/bsd/_mbsget.$O\
       +        arch/bsd/_mbsset.$O\
                arch/posix/_getheap.$O\
                arch/posix/_open.$O\
                arch/posix/_systime.$O\
 (DIR) diff --git a/src/libc/wchar/mbsinit.c b/src/libc/wchar/mbsinit.c
       @@ -1,5 +1,7 @@
        #include <wchar.h>
        
       +#include "../libc.h"
       +
        #undef mbsinit
        
        int
       @@ -7,5 +9,5 @@ mbsinit(const mbstate_t *ps)
        {
                if (!ps)
                        return 1;
       -        return *ps == 0;
       +        return _mbsget(ps) == 0;
        }