/* Using an integer's bits as flags for both the conversion flags and length
modifiers.
*/
-/* FIXME: one too many flags to work on a 16-bit machine */
+/* FIXME: one too many flags to work on a 16-bit machine, join some (e.g. the
+ width flags) into a combined field.
+*/
#define E_minus 1<<0
#define E_plus 1<<1
#define E_alt 1<<2
i - pointer to number of characters already delivered in this call
n - pointer to maximum number of characters to be delivered in this call
s - the buffer into which the character shall be delivered
- FIXME: ref. fputs() for a better way to buffer handling
+ TODO: ref. fputs() for a better way to buffer handling
*/
#define DELIVER( x ) \
do { \
if ( *spec == '*' )
{
/* Retrieve width value from argument stack */
-#if 1
int width = va_arg( status->arg, int );
if ( width < 0 )
{
status->flags |= E_minus;
- status->width = width * -1; /* FIXME: Should be abs( width ) */
+ status->width = abs( width );
}
else
{
status->width = width;
}
-#else
- /* FIXME: Old version - with unsigned status->width, condition <0 is never true */
- if ( ( status->width = va_arg( status->arg, int ) ) < 0 )
- {
- /* Negative value is '-' flag plus absolute value */
- status->flags |= E_minus;
- status->width *= -1;
- }
-#endif
++spec;
}
else
if ( *(_PDCLIB_print( format, &status )) != '\0' )
{
printf( "_PDCLIB_print() did not return end-of-specifier on '%s'.\n", format );
- ++rc;
+ ++TEST_RESULTS;
}
va_end( status.arg );
return status.i;
}
+#define TEST_CONVERSION_ONLY
+
+#define TESTCASE_SPRINTF( x ) TESTCASE( x )
+
int main( void )
{
char buffer[100];
+#include "printf_testcases.incl"
+
+#if 0
+ char buffer[100];
TESTCASE( testprintf( buffer, 100, "%hhd", CHAR_MIN ) == 4 );
TESTCASE( strcmp( buffer, "-128" ) == 0 );
TESTCASE( testprintf( buffer, 100, "%hhd", CHAR_MAX ) == 3 );
TESTCASE( strcmp( buffer, "abcdef" ) == 0 );
TESTCASE( testprintf( buffer, 100, "%p", (void *)0xdeadbeef ) == 10 );
TESTCASE( strcmp( buffer, "0xdeadbeef" ) == 0 );
+#endif
return TEST_RESULTS;
}