#elif _PDCLIB_LLONG_BYTES == 16
#define _PDCLIB_LLONG_MAX 0x7fffffffffffffffffffffffffffffffLL
#define _PDCLIB_LLONG_MIN (-0x7fffffffffffffffffffffffffffffffLL - 1LL)
-#define _PDCLIB_ULLONG_MAX 0xffffffffffffffffffffffffffffffffLL
+#define _PDCLIB_ULLONG_MAX 0xffffffffffffffffffffffffffffffffULL
#else
#error Unsupported width of 'long long' (neither 64 nor 128 bit).
#endif
/* -------------------------------------------------------------------------- */
/* <stdint.h> exact-width types and their limits */
/* -------------------------------------------------------------------------- */
+/* Note that, for the "standard" widths of 8, 16, 32 and 64 bit, the "LEAST" */
+/* types are identical to the "exact-width" types, by definition. */
-/* Setting 'int8_t', its limits, and its literal. */
+/* Setting 'int8_t', its limits, its literal, and conversion macros. */
#if _PDCLIB_CHAR_BIT == 8
typedef signed char _PDCLIB_int8_t;
typedef unsigned char _PDCLIB_uint8_t;
#define _PDCLIB_INT8_MAX _PDCLIB_CHAR_MAX
#define _PDCLIB_INT8_MIN _PDCLIB_CHAR_MIN
#define _PDCLIB_UINT8_MAX _PDCLIB_UCHAR_MAX
+#define _PDCLIB_8_CONV hh
#else
#error Unsupported width of char (not 8 bits).
#endif
-/* Setting 'int16_t', its limits, and its literal */
+/* Setting 'int16_t', its limits, its literal, and conversion macros. */
#if _PDCLIB_INT_BYTES == 2
typedef signed int _PDCLIB_int16_t;
typedef unsigned int _PDCLIB_uint16_t;
#define _PDCLIB_INT16_MAX _PDCLIB_INT_MAX
#define _PDCLIB_INT16_MIN _PDCLIB_INT_MIN
#define _PDCLIB_UINT16_MAX _PDCLIB_UINT_MAX
+#define _PDCLIB_16_CONV
#elif _PDCLIB_SHRT_BYTES == 2
typedef signed short _PDCLIB_int16_t;
typedef unsigned short _PDCLIB_uint16_t;
#define _PDCLIB_INT16_MAX _PDCLIB_SHRT_MAX
#define _PDCLIB_INT16_MIN _PDCLIB_SHRT_MIN
#define _PDCLIB_UINT16_MAX _PDCLIB_USHRT_MAX
+#define _PDCLIB_16_CONV h
#else
#error Neither 'short' nor 'int' are 16-bit.
#endif
-/* Setting 'int32_t', its limits, and its literal */
+/* Setting 'int32_t', its limits, its literal, and conversion macros. */
#if _PDCLIB_INT_BYTES == 4
typedef signed int _PDCLIB_int32_t;
typedef unsigned int _PDCLIB_uint32_t;
#define _PDCLIB_UINT32_MAX _PDCLIB_UINT_MAX
#define _PDCLIB_INT32_LITERAL
#define _PDCLIB_UINT32_LITERAL
+#define _PDCLIB_32_CONV
#elif _PDCLIB_LONG_BYTES == 4
typedef signed long _PDCLIB_int32_t;
typedef unsigned long _PDCLIB_uint32_t;
#define _PDCLIB_UINT32_MAX _PDCLIB_LONG_MAX
#define _PDCLIB_INT32_LITERAL l
#define _PDCLIB_UINT32_LITERAL ul
+#define _PDCLIB_32_CONV l
#else
#error Neither 'int' nor 'long' are 32-bit.
#endif
+/* Setting 'int64_t', its limits, its literal, and conversion macros. */
#if _PDCLIB_LONG_BYTES == 8
typedef signed long _PDCLIB_int64_t;
typedef unsigned long _PDCLIB_uint64_t;
#define _PDCLIB_UINT64_MAX _PDCLIB_ULONG_MAX
#define _PDCLIB_INT64_LITERAL l
#define _PDCLIB_UINT64_LITERAL ul
+#define _PDCLIB_64_CONV l
#elif _PDCLIB_LLONG_BYTES == 8
typedef signed long long _PDCLIB_int64_t;
typedef unsigned long long _PDCLIB_uint64_t;
#define _PDCLIB_UINT64_MAX _PDCLIB_ULLONG_MAX
#define _PDCLIB_INT64_LITERAL ll
#define _PDCLIB_UINT64_LITERAL ull
+#define _PDCLIB_64_CONV ll
#else
#error Neither 'long' nor 'long long' are 64-bit.
#endif
#define _PDCLIB_FBIN 128u
/* Internal flags, made to fit the same status field as the flags above. */
-#define _PDCLIB_LIBBUFFER 512u
+/* -------------------------------------------------------------------------- */
+/* free() the buffer memory on closing (false for user-supplied buffer) */
+#define _PDCLIB_FREEBUFFER 512u
+/* stream has encountered error / EOF */
#define _PDCLIB_ERRORFLAG 1024u
#define _PDCLIB_EOFFLAG 2048u
+/* stream is wide-oriented */
#define _PDCLIB_WIDESTREAM 4096u
+/* stream is byte-oriented */
#define _PDCLIB_BYTESTREAM 8192u
+/* file associated with stream should be remove()d on closing (tmpfile()) */
+#define _PDCLIB_DELONCLOSE 16384u
+/* stream handle should not be free()d on close (stdin, stdout, stderr) */
+#define _PDCLIB_STATIC 32768u
/* Position / status structure for getpos() / fsetpos(). */
struct _PDCLIB_fpos_t
*/
int _PDCLIB_prepwrite( struct _PDCLIB_file_t * stream );
+/* Closing all streams on program exit */
+void _PDCLIB_closeall( void );
+
/* -------------------------------------------------------------------------- */
/* errno */
/* -------------------------------------------------------------------------- */
#define _PDCLIB_EINVAL 5
/* Used in the example implementation for "I/O retries exceeded". */
#define _PDCLIB_ERETRY 6
+/* One larger than the largest used errno */
+#define _PDCLIB_EMAX 7
+/* TODO: Doing this via a static array is not the way to do it. */
+char const * _PDCLIB_errno_texts[ _PDCLIB_EMAX ];