@ -38,10 +38,8 @@ int kprintf_set_renderer(struct kprintf_renderer *new)
static int fmt_handle_ptr ( uintptr_t ptr )
{
static const char table [ ] = {
' 0 ' , ' 1 ' , ' 2 ' , ' 3 ' ,
' 4 ' , ' 5 ' , ' 6 ' , ' 7 ' ,
' 8 ' , ' 9 ' , ' a ' , ' b ' ,
' c ' , ' d ' , ' e ' , ' f ' ,
' 0 ' , ' 1 ' , ' 2 ' , ' 3 ' , ' 4 ' , ' 5 ' , ' 6 ' , ' 7 ' ,
' 8 ' , ' 9 ' , ' a ' , ' b ' , ' c ' , ' d ' , ' e ' , ' f ' ,
} ;
int ret ;
@ -53,9 +51,9 @@ static int fmt_handle_ptr(uintptr_t ptr)
str [ 1 ] = ' x ' ;
do {
* pos - - = table [ ptr % ARRAY_SIZE ( table ) ] ;
* pos - - = table [ ptr & 0xf ] ;
ptr > > = 4 ;
} while ( pos ! = & str [ 2 ] ) ;
} while ( pos ! = & str [ 1 ] ) ;
ret = renderer - > write ( renderer , str , 2 * sizeof ( uintptr_t ) + 2 ) ;
return ret ;
@ -97,19 +95,10 @@ static inline int fmt_handle_int(int i)
return ret ;
}
/**
* @ brief Parse a formatting escape sequence , fetch the parameter from the ` va_arg `
* stack , and print the resulting string to the standard serial console .
*
* @ param pos A reference to the pointer to the fmt sequence beginner ( ` % ` ) .
* This is updated to point to the first character * after * the entire
* escape sequence .
* @ param args A pointer to the varargs list . Will be manipulated .
* @ returns The amount of bytes written , or a negative POSIX error code .
*/
static inline int fmt_handle ( const char * * pos , va_list args )
int kvprintf ( const char * fmt , va_list args )
{
int ret = 0 ;
ssize_t ret = 0 ;
const char * tmp = fmt ;
union {
char c ;
int d ;
@ -118,48 +107,6 @@ static inline int fmt_handle(const char **pos, va_list args)
unsigned int u ;
} val ;
switch ( * * pos ) {
case ' % ' : /* literal percent sign */
ret = renderer - > write ( renderer , * pos , sizeof ( * * pos ) ) ;
break ;
case ' c ' : /* char */
val . c = va_arg ( args , int ) ; /* POSIX says chars are cast to an int */
ret = renderer - > write ( renderer , & val . c , sizeof ( val . c ) ) ;
break ;
case ' d ' : /* int */
val . d = va_arg ( args , typeof ( val . d ) ) ;
ret = fmt_handle_int ( val . d ) ;
break ;
case ' p ' : /* ptr */
val . p = va_arg ( args , typeof ( val . p ) ) ;
ret = fmt_handle_ptr ( val . p ) ;
break ;
case ' s ' : /* string */
val . s = va_arg ( args , typeof ( val . s ) ) ;
ret = ( int ) strlen ( val . s ) ;
ret = renderer - > write ( renderer , val . s , ( size_t ) ret ) ;
break ;
case ' u ' : /* unsigned int */
val . u = va_arg ( args , typeof ( val . u ) ) ;
ret = fmt_handle_uint ( val . u ) ;
break ;
}
( * pos ) + + ;
return ret ;
}
int kvprintf ( const char * fmt , va_list args )
{
ssize_t ret = 0 ;
const char * tmp = fmt ;
while ( * tmp ! = ' \0 ' ) {
if ( * tmp + + = = ' % ' ) {
/* flush out everything we have so far (minus one char for %) */
@ -174,7 +121,37 @@ int kvprintf(const char *fmt, va_list args)
}
ret + = write_ret ;
ssize_t fmt_ret = fmt_handle ( & tmp , args ) ;
ssize_t fmt_ret = 0 ;
switch ( * tmp ) {
case ' % ' : /* literal percent sign */
fmt_ret = renderer - > write ( renderer , tmp , sizeof ( * tmp ) ) ;
break ;
case ' c ' : /* char */
val . c = va_arg ( args , int ) ; /* POSIX wants an int */
fmt_ret = renderer - > write ( renderer , & val . c , sizeof ( val . c ) ) ;
break ;
case ' d ' : /* int */
case ' i ' :
fmt_ret = fmt_handle_int ( va_arg ( args , int ) ) ;
break ;
case ' p ' : /* ptr */
fmt_ret = fmt_handle_ptr ( va_arg ( args , uintptr_t ) ) ;
break ;
case ' s ' : /* string */
val . s = va_arg ( args , char * ) ;
fmt_ret = renderer - > write ( renderer , val . s , strlen ( val . s ) ) ;
break ;
case ' u ' : /* unsigned int */
fmt_ret = fmt_handle_uint ( va_arg ( args , unsigned int ) ) ;
break ;
}
tmp + + ;
/*
* act as if the current position were the beginning in
* order to make the first step of this if block easier