summaryrefslogtreecommitdiffstats
path: root/src/include/util/sprintf.H
diff options
context:
space:
mode:
authorPatrick Williams <iawillia@us.ibm.com>2013-09-23 14:55:10 -0500
committerA. Patrick Williams III <iawillia@us.ibm.com>2013-10-07 10:02:28 -0500
commitb8d7070d329b3a6577ae6c11ae7b1afb27db7a22 (patch)
tree0e93546356b039af78869b5edc86d8d4d1ff08a9 /src/include/util/sprintf.H
parent4dc8e90ef55cb15b6a36a8d27ae43a6b2261521b (diff)
downloadtalos-hostboot-b8d7070d329b3a6577ae6c11ae7b1afb27db7a22.tar.gz
talos-hostboot-b8d7070d329b3a6577ae6c11ae7b1afb27db7a22.zip
Make sprintf-class functions comply with standard.
Change-Id: I6a04179bb2c339668450bcbcf608ebef477c5bfe Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/6399 Tested-by: Jenkins Server Reviewed-by: Brian H. Horton <brianh@linux.ibm.com> Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src/include/util/sprintf.H')
-rw-r--r--src/include/util/sprintf.H326
1 files changed, 6 insertions, 320 deletions
diff --git a/src/include/util/sprintf.H b/src/include/util/sprintf.H
index 1385e9b17..f03ea6228 100644
--- a/src/include/util/sprintf.H
+++ b/src/include/util/sprintf.H
@@ -25,332 +25,18 @@
#include <stdarg.h>
#include <stdint.h>
-#include <builtins.h>
-
-class Console;
namespace Util
{
-
- class ConsoleTraits
+ class ConsoleBufferInterface
{
- public:
- enum trait { NONE, HEX, DEC, };
+ public:
+ virtual ~ConsoleBufferInterface() {};
+ virtual size_t operator() (int) = 0;
};
- template <typename _T, ConsoleTraits::trait _S = ConsoleTraits::NONE>
- class ConsoleDisplay
- {
- public:
- template <typename _F>
- ALWAYS_INLINE
- static size_t display(_F& c, _T value) { return 0; };
- };
-
- template <ConsoleTraits::trait _S>
- class ConsoleDisplay<char*, _S>
- {
- public:
- template <typename _F>
- ALWAYS_INLINE
- static size_t display(_F& c, char* value)
- {
- size_t count = 0;
- while(*value != '\0')
- {
- c(*value);
- value++;
- count++;
- }
- return count;
- }
- };
-
- template <>
- class ConsoleDisplay<char, ConsoleTraits::NONE>
- {
- public:
- template <typename _F>
- ALWAYS_INLINE
- static size_t display(_F& c, char value)
- {
- c(value);
- return 1;
- }
- };
-
- template <typename _T>
- class ConsoleDisplay<_T, ConsoleTraits::DEC>
- {
- public:
- template <typename _F>
- ALWAYS_INLINE
- static size_t display(_F& c, _T value)
- {
- size_t count = 0;
- if (value == 0)
- {
- c('0'); count++;
- }
- else if (value < 0)
- {
- c('-'); count++;
- value *= -1;
- count += subdisplay(c, value);
- }
- else
- count += subdisplay(c, value);
- return count;
- }
-
- template <typename _F>
- static size_t subdisplay(_F& c, _T value)
- {
- size_t count = 0;
- if (value != 0)
- {
- count += subdisplay(c, value / 10);
- c('0' + (value % 10));
- count++;
- }
- return count;
- }
- };
-
- template<typename _T>
- class ConsoleDisplay<_T, ConsoleTraits::HEX>
- {
- public:
- template <typename _F>
- ALWAYS_INLINE
- static size_t display(_F& c, _T value)
- {
- size_t count = 0;
- if (value == 0)
- {
- c('0'); count++;
- }
- else
- {
- count += subdisplay(c, value);
- }
- return count;
- }
-
- template <typename _F>
- static size_t subdisplay(_F& c, _T value)
- {
- size_t count = 0;
- if (value != 0)
- {
- count += subdisplay(c, value / 16);
- char nibble = value % 16;
- if (nibble >= 0x0a)
- c('A' + (nibble - 0x0a));
- else
- c('0' + nibble);
- count++;
- }
- return count;
- }
- };
-
- template<typename _F>
- size_t vasprintf(_F output_func, const char* fmt_str, va_list& args)
- {
- size_t count = 0;
-
- bool format = false;
- int size = 0;
-
- while('\0' != *fmt_str)
- {
- if (('%' == *fmt_str) || (format))
- switch (*fmt_str)
- {
- case '%':
- {
- if (format)
- {
- count +=
- ConsoleDisplay<char>::display(output_func,
- '%');
- format = false;
- }
- else
- {
- format = true;
- size = 2;
- }
- break;
- }
- case 'c':
- {
- format = false;
- count += ConsoleDisplay<char>
- ::display(output_func, (char)va_arg(args,int));
- break;
- }
- case 'h':
- {
- size--;
- break;
- }
- case 'l':
- {
- size++;
- break;
- }
- case 'z': // size_t or ssize_t
- {
- size = 4;
- break;
- }
- case 'd': // decimal
- {
- format = false;
- switch(size)
- {
- case 0:
- count += ConsoleDisplay<char,
- ConsoleTraits::DEC>
- ::display(output_func,
- (char)va_arg(args,int));
- break;
-
- case 1:
- count += ConsoleDisplay<short,
- ConsoleTraits::DEC>
- ::display(output_func,
- (short)va_arg(args,int));
- break;
-
- case 2:
- count += ConsoleDisplay<int,
- ConsoleTraits::DEC>
- ::display(output_func,
- va_arg(args,int));
- break;
-
- case 3:
- case 4:
- count += ConsoleDisplay<long,
- ConsoleTraits::DEC>
- ::display(output_func,
- va_arg(args,long));
- break;
- }
- break;
- }
- case 'u': // unsigned decimal
- {
- format = false;
- switch(size)
- {
- case 0:
- count += ConsoleDisplay<unsigned char,
- ConsoleTraits::DEC>
- ::display(output_func,
- (unsigned char)
- va_arg(args,unsigned int));
- break;
-
- case 1:
- count += ConsoleDisplay<unsigned short,
- ConsoleTraits::DEC>
- ::display(output_func,
- (unsigned short)
- va_arg(args,unsigned int));
- break;
-
- case 2:
- count += ConsoleDisplay<unsigned int,
- ConsoleTraits::DEC>
- ::display(output_func,
- va_arg(args,unsigned int));
- break;
-
- case 3:
- case 4:
- count += ConsoleDisplay<unsigned long,
- ConsoleTraits::DEC>
- ::display(output_func,
- va_arg(args,unsigned long));
- break;
- }
- break;
- }
- case 'x': // unsigned hex
- case 'X':
- {
- format = false;
- switch(size)
- {
- case 0:
- count += ConsoleDisplay<unsigned char,
- ConsoleTraits::HEX>
- ::display(output_func,
- (unsigned char)
- va_arg(args,unsigned int));
- break;
-
- case 1:
- count += ConsoleDisplay<unsigned short,
- ConsoleTraits::HEX>
- ::display(output_func,
- (unsigned short)
- va_arg(args,unsigned int));
- break;
-
- case 2:
- count += ConsoleDisplay<unsigned int,
- ConsoleTraits::HEX>
- ::display(output_func,
- va_arg(args,unsigned int));
- break;
-
- case 3:
- case 4:
- count += ConsoleDisplay<unsigned long,
- ConsoleTraits::HEX>
- ::display(output_func,
- va_arg(args,unsigned long));
- break;
- }
- break;
- }
- case 's': // string
- {
- format = false;
- count += ConsoleDisplay<char*>
- ::display(output_func,
- (char*) va_arg(args,void*));
- break;
- }
- case 'p': // pointer
- {
- format = false;
- count += ConsoleDisplay<char>
- ::display(output_func,
- '0');
- count += ConsoleDisplay<char>
- ::display(output_func,
- 'x');
- count += ConsoleDisplay<unsigned long,
- ConsoleTraits::HEX>
- ::display(output_func,
- va_arg(args,unsigned long));
- break;
- }
- }
- else
- count += ConsoleDisplay<char>::display(output_func, *fmt_str);
-
- fmt_str++;
- }
-
- return count;
- }
+ size_t vasprintf(ConsoleBufferInterface& output_func,
+ const char* fmt_str, va_list& args);
};
OpenPOWER on IntegriCloud