X-Git-Url: https://pd.if.org/git/?p=pdclib;a=blobdiff_plain;f=internals%2F_PDCLIB_int.h;h=ab1bc90b777879c03c2a53c25b8aaf323ca93bd9;hp=64d921967de5465ce795da8beabfcf10ebe1f924;hb=276f7e69f80ac53bfb5da5cc24072dd393485106;hpb=0a419d48138f1411d6e3e50a367b9ece5a2cf893 diff --git a/internals/_PDCLIB_int.h b/internals/_PDCLIB_int.h index 64d9219..ab1bc90 100644 --- a/internals/_PDCLIB_int.h +++ b/internals/_PDCLIB_int.h @@ -310,51 +310,28 @@ extern char _PDCLIB_digits[]; extern char _PDCLIB_Xdigits[]; /* -------------------------------------------------------------------------- */ -/* errno */ +/* Sanity checks */ /* -------------------------------------------------------------------------- */ -/* If PDCLib would call its error number "errno" directly, there would be no way - to catch its value from underlying system calls that also use it (i.e., POSIX - operating systems). That is why we use an internal name, providing a means to - access it through . -*/ -extern int _PDCLIB_errno; - -/* A mechanism for delayed evaluation. (Not sure if this is really necessary, so - no detailed documentation on the "why".) -*/ -int * _PDCLIB_errno_func( void ) _PDCLIB_nothrow; - -/* -------------------------------------------------------------------------- */ -/* lookup tables */ -/* -------------------------------------------------------------------------- */ - -#define _PDCLIB_CTYPE_ALPHA 1 -#define _PDCLIB_CTYPE_BLANK 2 -#define _PDCLIB_CTYPE_CNTRL 4 -#define _PDCLIB_CTYPE_GRAPH 8 -#define _PDCLIB_CTYPE_PUNCT 16 -#define _PDCLIB_CTYPE_SPACE 32 -#define _PDCLIB_CTYPE_LOWER 64 -#define _PDCLIB_CTYPE_UPPER 128 -#define _PDCLIB_CTYPE_DIGIT 256 -#define _PDCLIB_CTYPE_XDIGT 512 - -struct _PDCLIB_ctype_t -{ - _PDCLIB_uint16_t flags; - unsigned char upper; - unsigned char lower; - unsigned char collation; -}; +#if _PDCLIB_C_VERSION >= 2011 +_Static_assert( sizeof( short ) == _PDCLIB_SHRT_BYTES, "_PDCLIB_SHRT_BYTES incorrectly defined, check _PDCLIB_config.h" ); +_Static_assert( sizeof( int ) == _PDCLIB_INT_BYTES, "_PDCLIB_INT_BYTES incorrectly defined, check _PDCLIB_config.h" ); +_Static_assert( sizeof( long ) == _PDCLIB_LONG_BYTES, "_PDCLIB_LONG_BYTES incorrectly defined, check _PDCLIB_config.h" ); +_Static_assert( sizeof( long long ) == _PDCLIB_LLONG_BYTES, "_PDCLIB_LLONG_BYTES incorrectly defined, check _PDCLIB_config.h" ); +_Static_assert( ( (char)-1 < 0 ) == _PDCLIB_CHAR_SIGNED, "_PDCLIB_CHAR_SIGNED incorrectly defined, check _PDCLIB_config.h" ); +_Static_assert( sizeof( _PDCLIB_wchar ) == sizeof( L'x' ), "_PDCLIB_wchar incorrectly defined, check _PDCLIB_config.h" ); +_Static_assert( sizeof( void * ) == sizeof( _PDCLIB_intptr ), "_PDCLIB_intptr incorrectly defined, check _PDCLIB_config.h" ); +_Static_assert( sizeof( sizeof( 1 ) ) == sizeof( _PDCLIB_size ), "_PDCLIB_size incorrectly defined, check _PDCLIB_config.h" ); +_Static_assert( sizeof( &_PDCLIB_digits[1] - &_PDCLIB_digits[0] ) == sizeof( _PDCLIB_ptrdiff ), "_PDCLIB_ptrdiff incorrectly defined, check _PDCLIB_config.h" ); +#endif /* -------------------------------------------------------------------------- */ /* locale / wchar / uchar */ /* -------------------------------------------------------------------------- */ #ifndef __cplusplus -typedef _PDCLIB_int16_t _PDCLIB_char16_t; -typedef _PDCLIB_int32_t _PDCLIB_char32_t; +typedef _PDCLIB_uint16_t _PDCLIB_char16_t; +typedef _PDCLIB_uint32_t _PDCLIB_char32_t; #else typedef char16_t _PDCLIB_char16_t; typedef char32_t _PDCLIB_char32_t; @@ -371,22 +348,30 @@ typedef struct _PDCLIB_mbstate { char _StC [124]; }; - union { - /* c16/related functions: Surrogate storage - * - * If zero, no surrogate pending. If nonzero, surrogate. - */ - _PDCLIB_uint16_t _Surrogate; - - /* Reserved for potential mbtoutf8/etc functions */ - unsigned char _U8[4]; - }; + /* c16/related functions: Surrogate storage + * + * If zero, no surrogate pending. If nonzero, surrogate. + */ + _PDCLIB_uint16_t _Surrogate; + + /* In cases where the underlying codec is capable of regurgitating a + * character without consuming any extra input (e.g. a surrogate pair in a + * UCS-4 to UTF-16 conversion) then these fields are used to track that + * state. In particular, they are used to buffer/fake the input for mbrtowc + * and similar functions. + * + * See _PDCLIB_encoding.h for values of _PendState and the resultant value + * in _PendChar. + */ + unsigned char _PendState; + char _PendChar; } _PDCLIB_mbstate_t; -typedef struct _PDCLIB_charcodec _PDCLIB_charcodec_t; -typedef struct _PDCLIB_locale _PDCLIB_locale_t; +typedef struct _PDCLIB_locale *_PDCLIB_locale_t; typedef struct lconv _PDCLIB_lconv_t; +_PDCLIB_size_t _PDCLIB_mb_cur_max( void ); + /* -------------------------------------------------------------------------- */ /* stdio */ /* -------------------------------------------------------------------------- */ @@ -405,17 +390,26 @@ typedef struct _PDCLIB_file _PDCLIB_file_t; // Rename to _PDCLIB_FILE? /* Status structure required by _PDCLIB_print(). */ struct _PDCLIB_status_t { + /* XXX This structure is horrible now. scanf needs its own */ + int base; /* base to which the value shall be converted */ _PDCLIB_int_fast32_t flags; /* flags and length modifiers */ - unsigned n; /* print: maximum characters to be written */ + unsigned n; /* print: maximum characters to be written (snprintf) */ /* scan: number matched conversion specifiers */ unsigned i; /* number of characters read/written */ unsigned current;/* chars read/written in the CURRENT conversion */ - char * s; /* *sprintf(): target buffer */ - /* *sscanf(): source string */ unsigned width; /* specified field width */ int prec; /* specified field precision */ - _PDCLIB_file_t * stream; /* *fprintf() / *fscanf() stream */ + + union { + void * ctx; /* context for callback */ + const char * s; /* input string for scanf */ + }; + + union { + _PDCLIB_size_t ( *write ) ( void *p, const char *buf, _PDCLIB_size_t size ); + _PDCLIB_file_t *stream; /* for scanf */ + }; _PDCLIB_va_list arg; /* argument stack */ };