#define E_intmax 1<<10
#define E_size 1<<11
#define E_ptrdiff 1<<12
-#define E_double 1<<13
-#define E_lower 1<<14
-#define E_unsigned 1<<15
+#define E_intptr 1<<13
+#define E_double 1<<14
+#define E_lower 1<<15
+#define E_unsigned 1<<16
struct status_t
{
int main( void )
{
- puts( "- Signed min / max -\n" );
test( SIZE_MAX, "%hhd", CHAR_MIN );
test( SIZE_MAX, "%hhd", CHAR_MAX );
test( SIZE_MAX, "%hhd", 0 );
test( SIZE_MAX, "%lld", LLONG_MIN );
test( SIZE_MAX, "%lld", LLONG_MAX );
test( SIZE_MAX, "%lld", 0ll );
- puts( "- Unsigned min / max -\n" );
test( SIZE_MAX, "%hhu", UCHAR_MAX );
test( SIZE_MAX, "%hhu", (unsigned char)-1 );
test( SIZE_MAX, "%hu", USHRT_MAX );
test( SIZE_MAX, "%lu", -1ul );
test( SIZE_MAX, "%llu", ULLONG_MAX );
test( SIZE_MAX, "%llu", -1ull );
- puts( "- Hex and Octal, normal and alternative, upper and lowercase -\n" );
test( SIZE_MAX, "%X", UINT_MAX );
test( SIZE_MAX, "%#X", -1u );
test( SIZE_MAX, "%x", UINT_MAX );
test( SIZE_MAX, "%#x", -1u );
test( SIZE_MAX, "%o", UINT_MAX );
test( SIZE_MAX, "%#o", -1u );
- puts( "- Plus flag -\n" );
+ test( SIZE_MAX, "%.0#o", 0 );
test( SIZE_MAX, "%+d", INT_MIN );
test( SIZE_MAX, "%+d", INT_MAX );
test( SIZE_MAX, "%+d", 0 );
test( SIZE_MAX, "%+u", UINT_MAX );
test( SIZE_MAX, "%+u", -1u );
- puts( "- Space flag -\n" );
test( SIZE_MAX, "% d", INT_MIN );
test( SIZE_MAX, "% d", INT_MAX );
test( SIZE_MAX, "% d", 0 );
test( SIZE_MAX, "% u", UINT_MAX );
test( SIZE_MAX, "% u", -1u );
- puts( "- Field width -\n" );
test( SIZE_MAX, "%9d", INT_MIN );
test( SIZE_MAX, "%9d", INT_MAX );
test( SIZE_MAX, "%10d", INT_MIN );
test( SIZE_MAX, "%11d", INT_MAX );
test( SIZE_MAX, "%12d", INT_MIN );
test( SIZE_MAX, "%12d", INT_MAX );
- puts( "- Field width (left bound) -\n" );
test( SIZE_MAX, "%-9d", INT_MIN );
test( SIZE_MAX, "%-9d", INT_MAX );
test( SIZE_MAX, "%-10d", INT_MIN );
test( SIZE_MAX, "%-11d", INT_MAX );
test( SIZE_MAX, "%-12d", INT_MIN );
test( SIZE_MAX, "%-12d", INT_MAX );
- puts( "- Field width, zero padding -\n");
test( SIZE_MAX, "%09d", INT_MIN );
test( SIZE_MAX, "%09d", INT_MAX );
test( SIZE_MAX, "%010d", INT_MIN );
test( SIZE_MAX, "%011d", INT_MAX );
test( SIZE_MAX, "%012d", INT_MIN );
test( SIZE_MAX, "%012d", INT_MAX );
- puts( "- Field width, zero padding (left bound) -\n" );
test( SIZE_MAX, "%-09d", INT_MIN );
test( SIZE_MAX, "%-09d", INT_MAX );
test( SIZE_MAX, "%-010d", INT_MIN );
test( SIZE_MAX, "%-011d", INT_MAX );
test( SIZE_MAX, "%-012d", INT_MIN );
test( SIZE_MAX, "%-012d", INT_MAX );
- puts( "- Limited n -\n" );
test( 8, "%9d", INT_MAX );
test( 8, "%9d", INT_MIN );
test( 9, "%9d", INT_MAX );
test( 12, "%12d", INT_MIN );
test( 13, "%12d", INT_MAX );
test( 13, "%12d", INT_MIN );
- puts( "- Precision -\n" );
test( SIZE_MAX, "%030.20d", INT_MAX );
test( SIZE_MAX, "%.6x", UINT_MAX );
test( SIZE_MAX, "%#6.3x", UINT_MAX );
test( SIZE_MAX, "%+0.6d", INT_MAX );
test( SIZE_MAX, "%+06.3d", INT_MAX );
test( SIZE_MAX, "%+03.6d", INT_MAX );
- puts( "- Multiple outputs -\n" );
test( SIZE_MAX, "- %d", INT_MAX );
test( SIZE_MAX, "- %d %% %d", INT_MAX, INT_MIN );
+ test( SIZE_MAX, "%c", 'x' );
+ test( SIZE_MAX, "%s", "abcdef" );
+ test( SIZE_MAX, "%p", 0xdeadbeef );
return 0;
}
switch ( *spec )
{
case 'd':
+ /* FALLTHROUGH */
case 'i':
status->base = 10;
break;
case 'A':
break;
case 'c':
- break;
+ /* TODO: Flags, wide chars. */
+ DELIVER( va_arg( status->ap, int ) );
+ return ++spec;
case 's':
- break;
+ /* TODO: Flags, wide chars. */
+ {
+ char * s = va_arg( status->ap, char * );
+ while ( *s != '\0' )
+ {
+ DELIVER( *(s++) );
+ }
+ return ++spec;
+ }
case 'p':
- /* uint2base( 16, (intptr_t)value, true ) */
- case 'n':
+ /* TODO: E_long -> E_intptr */
+ status->base = 16;
+ status->flags |= ( E_lower | E_unsigned | E_alt | E_long );
break;
+ case 'n':
+ {
+ int * val = va_arg( status->ap, int * );
+ *val = status->i;
+ return ++spec;
+ }
default:
/* No conversion specifier. Bad conversion. */
return orig_spec;