65816-llvm-mos/runtime/include/uchar.h
Scott Duensing e65fedc8e1 Checkpoint
2026-05-13 15:48:34 -05:00

53 lines
1.5 KiB
C

// C11 uchar.h — char16_t / char32_t plus minimal conversion helpers.
//
// The W65816 runtime treats text as Latin-1 (8-bit) throughout, so
// the 16-bit and 32-bit char types are degenerate one-byte mappings
// (high bytes always zero). Conversion functions are provided for
// surface-compatibility; they do not handle multi-byte UTF-8 input.
#ifndef _UCHAR_H
#define _UCHAR_H
#include <stdint.h>
#include <stddef.h>
typedef uint16_t char16_t;
typedef uint32_t char32_t;
// mbstate_t is the multi-byte conversion state. Empty struct — our
// 1:1 byte mapping is stateless.
typedef struct { int unused; } mbstate_t;
// mbrtoc16 / c16rtomb — multibyte <-> char16_t. In our Latin-1
// model these are byte-for-byte copies.
static inline size_t mbrtoc16(char16_t *out, const char *s, size_t n, mbstate_t *ps) {
(void)ps;
if (!s || n == 0) return (size_t)-2;
unsigned char c = (unsigned char)*s;
if (out) *out = (char16_t)c;
return (c == 0) ? 0 : 1;
}
static inline size_t c16rtomb(char *s, char16_t c, mbstate_t *ps) {
(void)ps;
if (!s) return 1;
*s = (char)(c & 0xFF);
return 1;
}
static inline size_t mbrtoc32(char32_t *out, const char *s, size_t n, mbstate_t *ps) {
(void)ps;
if (!s || n == 0) return (size_t)-2;
unsigned char c = (unsigned char)*s;
if (out) *out = (char32_t)c;
return (c == 0) ? 0 : 1;
}
static inline size_t c32rtomb(char *s, char32_t c, mbstate_t *ps) {
(void)ps;
if (!s) return 1;
*s = (char)(c & 0xFF);
return 1;
}
#endif