#include <string.h>
#include "version.h"
#include "xml.h"
-#include "exception.h"
#define FALSE 0
#define TRUE 1
try
{
- Path path;
XMLElement *head;
try
{
- head = XMLLoadFile(".svn/entries", path);
+ head = XMLLoadFile(".svn/entries");
}
- catch(FileNotFoundException)
+ catch(XMLFileNotFoundException)
{
- head = XMLLoadFile("_svn/entries", path);
+ head = XMLLoadFile("_svn/entries");
}
XMLElement *entries = head->subElements[0];
for (size_t i = 0; i < entries->subElements.size(); i++)
- {
+ {
XMLElement *entry = entries->subElements[i];
if ("entry" == entry->name)
{
BUILDNO_SOURCES = $(addprefix $(BUILDNO_BASE_), \
buildno.cpp \
- exception.cpp \
- ssprintf.cpp \
- xml.cpp \
)
BUILDNO_OBJECTS = \
- $(addprefix $(INTERMEDIATE_), $(BUILDNO_SOURCES:.cpp=.o))
+ $(addprefix $(INTERMEDIATE_), $(BUILDNO_SOURCES:.cpp=.o))
-BUILDNO_HOST_CXXFLAGS = -Iinclude/reactos $(TOOLS_CPPFLAGS)
+BUILDNO_HOST_CXXFLAGS = -I$(TOOLS_BASE) -Iinclude/reactos $(TOOLS_CPPFLAGS)
BUILDNO_HOST_LFLAGS = $(TOOLS_LFLAGS)
-$(BUILDNO_TARGET): $(BUILDNO_OBJECTS) | $(BUILDNO_OUT)
+.PHONY: buildno
+buildno: $(BUILDNO_TARGET)
+
+$(BUILDNO_TARGET): $(BUILDNO_OBJECTS) $(XML_SSPRINTF_OBJECTS) | $(BUILDNO_OUT)
$(ECHO_LD)
- ${host_gpp} $(BUILDNO_OBJECTS) $(BUILDNO_HOST_LFLAGS) -o $@
+ ${host_gpp} $^ $(BUILDNO_HOST_LFLAGS) -o $@
$(BUILDNO_INT_)buildno.o: $(BUILDNO_BASE_)buildno.cpp | $(BUILDNO_INT)
$(ECHO_CC)
${host_gpp} $(BUILDNO_HOST_CXXFLAGS) -c $< -o $@
-$(BUILDNO_INT_)exception.o: $(BUILDNO_BASE_)exception.cpp | $(BUILDNO_INT)
- $(ECHO_CC)
- ${host_gpp} $(BUILDNO_HOST_CXXFLAGS) -c $< -o $@
-
-$(BUILDNO_INT_)ssprintf.o: $(BUILDNO_BASE_)ssprintf.cpp | $(BUILDNO_INT)
- $(ECHO_CC)
- ${host_gpp} $(BUILDNO_HOST_CXXFLAGS) -c $< -o $@
-
-$(BUILDNO_INT_)xml.o: $(BUILDNO_BASE_)xml.cpp | $(BUILDNO_INT)
- $(ECHO_CC)
- ${host_gpp} $(BUILDNO_HOST_CXXFLAGS) -c $< -o $@
-
.PHONY: buildno_clean
buildno_clean:
-@$(rm) $(BUILDNO_TARGET) $(BUILDNO_OBJECTS) 2>$(NUL)
+++ /dev/null
-#include "pch.h"
-
-#ifdef RBUILD
-#include "rbuild.h"
-#else
-#include "exception.h"
-#include "ssprintf.h"
-#endif
-
-using std::string;
-
-Exception::Exception ()
-{
-}
-
-Exception::Exception ( const string& message )
-{
- Message = message;
-}
-
-Exception::Exception ( const char* format,
- ...)
-{
- va_list args;
- va_start ( args,
- format);
- Message = ssvprintf ( format,
- args);
- va_end ( args );
-}
-
-void Exception::SetMessage ( const char* message,
- va_list args)
-{
- Message = ssvprintf ( message,
- args);
-}
-
-
-OutOfMemoryException::OutOfMemoryException ()
- : Exception ( "Out of memory" )
-{
-}
-
-
-InvalidOperationException::InvalidOperationException ( const char* filename,
- const int linenumber )
-{
- Message = ssprintf ( "%s:%d",
- filename,
- linenumber );
-}
-
-InvalidOperationException::InvalidOperationException ( const char* filename,
- const int linenumber,
- const char* message,
- ... )
-{
- string errorMessage;
- va_list args;
- va_start ( args,
- message );
- errorMessage = ssvprintf ( message,
- args );
- va_end ( args );
- Message = ssprintf ( "%s:%d %s",
- filename,
- linenumber,
- errorMessage.c_str () );
-}
-
-
-FileNotFoundException::FileNotFoundException ( const string& filename )
- : Exception ( "File '%s' not found.",
- filename.c_str() )
-{
- Filename = filename;
-}
-
-
-AccessDeniedException::AccessDeniedException ( const string& filename)
- : Exception ( "Access denied to file '%s'.",
- filename.c_str() )
-{
- Filename = filename;
-}
-
-
-InvalidBuildFileException::InvalidBuildFileException ( const string& location,
- const char* message,
- ...)
-{
- va_list args;
- va_start ( args,
- message );
- SetLocationMessage ( location, message, args );
- va_end ( args );
-}
-
-InvalidBuildFileException::InvalidBuildFileException ()
-{
-}
-
-void
-InvalidBuildFileException::SetLocationMessage ( const std::string& location,
- const char* message,
- va_list args )
-{
- Message = location + ": " + ssvprintf ( message, args );
-}
-
-XMLSyntaxErrorException::XMLSyntaxErrorException ( const string& location,
- const char* message,
- ... )
-{
- va_list args;
- va_start ( args,
- message );
- SetLocationMessage ( location, message, args );
- va_end ( args );
-}
-
-
-RequiredAttributeNotFoundException::RequiredAttributeNotFoundException (
- const string& location,
- const string& attributeName,
- const string& elementName )
- : InvalidBuildFileException ( location,
- "Required attribute '%s' not found on '%s'.",
- attributeName.c_str (),
- elementName.c_str ())
-{
-}
-
-InvalidAttributeValueException::InvalidAttributeValueException (
- const string& location,
- const string& name,
- const string& value )
- : InvalidBuildFileException ( location,
- "Attribute '%s' has an invalid value '%s'.",
- name.c_str (),
- value.c_str () )
-{
-
-}
-
-BackendNameConflictException::BackendNameConflictException ( const string& name )
- : Exception ( "Backend name conflict: '%s'",
- name.c_str() )
-{
-}
-
-
-UnknownBackendException::UnknownBackendException ( const string& name )
- : Exception ( "Unknown Backend requested: '%s'",
- name.c_str() )
-{
-}
-
-
-UnknownModuleTypeException::UnknownModuleTypeException ( const string& location,
- int moduletype )
- : InvalidBuildFileException ( location,
- "module type requested: %i",
- moduletype )
-{
-}
-
-
-InvocationFailedException::InvocationFailedException ( const std::string& command,
- int exitcode )
- : Exception ( "Failed to execute '%s' (exit code %d)",
- command.c_str (),
- exitcode )
-{
- Command = command;
- ExitCode = exitcode;
-}
+++ /dev/null
-#ifndef __EXCEPTION_H
-#define __EXCEPTION_H
-
-#include "pch.h"
-
-class Exception
-{
-public:
- Exception ( const std::string& message );
- Exception ( const char* format,
- ...);
- std::string Message;
-protected:
- Exception ();
- void SetMessage ( const char* message,
- va_list args);
-};
-
-
-class InvalidOperationException : public Exception
-{
-public:
- InvalidOperationException ( const char* filename,
- const int linenumber);
- InvalidOperationException ( const char* filename,
- const int linenumber,
- const char* message,
- ... );
-};
-
-
-class OutOfMemoryException : public Exception
-{
-public:
- OutOfMemoryException ();
-};
-
-
-class FileNotFoundException : public Exception
-{
-public:
- FileNotFoundException ( const std::string& filename );
- std::string Filename;
-};
-
-
-class AccessDeniedException : public Exception
-{
-public:
- AccessDeniedException ( const std::string& filename );
- std::string Filename;
-};
-
-class InvalidBuildFileException : public Exception
-{
-public:
- InvalidBuildFileException ( const std::string& location,
- const char* message,
- ...);
- void SetLocationMessage ( const std::string& location,
- const char* message,
- va_list args );
-protected:
- InvalidBuildFileException ();
-};
-
-
-class XMLSyntaxErrorException : public InvalidBuildFileException
-{
-public:
- XMLSyntaxErrorException ( const std::string& location,
- const char* message,
- ... );
-};
-
-
-class RequiredAttributeNotFoundException : public InvalidBuildFileException
-{
-public:
- RequiredAttributeNotFoundException ( const std::string& location,
- const std::string& attributeName,
- const std::string& elementName );
-};
-
-
-class InvalidAttributeValueException : public InvalidBuildFileException
-{
-public:
- InvalidAttributeValueException ( const std::string& location,
- const std::string& name,
- const std::string& value );
-};
-
-
-class BackendNameConflictException : public Exception
-{
-public:
- BackendNameConflictException ( const std::string& name );
-};
-
-
-class UnknownBackendException : public Exception
-{
-public:
- UnknownBackendException ( const std::string& name );
-};
-
-class UnknownModuleTypeException : public InvalidBuildFileException
-{
-public:
- UnknownModuleTypeException ( const std::string& location,
- int moduletype );
-};
-
-
-class InvocationFailedException : public Exception
-{
-public:
- InvocationFailedException ( const std::string& command,
- int exitcode );
- std::string Command;
- int ExitCode;
-};
-
-#endif /* __EXCEPTION_H */
+++ /dev/null
-// ssprintf.cpp
-
-#include "pch.h"
-
-#ifdef __FreeBSD__
-# include <stdlib.h>
-#else
-# include <malloc.h>
-#endif // __FreeBSD__
-#include <math.h>
-#include <float.h>
-#include <assert.h>
-#include "ssprintf.h"
-
-#ifdef __FreeBSD__
-# 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 0;
- 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 = 0;
- 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 x;
- char *buf, *tmp;
- int i = 0;
- int j = 0;
- //int k = 0;
-
- double frac, intr;
- double p;
- char sign;
- char c;
- char ro = 0;
- 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
- }
-
- 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,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 ) {
- //frac = modfl(__n,&intr);
- 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;
-
- size -= precision;
- if (!(type&(ZEROPAD+LEFT)))
- {
- while(size-->0)
- f += ' ';
- }
- if (sign)
- {
- f += sign;
- }
-
- if (!(type&(ZEROPAD+LEFT)))
- while(size-->0)
- {
- f += ' ';
- }
- if (type & SPECIAL) {
- }
-
- 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--;
- }
- }
-// else
-// while (i < precision--)
-// putc('0', f);
- 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;
-
- double frac, intr;
- double p;
- wchar_t *buf, *tmp, sign, c, ro = 0;
- 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
- }
-
- 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,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 ) {
- //frac = modfl(__n,&intr);
- 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;
-
- size -= precision;
- if (!(type&(ZEROPAD+LEFT)))
- {
- while(size-->0)
- f += L' ';
- }
- if (sign)
- {
- f += sign;
- }
-
- if (!(type&(ZEROPAD+LEFT)))
- while(size-->0)
- {
- f += L' ';
- }
- if (type & SPECIAL) {
- }
-
- 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 x;
- char *buf, *tmp;
- int i = 0;
- int j = 0;
- //int k = 0;
-
- long double frac, intr;
- long double p;
- char sign;
- char c;
- char ro = 0;
-
- 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
- }
-
- 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 )
- {
- //frac = modfl(__n,&intr);
-
- 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;
-
- size -= precision;
- if (!(type&(ZEROPAD+LEFT)))
- {
- while(size-->0)
- f += ' ';
- }
- if (sign)
- {
- f += sign;
- }
-
- if (!(type&(ZEROPAD+LEFT)))
- {
- while(size-->0)
- f += ' ';
- }
- if (type & SPECIAL) {
- }
-
- 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;
-
- wchar_t *buf, *tmp, sign, c, ro = 0;
- int i = 0;
- int j = 0;
-
- long double frac, intr;
- long double p;
-
- 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
- }
-
-
- 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 )
- {
- //frac = modfl(__n,&intr);
-
- 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;
-
- size -= precision;
- if (!(type&(ZEROPAD+LEFT)))
- {
- while(size-->0)
- f += L' ';
- }
- if (sign)
- {
- f += sign;
- }
-
- if (!(type&(ZEROPAD+LEFT)))
- {
- while(size-->0)
- f += L' ';
- }
- if (type & SPECIAL) {
- }
-
- 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, 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,
- (unsigned long) 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,
- (unsigned long) 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;
-}
+++ /dev/null
-// ssprintf.h
-
-#ifndef SSPRINTF_H
-#define SSPRINTF_H
-
-#include <string>
-#include <stdarg.h>
-
-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
-
-#endif//SSPRINTF_H
+++ /dev/null
-// xml.cpp
-
-#include "pch.h"
-
-#ifdef _MSC_VER
-#define MAX_PATH _MAX_PATH
-#endif
-
-#ifdef WIN32
-# include <direct.h>
-# include <io.h>
-#else
-# include <sys/stat.h>
-# define MAX_PATH PATH_MAX
-#endif
-#include <assert.h>
-
-#include "xml.h"
-#include "exception.h"
-#include "ssprintf.h"
-
-using std::string;
-using std::vector;
-
-#ifdef WIN32
-#define getcwd _getcwd
-#endif//WIN32
-
-static const char* WS = " \t\r\n";
-static const char* WSEQ = " =\t\r\n";
-
-string working_directory;
-
-class XMLInclude
-{
-public:
- XMLElement *e;
- Path path;
-
- XMLInclude ( XMLElement* e_, const Path& path_ )
- : e(e_), path(path_)
- {
- }
-};
-
-class XMLIncludes : public vector<XMLInclude*>
-{
-public:
- ~XMLIncludes()
- {
- for ( size_t i = 0; i < this->size(); i++ )
- delete (*this)[i];
- }
-};
-
-void
-InitWorkingDirectory()
-{
- // store the current directory for path calculations
- working_directory.resize ( _MAX_PATH );
- working_directory[0] = 0;
- getcwd ( &working_directory[0], working_directory.size() );
- working_directory.resize ( strlen ( working_directory.c_str() ) );
-}
-
-#ifdef _MSC_VER
-unsigned __int64
-#else
-unsigned long long
-#endif
-filelen ( FILE* f )
-{
-#ifdef WIN32
- return _filelengthi64 ( _fileno(f) );
-#else
-# ifdef __FreeBSD__
- struct stat file_stat;
- if ( fstat(fileno(f), &file_stat) != 0 )
-# else
- struct stat64 file_stat;
- if ( fstat64(fileno(f), &file_stat) != 0 )
-# endif // __FreeBSD__
- return 0;
- return file_stat.st_size;
-
-#endif // WIN32
-}
-
-Path::Path()
-{
- if ( !working_directory.size() )
- InitWorkingDirectory();
- string s ( working_directory );
- const char* p = strtok ( &s[0], "/\\" );
- while ( p )
- {
- if ( *p )
- path.push_back ( p );
- p = strtok ( NULL, "/\\" );
- }
-}
-
-Path::Path ( const Path& cwd, const string& file )
-{
- string s ( cwd.Fixup ( file, false ) );
- const char* p = strtok ( &s[0], "/\\" );
- while ( p )
- {
- if ( *p )
- path.push_back ( p );
- p = strtok ( NULL, "/\\" );
- }
-}
-
-string
-Path::Fixup ( const string& file, bool include_filename ) const
-{
- if ( strchr ( "/\\", file[0] )
-#ifdef WIN32
- // this squirreliness is b/c win32 has drive letters and *nix doesn't...
- || file[1] == ':'
-#endif//WIN32
- )
- {
- return file;
- }
- vector<string> pathtmp ( path );
- string tmp ( file );
- const char* prev = strtok ( &tmp[0], "/\\" );
- const char* p = strtok ( NULL, "/\\" );
- while ( p )
- {
- if ( !strcmp ( prev, "." ) )
- ; // do nothing
- else if ( !strcmp ( prev, ".." ) )
- {
- // this squirreliness is b/c win32 has drive letters and *nix doesn't...
-#ifdef WIN32
- if ( pathtmp.size() > 1 )
-#else
- if ( pathtmp.size() )
-#endif
- pathtmp.resize ( pathtmp.size() - 1 );
- }
- else
- pathtmp.push_back ( prev );
- prev = p;
- p = strtok ( NULL, "/\\" );
- }
- if ( include_filename )
- pathtmp.push_back ( prev );
-
- // reuse tmp variable to return recombined path
- tmp.resize(0);
- for ( size_t i = 0; i < pathtmp.size(); i++ )
- {
- // this squirreliness is b/c win32 has drive letters and *nix doesn't...
-#ifdef WIN32
- if ( i ) tmp += "/";
-#else
- tmp += "/";
-#endif
- tmp += pathtmp[i];
- }
- return tmp;
-}
-
-/*static*/ string
-Path::RelativeFromWorkingDirectory ( const string& path )
-{
- vector<string> vwork, vpath, vout;
- Path::Split ( vwork, working_directory, true );
- Path::Split ( vpath, path, true );
-#ifdef WIN32
- // this squirreliness is b/c win32 has drive letters and *nix doesn't...
- // not possible to do relative across different drive letters
- if ( vwork[0] != vpath[0] )
- return path;
-#endif
- size_t i = 0;
- while ( i < vwork.size() && i < vpath.size() && vwork[i] == vpath[i] )
- ++i;
- if ( i < vwork.size() )
- {
- // path goes above our working directory, we will need some ..'s
- for ( size_t j = 0; j < i; j++ )
- vout.push_back ( ".." );
- }
- while ( i < vpath.size() )
- vout.push_back ( vpath[i++] );
-
- // now merge vout into a string again
- string out = ".";
- for ( i = 0; i < vout.size(); i++ )
- {
- out += "/" + vout[i];
- }
- return out;
-}
-
-/*static*/ void
-Path::Split ( vector<string>& out,
- const string& path,
- bool include_last )
-{
- string s ( path );
- const char* prev = strtok ( &s[0], "/\\" );
- const char* p = strtok ( NULL, "/\\" );
- out.resize ( 0 );
- while ( p )
- {
- out.push_back ( prev );
- prev = p;
- p = strtok ( NULL, "/\\" );
- }
- if ( include_last )
- out.push_back ( prev );
-}
-
-XMLFile::XMLFile()
-{
-}
-
-void
-XMLFile::close()
-{
- _buf.resize(0);
- _p = _end = NULL;
-}
-
-bool
-XMLFile::open(const string& filename_)
-{
- close();
- FILE* f = fopen ( filename_.c_str(), "rb" );
- if ( !f )
- return false;
- unsigned long len = (unsigned long)filelen(f);
- _buf.resize ( len );
- fread ( &_buf[0], 1, len, f );
- fclose ( f );
- _p = _buf.c_str();
- _end = _p + len;
- _filename = filename_;
- next_token();
- return true;
-}
-
-// next_token() moves the pointer to next token, which may be
-// an xml element or a text element, basically it's a glorified
-// skipspace, normally the user of this class won't need to call
-// this function
-void
-XMLFile::next_token()
-{
- _p += strspn ( _p, WS );
-}
-
-bool
-XMLFile::next_is_text()
-{
- return *_p != '<';
-}
-
-bool
-XMLFile::more_tokens()
-{
- return _p != _end;
-}
-
-// get_token() is used to return a token, and move the pointer
-// past the token
-bool
-XMLFile::get_token(string& token)
-{
- const char* tokend;
- if ( !strncmp ( _p, "<!--", 4 ) )
- {
- tokend = strstr ( _p, "-->" );
- if ( !tokend )
- tokend = _end;
- else
- tokend += 3;
- }
- else if ( !strncmp ( _p, "<?", 2 ) )
- {
- tokend = strstr ( _p, "?>" );
- if ( !tokend )
- tokend = _end;
- else
- tokend += 2;
- }
- else if ( *_p == '<' )
- {
- tokend = strchr ( _p, '>' );
- if ( !tokend )
- tokend = _end;
- else
- ++tokend;
- }
- else
- {
- tokend = strchr ( _p, '<' );
- if ( !tokend )
- tokend = _end;
- while ( tokend > _p && isspace(tokend[-1]) )
- --tokend;
- }
- if ( tokend == _p )
- return false;
- token = string ( _p, tokend-_p );
- _p = tokend;
- next_token();
- return true;
-}
-
-string
-XMLFile::Location() const
-{
- int line = 1;
- 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 );
-}
-
-XMLAttribute::XMLAttribute()
-{
-}
-
-XMLAttribute::XMLAttribute(const string& name_,
- const string& value_)
- : name(name_), value(value_)
-{
-}
-
-XMLAttribute::XMLAttribute ( const XMLAttribute& src )
- : name(src.name), value(src.value)
-{
-
-}
-
-XMLAttribute& XMLAttribute::operator = ( const XMLAttribute& src )
-{
- name = src.name;
- value = src.value;
- return *this;
-}
-
-XMLElement::XMLElement ( const string& location_ )
- : location(location_),
- parentElement(NULL)
-{
-}
-
-XMLElement::~XMLElement()
-{
- size_t i;
- for ( i = 0; i < attributes.size(); i++ )
- delete attributes[i];
- for ( i = 0; i < subElements.size(); i++ )
- delete subElements[i];
-}
-
-void
-XMLElement::AddSubElement ( XMLElement* e )
-{
- subElements.push_back ( e );
- e->parentElement = this;
-}
-
-// Parse()
-// This function takes a single xml tag ( i.e. beginning with '<' and
-// ending with '>', and parses out it's tag name and constituent
-// attributes.
-// Return Value: returns true if you need to look for a </tag> for
-// the one it just parsed...
-bool
-XMLElement::Parse(const string& token,
- bool& end_tag)
-{
- const char* p = token.c_str();
- assert ( *p == '<' );
- ++p;
- p += strspn ( p, WS );
-
- // check if this is a comment
- if ( !strncmp ( p, "!--", 3 ) )
- {
- name = "!--";
- end_tag = false;
- return false; // never look for end tag to a comment
- }
-
- end_tag = ( *p == '/' );
- if ( end_tag )
- {
- ++p;
- p += strspn ( p, WS );
- }
- const char* end = strpbrk ( p, WS );
- if ( !end )
- {
- end = strpbrk ( p, "/>" );
- assert ( end );
- }
- name = string ( p, end-p );
- p = end;
- p += strspn ( p, WS );
- while ( *p != '>' && *p != '/' )
- {
- end = strpbrk ( p, WSEQ );
- if ( !end )
- {
- end = strpbrk ( p, "/>" );
- assert ( end );
- }
- string attribute ( p, end-p ), value;
- p = end;
- p += strspn ( p, WS );
- if ( *p == '=' )
- {
- ++p;
- p += strspn ( p, WS );
- char quote = 0;
- if ( strchr ( "\"'", *p ) )
- {
- quote = *p++;
- end = strchr ( p, quote );
- }
- else
- {
- end = strpbrk ( p, WS );
- }
- if ( !end )
- {
- end = strchr ( p, '>' );
- assert(end);
- if ( end[-1] == '/' )
- end--;
- }
- value = string ( p, end-p );
- p = end;
- if ( quote && *p == quote )
- p++;
- p += strspn ( p, WS );
- }
- else if ( name[0] != '!' )
- {
- throw XMLSyntaxErrorException ( location,
- "attributes must have values" );
- }
- attributes.push_back ( new XMLAttribute ( attribute, value ) );
- }
- return !( *p == '/' ) && !end_tag;
-}
-
-XMLAttribute*
-XMLElement::GetAttribute ( const string& attribute,
- bool required )
-{
- // this would be faster with a tree-based container, but our attribute
- // lists are likely to stay so short as to not be an issue.
- for ( size_t i = 0; i < attributes.size(); i++ )
- {
- if ( attribute == attributes[i]->name )
- return attributes[i];
- }
- if ( required )
- {
- throw RequiredAttributeNotFoundException ( location,
- attribute,
- name );
- }
- return NULL;
-}
-
-const XMLAttribute*
-XMLElement::GetAttribute ( const string& attribute,
- bool required ) const
-{
- // this would be faster with a tree-based container, but our attribute
- // lists are likely to stay so short as to not be an issue.
- for ( size_t i = 0; i < attributes.size(); i++ )
- {
- if ( attribute == attributes[i]->name )
- return attributes[i];
- }
- if ( required )
- {
- throw RequiredAttributeNotFoundException ( location,
- attribute,
- name );
- }
- return NULL;
-}
-
-// XMLParse()
-// This function reads a "token" from the file loaded in XMLFile
-// if it finds a tag that is non-singular, it parses sub-elements and/or
-// inner text into the XMLElement that it is building to return.
-// Return Value: an XMLElement allocated via the new operator that contains
-// it's parsed data. Keep calling this function until it returns NULL
-// (no more data)
-XMLElement*
-XMLParse(XMLFile& f,
- XMLIncludes* includes,
- const Path& path,
- bool* pend_tag = NULL )
-{
- string token;
- if ( !f.get_token(token) )
- return NULL;
- bool end_tag, is_include = false;
-
- while ( token[0] != '<'
- || !strncmp ( token.c_str(), "<!--", 4 )
- || !strncmp ( token.c_str(), "<?", 2 ) )
- {
- if ( token[0] != '<' )
- throw XMLSyntaxErrorException ( f.Location(),
- "expecting xml tag, not '%s'",
- token.c_str() );
- if ( !f.get_token(token) )
- return NULL;
- }
-
- XMLElement* e = new XMLElement ( f.Location() );
- bool bNeedEnd = e->Parse ( token, end_tag );
-
- if ( e->name == "xi:include" && includes )
- {
- includes->push_back ( new XMLInclude ( e, path ) );
- is_include = true;
- }
-
- if ( !bNeedEnd )
- {
- if ( pend_tag )
- *pend_tag = end_tag;
- else if ( end_tag )
- {
- delete e;
- throw XMLSyntaxErrorException ( f.Location(),
- "end tag '%s' not expected",
- token.c_str() );
- return NULL;
- }
- return e;
- }
- bool bThisMixingErrorReported = false;
- while ( f.more_tokens() )
- {
- if ( f.next_is_text() )
- {
- if ( !f.get_token ( token ) || !token.size() )
- {
- throw InvalidBuildFileException (
- f.Location(),
- "internal tool error - get_token() failed when more_tokens() returned true" );
- break;
- }
- if ( e->subElements.size() && !bThisMixingErrorReported )
- {
- throw XMLSyntaxErrorException ( f.Location(),
- "mixing of inner text with sub elements" );
- bThisMixingErrorReported = true;
- }
- if ( strchr ( token.c_str(), '>' ) )
- {
- throw XMLSyntaxErrorException ( f.Location(),
- "invalid symbol '>'" );
- }
- if ( e->value.size() )
- {
- throw XMLSyntaxErrorException ( f.Location(),
- "multiple instances of inner text" );
- e->value += " " + token;
- }
- else
- e->value = token;
- }
- else
- {
- XMLElement* e2 = XMLParse ( f, is_include ? NULL : includes, path, &end_tag );
- if ( !e2 )
- {
- throw InvalidBuildFileException (
- e->location,
- "end of file found looking for end tag" );
- break;
- }
- if ( end_tag )
- {
- if ( e->name != e2->name )
- {
- delete e2;
- throw XMLSyntaxErrorException ( f.Location(),
- "end tag name mismatch" );
- break;
- }
- delete e2;
- break;
- }
- if ( e->value.size() && !bThisMixingErrorReported )
- {
- throw XMLSyntaxErrorException ( f.Location(),
- "mixing of inner text with sub elements" );
- bThisMixingErrorReported = true;
- }
- e->AddSubElement ( e2 );
- }
- }
- return e;
-}
-
-void
-XMLReadFile ( XMLFile& f, XMLElement& head, XMLIncludes& includes, const Path& path )
-{
- for ( ;; )
- {
- XMLElement* e = XMLParse ( f, &includes, path );
- if ( !e )
- return;
- head.AddSubElement ( e );
- }
-}
-
-XMLElement*
-XMLLoadInclude ( XMLElement* e, const Path& path, XMLIncludes& includes )
-{
- XMLAttribute* att;
- att = e->GetAttribute("href",true);
- assert(att);
-
- string file ( path.Fixup(att->value,true) );
- string top_file ( Path::RelativeFromWorkingDirectory ( file ) );
- e->attributes.push_back ( new XMLAttribute ( "top_href", top_file ) );
- XMLFile fInc;
- if ( !fInc.open ( file ) )
- {
- // look for xi:fallback element
- for ( size_t i = 0; i < e->subElements.size(); i++ )
- {
- XMLElement* e2 = e->subElements[i];
- if ( e2->name == "xi:fallback" )
- {
- // now look for xi:include below...
- for ( i = 0; i < e2->subElements.size(); i++ )
- {
- XMLElement* e3 = e2->subElements[i];
- if ( e3->name == "xi:include" )
- {
- return XMLLoadInclude ( e3, path, includes );
- }
- }
- throw InvalidBuildFileException (
- e2->location,
- "<xi:fallback> must have a <xi:include> sub-element" );
- return NULL;
- }
- }
- return NULL;
- }
- else
- {
- XMLElement* new_e = new XMLElement ( e->location );
- new_e->name = "xi:included";
- Path path2 ( path, att->value );
- XMLReadFile ( fInc, *new_e, includes, path2 );
- return new_e;
- }
-}
-
-XMLElement*
-XMLLoadFile ( const string& filename, const Path& path )
-{
- XMLIncludes includes;
- XMLFile f;
-
- if ( !f.open ( filename ) )
- throw FileNotFoundException ( filename );
-
- XMLElement* head = new XMLElement("(virtual)");
-
- XMLReadFile ( f, *head, includes, path );
-
- for ( size_t i = 0; i < includes.size(); i++ )
- {
- XMLElement* e = includes[i]->e;
- XMLElement* e2 = XMLLoadInclude ( includes[i]->e, includes[i]->path, includes );
- if ( !e2 )
- {
- throw FileNotFoundException (
- ssprintf("%s (referenced from %s)",
- e->GetAttribute("top_href",true)->value.c_str(),
- f.Location().c_str() ) );
- }
- XMLElement* parent = e->parentElement;
- XMLElement** parent_container = NULL;
- if ( !parent )
- {
- delete e;
- throw Exception ( "internal tool error: xi:include doesn't have a parent" );
- return NULL;
- }
- for ( size_t j = 0; j < parent->subElements.size(); j++ )
- {
- if ( parent->subElements[j] == e )
- {
- parent_container = &parent->subElements[j];
- break;
- }
- }
- if ( !parent_container )
- {
- delete e;
- throw Exception ( "internal tool error: couldn't find xi:include in parent's sub-elements" );
- return NULL;
- }
- // replace inclusion tree with the imported tree
- e2->parentElement = e->parentElement;
- e2->name = e->name;
- e2->attributes = e->attributes;
- *parent_container = e2;
- e->attributes.resize(0);
- delete e;
- }
- return head;
-}
+++ /dev/null
-// XML.h
-
-#ifndef XML_H
-#define XML_H
-
-#include "pch.h"
-
-void
-InitWorkingDirectory();
-
-#ifdef _MSC_VER
-unsigned __int64
-#else
-unsigned long long
-#endif
-filelen ( FILE* f );
-
-class Path
-{
- std::vector<std::string> path;
-public:
- Path(); // initializes path to getcwd();
- Path ( const Path& cwd, const std::string& filename );
- std::string Fixup ( const std::string& filename, bool include_filename ) const;
-
- static std::string RelativeFromWorkingDirectory ( const std::string& path );
-
- static void Split ( std::vector<std::string>& out,
- const std::string& path,
- bool include_last );
-};
-
-class XMLFile
-{
- friend class XMLElement;
-public:
- XMLFile();
- void close();
- bool open(const std::string& filename);
- void next_token();
- bool next_is_text();
- bool more_tokens();
- bool get_token(std::string& token);
- const std::string& filename() { return _filename; }
- std::string Location() const;
-
-private:
- std::string _buf, _filename;
-
- const char *_p, *_end;
-};
-
-
-class XMLAttribute
-{
-public:
- std::string name;
- std::string value;
-
- XMLAttribute();
- XMLAttribute ( const std::string& name_, const std::string& value_ );
- XMLAttribute ( const XMLAttribute& );
- XMLAttribute& operator = ( const XMLAttribute& );
-};
-
-
-class XMLElement
-{
-public:
- std::string location;
- std::string name;
- std::vector<XMLAttribute*> attributes;
- XMLElement* parentElement;
- std::vector<XMLElement*> subElements;
- std::string value;
-
- XMLElement ( const std::string& location_ );
- ~XMLElement();
- bool Parse(const std::string& token,
- bool& end_tag);
- void AddSubElement ( XMLElement* e );
- XMLAttribute* GetAttribute ( const std::string& attribute,
- bool required);
- const XMLAttribute* GetAttribute ( const std::string& attribute,
- bool required) const;
-};
-
-XMLElement*
-XMLLoadFile ( const std::string& filename, const Path& path );
-
-/*XMLElement*
-XMLParse(XMLFile& f,
- const Path& path,
- bool* pend_tag = NULL);*/
-
-#endif//XML_H
# PROP Intermediate_Dir "Debug"\r
# PROP Target_Dir ""\r
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c\r
-# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../lib/inflib" /I "../../include/reactos" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "INFLIB_HOST" /YX /FD /GZ /c\r
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I ".." /I "../../lib/inflib" /I "../../include/reactos" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "INFLIB_HOST" /YX /FD /GZ /c\r
# ADD BASE RSC /l 0x409 /d "_DEBUG"\r
# ADD RSC /l 0x409 /d "_DEBUG"\r
BSC32=bscmake.exe\r
# End Source File\r
# Begin Source File\r
\r
-SOURCE=.\ssprintf.cpp\r
-# End Source File\r
-# Begin Source File\r
-\r
SOURCE=.\stubbedcomponent.cpp\r
# End Source File\r
# Begin Source File\r
\r
SOURCE=.\wineresource.cpp\r
# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\XML.cpp\r
-# End Source File\r
# End Group\r
# Begin Group "rbuild_headers"\r
\r
# End Source File\r
# Begin Source File\r
\r
-SOURCE=.\ssprintf.h\r
-# End Source File\r
-# Begin Source File\r
-\r
SOURCE=.\test.h\r
# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\XML.h\r
-# End Source File\r
# End Group\r
# Begin Group "inflib"\r
\r
SOURCE=..\..\lib\inflib\infput.c\r
# End Source File\r
# End Group\r
+# Begin Group "tools"\r
+\r
+# PROP Default_Filter ""\r
+# Begin Source File\r
+\r
+SOURCE=..\ssprintf.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\ssprintf.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\xml.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\xml.h\r
+# End Source File\r
+# End Group\r
# End Target\r
# End Project\r
linkerscript.cpp \
module.cpp \
project.cpp \
- ssprintf.cpp \
stubbedcomponent.cpp \
syssetupgenerator.cpp \
testsupportcode.cpp \
wineresource.cpp \
- xml.cpp \
)
RBUILD_SPECIAL_SOURCES = \
exception.h \
pch.h \
rbuild.h \
- ssprintf.h \
test.h \
- xml.h \
$(addprefix backend$(SEP), $(RBUILD_BACKEND_HEADERS)) \
- )
+ ) \
+ $(XML_SSPRINTF_HEADERS)
RBUILD_TESTS = \
tests$(SEP)cdfiletest.cpp \
$(RBUILD_COMMON_OBJECTS) \
$(RBUILD_TEST_SPECIAL_OBJECTS)
-RBUILD_HOST_CXXFLAGS = -I$(RBUILD_BASE) -I$(INFLIB_BASE) $(TOOLS_CPPFLAGS)
+RBUILD_HOST_CXXFLAGS = -I$(RBUILD_BASE) -I$(TOOLS_BASE) -I$(INFLIB_BASE) $(TOOLS_CPPFLAGS)
RBUILD_HOST_LFLAGS = $(TOOLS_LFLAGS)
.PHONY: rbuild
rbuild: $(RBUILD_TARGET)
-$(RBUILD_TARGET): $(RBUILD_OBJECTS) $(INFLIB_HOST_OBJECTS) | $(RBUILD_OUT)
+$(RBUILD_TARGET): $(RBUILD_OBJECTS) $(XML_SSPRINTF_OBJECTS) $(INFLIB_HOST_OBJECTS) | $(RBUILD_OUT)
$(ECHO_LD)
- ${host_gpp} $(RBUILD_OBJECTS) $(INFLIB_HOST_OBJECTS) $(RBUILD_HOST_LFLAGS) -o $@
+ ${host_gpp} $^ $(RBUILD_HOST_LFLAGS) -o $@
$(RBUILD_INT_)global.o: $(RBUILD_BASE_)global.cpp $(RBUILD_HEADERS) | $(RBUILD_INT)
$(ECHO_CC)
$(ECHO_CC)
${host_gpp} $(RBUILD_HOST_CXXFLAGS) -c $< -o $@
-$(RBUILD_INT_)ssprintf.o: $(RBUILD_BASE_)ssprintf.cpp $(RBUILD_HEADERS) | $(RBUILD_INT)
- $(ECHO_CC)
- ${host_gpp} $(RBUILD_HOST_CXXFLAGS) -c $< -o $@
-
$(RBUILD_INT_)stubbedcomponent.o: $(RBUILD_BASE_)stubbedcomponent.cpp $(RBUILD_HEADERS) | $(RBUILD_INT)
$(ECHO_CC)
${host_gpp} $(RBUILD_HOST_CXXFLAGS) -c $< -o $@
$(ECHO_CC)
${host_gpp} $(RBUILD_HOST_CXXFLAGS) -c $< -o $@
-$(RBUILD_INT_)xml.o: $(RBUILD_BASE_)xml.cpp $(RBUILD_HEADERS) | $(RBUILD_INT)
- $(ECHO_CC)
- ${host_gpp} $(RBUILD_HOST_CXXFLAGS) -c $< -o $@
-
$(RBUILD_BACKEND_INT_)backend.o: $(RBUILD_BACKEND_BASE_)backend.cpp $(RBUILD_HEADERS) | $(RBUILD_BACKEND_INT)
$(ECHO_CC)
${host_gpp} $(RBUILD_HOST_CXXFLAGS) -c $< -o $@
${mkdir} $@
endif
+XML_SSPRINTF_SOURCES = $(addprefix $(TOOLS_BASE_), \
+ ssprintf.cpp \
+ xml.cpp \
+ )
+
+XML_SSPRINTF_HEADERS = $(addprefix $(TOOLS_BASE_), \
+ ssprintf.h \
+ xml.h \
+ )
+
+XML_SSPRINTF_OBJECTS = \
+ $(addprefix $(INTERMEDIATE_), $(XML_SSPRINTF_SOURCES:.cpp=.o))
+
+$(TOOLS_INT_)ssprintf.o: $(TOOLS_BASE_)ssprintf.cpp $(XML_SSPRINTF_HEADERS) | $(TOOLS_INT)
+ $(ECHO_CC)
+ ${host_gcc} $(TOOLS_CPPFLAGS) -c $< -o $@
+
+$(TOOLS_INT_)xml.o: $(TOOLS_BASE_)xml.cpp $(XML_SSPRINTF_HEADERS) | $(TOOLS_INT)
+ $(ECHO_CC)
+ ${host_gcc} $(TOOLS_CPPFLAGS) -c $< -o $@
include tools/bin2c.mak
include tools/rsym.mak