+void parse_out( const char * spec, struct status_t * status, va_list ap );
+void parse_out_wrapper( const char * spec, struct status_t * status, ... );
+
+#define TESTCASE( _n, _value, _expect ) \
+ status.n = _n; \
+ status.i = 0; \
+ memset( status.s, '\0', 50 ); \
+ spec = _expect; \
+ ++spec; \
+ parse_out_wrapper( spec, &status, _value ); \
+ rc = snprintf( buffer, _n, _expect, _value ); \
+ if ( ( strcmp( status.s, buffer ) != 0 ) || ( status.i != rc ) ) \
+{ \
+ printf( "Output '%s', RC %d\nExpect '%s', RC %d\n\n", status.s, status.i, buffer, rc ); \
+}
+
+int main( void )
+{
+ struct status_t status;
+ int rc;
+ char * buffer = malloc( 50 );
+ const char * spec;
+ status.s = calloc( 50, 1 );
+ status.i = 0;
+ status.stream = NULL;
+ status.n = SIZE_MAX;
+ puts( "- Signed min / max -\n" );
+ TESTCASE( SIZE_MAX, CHAR_MIN, "%hhd" );
+ TESTCASE( SIZE_MAX, CHAR_MAX, "%hhd" );
+ TESTCASE( SIZE_MAX, 0, "%hhd" );
+ TESTCASE( SIZE_MAX, SHRT_MIN, "%hd" );
+ TESTCASE( SIZE_MAX, SHRT_MAX, "%hd" );
+ TESTCASE( SIZE_MAX, 0, "%hd" );
+ TESTCASE( SIZE_MAX, INT_MIN, "%d" );
+ TESTCASE( SIZE_MAX, INT_MAX, "%d" );
+ TESTCASE( SIZE_MAX, 0, "%d" );
+ TESTCASE( SIZE_MAX, LONG_MIN, "%ld" );
+ TESTCASE( SIZE_MAX, LONG_MAX, "%ld" );
+ TESTCASE( SIZE_MAX, 0l, "%ld" );
+ TESTCASE( SIZE_MAX, LLONG_MIN, "%lld" );
+ TESTCASE( SIZE_MAX, LLONG_MAX, "%lld" );
+ TESTCASE( SIZE_MAX, 0ll, "%lld" );
+ puts( "- Unsigned min / max -\n" );
+ TESTCASE( SIZE_MAX, UCHAR_MAX, "%hhu" );
+ TESTCASE( SIZE_MAX, (unsigned char)-1, "%hhu" );
+ TESTCASE( SIZE_MAX, USHRT_MAX, "%hu" );
+ TESTCASE( SIZE_MAX, (unsigned short)-1, "%hu" );
+ TESTCASE( SIZE_MAX, UINT_MAX, "%u" );
+ TESTCASE( SIZE_MAX, -1u, "%u" );
+ TESTCASE( SIZE_MAX, ULONG_MAX, "%lu" );
+ TESTCASE( SIZE_MAX, -1ul, "%lu" );
+ TESTCASE( SIZE_MAX, ULLONG_MAX, "%llu" );
+ TESTCASE( SIZE_MAX, -1ull, "%llu" );
+ puts( "- Hex and Octal, normal and alternative, upper and lowercase -\n" );
+ TESTCASE( SIZE_MAX, UINT_MAX, "%X" );
+ TESTCASE( SIZE_MAX, -1u, "%#X" );
+ TESTCASE( SIZE_MAX, UINT_MAX, "%x" );
+ TESTCASE( SIZE_MAX, -1u, "%#x" );
+ TESTCASE( SIZE_MAX, UINT_MAX, "%o" );
+ TESTCASE( SIZE_MAX, -1u, "%#o" );
+ puts( "- Plus flag -\n" );
+ TESTCASE( SIZE_MAX, INT_MIN, "%+d" );
+ TESTCASE( SIZE_MAX, INT_MAX, "%+d" );
+ TESTCASE( SIZE_MAX, 0, "%+d" );
+ TESTCASE( SIZE_MAX, UINT_MAX, "%+u" );
+ TESTCASE( SIZE_MAX, -1u, "%+u" );
+ puts( "- Space flag -\n" );
+ TESTCASE( SIZE_MAX, INT_MIN, "% d" );
+ TESTCASE( SIZE_MAX, INT_MAX, "% d" );
+ TESTCASE( SIZE_MAX, 0, "% d" );
+ TESTCASE( SIZE_MAX, UINT_MAX, "% u" );
+ TESTCASE( SIZE_MAX, -1u, "% u" );
+ puts( "- Field width -\n" );
+ TESTCASE( SIZE_MAX, INT_MIN, "%9d" );
+ TESTCASE( SIZE_MAX, INT_MAX, "%9d" );
+ TESTCASE( SIZE_MAX, INT_MIN, "%10d" );
+ TESTCASE( SIZE_MAX, INT_MAX, "%10d" );
+ TESTCASE( SIZE_MAX, INT_MIN, "%11d" );
+ TESTCASE( SIZE_MAX, INT_MAX, "%11d" );
+ TESTCASE( SIZE_MAX, INT_MIN, "%12d" );
+ TESTCASE( SIZE_MAX, INT_MAX, "%12d" );
+ puts( "- Field width (left bound) -\n" );
+ TESTCASE( SIZE_MAX, INT_MIN, "%-9d" );
+ TESTCASE( SIZE_MAX, INT_MAX, "%-9d" );
+ TESTCASE( SIZE_MAX, INT_MIN, "%-10d" );
+ TESTCASE( SIZE_MAX, INT_MAX, "%-10d" );
+ TESTCASE( SIZE_MAX, INT_MIN, "%-11d" );
+ TESTCASE( SIZE_MAX, INT_MAX, "%-11d" );
+ TESTCASE( SIZE_MAX, INT_MIN, "%-12d" );
+ TESTCASE( SIZE_MAX, INT_MAX, "%-12d" );
+ puts( "- Field width, zero padding -\n");
+ TESTCASE( SIZE_MAX, INT_MIN, "%09d" );
+ TESTCASE( SIZE_MAX, INT_MAX, "%09d" );
+ TESTCASE( SIZE_MAX, INT_MIN, "%010d" );
+ TESTCASE( SIZE_MAX, INT_MAX, "%010d" );
+ TESTCASE( SIZE_MAX, INT_MIN, "%011d" );
+ TESTCASE( SIZE_MAX, INT_MAX, "%011d" );
+ TESTCASE( SIZE_MAX, INT_MIN, "%012d" );
+ TESTCASE( SIZE_MAX, INT_MAX, "%012d" );
+ puts( "- Field width, zero padding (left bound) -\n" );
+ TESTCASE( SIZE_MAX, INT_MIN, "%-09d" );
+ TESTCASE( SIZE_MAX, INT_MAX, "%-09d" );
+ TESTCASE( SIZE_MAX, INT_MIN, "%-010d" );
+ TESTCASE( SIZE_MAX, INT_MAX, "%-010d" );
+ TESTCASE( SIZE_MAX, INT_MIN, "%-011d" );
+ TESTCASE( SIZE_MAX, INT_MAX, "%-011d" );
+ TESTCASE( SIZE_MAX, INT_MIN, "%-012d" );
+ TESTCASE( SIZE_MAX, INT_MAX, "%-012d" );
+ return 0;
+}
+