this code was written independently of musl, with support for a the backwards, nonstandard "31-bit unicode" some libraries/apps might want. unfortunately the extra code (inside #ifdef) makes the source harder to read and makes code that should be simple look complex, so i'm removing it. anyone who wants to use the old code can find it in the history or from elsewhere. also, change the visibility of the __fsmu8 state machine table to hidden, if supported. this should improve performance slightly in shared-library builds.
25 lines
809 B
C
25 lines
809 B
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 bittab __fsmu8
|
|
|
|
#if 100*__GNUC__+__GNUC_MINOR__ >= 303 || defined(__PCC__) || defined(__TINYC__)
|
|
extern const uint32_t bittab[] __attribute__((visibility("hidden")));
|
|
#else
|
|
extern const uint32_t bittab[];
|
|
#endif
|
|
|
|
/* 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)
|
|
|
|
#define SA 0xc2u
|
|
#define SB 0xf5u
|