61 lines
1.5 KiB
C
61 lines
1.5 KiB
C
/*
|
|
* This code was written by Rich Felker in 2010; no copyright is claimed.
|
|
* This code is in the public domain. Attribution is appreciated but
|
|
* unnecessary.
|
|
*/
|
|
|
|
#define LIBC
|
|
#ifndef LIBC
|
|
/* rename functions not to conflict with libc */
|
|
#ifndef myprefix
|
|
#define myprefix fsmu8_
|
|
#endif
|
|
#define concat2(a,b) a ## b
|
|
#define concat(a,b) concat2(a,b)
|
|
#define prefix(b) concat(myprefix,b)
|
|
|
|
#undef mblen
|
|
#undef mbrlen
|
|
#undef mbrtowc
|
|
#undef mbsinit
|
|
#undef mbsnrtowcs
|
|
#undef mbsrtowcs
|
|
#undef wcrtomb
|
|
#undef wcsrtombs
|
|
#undef wcstombs
|
|
#undef wctomb
|
|
#define mblen prefix(mblen)
|
|
#define mbrlen prefix(mbrlen)
|
|
#define mbrtowc prefix(mbrtowc)
|
|
#define mbsinit prefix(mbsinit)
|
|
#define mbsnrtowcs prefix(mbsnrtowcs)
|
|
#define mbsrtowcs prefix(mbsrtowcs)
|
|
#define mbstowcs prefix(mbstowcs)
|
|
#define wcrtomb prefix(wcrtomb)
|
|
#define wcsnrtombs prefix(wcsnrtombs)
|
|
#define wcsrtombs prefix(wcsrtombs)
|
|
#define wcstombs prefix(wcstombs)
|
|
#define wctomb prefix(wctomb)
|
|
|
|
#define bittab prefix(bittab)
|
|
#else
|
|
#define bittab __fsmu8
|
|
#endif
|
|
|
|
extern const uint32_t bittab[];
|
|
|
|
/* Upper 6 state bits are a negative integer offset to bound-check next byte */
|
|
/* equivalent to: ( (b-0x80) | (b+offset) ) & ~0x3f */
|
|
#define OOB(c,b) (((((b)>>3)-0x10)|(((b)>>3)+((int32_t)(c)>>26))) & ~7)
|
|
|
|
/* Interval [a,b). Either a must be 80 or b must be c0, lower 3 bits clear. */
|
|
#define R(a,b) ((uint32_t)((a==0x80 ? 0x40-b : -a) << 23))
|
|
#define FAILSTATE R(0x80,0x80)
|
|
|
|
#ifdef I_FAILED_TO_RTFM_RFC3629
|
|
#define SA 0xc2u
|
|
#define SB 0xfeu
|
|
#else
|
|
#define SA 0xc2u
|
|
#define SB 0xf5u
|
|
#endif
|