Author: tkreuzer
Date: Sun Oct 10 14:31:04 2010
New Revision: 49094
URL:
http://svn.reactos.org/svn/reactos?rev=49094&view=rev
Log:
[XML]
- Replace ssvprintf with _vsnprintf
- get rid of ssprintf, a 2000 lines / 35 kb C++ reimplementation of vsprintf &
friends
Removed:
branches/cmake-bringup/tools/ssprintf.cpp
branches/cmake-bringup/tools/ssprintf.h
Modified:
branches/cmake-bringup/tools/CMakeLists.txt
branches/cmake-bringup/tools/xml.cpp
Modified: branches/cmake-bringup/tools/CMakeLists.txt
URL:
http://svn.reactos.org/svn/reactos/branches/cmake-bringup/tools/CMakeLists.…
==============================================================================
--- branches/cmake-bringup/tools/CMakeLists.txt [iso-8859-1] (original)
+++ branches/cmake-bringup/tools/CMakeLists.txt [iso-8859-1] Sun Oct 10 14:31:04 2010
@@ -1,4 +1,4 @@
-add_library(xml xml.cpp ssprintf.cpp)
+add_library(xml xml.cpp)
add_executable(bin2c bin2c.c)
#add_executable(pefixup pefixup.c)
Removed: branches/cmake-bringup/tools/ssprintf.cpp
URL:
http://svn.reactos.org/svn/reactos/branches/cmake-bringup/tools/ssprintf.cp…
==============================================================================
--- branches/cmake-bringup/tools/ssprintf.cpp [iso-8859-1] (original)
+++ branches/cmake-bringup/tools/ssprintf.cpp (removed)
@@ -1,1969 +1,0 @@
-/*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-// For character conversion functions like "wctomb" and "alloca"
under Unix
-#include <stdlib.h>
-
-#if defined(WIN32)
- // Under Win32 hosts, "alloca" is not defined by stdlib.h, but by malloc.h
- // On the other hand, malloc.h is deprecated under some Unix hosts, so only include
it for Win32 hosts.
- #include <malloc.h>
-#endif
-
-#include <ctype.h>
-#include <math.h>
-#include <float.h>
-#include <assert.h>
-#include "ssprintf.h"
-
-#ifndef WIN32
-#define _finite __finite
-#define _isnan __isnan
-#endif
-
-#ifndef __APPLE__
-inline int iswdigit ( wchar_t c )
-{
- return ( c >= L'0' && c <= L'9' );
-}
-#endif
-
-#if defined(__sun__)
-#include <alloca.h>
-#include <ieee.h>
-#endif
-
-#if defined(__FreeBSD__) || defined(__APPLE__) || defined(__sun__) ||
defined(__CYGWIN__)
-# define __isnan isnan
-# define __finite finite
-# define powl __builtin_powl
-# define modfl __builtin_modfl
-#endif // _FreeBSD__
-
-#ifdef _MSC_VER
-#define alloca _alloca
-#endif//_MSC_VER
-
-#ifdef _MSC_VER
-typedef __int64 LONGLONG;
-typedef unsigned __int64 ULONGLONG;
-#else
-typedef long long LONGLONG;
-typedef unsigned long long ULONGLONG;
-#endif
-
-typedef struct {
- unsigned int mantissa:23;
- unsigned int exponent:8;
- unsigned int sign:1;
-} ieee_float_t;
-
-typedef struct {
- unsigned int mantissal:32;
- unsigned int mantissah:20;
- unsigned int exponent:11;
- unsigned int sign:1;
-} ieee_double_t;
-
-typedef struct {
- unsigned int mantissal:32;
- unsigned int mantissah:32;
- unsigned int exponent:15;
- unsigned int sign:1;
- unsigned int empty:16;
-} ieee_long_double_t;
-
-std::string
-ssprintf ( const char* fmt, ... )
-{
- va_list arg;
- va_start(arg, fmt);
- std::string f = ssvprintf ( fmt, arg );
- va_end(arg);
- return f;
-}
-
-std::wstring
-sswprintf ( const wchar_t* fmt, ... )
-{
- va_list arg;
- va_start(arg, fmt);
- std::wstring f = sswvprintf ( fmt, arg );
- va_end(arg);
- return f;
-}
-
-#define ZEROPAD 1 /* pad with zero */
-#define SIGN 2 /* unsigned/signed long */
-#define PLUS 4 /* show plus */
-#define SPACE 8 /* space if plus */
-#define LEFT 16 /* left justified */
-#define SPECIAL 32 /* 0x */
-#define LARGE 64 /* use 'ABCDEF' instead of 'abcdef' */
-#define ZEROTRUNC 128 /* truncate zero 's */
-
-
-static int
-skip_atoi(const char **s)
-{
- int i=0;
-
- while (isdigit(**s))
- i = i*10 + *((*s)++) - '0';
- return i;
-}
-
-static int
-skip_wtoi(const wchar_t **s)
-{
- int i=0;
-
- while (iswdigit(**s))
- i = i*10 + *((*s)++) - L'0';
- return i;
-}
-
-
-static int
-do_div(LONGLONG *n,int base)
-{
- int __res = ((ULONGLONG) *n) % (unsigned) base;
- *n = ((ULONGLONG) *n) / (unsigned) base;
- return __res;
-}
-
-
-static bool
-number(std::string& f, LONGLONG num, int base, int size, int precision ,int type)
-{
- char c,sign,tmp[66];
- const char *digits="0123456789abcdefghijklmnopqrstuvwxyz";
- int i;
-
- if (type & LARGE)
- digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
- if (type & LEFT)
- type &= ~ZEROPAD;
- if (base < 2 || base > 36)
- return false;
- c = (type & ZEROPAD) ? '0' : ' ';
- sign = 0;
- if (type & SIGN) {
- if (num < 0) {
- sign = '-';
- num = -num;
- size--;
- } else if (type & PLUS) {
- sign = '+';
- size--;
- } else if (type & SPACE) {
- sign = ' ';
- size--;
- }
- }
- if (type & SPECIAL) {
- if (base == 16)
- size -= 2;
- else if (base == 8)
- size--;
- }
- i = 0;
- if (num == 0)
- tmp[i++]='0';
- else while (num != 0)
- tmp[i++] = digits[do_div(&num,base)];
- if (i > precision)
- precision = i;
- size -= precision;
- if (!(type&(ZEROPAD+LEFT)))
- while(size-->0)
- f += ' ';
- if (sign)
- f += sign;
- if (type & SPECIAL)
- {
- if (base==8)
- f += '0';
- else if (base==16)
- {
- f += '0';
- f += digits[33];
- }
- }
- if (!(type & LEFT))
- {
- while (size-- > 0)
- f += c;
- }
- while (i < precision--)
- {
- f += '0';
- }
- while (i-- > 0)
- {
- f += tmp[i];
- }
- while (size-- > 0)
- {
- f += ' ';
- }
- return true;
-}
-
-static bool
-wnumber(std::wstring& f, LONGLONG num, int base, int size, int precision ,int type)
-{
- wchar_t c,sign,tmp[66];
- const wchar_t *digits = L"0123456789abcdefghijklmnopqrstuvwxyz";
- int i;
-
- if (type & LARGE)
- digits = L"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
- if (type & LEFT)
- type &= ~ZEROPAD;
- if (base < 2 || base > 36)
- return 0;
- c = (type & ZEROPAD) ? L'0' : L' ';
- sign = false;
- if (type & SIGN) {
- if (num < 0) {
- sign = L'-';
- num = -num;
- size--;
- } else if (type & PLUS) {
- sign = L'+';
- size--;
- } else if (type & SPACE) {
- sign = L' ';
- size--;
- }
- }
- if (type & SPECIAL) {
- if (base == 16)
- size -= 2;
- else if (base == 8)
- size--;
- }
- i = 0;
- if (num == 0)
- tmp[i++]=L'0';
- else while (num != 0)
- tmp[i++] = digits[do_div(&num,base)];
- if (i > precision)
- precision = i;
- size -= precision;
- if (!(type&(ZEROPAD+LEFT)))
- while(size-->0)
- f += L' ';
- if (sign)
- f += sign;
- if (type & SPECIAL)
- {
- if (base==8)
- f += L'0';
- else if (base==16)
- {
- f += L'0';
- f += digits[33];
- }
- }
- if (!(type & LEFT))
- {
- while (size-- > 0)
- f += c;
- }
- while (i < precision--)
- {
- f += L'0';
- }
- while (i-- > 0)
- {
- f += tmp[i];
- }
- while (size-- > 0)
- {
- f += L' ';
- }
- return true;
-}
-
-
-static bool
-numberf(std::string& f, double __n, char exp_sign, int size, int precision, int
type)
-{
- double exponent = 0.0;
- double e;
- long ie;
-
- int i = 0;
- int j = 0;
- int ro = 0;
-
- double frac, intr;
- double p;
- char *buf, *tmp, sign, c;
- int result;
-
- union
- {
- double* __n;
- ieee_double_t* n;
- } n;
-
- n.__n = &__n;
-
- if ( exp_sign == 'g' || exp_sign == 'G' || exp_sign == 'e' ||
exp_sign == 'E' )
- {
- ie = ((unsigned int)n.n->exponent - (unsigned int)0x3ff);
- exponent = ie/3.321928;
- }
-
- if ( exp_sign == 'g' || exp_sign == 'G' )
- {
- type |= ZEROTRUNC;
- if ( exponent < -4 || fabs(exponent) >= precision )
- exp_sign -= 2; // g -> e and G -> E
- else
- exp_sign = 'f';
- }
-
- if ( exp_sign == 'e' || exp_sign == 'E' )
- {
- frac = modf(exponent,&e);
- if ( frac > 0.5 )
- e++;
- else if ( frac < -0.5 )
- e--;
-
- result = numberf(f,__n/pow(10.0L,(long double)e),'f',size-4, precision, type);
- if (result < 0)
- return false;
- f += exp_sign;
- size--;
- ie = (long)e;
- type = LEFT | PLUS;
- if ( ie < 0 )
- type |= SIGN;
-
- result = number(f,ie, 10,2, 2,type );
- if (result < 0)
- return false;
- return true;
- }
-
- if ( exp_sign == 'f' )
- {
- buf = (char*)alloca(4096);
- if (type & LEFT)
- type &= ~ZEROPAD;
-
- c = (type & ZEROPAD) ? '0' : ' ';
- sign = 0;
- if (type & SIGN)
- {
- if (__n < 0)
- {
- sign = '-';
- __n = fabs(__n);
- size--;
- }
- else if (type & PLUS)
- {
- sign = '+';
- size--;
- }
- else if (type & SPACE)
- {
- sign = ' ';
- size--;
- }
- }
-
- frac = modf(__n,&intr);
-
- // # flags forces a . and prevents trucation of trailing zero's
- if ( precision > 0 )
- {
- i = precision-1;
- while ( i >= 0 )
- {
- frac*=10.0L;
- frac = modf(frac, &p);
- buf[i] = (int)p + '0';
- i--;
- }
- i = precision;
- size -= precision;
-
- ro = 0;
- if ( frac > 0.5 )
- ro = 1;
-
- if ( precision >= 1 || type & SPECIAL)
- {
- buf[i++] = '.';
- size--;
- }
- }
-
- if ( intr == 0.0 )
- {
- buf[i++] = '0';
- size--;
- }
- else
- {
- while ( intr > 0.0 )
- {
- p = intr;
- intr/=10.0L;
- modf(intr, &intr);
-
- p -= 10.0*intr;
-
- buf[i++] = (int)p + '0';
- size--;
- }
- }
-
- j = 0;
- while ( j < i && ro == 1)
- {
- if ( buf[j] >= '0' && buf[j] <= '8' )
- {
- buf[j]++;
- ro = 0;
- }
- else if ( buf[j] == '9' )
- {
- buf[j] = '0';
- }
- j++;
- }
- if ( ro == 1 )
- buf[i++] = '1';
-
- buf[i] = 0;
-
- if (!(type&(ZEROPAD+LEFT)))
- {
- while(size-->0)
- f += ' ';
- }
- if (sign)
- {
- f += sign;
- }
-
- if (!(type&(ZEROPAD+LEFT)))
- {
- while(size-->0)
- f += ' ';
- }
-
- if (!(type & LEFT))
- {
- while (size-- > 0)
- f += c;
- }
-
- tmp = buf;
- if ( type & ZEROTRUNC && ((type & SPECIAL) != SPECIAL) )
- {
- j = 0;
- while ( j < i && ( *tmp == '0' || *tmp == '.' ))
- {
- tmp++;
- i--;
- }
- }
- while (i-- > 0)
- {
- f += tmp[i];
- }
- while (size-- > 0)
- {
- f += ' ';
- }
- }
- return true;
-}
-
-static bool
-wnumberf(std::wstring& f, double __n, wchar_t exp_sign, int size, int precision, int
type)
-{
- double exponent = 0.0;
- double e;
- long ie;
-
- int i = 0;
- int j = 0;
- int ro = 0;
-
- double frac, intr;
- double p;
- wchar_t *buf, *tmp, sign, c;
- int result;
-
- union
- {
- double* __n;
- ieee_double_t* n;
- } n;
-
- n.__n = &__n;
-
- if ( exp_sign == L'g' || exp_sign == L'G' || exp_sign == L'e' ||
exp_sign == L'E' )
- {
- ie = ((unsigned int)n.n->exponent - (unsigned int)0x3ff);
- exponent = ie/3.321928;
- }
-
- if ( exp_sign == L'g' || exp_sign == L'G' )
- {
- type |= ZEROTRUNC;
- if ( exponent < -4 || fabs(exponent) >= precision )
- exp_sign -= 2; // g -> e and G -> E
- else
- exp_sign = L'f';
- }
-
- if ( exp_sign == L'e' || exp_sign == L'E' )
- {
- frac = modf(exponent,&e);
- if ( frac > 0.5 )
- e++;
- else if ( frac < -0.5 )
- e--;
-
- result = wnumberf(f,__n/pow(10.0L,(long double) e),L'f',size-4, precision,
type);
- if (result < 0)
- return false;
- f += exp_sign;
- size--;
- ie = (long)e;
- type = LEFT | PLUS;
- if ( ie < 0 )
- type |= SIGN;
-
- result = wnumber(f,ie, 10,2, 2,type );
- if (result < 0)
- return false;
- return true;
- }
-
- if ( exp_sign == L'f' )
- {
- buf = (wchar_t*)alloca(4096*sizeof(wchar_t));
- if (type & LEFT)
- type &= ~ZEROPAD;
-
- c = (type & ZEROPAD) ? L'0' : L' ';
- sign = 0;
- if (type & SIGN)
- {
- if (__n < 0)
- {
- sign = L'-';
- __n = fabs(__n);
- size--;
- }
- else if (type & PLUS)
- {
- sign = L'+';
- size--;
- }
- else if (type & SPACE)
- {
- sign = L' ';
- size--;
- }
- }
-
- frac = modf(__n,&intr);
-
- // # flags forces a . and prevents trucation of trailing zero's
- if ( precision > 0 )
- {
- i = precision-1;
- while ( i >= 0 )
- {
- frac*=10.0L;
- frac = modf(frac, &p);
- buf[i] = (int)p + L'0';
- i--;
- }
- i = precision;
- size -= precision;
-
- ro = 0;
- if ( frac > 0.5 )
- ro = 1;
-
- if ( precision >= 1 || type & SPECIAL)
- {
- buf[i++] = L'.';
- size--;
- }
- }
-
- if ( intr == 0.0 )
- {
- buf[i++] = L'0';
- size--;
- }
- else
- {
- while ( intr > 0.0 )
- {
- p = intr;
- intr/=10.0L;
- modf(intr, &intr);
-
- p -= 10.0*intr;
-
- buf[i++] = (int)p + L'0';
- size--;
- }
- }
-
- j = 0;
- while ( j < i && ro == 1)
- {
- if ( buf[j] >= L'0' && buf[j] <= L'8' )
- {
- buf[j]++;
- ro = 0;
- }
- else if ( buf[j] == L'9' )
- {
- buf[j] = L'0';
- }
- j++;
- }
- if ( ro == 1 )
- buf[i++] = L'1';
-
- buf[i] = 0;
-
- if (!(type&(ZEROPAD+LEFT)))
- {
- while(size-->0)
- f += L' ';
- }
- if (sign)
- {
- f += sign;
- }
-
- if (!(type&(ZEROPAD+LEFT)))
- {
- while(size-->0)
- f += L' ';
- }
-
- if (!(type & LEFT))
- {
- while (size-- > 0)
- f += c;
- }
-
- tmp = buf;
- if ( type & ZEROTRUNC && ((type & SPECIAL) != SPECIAL) )
- {
- j = 0;
- while ( j < i && ( *tmp == L'0' || *tmp == L'.' ))
- {
- tmp++;
- i--;
- }
- }
- while (i-- > 0)
- {
- f += tmp[i];
- }
- while (size-- > 0)
- {
- f += L' ';
- }
- }
- return true;
-}
-
-static bool
-numberfl(std::string& f, long double __n, char exp_sign, int size, int precision,
int type)
-{
- long double exponent = 0.0;
- long double e;
- long ie;
-
- int i = 0;
- int j = 0;
- int ro = 0;
-
- long double frac, intr;
- long double p;
- char *buf, *tmp, sign, c;
- int result;
-
- union
- {
- long double* __n;
- ieee_long_double_t* n;
- } n;
-
- n.__n = &__n;
-
- if ( exp_sign == 'g' || exp_sign == 'G' || exp_sign == 'e' ||
exp_sign == 'E' )
- {
- ie = ((unsigned int)n.n->exponent - (unsigned int)0x3fff);
- exponent = ie/3.321928;
- }
-
- if ( exp_sign == 'g' || exp_sign == 'G' )
- {
- type |= ZEROTRUNC;
- if ( exponent < -4 || fabs(exponent) >= precision )
- exp_sign -= 2; // g -> e and G -> E
- else
- exp_sign = 'f';
- }
-
- if ( exp_sign == 'e' || exp_sign == 'E' )
- {
- frac = modfl(exponent,&e);
- if ( frac > 0.5 )
- e++;
- else if ( frac < -0.5 )
- e--;
-
- result = numberf(f,__n/powl(10.0L,e),'f',size-4, precision, type);
- if (result < 0)
- return false;
- f += exp_sign;
- size--;
- ie = (long)e;
- type = LEFT | PLUS;
- if ( ie < 0 )
- type |= SIGN;
-
- result = number(f,ie, 10,2, 2,type );
- if (result < 0)
- return false;
- return true;
- }
-
- if ( exp_sign == 'f' )
- {
- buf = (char*)alloca(4096);
- if (type & LEFT)
- type &= ~ZEROPAD;
-
- c = (type & ZEROPAD) ? '0' : ' ';
- sign = 0;
- if (type & SIGN)
- {
- if (__n < 0)
- {
- sign = '-';
- __n = fabs(__n);
- size--;
- }
- else if (type & PLUS)
- {
- sign = '+';
- size--;
- }
- else if (type & SPACE)
- {
- sign = ' ';
- size--;
- }
- }
-
- frac = modfl(__n,&intr);
-
- // # flags forces a . and prevents trucation of trailing zero's
- if ( precision > 0 )
- {
- i = precision-1;
- while ( i >= 0 )
- {
- frac*=10.0L;
- frac = modfl((long double)frac, &p);
- buf[i] = (int)p + '0';
- i--;
- }
- i = precision;
- size -= precision;
-
- ro = 0;
- if ( frac > 0.5 )
- ro = 1;
-
- if ( precision >= 1 || type & SPECIAL)
- {
- buf[i++] = '.';
- size--;
- }
- }
-
- if ( intr == 0.0 )
- {
- buf[i++] = '0';
- size--;
- }
- else
- {
- while ( intr > 0.0 )
- {
- p = intr;
- intr/=10.0L;
- modfl(intr, &intr);
-
- p -= 10.0L*intr;
-
- buf[i++] = (int)p + '0';
- size--;
- }
- }
-
- j = 0;
- while ( j < i && ro == 1)
- {
- if ( buf[j] >= '0' && buf[j] <= '8' )
- {
- buf[j]++;
- ro = 0;
- }
- else if ( buf[j] == '9' )
- {
- buf[j] = '0';
- }
- j++;
- }
- if ( ro == 1 )
- buf[i++] = '1';
-
- buf[i] = 0;
-
- if (!(type&(ZEROPAD+LEFT)))
- {
- while(size-->0)
- f += ' ';
- }
- if (sign)
- {
- f += sign;
- }
-
- if (!(type&(ZEROPAD+LEFT)))
- {
- while(size-->0)
- f += ' ';
- }
-
- if (!(type & LEFT))
- {
- while (size-- > 0)
- f += c;
- }
-
- tmp = buf;
- if ( type & ZEROTRUNC && ((type & SPECIAL) != SPECIAL) )
- {
- j = 0;
- while ( j < i && ( *tmp == '0' || *tmp == '.' ))
- {
- tmp++;
- i--;
- }
- }
- while (i-- > 0)
- {
- f += tmp[i];
- }
- while (size-- > 0)
- {
- f += ' ';
- }
- }
- return true;
-}
-
-static bool
-wnumberfl(std::wstring& f, long double __n, wchar_t exp_sign, int size, int
precision, int type)
-{
- long double exponent = 0.0;
- long double e;
- long ie;
-
- int i = 0;
- int j = 0;
- int ro = 0;
-
- long double frac, intr;
- long double p;
- wchar_t *buf, *tmp, sign, c;
- int result;
-
- union
- {
- long double* __n;
- ieee_long_double_t* n;
- } n;
-
- n.__n = &__n;
-
- if ( exp_sign == L'g' || exp_sign == L'G' || exp_sign == L'e' ||
exp_sign == L'E' )
- {
- ie = ((unsigned int)n.n->exponent - (unsigned int)0x3fff);
- exponent = ie/3.321928;
- }
-
- if ( exp_sign == L'g' || exp_sign == L'G' )
- {
- type |= ZEROTRUNC;
- if ( exponent < -4 || fabs(exponent) >= precision )
- exp_sign -= 2; // g -> e and G -> E
- else
- exp_sign = 'f';
- }
-
- if ( exp_sign == L'e' || exp_sign == L'E' )
- {
- frac = modfl(exponent,&e);
- if ( frac > 0.5 )
- e++;
- else if ( frac < -0.5 )
- e--;
-
- result = wnumberf(f,__n/powl(10.0L,e),L'f',size-4, precision, type);
- if (result < 0)
- return false;
- f += exp_sign;
- size--;
- ie = (long)e;
- type = LEFT | PLUS;
- if ( ie < 0 )
- type |= SIGN;
-
- result = wnumber(f,ie, 10,2, 2,type );
- if (result < 0)
- return false;
- return true;
- }
-
- if ( exp_sign == L'f' )
- {
- buf = (wchar_t*)alloca(4096*sizeof(wchar_t));
- if (type & LEFT)
- type &= ~ZEROPAD;
-
- c = (type & ZEROPAD) ? L'0' : L' ';
- sign = 0;
- if (type & SIGN)
- {
- if (__n < 0)
- {
- sign = L'-';
- __n = fabs(__n);
- size--;
- }
- else if (type & PLUS)
- {
- sign = L'+';
- size--;
- }
- else if (type & SPACE)
- {
- sign = L' ';
- size--;
- }
- }
-
- frac = modfl(__n,&intr);
-
- // # flags forces a . and prevents trucation of trailing zero's
- if ( precision > 0 )
- {
- i = precision-1;
- while ( i >= 0 )
- {
- frac*=10.0L;
- frac = modfl((long double)frac, &p);
- buf[i] = (int)p + L'0';
- i--;
- }
- i = precision;
- size -= precision;
-
- ro = 0;
- if ( frac > 0.5 )
- ro = 1;
-
- if ( precision >= 1 || type & SPECIAL)
- {
- buf[i++] = L'.';
- size--;
- }
- }
-
- if ( intr == 0.0 )
- {
- buf[i++] = L'0';
- size--;
- }
- else
- {
- while ( intr > 0.0 )
- {
- p = intr;
- intr/=10.0L;
- modfl(intr, &intr);
-
- p -= 10.0L*intr;
-
- buf[i++] = (int)p + L'0';
- size--;
- }
- }
-
- j = 0;
- while ( j < i && ro == 1)
- {
- if ( buf[j] >= L'0' && buf[j] <= L'8' )
- {
- buf[j]++;
- ro = 0;
- }
- else if ( buf[j] == L'9' )
- {
- buf[j] = L'0';
- }
- j++;
- }
- if ( ro == 1 )
- buf[i++] = L'1';
-
- buf[i] = 0;
-
- if (!(type&(ZEROPAD+LEFT)))
- {
- while(size-->0)
- f += L' ';
- }
- if (sign)
- {
- f += sign;
- }
-
- if (!(type&(ZEROPAD+LEFT)))
- {
- while(size-->0)
- f += L' ';
- }
-
- if (!(type & LEFT))
- {
- while (size-- > 0)
- f += c;
- }
-
- tmp = buf;
- if ( type & ZEROTRUNC && ((type & SPECIAL) != SPECIAL) )
- {
- j = 0;
- while ( j < i && ( *tmp == L'0' || *tmp == L'.' ))
- {
- tmp++;
- i--;
- }
- }
- while (i-- > 0)
- {
- f += tmp[i];
- }
- while (size-- > 0)
- {
- f += L' ';
- }
- }
- return true;
-}
-
-static int
-do_string(std::string& f, const char* s, int len, int field_width, int precision, int
flags)
-{
- int i, done = 0;
- if (s == NULL)
- {
- s = "<NULL>";
- len = 6;
- }
- else
- {
- if (len == -1)
- {
- len = 0;
- while ((unsigned int)len < (unsigned int)precision && s[len])
- len++;
- }
- else
- {
- if ((unsigned int)len > (unsigned int)precision)
- len = precision;
- }
- }
- if (!(flags & LEFT))
- while (len < field_width--)
- {
- f += ' ';
- done++;
- }
- for (i = 0; i < len; ++i)
- {
- f += *s++;
- done++;
- }
- while (len < field_width--)
- {
- f += ' ';
- done++;
- }
- return done;
-}
-
-static int
-do_wstring(std::wstring& f, const wchar_t* s, int len, int field_width, int
precision, int flags)
-{
- int i, done = 0;
- if (s == NULL)
- {
- s = L"<NULL>";
- len = 6;
- }
- else
- {
- if (len == -1)
- {
- len = 0;
- while ((unsigned int)len < (unsigned int)precision && s[len])
- len++;
- }
- else
- {
- if ((unsigned int)len > (unsigned int)precision)
- len = precision;
- }
- }
- if (!(flags & LEFT))
- while (len < field_width--)
- {
- f += L' ';
- done++;
- }
- for (i = 0; i < len; ++i)
- {
- f += *s++;
- done++;
- }
- while (len < field_width--)
- {
- f += L' ';
- done++;
- }
- return done;
-}
-
-static int
-stringw(std::string& f, const wchar_t* sw, int len, int field_width, int precision,
int flags)
-{
- int i, done = 0;
- if (sw == NULL)
- {
- sw = L"<NULL>";
- len = 6;
- }
- else
- {
- if (len == -1)
- {
- len = 0;
- while ((unsigned int)len < (unsigned int)precision && sw[len])
- len++;
- }
- else
- {
- if ((unsigned int)len > (unsigned int)precision)
- len = precision;
- }
- }
- if (!(flags & LEFT))
- while (len < field_width--)
- {
- f += ' ';
- done++;
- }
- for (i = 0; i < len; ++i)
- {
-#define MY_MB_CUR_MAX 1
- char mb[MY_MB_CUR_MAX];
- int mbcount, j;
- mbcount = wctomb(mb, *sw++);
- if (mbcount <= 0)
- {
- break;
- }
- for (j = 0; j < mbcount; j++)
- {
- f += mb[j];
- done++;
- }
- }
- while (len < field_width--)
- {
- f += ' ';
- done++;
- }
- return done;
-}
-
-static int
-wstringa(std::wstring& f, const char* sa, int len, int field_width, int precision,
int flags)
-{
- int i, done = 0;
- if (sa == NULL)
- {
- sa = "<NULL>";
- len = 6;
- }
- else
- {
- if (len == -1)
- {
- len = 0;
- while ((unsigned int)len < (unsigned int)precision && sa[len])
- len++;
- }
- else
- {
- if ((unsigned int)len > (unsigned int)precision)
- len = precision;
- }
- }
- if (!(flags & LEFT))
- while (len < field_width--)
- {
- f += L' ';
- done++;
- }
- for (i = 0; i < len;)
- {
- wchar_t w;
- int mbcount;
- mbcount = mbtowc(&w, sa+i, len-i);
- if (mbcount <= 0)
- break;
- f += w;
- done++;
- i += mbcount;
- }
- while (len < field_width--)
- {
- f += L' ';
- done++;
- }
- return done;
-}
-
-#define _isnanl _isnan
-#define _finitel _finite
-
-std::string
-ssvprintf ( const char *fmt, va_list args )
-{
- ULONGLONG num;
- int base;
- long double _ldouble;
- double _double;
- const char *s;
- const wchar_t* sw;
- int result;
- std::string f;
-
- int flags; /* flags to number() */
-
- int field_width; /* width of output field */
- int precision; /* min. # of digits for integers; max
- number of chars for from string */
- int qualifier = 0; /* 'h', 'l', 'L' or 'I64' for integer
fields */
-
- for (; *fmt ; ++fmt)
- {
- if (*fmt != '%')
- {
- f += *fmt;
- continue;
- }
-
- /* process flags */
- flags = 0;
- repeat:
- ++fmt; /* this also skips first '%' */
- switch (*fmt) {
- case '-': flags |= LEFT; goto repeat;
- case '+': flags |= PLUS; goto repeat;
- case ' ': flags |= SPACE; goto repeat;
- case '#': flags |= SPECIAL; goto repeat;
- case '0': flags |= ZEROPAD; goto repeat;
- }
-
- /* get field width */
- field_width = -1;
- if (isdigit(*fmt))
- field_width = skip_atoi(&fmt);
- else if (*fmt == '*') {
- ++fmt;
- /* it's the next argument */
- field_width = va_arg(args, int);
- if (field_width < 0) {
- field_width = -field_width;
- flags |= LEFT;
- }
- }
-
- /* get the precision */
- precision = -1;
- if (*fmt == '.') {
- ++fmt;
- if (isdigit(*fmt))
- precision = skip_atoi(&fmt);
- else if (*fmt == '*') {
- ++fmt;
- /* it's the next argument */
- precision = va_arg(args, int);
- }
- if (precision < 0)
- precision = 0;
- }
-
- /* get the conversion qualifier */
- qualifier = 0;
- // %Z can be just stand alone or as size_t qualifier
- if ( *fmt == 'Z' ) {
- qualifier = *fmt;
- switch ( *(fmt+1)) {
- case 'o':
- case 'b':
- case 'X':
- case 'x':
- case 'd':
- case 'i':
- case 'u':
- ++fmt;
- break;
- default:
- break;
- }
- } else if (*fmt == 'h' || *fmt == 'l' || *fmt == 'L' || *fmt ==
'w') {
- qualifier = *fmt;
- ++fmt;
- } else if (*fmt == 'I' && *(fmt+1) == '6' && *(fmt+2)
== '4') {
- qualifier = *fmt;
- fmt += 3;
- }
-
- // go fine with ll instead of L
- if ( *fmt == 'l' ) {
- ++fmt;
- qualifier = 'L';
- }
-
- /* default base */
- base = 10;
-
- switch (*fmt) {
- case 'c':
- if (!(flags & LEFT))
- while (--field_width > 0)
- {
- f += ' ';
- }
- if (qualifier == 'l' || qualifier == 'w')
- {
- f += (char)(unsigned char)(wchar_t) va_arg(args,int);
- }
- else
- {
- f += (char)(unsigned char) va_arg(args,int);
- }
- while (--field_width > 0)
- {
- f += ' ';
- }
- continue;
-
- case 'C':
- if (!(flags & LEFT))
- while (--field_width > 0)
- {
- f += ' ';
- }
- if (qualifier == 'h')
- {
- f += (char)(unsigned char) va_arg(args,int);
- }
- else
- {
- f += (char)(unsigned char)(wchar_t) va_arg(args,int);
- }
- while (--field_width > 0)
- {
- f += ' ';
- }
- continue;
-
- case 's':
- if (qualifier == 'l' || qualifier == 'w') {
- /* print unicode string */
- sw = va_arg(args, wchar_t *);
- result = stringw(f, sw, -1, field_width, precision, flags);
- } else {
- /* print ascii string */
- s = va_arg(args, char *);
- result = do_string(f, s, -1, field_width, precision, flags);
- }
- if (result < 0)
- {
- assert(!"TODO FIXME handle error better");
- return f;
- }
- continue;
-
- case 'S':
- if (qualifier == 'h') {
- /* print ascii string */
- s = va_arg(args, char *);
- result = do_string(f, s, -1, field_width, precision, flags);
- } else {
- /* print unicode string */
- sw = va_arg(args, wchar_t *);
- result = stringw(f, sw, -1, field_width, precision, flags);
- }
- if (result < 0)
- {
- assert(!"TODO FIXME handle error better");
- return f;
- }
- continue;
-
- /*case 'Z':
- if (qualifier == 'w') {
- // print counted unicode string
- PUNICODE_STRING pus = va_arg(args, PUNICODE_STRING);
- if ((pus == NULL) || (pus->Buffer == NULL)) {
- sw = NULL;
- len = -1;
- } else {
- sw = pus->Buffer;
- len = pus->Length / sizeof(WCHAR);
- }
- result = stringw(f, sw, len, field_width, precision, flags);
- } else {
- // print counted ascii string
- PANSI_STRING pas = va_arg(args, PANSI_STRING);
- if ((pas == NULL) || (pas->Buffer == NULL)) {
- s = NULL;
- len = -1;
- } else {
- s = pas->Buffer;
- len = pas->Length;
- }
- result = string(f, s, -1, field_width, precision, flags);
- }
- if (result < 0)
- return -1;
- continue;*/
-
- case 'e':
- case 'E':
- case 'f':
- case 'g':
- case 'G':
- if (qualifier == 'l' || qualifier == 'L' ) {
- _ldouble = va_arg(args, long double);
-
- if ( _isnanl(_ldouble) )
- {
- f += "Nan";
- }
- else if ( !_finitel(_ldouble) )
- {
- if ( _ldouble < 0 )
- f += "-Inf";
- else
- f += "+Inf";
- } else {
- if ( precision == -1 )
- precision = 6;
- result = numberfl(f,_ldouble,*fmt,field_width,precision,flags);
- if (result < 0)
- {
- assert(!"TODO FIXME handle error better");
- return f;
- }
- }
- } else {
- _double = (double)va_arg(args, double);
-
- if ( _isnan(_double) )
- {
- f += "Nan";
- }
- else if ( !_finite(_double) )
- {
- if ( _double < 0 )
- f += "-Inf";
- else
- f += "+Inf";
- }
- else
- {
- if ( precision == -1 )
- precision = 6;
- result = numberf(f,_double,*fmt,field_width,precision,flags);
- if (result < 0)
- {
- assert(!"TODO FIXME handle error better");
- return f;
- }
- }
- }
- continue;
-
- case 'p':
- if (field_width == -1) {
- field_width = 2*sizeof(void *);
- flags |= ZEROPAD;
- }
- result = number(f,
- (size_t) va_arg(args, void *), 16,
- field_width, precision, flags);
- if (result < 0)
- {
- assert(!"TODO FIXME handle error better");
- return f;
- }
- continue;
-
- case 'n':
- if (qualifier == 'l') {
- long * ip = va_arg(args, long *);
- *ip = 0;
- } else {
- int * ip = va_arg(args, int *);
- *ip = 0;
- }
- continue;
-
- /* integer number formats - set up the flags and "break" */
- case 'o':
- base = 8;
- break;
-
- case 'b':
- base = 2;
- break;
-
- case 'X':
- flags |= LARGE;
- case 'x':
- base = 16;
- break;
-
- case 'd':
- case 'i':
- flags |= SIGN;
- case 'u':
- break;
-
- default:
- if (*fmt != '%')
- {
- f += '%';
- }
- if (*fmt)
- {
- f += *fmt;
- }
- else
- --fmt;
- continue;
- }
-
- if (qualifier == 'I')
- num = va_arg(args, ULONGLONG);
- else if (qualifier == 'l') {
- if (flags & SIGN)
- num = va_arg(args, long);
- else
- num = va_arg(args, unsigned long);
- }
- else if (qualifier == 'h') {
- if (flags & SIGN)
- num = va_arg(args, int);
- else
- num = va_arg(args, unsigned int);
- }
- else if (flags & SIGN)
- num = va_arg(args, int);
- else
- num = va_arg(args, unsigned int);
- result = number(f, num, base, field_width, precision, flags);
- if (result < 0)
- {
- assert(!"TODO FIXME handle error better");
- return f;
- }
- }
- //putc('\0',f);
- return f;
-}
-
-std::wstring
-sswvprintf ( const wchar_t* fmt, va_list args )
-{
- ULONGLONG num;
- int base;
- long double _ldouble;
- double _double;
- const wchar_t* s;
- const char* sa;
- int result;
- std::wstring f;
-
- int flags; /* flags to number() */
-
- int field_width; /* width of output field */
- int precision; /* min. # of digits for integers; max
- number of chars for from string */
- int qualifier = 0; /* 'h', 'l', 'L' or 'I64' for integer
fields */
-
- for (; *fmt ; ++fmt)
- {
- if (*fmt != L'%')
- {
- f += *fmt;
- continue;
- }
-
- /* process flags */
- flags = 0;
- repeat:
- ++fmt; /* this also skips first '%' */
- switch (*fmt) {
- case L'-': flags |= LEFT; goto repeat;
- case L'+': flags |= PLUS; goto repeat;
- case L' ': flags |= SPACE; goto repeat;
- case L'#': flags |= SPECIAL; goto repeat;
- case L'0': flags |= ZEROPAD; goto repeat;
- }
-
- /* get field width */
- field_width = -1;
- if (isdigit(*fmt))
- field_width = skip_wtoi(&fmt);
- else if (*fmt == L'*') {
- ++fmt;
- /* it's the next argument */
- field_width = va_arg(args, int);
- if (field_width < 0) {
- field_width = -field_width;
- flags |= LEFT;
- }
- }
-
- /* get the precision */
- precision = -1;
- if (*fmt == L'.') {
- ++fmt;
- if (iswdigit(*fmt))
- precision = skip_wtoi(&fmt);
- else if (*fmt == L'*') {
- ++fmt;
- /* it's the next argument */
- precision = va_arg(args, int);
- }
- if (precision < 0)
- precision = 0;
- }
-
- /* get the conversion qualifier */
- qualifier = 0;
- // %Z can be just stand alone or as size_t qualifier
- if ( *fmt == L'Z' ) {
- qualifier = *fmt;
- switch ( *(fmt+1)) {
- case L'o':
- case L'b':
- case L'X':
- case L'x':
- case L'd':
- case L'i':
- case L'u':
- ++fmt;
- break;
- default:
- break;
- }
- } else if (*fmt == L'h' || *fmt == L'l' || *fmt == L'L' || *fmt
== L'w') {
- qualifier = *fmt;
- ++fmt;
- } else if (*fmt == L'I' && *(fmt+1) == L'6' && *(fmt+2)
== L'4') {
- qualifier = *fmt;
- fmt += 3;
- }
-
- // go fine with ll instead of L
- if ( *fmt == L'l' ) {
- ++fmt;
- qualifier = L'L';
- }
-
- /* default base */
- base = 10;
-
- switch (*fmt) {
- case L'c':
- if (!(flags & LEFT))
- while (--field_width > 0)
- {
- f += L' ';
- }
- if ( qualifier == L'h' )
- {
- f += (wchar_t)(char)(unsigned char) va_arg(args,int);
- }
- else
- {
- f += (wchar_t) va_arg(args,int);
- }
- while (--field_width > 0)
- {
- f += ' ';
- }
- continue;
-
- case 'C':
- if (!(flags & LEFT))
- while (--field_width > 0)
- {
- f += L' ';
- }
- if (qualifier == L'l' || qualifier == L'w')
- {
- f += (wchar_t) va_arg(args,int);
- }
- else
- {
- f += (wchar_t)(char)(unsigned char) va_arg(args,int);
- }
- while (--field_width > 0)
- {
- f += L' ';
- }
- continue;
-
- case 's':
- if (qualifier == L'h') {
- /* print ascii string */
- sa = va_arg(args, char *);
- result = wstringa(f, sa, -1, field_width, precision, flags);
- } else {
- /* print unicode string */
- s = va_arg(args, wchar_t *);
- result = do_wstring(f, s, -1, field_width, precision, flags);
- }
- if (result < 0)
- {
- assert(!"TODO FIXME handle error better");
- return f;
- }
- continue;
-
- case 'S':
- if (qualifier == L'l' || qualifier == L'w') {
- /* print unicode string */
- s = va_arg(args, wchar_t *);
- result = do_wstring(f, s, -1, field_width, precision, flags);
- } else {
- /* print ascii string */
- sa = va_arg(args, char *);
- result = wstringa(f, sa, -1, field_width, precision, flags);
- }
- if (result < 0)
- {
- assert(!"TODO FIXME handle error better");
- return f;
- }
- continue;
-
- case L'e':
- case L'E':
- case L'f':
- case L'g':
- case L'G':
- if (qualifier == L'l' || qualifier == L'L' )
- {
- _ldouble = va_arg(args, long double);
-
- if ( _isnanl(_ldouble) )
- {
- f += L"Nan";
- }
- else if ( !_finitel(_ldouble) )
- {
- if ( _ldouble < 0 )
- f += L"-Inf";
- else
- f += L"+Inf";
- } else {
- if ( precision == -1 )
- precision = 6;
- result = wnumberfl(f,_ldouble,*fmt,field_width,precision,flags);
- if (result < 0)
- {
- assert(!"TODO FIXME handle error better");
- return f;
- }
- }
- } else {
- _double = (double)va_arg(args, double);
-
- if ( _isnan(_double) )
- {
- f += L"Nan";
- }
- else if ( !_finite(_double) )
- {
- if ( _double < 0 )
- f += L"-Inf";
- else
- f += L"+Inf";
- }
- else
- {
- if ( precision == -1 )
- precision = 6;
- result = wnumberf(f,_double,*fmt,field_width,precision,flags);
- if (result < 0)
- {
- assert(!"TODO FIXME handle error better");
- return f;
- }
- }
- }
- continue;
-
- case L'p':
- if (field_width == -1) {
- field_width = 2*sizeof(void *);
- flags |= ZEROPAD;
- }
- result = wnumber(f,
- (size_t) va_arg(args, void *), 16,
- field_width, precision, flags);
- if (result < 0)
- {
- assert(!"TODO FIXME handle error better");
- return f;
- }
- continue;
-
- case L'n':
- if (qualifier == L'l') {
- long * ip = va_arg(args, long *);
- *ip = 0;
- } else {
- int * ip = va_arg(args, int *);
- *ip = 0;
- }
- continue;
-
- /* integer number formats - set up the flags and "break" */
- case L'o':
- base = 8;
- break;
-
- case L'b':
- base = 2;
- break;
-
- case L'X':
- flags |= LARGE;
- case L'x':
- base = 16;
- break;
-
- case L'd':
- case L'i':
- flags |= SIGN;
- case L'u':
- break;
-
- default:
- if (*fmt != L'%')
- {
- f += L'%';
- }
- if (*fmt)
- {
- f += *fmt;
- }
- else
- --fmt;
- continue;
- }
-
- if (qualifier == L'I')
- num = va_arg(args, ULONGLONG);
- else if (qualifier == L'l') {
- if (flags & SIGN)
- num = va_arg(args, long);
- else
- num = va_arg(args, unsigned long);
- }
- else if (qualifier == L'h') {
- if (flags & SIGN)
- num = va_arg(args, int);
- else
- num = va_arg(args, unsigned int);
- }
- else if (flags & SIGN)
- num = va_arg(args, int);
- else
- num = va_arg(args, unsigned int);
- result = wnumber(f, num, base, field_width, precision, flags);
- if (result < 0)
- {
- assert(!"TODO FIXME handle error better");
- return f;
- }
- }
- //putc('\0',f);
- return f;
-}
Removed: branches/cmake-bringup/tools/ssprintf.h
URL:
http://svn.reactos.org/svn/reactos/branches/cmake-bringup/tools/ssprintf.h?…
==============================================================================
--- branches/cmake-bringup/tools/ssprintf.h [iso-8859-1] (original)
+++ branches/cmake-bringup/tools/ssprintf.h (removed)
@@ -1,40 +1,0 @@
-/*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#pragma once
-
-#include <string>
-#include <stdarg.h>
-
-#ifdef __CYGWIN__
-namespace std {
- typedef basic_string<wchar_t> wstring;
-}
-#endif
-
-std::string ssprintf ( const char* fmt, ... );
-std::string ssvprintf ( const char* fmt, va_list args );
-
-std::wstring sswprintf ( const wchar_t* fmt, ... );
-std::wstring sswvprintf ( const wchar_t* fmt, va_list args );
-
-#ifdef _UNICODE
-#define sstprintf sswprintf
-#define sstvprintf sswvprintf
-#else
-#define sstprintf ssprintf
-#define sstvprintf ssvprintf
-#endif
Modified: branches/cmake-bringup/tools/xml.cpp
URL:
http://svn.reactos.org/svn/reactos/branches/cmake-bringup/tools/xml.cpp?rev…
==============================================================================
--- branches/cmake-bringup/tools/xml.cpp [iso-8859-1] (original)
+++ branches/cmake-bringup/tools/xml.cpp [iso-8859-1] Sun Oct 10 14:31:04 2010
@@ -18,6 +18,7 @@
#ifdef _MSC_VER
#pragma warning ( disable : 4786 )
+#pragma warning ( disable : 4996 )
#endif//_MSC_VER
#ifdef WIN32
@@ -41,7 +42,6 @@
#include <stdlib.h>
#include <stdio.h>
#include "xml.h"
-#include "ssprintf.h"
#ifndef MAX_PATH
#define MAX_PATH _MAX_PATH
@@ -100,7 +100,9 @@
void XMLException::SetExceptionV ( const std::string& location, const char* format,
va_list args )
{
- _e = location + ": " + ssvprintf(format,args);
+ char buffer[1024];
+ _vsnprintf(buffer, sizeof(buffer)-1, format, args);
+ _e = location + ": " + buffer;
}
void XMLException::SetException ( const std::string& location, const char* format,
... )
@@ -424,13 +426,14 @@
XMLFile::Location() const
{
int line = 1;
+ char line_str[10];
const char* p = strchr ( _buf.c_str(), '\n' );
while ( p && p < _p )
{
++line;
p = strchr ( p+1, '\n' );
}
- return ssprintf ( "%s(%i)",_filename.c_str(), line );
+ return _filename + "(" + itoa(line, line_str, 10) + ")";
}
XMLAttribute::XMLAttribute()