latest SDK
This commit is contained in:
121
pfc/printf.cpp
Normal file
121
pfc/printf.cpp
Normal file
@@ -0,0 +1,121 @@
|
||||
#include "pfc.h"
|
||||
|
||||
//implementations of deprecated string_printf methods, with a pragma to disable warnings when they reference other deprecated methods.
|
||||
|
||||
#ifndef _MSC_VER
|
||||
#define _itoa_s itoa
|
||||
#define _ultoa_s ultoa
|
||||
#endif
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(disable:4996)
|
||||
#endif
|
||||
|
||||
namespace pfc {
|
||||
|
||||
void string_printf::run(const char * fmt,va_list list) {g_run(*this,fmt,list);}
|
||||
|
||||
string_printf_va::string_printf_va(const char * fmt,va_list list) {string_printf::g_run(*this,fmt,list);}
|
||||
|
||||
void string_printf::g_run(string_base & out,const char * fmt,va_list list)
|
||||
{
|
||||
out.reset();
|
||||
while(*fmt)
|
||||
{
|
||||
if (*fmt=='%')
|
||||
{
|
||||
fmt++;
|
||||
if (*fmt=='%')
|
||||
{
|
||||
out.add_char('%');
|
||||
fmt++;
|
||||
}
|
||||
else
|
||||
{
|
||||
bool force_sign = false;
|
||||
if (*fmt=='+')
|
||||
{
|
||||
force_sign = true;
|
||||
fmt++;
|
||||
}
|
||||
char padchar = (*fmt == '0') ? '0' : ' ';
|
||||
t_size pad = 0;
|
||||
while(*fmt>='0' && *fmt<='9')
|
||||
{
|
||||
pad = pad * 10 + (*fmt - '0');
|
||||
fmt++;
|
||||
}
|
||||
|
||||
if (*fmt=='s' || *fmt=='S')
|
||||
{
|
||||
const char * ptr = va_arg(list,const char*);
|
||||
t_size len = strlen(ptr);
|
||||
if (pad>len) out.add_chars(padchar,pad-len);
|
||||
out.add_string(ptr);
|
||||
fmt++;
|
||||
|
||||
}
|
||||
else if (*fmt=='i' || *fmt=='I' || *fmt=='d' || *fmt=='D')
|
||||
{
|
||||
int val = va_arg(list,int);
|
||||
if (force_sign && val>0) out.add_char('+');
|
||||
pfc::format_int temp( val );
|
||||
t_size len = strlen(temp);
|
||||
if (pad>len) out.add_chars(padchar,pad-len);
|
||||
out.add_string(temp);
|
||||
fmt++;
|
||||
}
|
||||
else if (*fmt=='u' || *fmt=='U')
|
||||
{
|
||||
int val = va_arg(list,int);
|
||||
if (force_sign && val>0) out.add_char('+');
|
||||
pfc::format_uint temp(val);
|
||||
t_size len = strlen(temp);
|
||||
if (pad>len) out.add_chars(padchar,pad-len);
|
||||
out.add_string(temp);
|
||||
fmt++;
|
||||
}
|
||||
else if (*fmt=='x' || *fmt=='X')
|
||||
{
|
||||
auto val = va_arg(list,unsigned);
|
||||
if (force_sign && val>0) out.add_char('+');
|
||||
pfc::format_uint temp(val, 0, 16);
|
||||
if (*fmt=='X')
|
||||
{
|
||||
char * t = const_cast< char* > ( temp.get_ptr() );
|
||||
while(*t)
|
||||
{
|
||||
if (*t>='a' && *t<='z')
|
||||
*t += 'A' - 'a';
|
||||
t++;
|
||||
}
|
||||
}
|
||||
t_size len = strlen(temp);
|
||||
if (pad>len) out.add_chars(padchar,pad-len);
|
||||
out.add_string(temp);
|
||||
fmt++;
|
||||
}
|
||||
else if (*fmt=='c' || *fmt=='C')
|
||||
{
|
||||
out.add_char(va_arg(list,int));
|
||||
fmt++;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
out.add_char(*(fmt++));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
string_printf::string_printf(const char * fmt,...)
|
||||
{
|
||||
va_list list;
|
||||
va_start(list,fmt);
|
||||
run(fmt,list);
|
||||
va_end(list);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user