From ae18ba571af3ae04071f9f32c78bc2b26785cdd7 Mon Sep 17 00:00:00 2001 From: Casper Hornstrup Date: Fri, 6 May 2005 10:38:30 +0000 Subject: [PATCH] Set svn:eol-style=native svn path=/branches/xmlbuildsystem/; revision=15035 --- reactos/tools/rbuild/XML.cpp | 1482 ++--- reactos/tools/rbuild/XML.h | 232 +- reactos/tools/rbuild/automaticdependency.cpp | 906 +-- reactos/tools/rbuild/backend/backend.cpp | 124 +- reactos/tools/rbuild/backend/backend.h | 94 +- .../tools/rbuild/backend/devcpp/devcpp.cpp | 502 +- reactos/tools/rbuild/backend/devcpp/devcpp.h | 98 +- reactos/tools/rbuild/backend/mingw/mingw.cpp | 1666 ++--- reactos/tools/rbuild/backend/mingw/mingw.h | 224 +- .../rbuild/backend/mingw/modulehandler.cpp | 5838 ++++++++--------- .../rbuild/backend/mingw/modulehandler.h | 824 +-- .../rbuild/backend/mingw/pipe_detection.c | 10 +- reactos/tools/rbuild/bootstrap.cpp | 156 +- reactos/tools/rbuild/cdfile.cpp | 84 +- reactos/tools/rbuild/compilerflag.cpp | 94 +- reactos/tools/rbuild/define.cpp | 88 +- reactos/tools/rbuild/exception.cpp | 348 +- reactos/tools/rbuild/exception.h | 250 +- reactos/tools/rbuild/include.cpp | 146 +- reactos/tools/rbuild/installfile.cpp | 84 +- reactos/tools/rbuild/linkerflag.cpp | 94 +- reactos/tools/rbuild/module.cpp | 1940 +++--- reactos/tools/rbuild/pch.h | 82 +- reactos/tools/rbuild/project.cpp | 700 +- reactos/tools/rbuild/rbuild.cpp | 214 +- reactos/tools/rbuild/rbuild.h | 1238 ++-- reactos/tools/rbuild/rbuild.mak | 700 +- reactos/tools/rbuild/rbuild.txt | 962 +-- reactos/tools/rbuild/ssprintf.cpp | 3834 +++++------ reactos/tools/rbuild/ssprintf.h | 46 +- reactos/tools/rbuild/stubbedcomponent.cpp | 160 +- reactos/tools/rbuild/test.h | 272 +- reactos/tools/rbuild/tests/alltests.cpp | 386 +- reactos/tools/rbuild/tests/cdfiletest.cpp | 44 +- .../rbuild/tests/data/automaticdependency.xml | 30 +- .../data/automaticdependency_include.xml | 32 +- reactos/tools/rbuild/tests/data/cdfile.xml | 16 +- reactos/tools/rbuild/tests/data/define.xml | 18 +- reactos/tools/rbuild/tests/data/if.xml | 18 +- reactos/tools/rbuild/tests/data/include.xml | 28 +- reactos/tools/rbuild/tests/data/invoke.xml | 26 +- .../tools/rbuild/tests/data/linkerflag.xml | 14 +- reactos/tools/rbuild/tests/data/module.xml | 34 +- reactos/tools/rbuild/tests/data/project.xml | 22 +- reactos/tools/rbuild/tests/data/sourcefile1.c | 26 +- .../data/sourcefile1/sourcefile1_header3.h | 2 +- .../data/sourcefile1/sourcefile_includenext.h | 2 +- .../rbuild/tests/data/sourcefile1_header1.h | 2 +- .../rbuild/tests/data/sourcefile1_header2.h | 6 +- .../rbuild/tests/data/sourcefile1_recurse.h | 4 +- .../rbuild/tests/data/sourcefile_include.c | 4 +- .../rbuild/tests/data/sourcefile_include.h | 2 +- .../tests/data/sourcefile_includenext.h | 2 +- reactos/tools/rbuild/tests/data/symbol.xml | 18 +- reactos/tools/rbuild/tests/definetest.cpp | 42 +- reactos/tools/rbuild/tests/functiontest.cpp | 18 +- reactos/tools/rbuild/tests/iftest.cpp | 50 +- reactos/tools/rbuild/tests/includetest.cpp | 48 +- reactos/tools/rbuild/tests/invoketest.cpp | 38 +- reactos/tools/rbuild/tests/linkerflagtest.cpp | 38 +- reactos/tools/rbuild/tests/moduletest.cpp | 74 +- reactos/tools/rbuild/tests/projecttest.cpp | 20 +- reactos/tools/rbuild/tests/sourcefiletest.cpp | 140 +- reactos/tools/rbuild/tests/symboltest.cpp | 50 +- 64 files changed, 12373 insertions(+), 12373 deletions(-) diff --git a/reactos/tools/rbuild/XML.cpp b/reactos/tools/rbuild/XML.cpp index 6a60fe1d61e..4e86c8f281b 100644 --- a/reactos/tools/rbuild/XML.cpp +++ b/reactos/tools/rbuild/XML.cpp @@ -1,741 +1,741 @@ -// XML.cpp - -#include "pch.h" - -#ifdef _MSC_VER -#define MAX_PATH _MAX_PATH -#endif - -#ifdef WIN32 -# include -# include -#else -# include -# define MAX_PATH PATH_MAX -#endif -#include - -#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; - -XMLIncludes::~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 - struct stat64 file_stat; - if ( fstat64(fileno(f), &file_stat) != 0 ) - return 0; - return file_stat.st_size; -#endif -} - -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 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; -} - -string -Path::RelativeFromWorkingDirectory () -{ - string out = ""; - for ( size_t i = 0; i < path.size(); i++ ) - { - out += "/" + path[i]; - } - return RelativeFromWorkingDirectory ( out ); -} - -string -Path::RelativeFromWorkingDirectory ( const string& path ) -{ - vector 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 = vout[0]; - for ( i = 1; i < vout.size(); i++ ) - { - out += "/" + vout[i]; - } - return out; -} - -void -Path::Split ( vector& 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, "" ); - if ( !tokend ) - tokend = _end; - else - tokend += 3; - } - else if ( !strncmp ( _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 ( XMLFile* xmlFile, - const string& location ) - : xmlFile ( xmlFile ), - 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 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 (), "" ); + if ( !tokend ) + tokend = _end; + else + tokend += 3; + } + else if ( !strncmp ( _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 ( XMLFile* xmlFile, + const string& location ) + : xmlFile ( xmlFile ), + 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 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 (), "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 = ""; - 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""; - 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""; - 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 = ""; - 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; -} +// ssprintf.cpp + +#include "pch.h" + +#include +#include +#include +#include +#include "ssprintf.h" + +#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 = ""; + 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""; + 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""; + 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 = ""; + 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; +} diff --git a/reactos/tools/rbuild/ssprintf.h b/reactos/tools/rbuild/ssprintf.h index 8efdb874117..c7a6d2d2595 100644 --- a/reactos/tools/rbuild/ssprintf.h +++ b/reactos/tools/rbuild/ssprintf.h @@ -1,23 +1,23 @@ -// ssprintf.h - -#ifndef SSPRINTF_H -#define SSPRINTF_H - -#include -#include - -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 +// ssprintf.h + +#ifndef SSPRINTF_H +#define SSPRINTF_H + +#include +#include + +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 diff --git a/reactos/tools/rbuild/stubbedcomponent.cpp b/reactos/tools/rbuild/stubbedcomponent.cpp index 707b5bb01b8..5d65716bee9 100644 --- a/reactos/tools/rbuild/stubbedcomponent.cpp +++ b/reactos/tools/rbuild/stubbedcomponent.cpp @@ -1,80 +1,80 @@ -#include "pch.h" -#include - -#include "rbuild.h" - -using std::string; -using std::vector; - -StubbedComponent::StubbedComponent ( const Module* module_, - const XMLElement& stubbedComponentNode ) - : module(module_), - node(stubbedComponentNode) -{ - const XMLAttribute* att = node.GetAttribute ( "name", true ); - assert ( att ); - name = att->value; -} - -StubbedComponent::~StubbedComponent () -{ - for ( size_t i = 0; i < symbols.size(); i++ ) - delete symbols[i]; -} - -void -StubbedComponent::ProcessXML () -{ - size_t i; - for ( i = 0; i < node.subElements.size (); i++ ) - ProcessXMLSubElement ( *node.subElements[i] ); - for ( i = 0; i < symbols.size (); i++ ) - symbols[i]->ProcessXML (); -} - -void -StubbedComponent::ProcessXMLSubElement ( const XMLElement& e ) -{ - bool subs_invalid = false; - if ( e.name == "symbol" ) - { - symbols.push_back ( new StubbedSymbol ( e ) ); - subs_invalid = false; - } - if ( subs_invalid && e.subElements.size () > 0 ) - throw InvalidBuildFileException ( - e.location, - "<%s> cannot have sub-elements", - e.name.c_str() ); - for ( size_t i = 0; i < e.subElements.size (); i++ ) - ProcessXMLSubElement ( *e.subElements[i] ); -} - - - -StubbedSymbol::StubbedSymbol ( const XMLElement& stubbedSymbolNode ) - : node(stubbedSymbolNode) -{ -} - -StubbedSymbol::~StubbedSymbol () -{ -} - -void -StubbedSymbol::ProcessXML () -{ - if ( node.value.size () == 0 ) - { - throw InvalidBuildFileException ( - node.location, - " is empty." ); - } - symbol = node.value; - - const XMLAttribute* att = node.GetAttribute ( "newname", false ); - if ( att != NULL ) - newname = att->value; - else - newname = symbol; -} +#include "pch.h" +#include + +#include "rbuild.h" + +using std::string; +using std::vector; + +StubbedComponent::StubbedComponent ( const Module* module_, + const XMLElement& stubbedComponentNode ) + : module(module_), + node(stubbedComponentNode) +{ + const XMLAttribute* att = node.GetAttribute ( "name", true ); + assert ( att ); + name = att->value; +} + +StubbedComponent::~StubbedComponent () +{ + for ( size_t i = 0; i < symbols.size(); i++ ) + delete symbols[i]; +} + +void +StubbedComponent::ProcessXML () +{ + size_t i; + for ( i = 0; i < node.subElements.size (); i++ ) + ProcessXMLSubElement ( *node.subElements[i] ); + for ( i = 0; i < symbols.size (); i++ ) + symbols[i]->ProcessXML (); +} + +void +StubbedComponent::ProcessXMLSubElement ( const XMLElement& e ) +{ + bool subs_invalid = false; + if ( e.name == "symbol" ) + { + symbols.push_back ( new StubbedSymbol ( e ) ); + subs_invalid = false; + } + if ( subs_invalid && e.subElements.size () > 0 ) + throw InvalidBuildFileException ( + e.location, + "<%s> cannot have sub-elements", + e.name.c_str() ); + for ( size_t i = 0; i < e.subElements.size (); i++ ) + ProcessXMLSubElement ( *e.subElements[i] ); +} + + + +StubbedSymbol::StubbedSymbol ( const XMLElement& stubbedSymbolNode ) + : node(stubbedSymbolNode) +{ +} + +StubbedSymbol::~StubbedSymbol () +{ +} + +void +StubbedSymbol::ProcessXML () +{ + if ( node.value.size () == 0 ) + { + throw InvalidBuildFileException ( + node.location, + " is empty." ); + } + symbol = node.value; + + const XMLAttribute* att = node.GetAttribute ( "newname", false ); + if ( att != NULL ) + newname = att->value; + else + newname = symbol; +} diff --git a/reactos/tools/rbuild/test.h b/reactos/tools/rbuild/test.h index ee740fdaecf..94bd90e41e3 100644 --- a/reactos/tools/rbuild/test.h +++ b/reactos/tools/rbuild/test.h @@ -1,136 +1,136 @@ -#ifndef __TEST_H -#define __TEST_H - -#include "rbuild.h" -#include "backend/mingw/mingw.h" - -#define RBUILD_BASE "tools" SSEP "rbuild" SSEP - -class BaseTest -{ -public: - bool Failed; - BaseTest (); - virtual ~BaseTest (); - virtual void Run () = 0; -protected: - void Assert ( const char *message, - ... ); - void IsNull ( void* reference, - const char* file, - int line ); - void IsNotNull ( void* reference, - const char* file, - int line ); - void IsTrue ( bool condition, - const char* file, - int line ); - void IsFalse ( bool condition, - const char* file, - int line ); - void AreEqual ( int expected, - int actual, - const char* file, - int line ); - void AreEqual ( const std::string& expected, - const std::string& actual, - const char* file, - int line ); - void AreNotEqual ( int expected, - int actual, - const char* file, - int line ); -private: - void Fail (); -}; - -#define IS_NULL(reference) IsNull((void*)reference,__FILE__,__LINE__) -#define IS_NOT_NULL(reference) IsNotNull((void*)reference,__FILE__,__LINE__) -#define IS_TRUE(condition) IsTrue(condition,__FILE__,__LINE__) -#define IS_FALSE(condition) IsFalse(condition,__FILE__,__LINE__) -#define ARE_EQUAL(expected,actual) AreEqual(expected,actual,__FILE__,__LINE__) -#define ARE_NOT_EQUAL(expected,actual) AreNotEqual(expected,actual,__FILE__,__LINE__) - -class ProjectTest : public BaseTest -{ -public: - void Run (); -}; - - -class ModuleTest : public BaseTest -{ -public: - void Run (); -}; - - -class DefineTest : public BaseTest -{ -public: - void Run (); -}; - - -class IncludeTest : public BaseTest -{ -public: - void Run (); -}; - - -class InvokeTest : public BaseTest -{ -public: - void Run (); -}; - - -class LinkerFlagTest : public BaseTest -{ -public: - void Run (); -}; - - -class IfTest : public BaseTest -{ -public: - void Run (); -}; - - -class FunctionTest : public BaseTest -{ -public: - void Run (); -}; - - -class SourceFileTest : public BaseTest -{ -public: - void Run (); - void IncludeTest (); - void FullParseTest (); -private: - bool IsParentOf ( const SourceFile* parent, - const SourceFile* child ); - -}; - - -class CDFileTest : public BaseTest -{ -public: - void Run (); -}; - - -class SymbolTest : public BaseTest -{ -public: - void Run (); -}; - -#endif /* __TEST_H */ +#ifndef __TEST_H +#define __TEST_H + +#include "rbuild.h" +#include "backend/mingw/mingw.h" + +#define RBUILD_BASE "tools" SSEP "rbuild" SSEP + +class BaseTest +{ +public: + bool Failed; + BaseTest (); + virtual ~BaseTest (); + virtual void Run () = 0; +protected: + void Assert ( const char *message, + ... ); + void IsNull ( void* reference, + const char* file, + int line ); + void IsNotNull ( void* reference, + const char* file, + int line ); + void IsTrue ( bool condition, + const char* file, + int line ); + void IsFalse ( bool condition, + const char* file, + int line ); + void AreEqual ( int expected, + int actual, + const char* file, + int line ); + void AreEqual ( const std::string& expected, + const std::string& actual, + const char* file, + int line ); + void AreNotEqual ( int expected, + int actual, + const char* file, + int line ); +private: + void Fail (); +}; + +#define IS_NULL(reference) IsNull((void*)reference,__FILE__,__LINE__) +#define IS_NOT_NULL(reference) IsNotNull((void*)reference,__FILE__,__LINE__) +#define IS_TRUE(condition) IsTrue(condition,__FILE__,__LINE__) +#define IS_FALSE(condition) IsFalse(condition,__FILE__,__LINE__) +#define ARE_EQUAL(expected,actual) AreEqual(expected,actual,__FILE__,__LINE__) +#define ARE_NOT_EQUAL(expected,actual) AreNotEqual(expected,actual,__FILE__,__LINE__) + +class ProjectTest : public BaseTest +{ +public: + void Run (); +}; + + +class ModuleTest : public BaseTest +{ +public: + void Run (); +}; + + +class DefineTest : public BaseTest +{ +public: + void Run (); +}; + + +class IncludeTest : public BaseTest +{ +public: + void Run (); +}; + + +class InvokeTest : public BaseTest +{ +public: + void Run (); +}; + + +class LinkerFlagTest : public BaseTest +{ +public: + void Run (); +}; + + +class IfTest : public BaseTest +{ +public: + void Run (); +}; + + +class FunctionTest : public BaseTest +{ +public: + void Run (); +}; + + +class SourceFileTest : public BaseTest +{ +public: + void Run (); + void IncludeTest (); + void FullParseTest (); +private: + bool IsParentOf ( const SourceFile* parent, + const SourceFile* child ); + +}; + + +class CDFileTest : public BaseTest +{ +public: + void Run (); +}; + + +class SymbolTest : public BaseTest +{ +public: + void Run (); +}; + +#endif /* __TEST_H */ diff --git a/reactos/tools/rbuild/tests/alltests.cpp b/reactos/tools/rbuild/tests/alltests.cpp index f25306d5e92..d5982385981 100644 --- a/reactos/tools/rbuild/tests/alltests.cpp +++ b/reactos/tools/rbuild/tests/alltests.cpp @@ -1,193 +1,193 @@ - -#include "pch.h" - -#include "rbuild.h" -#include "test.h" - -BaseTest::BaseTest() -{ - Failed = false; -} - -BaseTest::~BaseTest() -{ -} - -void BaseTest::Assert(const char *message, ...) -{ - va_list args; - va_start ( args, message ); - vprintf(message, args); - va_end ( args ); - Fail(); -} - -void BaseTest::IsNull(void* reference, - const char* file, - int line) -{ - if (reference != NULL) - { - Assert("Condition was not NULL at %s:%d\n", - file, - line); - } -} - -void BaseTest::IsNotNull(void* reference, - const char* file, - int line) -{ - if (reference == NULL) - { - Assert("Condition was NULL at %s:%d\n", - file, - line); - } -} - -void BaseTest::IsTrue(bool condition, - const char* file, - int line) -{ - if (!condition) - { - Assert("Condition was not true at %s:%d\n", - file, - line); - } -} - -void BaseTest::IsFalse(bool condition, - const char* file, - int line) -{ - if (condition) - { - Assert("Condition was not false at %s:%d\n", - file, - line); - } -} - -void BaseTest::AreEqual(int expected, - int actual, - const char* file, - int line) -{ - if (actual != expected) - { - Assert("Expected %d/0x%.08x was %d/0x%.08x at %s:%d\n", - expected, - expected, - actual, - actual, - file, - line); - } -} - -void BaseTest::AreEqual(const std::string& expected, - const std::string& actual, - const char* file, - int line) -{ - if (actual != expected) - { - Assert("Expected '%s' was '%s' at %s:%d\n", - expected.c_str(), - actual.c_str(), - file, - line); - } -} - -void BaseTest::AreNotEqual(int expected, - int actual, - const char* file, - int line) -{ - if (actual == expected) - { - Assert("Actual value expected to be different from %d/0x%.08x at %s:%d\n", - expected, - expected, - file, - line); - } -} - -void BaseTest::Fail() -{ - Failed = true; -} - -class BaseTestList : public std::vector -{ -public: - ~BaseTestList() - { - for ( size_t i = 0; i < size(); i++ ) - { - delete (*this)[i]; - } - } -}; - -class TestDispatcher -{ -public: - void Run() - { - int numberOfFailedTests = 0; - BaseTestList tests; - GetTests(tests); - for (size_t i = 0; i < tests.size(); i++) - { - try - { - BaseTest& test = *tests[i]; - test.Run(); - if (test.Failed) - numberOfFailedTests++; - } - catch (Exception& ex) - { - printf("%s\n", - ex.Message.c_str()); - numberOfFailedTests++; - } - } - - if (numberOfFailedTests > 0) - printf("%d tests failed\n", - numberOfFailedTests); - else - printf("All tests succeeded\n"); - } - -private: - void GetTests ( BaseTestList& tests ) - { - tests.push_back(new ProjectTest()); - tests.push_back(new ModuleTest()); - tests.push_back(new DefineTest()); - tests.push_back(new IncludeTest()); - tests.push_back(new InvokeTest()); - tests.push_back(new LinkerFlagTest()); - tests.push_back(new IfTest()); - tests.push_back(new FunctionTest()); - tests.push_back(new SourceFileTest()); - tests.push_back(new CDFileTest()); - tests.push_back(new SymbolTest()); - } -}; - - -int main(int argc, - char** argv) -{ - TestDispatcher testDispatcher; - testDispatcher.Run(); - return 0; -}; + +#include "pch.h" + +#include "rbuild.h" +#include "test.h" + +BaseTest::BaseTest() +{ + Failed = false; +} + +BaseTest::~BaseTest() +{ +} + +void BaseTest::Assert(const char *message, ...) +{ + va_list args; + va_start ( args, message ); + vprintf(message, args); + va_end ( args ); + Fail(); +} + +void BaseTest::IsNull(void* reference, + const char* file, + int line) +{ + if (reference != NULL) + { + Assert("Condition was not NULL at %s:%d\n", + file, + line); + } +} + +void BaseTest::IsNotNull(void* reference, + const char* file, + int line) +{ + if (reference == NULL) + { + Assert("Condition was NULL at %s:%d\n", + file, + line); + } +} + +void BaseTest::IsTrue(bool condition, + const char* file, + int line) +{ + if (!condition) + { + Assert("Condition was not true at %s:%d\n", + file, + line); + } +} + +void BaseTest::IsFalse(bool condition, + const char* file, + int line) +{ + if (condition) + { + Assert("Condition was not false at %s:%d\n", + file, + line); + } +} + +void BaseTest::AreEqual(int expected, + int actual, + const char* file, + int line) +{ + if (actual != expected) + { + Assert("Expected %d/0x%.08x was %d/0x%.08x at %s:%d\n", + expected, + expected, + actual, + actual, + file, + line); + } +} + +void BaseTest::AreEqual(const std::string& expected, + const std::string& actual, + const char* file, + int line) +{ + if (actual != expected) + { + Assert("Expected '%s' was '%s' at %s:%d\n", + expected.c_str(), + actual.c_str(), + file, + line); + } +} + +void BaseTest::AreNotEqual(int expected, + int actual, + const char* file, + int line) +{ + if (actual == expected) + { + Assert("Actual value expected to be different from %d/0x%.08x at %s:%d\n", + expected, + expected, + file, + line); + } +} + +void BaseTest::Fail() +{ + Failed = true; +} + +class BaseTestList : public std::vector +{ +public: + ~BaseTestList() + { + for ( size_t i = 0; i < size(); i++ ) + { + delete (*this)[i]; + } + } +}; + +class TestDispatcher +{ +public: + void Run() + { + int numberOfFailedTests = 0; + BaseTestList tests; + GetTests(tests); + for (size_t i = 0; i < tests.size(); i++) + { + try + { + BaseTest& test = *tests[i]; + test.Run(); + if (test.Failed) + numberOfFailedTests++; + } + catch (Exception& ex) + { + printf("%s\n", + ex.Message.c_str()); + numberOfFailedTests++; + } + } + + if (numberOfFailedTests > 0) + printf("%d tests failed\n", + numberOfFailedTests); + else + printf("All tests succeeded\n"); + } + +private: + void GetTests ( BaseTestList& tests ) + { + tests.push_back(new ProjectTest()); + tests.push_back(new ModuleTest()); + tests.push_back(new DefineTest()); + tests.push_back(new IncludeTest()); + tests.push_back(new InvokeTest()); + tests.push_back(new LinkerFlagTest()); + tests.push_back(new IfTest()); + tests.push_back(new FunctionTest()); + tests.push_back(new SourceFileTest()); + tests.push_back(new CDFileTest()); + tests.push_back(new SymbolTest()); + } +}; + + +int main(int argc, + char** argv) +{ + TestDispatcher testDispatcher; + testDispatcher.Run(); + return 0; +}; diff --git a/reactos/tools/rbuild/tests/cdfiletest.cpp b/reactos/tools/rbuild/tests/cdfiletest.cpp index 717209924f6..3e6143ca982 100644 --- a/reactos/tools/rbuild/tests/cdfiletest.cpp +++ b/reactos/tools/rbuild/tests/cdfiletest.cpp @@ -1,22 +1,22 @@ -#include "test.h" - -using std::string; - -void CDFileTest::Run() -{ - string projectFilename ( RBUILD_BASE "tests/data/cdfile.xml" ); - Project project( projectFilename ); - ARE_EQUAL ( 3, project.cdfiles.size () ); - - CDFile& cdfile1 = *project.cdfiles[0]; - ARE_EQUAL("dir1", cdfile1.base); - ARE_EQUAL("ReadMe1.txt", cdfile1.nameoncd); - - CDFile& cdfile2 = *project.cdfiles[1]; - ARE_EQUAL("dir2", cdfile2.base); - ARE_EQUAL("readme2.txt", cdfile2.nameoncd); - - CDFile& cdfile3 = *project.cdfiles[2]; - //ARE_EQUAL("", cdfile3.base); - ARE_EQUAL("readme3.txt", cdfile3.nameoncd); -} +#include "test.h" + +using std::string; + +void CDFileTest::Run() +{ + string projectFilename ( RBUILD_BASE "tests/data/cdfile.xml" ); + Project project( projectFilename ); + ARE_EQUAL ( 3, project.cdfiles.size () ); + + CDFile& cdfile1 = *project.cdfiles[0]; + ARE_EQUAL("dir1", cdfile1.base); + ARE_EQUAL("ReadMe1.txt", cdfile1.nameoncd); + + CDFile& cdfile2 = *project.cdfiles[1]; + ARE_EQUAL("dir2", cdfile2.base); + ARE_EQUAL("readme2.txt", cdfile2.nameoncd); + + CDFile& cdfile3 = *project.cdfiles[2]; + //ARE_EQUAL("", cdfile3.base); + ARE_EQUAL("readme3.txt", cdfile3.nameoncd); +} diff --git a/reactos/tools/rbuild/tests/data/automaticdependency.xml b/reactos/tools/rbuild/tests/data/automaticdependency.xml index 6fa14b1adbf..3cf3d0a7cbe 100644 --- a/reactos/tools/rbuild/tests/data/automaticdependency.xml +++ b/reactos/tools/rbuild/tests/data/automaticdependency.xml @@ -1,15 +1,15 @@ - - - - - - - - . - sourcefile1.c - - - - - - + + + + + + + + . + sourcefile1.c + + + + + + diff --git a/reactos/tools/rbuild/tests/data/automaticdependency_include.xml b/reactos/tools/rbuild/tests/data/automaticdependency_include.xml index de713cf9d31..9d8c7b43d4e 100644 --- a/reactos/tools/rbuild/tests/data/automaticdependency_include.xml +++ b/reactos/tools/rbuild/tests/data/automaticdependency_include.xml @@ -1,16 +1,16 @@ - - - - - - - - . - sourcefile1 - sourcefile_include.c - - - - - - + + + + + + + + . + sourcefile1 + sourcefile_include.c + + + + + + diff --git a/reactos/tools/rbuild/tests/data/cdfile.xml b/reactos/tools/rbuild/tests/data/cdfile.xml index ef69d76d3f7..22e5407d690 100644 --- a/reactos/tools/rbuild/tests/data/cdfile.xml +++ b/reactos/tools/rbuild/tests/data/cdfile.xml @@ -1,8 +1,8 @@ - - - - readme1.txt - readme2.txt - readme3.txt - - + + + + readme1.txt + readme2.txt + readme3.txt + + diff --git a/reactos/tools/rbuild/tests/data/define.xml b/reactos/tools/rbuild/tests/data/define.xml index 1f5c823f838..d4f10c12d59 100644 --- a/reactos/tools/rbuild/tests/data/define.xml +++ b/reactos/tools/rbuild/tests/data/define.xml @@ -1,9 +1,9 @@ - - - value1 - - - value2 - - - + + + value1 + + + value2 + + + diff --git a/reactos/tools/rbuild/tests/data/if.xml b/reactos/tools/rbuild/tests/data/if.xml index 4aae6b06de5..03a981831de 100644 --- a/reactos/tools/rbuild/tests/data/if.xml +++ b/reactos/tools/rbuild/tests/data/if.xml @@ -1,9 +1,9 @@ - - - - - file1.c - - file2.c - - + + + + + file1.c + + file2.c + + diff --git a/reactos/tools/rbuild/tests/data/include.xml b/reactos/tools/rbuild/tests/data/include.xml index 69add646f7d..5bf12038751 100644 --- a/reactos/tools/rbuild/tests/data/include.xml +++ b/reactos/tools/rbuild/tests/data/include.xml @@ -1,14 +1,14 @@ - - - include1 - - - include2 - - - - - include3 - - - + + + include1 + + + include2 + + + + + include3 + + + diff --git a/reactos/tools/rbuild/tests/data/invoke.xml b/reactos/tools/rbuild/tests/data/invoke.xml index 7940a0f85b1..33bedb5564e 100644 --- a/reactos/tools/rbuild/tests/data/invoke.xml +++ b/reactos/tools/rbuild/tests/data/invoke.xml @@ -1,13 +1,13 @@ - - - - - file1.c - - - file1.c - - - - - + + + + + file1.c + + + file1.c + + + + + diff --git a/reactos/tools/rbuild/tests/data/linkerflag.xml b/reactos/tools/rbuild/tests/data/linkerflag.xml index 843a03ede2f..8977cc5c915 100644 --- a/reactos/tools/rbuild/tests/data/linkerflag.xml +++ b/reactos/tools/rbuild/tests/data/linkerflag.xml @@ -1,7 +1,7 @@ - - - -lgcc1 - - -lgcc2 - - + + + -lgcc1 + + -lgcc2 + + diff --git a/reactos/tools/rbuild/tests/data/module.xml b/reactos/tools/rbuild/tests/data/module.xml index 6e72aad37be..6ccc81839e1 100644 --- a/reactos/tools/rbuild/tests/data/module.xml +++ b/reactos/tools/rbuild/tests/data/module.xml @@ -1,17 +1,17 @@ - - - - - file1.c - file2.c - - - - - module1 - module1 - file3.c - file4.c - - - + + + + + file1.c + file2.c + + + + + module1 + module1 + file3.c + file4.c + + + diff --git a/reactos/tools/rbuild/tests/data/project.xml b/reactos/tools/rbuild/tests/data/project.xml index 472cf619c66..97d58317cd8 100644 --- a/reactos/tools/rbuild/tests/data/project.xml +++ b/reactos/tools/rbuild/tests/data/project.xml @@ -1,11 +1,11 @@ - - - - - - - - - - - + + + + + + + + + + + diff --git a/reactos/tools/rbuild/tests/data/sourcefile1.c b/reactos/tools/rbuild/tests/data/sourcefile1.c index 55f17e7c3d2..28af7778e50 100644 --- a/reactos/tools/rbuild/tests/data/sourcefile1.c +++ b/reactos/tools/rbuild/tests/data/sourcefile1.c @@ -1,13 +1,13 @@ -/* - * ReactOS kernel - */ -/* $Id: main.c 12694 2005-01-01 11:47:33Z hbirr $ - * FILE: ntoskrnl/ke/main.c - */ - -/* INCLUDES *****************************************************************/ - -#include -#include - -/* GLOBALS *******************************************************************/ +/* + * ReactOS kernel + */ +/* $Id: main.c 12694 2005-01-01 11:47:33Z hbirr $ + * FILE: ntoskrnl/ke/main.c + */ + +/* INCLUDES *****************************************************************/ + +#include +#include + +/* GLOBALS *******************************************************************/ diff --git a/reactos/tools/rbuild/tests/data/sourcefile1/sourcefile1_header3.h b/reactos/tools/rbuild/tests/data/sourcefile1/sourcefile1_header3.h index ab79b95a5f7..40a8c178f10 100644 --- a/reactos/tools/rbuild/tests/data/sourcefile1/sourcefile1_header3.h +++ b/reactos/tools/rbuild/tests/data/sourcefile1/sourcefile1_header3.h @@ -1 +1 @@ -/* empty */ +/* empty */ diff --git a/reactos/tools/rbuild/tests/data/sourcefile1/sourcefile_includenext.h b/reactos/tools/rbuild/tests/data/sourcefile1/sourcefile_includenext.h index ab79b95a5f7..40a8c178f10 100644 --- a/reactos/tools/rbuild/tests/data/sourcefile1/sourcefile_includenext.h +++ b/reactos/tools/rbuild/tests/data/sourcefile1/sourcefile_includenext.h @@ -1 +1 @@ -/* empty */ +/* empty */ diff --git a/reactos/tools/rbuild/tests/data/sourcefile1_header1.h b/reactos/tools/rbuild/tests/data/sourcefile1_header1.h index fbae0f515d4..c4261ef88cb 100644 --- a/reactos/tools/rbuild/tests/data/sourcefile1_header1.h +++ b/reactos/tools/rbuild/tests/data/sourcefile1_header1.h @@ -1 +1 @@ -#include +#include diff --git a/reactos/tools/rbuild/tests/data/sourcefile1_header2.h b/reactos/tools/rbuild/tests/data/sourcefile1_header2.h index f92a74186ae..212537b619a 100644 --- a/reactos/tools/rbuild/tests/data/sourcefile1_header2.h +++ b/reactos/tools/rbuild/tests/data/sourcefile1_header2.h @@ -1,3 +1,3 @@ -#include "sourcefile1/sourcefile1_header3.h" -#include -#include +#include "sourcefile1/sourcefile1_header3.h" +#include +#include diff --git a/reactos/tools/rbuild/tests/data/sourcefile1_recurse.h b/reactos/tools/rbuild/tests/data/sourcefile1_recurse.h index f3ab6df93fd..0ce390cf892 100644 --- a/reactos/tools/rbuild/tests/data/sourcefile1_recurse.h +++ b/reactos/tools/rbuild/tests/data/sourcefile1_recurse.h @@ -1,2 +1,2 @@ -#include -#include +#include +#include diff --git a/reactos/tools/rbuild/tests/data/sourcefile_include.c b/reactos/tools/rbuild/tests/data/sourcefile_include.c index 373a64d4dcc..8ee9670f406 100644 --- a/reactos/tools/rbuild/tests/data/sourcefile_include.c +++ b/reactos/tools/rbuild/tests/data/sourcefile_include.c @@ -1,2 +1,2 @@ -# include -#include +# include +#include diff --git a/reactos/tools/rbuild/tests/data/sourcefile_include.h b/reactos/tools/rbuild/tests/data/sourcefile_include.h index ab79b95a5f7..40a8c178f10 100644 --- a/reactos/tools/rbuild/tests/data/sourcefile_include.h +++ b/reactos/tools/rbuild/tests/data/sourcefile_include.h @@ -1 +1 @@ -/* empty */ +/* empty */ diff --git a/reactos/tools/rbuild/tests/data/sourcefile_includenext.h b/reactos/tools/rbuild/tests/data/sourcefile_includenext.h index f02b86b654d..0f4f8e730b5 100644 --- a/reactos/tools/rbuild/tests/data/sourcefile_includenext.h +++ b/reactos/tools/rbuild/tests/data/sourcefile_includenext.h @@ -1 +1 @@ -#include_next +#include_next diff --git a/reactos/tools/rbuild/tests/data/symbol.xml b/reactos/tools/rbuild/tests/data/symbol.xml index 0089d6431fc..cb0d536d035 100644 --- a/reactos/tools/rbuild/tests/data/symbol.xml +++ b/reactos/tools/rbuild/tests/data/symbol.xml @@ -1,9 +1,9 @@ - - - - - HeapAlloc@12 - LdrAccessResource@16 - - - + + + + + HeapAlloc@12 + LdrAccessResource@16 + + + diff --git a/reactos/tools/rbuild/tests/definetest.cpp b/reactos/tools/rbuild/tests/definetest.cpp index 539f21a2619..09943a543bd 100644 --- a/reactos/tools/rbuild/tests/definetest.cpp +++ b/reactos/tools/rbuild/tests/definetest.cpp @@ -1,21 +1,21 @@ -#include "test.h" - -using std::string; - -void DefineTest::Run() -{ - string projectFilename ( RBUILD_BASE "tests/data/define.xml" ); - Project project ( projectFilename ); - ARE_EQUAL(1, project.non_if_data.defines.size()); - Define& define1 = *project.non_if_data.defines[0]; - ARE_EQUAL("define1", define1.name); - ARE_EQUAL("value1", define1.value); - - ARE_EQUAL(1, project.modules.size()); - Module& module1 = *project.modules[0]; - - ARE_EQUAL(1, module1.non_if_data.defines.size()); - Define& define2 = *module1.non_if_data.defines[0]; - ARE_EQUAL("define2", define2.name); - ARE_EQUAL("value2", define2.value); -} +#include "test.h" + +using std::string; + +void DefineTest::Run() +{ + string projectFilename ( RBUILD_BASE "tests/data/define.xml" ); + Project project ( projectFilename ); + ARE_EQUAL(1, project.non_if_data.defines.size()); + Define& define1 = *project.non_if_data.defines[0]; + ARE_EQUAL("define1", define1.name); + ARE_EQUAL("value1", define1.value); + + ARE_EQUAL(1, project.modules.size()); + Module& module1 = *project.modules[0]; + + ARE_EQUAL(1, module1.non_if_data.defines.size()); + Define& define2 = *module1.non_if_data.defines[0]; + ARE_EQUAL("define2", define2.name); + ARE_EQUAL("value2", define2.value); +} diff --git a/reactos/tools/rbuild/tests/functiontest.cpp b/reactos/tools/rbuild/tests/functiontest.cpp index 3e766567304..571d4c7c805 100644 --- a/reactos/tools/rbuild/tests/functiontest.cpp +++ b/reactos/tools/rbuild/tests/functiontest.cpp @@ -1,9 +1,9 @@ -#include "test.h" - -using std::string; - -void FunctionTest::Run () -{ - string fixedupFilename = NormalizeFilename ( "." SSEP "dir1" SSEP "dir2" SSEP ".." SSEP "filename.txt" ); - ARE_EQUAL ( "dir1" SSEP "filename.txt", fixedupFilename ); -} +#include "test.h" + +using std::string; + +void FunctionTest::Run () +{ + string fixedupFilename = NormalizeFilename ( "." SSEP "dir1" SSEP "dir2" SSEP ".." SSEP "filename.txt" ); + ARE_EQUAL ( "dir1" SSEP "filename.txt", fixedupFilename ); +} diff --git a/reactos/tools/rbuild/tests/iftest.cpp b/reactos/tools/rbuild/tests/iftest.cpp index 92a4c846eae..37d88c15c63 100644 --- a/reactos/tools/rbuild/tests/iftest.cpp +++ b/reactos/tools/rbuild/tests/iftest.cpp @@ -1,25 +1,25 @@ -#include "test.h" - -using std::string; - -void IfTest::Run() -{ - string projectFilename ( RBUILD_BASE "tests/data/if.xml" ); - Project project ( projectFilename ); - - ARE_EQUAL ( 1, project.modules.size () ); - Module& module1 = *project.modules[0]; - - ARE_EQUAL ( 1, module1.non_if_data.ifs.size () ); - If& if1 = *module1.non_if_data.ifs[0]; - ARE_EQUAL ( "VAR1", if1.property ); - ARE_EQUAL ( "value1", if1.value ); - - ARE_EQUAL ( 1, if1.data.files.size () ); - File& file1 = *if1.data.files[0]; - ARE_EQUAL( SSEP "file1.c", file1.name ); - - ARE_EQUAL ( 1, module1.non_if_data.files.size () ); - File& file2 = *module1.non_if_data.files[0]; - ARE_EQUAL( SSEP "file2.c", file2.name ); -} +#include "test.h" + +using std::string; + +void IfTest::Run() +{ + string projectFilename ( RBUILD_BASE "tests/data/if.xml" ); + Project project ( projectFilename ); + + ARE_EQUAL ( 1, project.modules.size () ); + Module& module1 = *project.modules[0]; + + ARE_EQUAL ( 1, module1.non_if_data.ifs.size () ); + If& if1 = *module1.non_if_data.ifs[0]; + ARE_EQUAL ( "VAR1", if1.property ); + ARE_EQUAL ( "value1", if1.value ); + + ARE_EQUAL ( 1, if1.data.files.size () ); + File& file1 = *if1.data.files[0]; + ARE_EQUAL( SSEP "file1.c", file1.name ); + + ARE_EQUAL ( 1, module1.non_if_data.files.size () ); + File& file2 = *module1.non_if_data.files[0]; + ARE_EQUAL( SSEP "file2.c", file2.name ); +} diff --git a/reactos/tools/rbuild/tests/includetest.cpp b/reactos/tools/rbuild/tests/includetest.cpp index 6fb4ac8bd1d..3977d68605d 100644 --- a/reactos/tools/rbuild/tests/includetest.cpp +++ b/reactos/tools/rbuild/tests/includetest.cpp @@ -1,24 +1,24 @@ -#include "test.h" - -using std::string; - -void IncludeTest::Run() -{ - string projectFilename ( RBUILD_BASE "tests/data/include.xml" ); - Project project ( projectFilename ); - ARE_EQUAL(1, project.non_if_data.includes.size()); - Include& include1 = *project.non_if_data.includes[0]; - ARE_EQUAL("include1", include1.directory); - - ARE_EQUAL(2, project.modules.size()); - Module& module1 = *project.modules[0]; - Module& module2 = *project.modules[1]; - - ARE_EQUAL(1, module1.non_if_data.includes.size()); - Include& include2 = *module1.non_if_data.includes[0]; - ARE_EQUAL("include2", include2.directory); - - ARE_EQUAL(1, module2.non_if_data.includes.size()); - Include& include3 = *module2.non_if_data.includes[0]; - ARE_EQUAL(FixSeparator("dir1/include3"), include3.directory); -} +#include "test.h" + +using std::string; + +void IncludeTest::Run() +{ + string projectFilename ( RBUILD_BASE "tests/data/include.xml" ); + Project project ( projectFilename ); + ARE_EQUAL(1, project.non_if_data.includes.size()); + Include& include1 = *project.non_if_data.includes[0]; + ARE_EQUAL("include1", include1.directory); + + ARE_EQUAL(2, project.modules.size()); + Module& module1 = *project.modules[0]; + Module& module2 = *project.modules[1]; + + ARE_EQUAL(1, module1.non_if_data.includes.size()); + Include& include2 = *module1.non_if_data.includes[0]; + ARE_EQUAL("include2", include2.directory); + + ARE_EQUAL(1, module2.non_if_data.includes.size()); + Include& include3 = *module2.non_if_data.includes[0]; + ARE_EQUAL(FixSeparator("dir1/include3"), include3.directory); +} diff --git a/reactos/tools/rbuild/tests/invoketest.cpp b/reactos/tools/rbuild/tests/invoketest.cpp index fdd18937e24..409478a406f 100644 --- a/reactos/tools/rbuild/tests/invoketest.cpp +++ b/reactos/tools/rbuild/tests/invoketest.cpp @@ -1,19 +1,19 @@ -#include "test.h" - -using std::string; - -void InvokeTest::Run() -{ - string projectFilename ( RBUILD_BASE "tests/data/invoke.xml" ); - Project project ( projectFilename ); - ARE_EQUAL(1, project.modules.size()); - - Module& module1 = *project.modules[0]; - ARE_EQUAL(1, module1.invocations.size()); - - Invoke& invoke1 = *module1.invocations[0]; - ARE_EQUAL(1, invoke1.output.size()); - - InvokeFile& file1 = *invoke1.output[0]; - ARE_EQUAL(FixSeparator("dir1/file1.c"), file1.name); -} +#include "test.h" + +using std::string; + +void InvokeTest::Run() +{ + string projectFilename ( RBUILD_BASE "tests/data/invoke.xml" ); + Project project ( projectFilename ); + ARE_EQUAL(1, project.modules.size()); + + Module& module1 = *project.modules[0]; + ARE_EQUAL(1, module1.invocations.size()); + + Invoke& invoke1 = *module1.invocations[0]; + ARE_EQUAL(1, invoke1.output.size()); + + InvokeFile& file1 = *invoke1.output[0]; + ARE_EQUAL(FixSeparator("dir1/file1.c"), file1.name); +} diff --git a/reactos/tools/rbuild/tests/linkerflagtest.cpp b/reactos/tools/rbuild/tests/linkerflagtest.cpp index 4e804523aed..6f7ac48a3a9 100644 --- a/reactos/tools/rbuild/tests/linkerflagtest.cpp +++ b/reactos/tools/rbuild/tests/linkerflagtest.cpp @@ -1,19 +1,19 @@ -#include "test.h" - -using std::string; - -void LinkerFlagTest::Run() -{ - string projectFilename ( RBUILD_BASE "tests/data/linkerflag.xml" ); - Project project ( projectFilename ); - ARE_EQUAL(1, project.linkerFlags.size()); - LinkerFlag& linkerFlag1 = *project.linkerFlags[0]; - ARE_EQUAL("-lgcc1", linkerFlag1.flag); - - ARE_EQUAL(1, project.modules.size()); - Module& module1 = *project.modules[0]; - - ARE_EQUAL(1, module1.linkerFlags.size()); - LinkerFlag& linkerFlag2 = *module1.linkerFlags[0]; - ARE_EQUAL("-lgcc2", linkerFlag2.flag); -} +#include "test.h" + +using std::string; + +void LinkerFlagTest::Run() +{ + string projectFilename ( RBUILD_BASE "tests/data/linkerflag.xml" ); + Project project ( projectFilename ); + ARE_EQUAL(1, project.linkerFlags.size()); + LinkerFlag& linkerFlag1 = *project.linkerFlags[0]; + ARE_EQUAL("-lgcc1", linkerFlag1.flag); + + ARE_EQUAL(1, project.modules.size()); + Module& module1 = *project.modules[0]; + + ARE_EQUAL(1, module1.linkerFlags.size()); + LinkerFlag& linkerFlag2 = *module1.linkerFlags[0]; + ARE_EQUAL("-lgcc2", linkerFlag2.flag); +} diff --git a/reactos/tools/rbuild/tests/moduletest.cpp b/reactos/tools/rbuild/tests/moduletest.cpp index 01313e9364a..87e31dbef9a 100644 --- a/reactos/tools/rbuild/tests/moduletest.cpp +++ b/reactos/tools/rbuild/tests/moduletest.cpp @@ -1,37 +1,37 @@ -#include "test.h" - -using std::string; - -void ModuleTest::Run() -{ - string projectFilename ( RBUILD_BASE "tests/data/module.xml" ); - Project project ( projectFilename ); - ARE_EQUAL(2, project.modules.size()); - - Module& module1 = *project.modules[0]; - IS_TRUE(module1.type == BuildTool); - - ARE_EQUAL(2, module1.non_if_data.files.size()); - ARE_EQUAL("dir1" SSEP "file1.c", module1.non_if_data.files[0]->name); - ARE_EQUAL("dir1" SSEP "file2.c", module1.non_if_data.files[1]->name); - - ARE_EQUAL(0, module1.non_if_data.libraries.size()); - - Module& module2 = *project.modules[1]; - IS_TRUE(module2.type == KernelModeDLL); - ARE_EQUAL("reactos", module2.installBase); - ARE_EQUAL("module2.ext", module2.installName); - - ARE_EQUAL(2, module2.non_if_data.files.size()); - ARE_EQUAL("dir2" SSEP "file3.c", module2.non_if_data.files[0]->name); - ARE_EQUAL("dir2" SSEP "file4.c", module2.non_if_data.files[1]->name); - - ARE_EQUAL(1, module2.non_if_data.libraries.size()); - Library& library1 = *module2.non_if_data.libraries[0]; - ARE_EQUAL("module1", library1.name); - - ARE_EQUAL(1, module2.dependencies.size()); - Dependency& module1dependency = *module2.dependencies[0]; - IS_NOT_NULL(module1dependency.dependencyModule); - ARE_EQUAL("module1", module1dependency.dependencyModule->name); -} +#include "test.h" + +using std::string; + +void ModuleTest::Run() +{ + string projectFilename ( RBUILD_BASE "tests/data/module.xml" ); + Project project ( projectFilename ); + ARE_EQUAL(2, project.modules.size()); + + Module& module1 = *project.modules[0]; + IS_TRUE(module1.type == BuildTool); + + ARE_EQUAL(2, module1.non_if_data.files.size()); + ARE_EQUAL("dir1" SSEP "file1.c", module1.non_if_data.files[0]->name); + ARE_EQUAL("dir1" SSEP "file2.c", module1.non_if_data.files[1]->name); + + ARE_EQUAL(0, module1.non_if_data.libraries.size()); + + Module& module2 = *project.modules[1]; + IS_TRUE(module2.type == KernelModeDLL); + ARE_EQUAL("reactos", module2.installBase); + ARE_EQUAL("module2.ext", module2.installName); + + ARE_EQUAL(2, module2.non_if_data.files.size()); + ARE_EQUAL("dir2" SSEP "file3.c", module2.non_if_data.files[0]->name); + ARE_EQUAL("dir2" SSEP "file4.c", module2.non_if_data.files[1]->name); + + ARE_EQUAL(1, module2.non_if_data.libraries.size()); + Library& library1 = *module2.non_if_data.libraries[0]; + ARE_EQUAL("module1", library1.name); + + ARE_EQUAL(1, module2.dependencies.size()); + Dependency& module1dependency = *module2.dependencies[0]; + IS_NOT_NULL(module1dependency.dependencyModule); + ARE_EQUAL("module1", module1dependency.dependencyModule->name); +} diff --git a/reactos/tools/rbuild/tests/projecttest.cpp b/reactos/tools/rbuild/tests/projecttest.cpp index 71d5b5481a6..2769d860314 100644 --- a/reactos/tools/rbuild/tests/projecttest.cpp +++ b/reactos/tools/rbuild/tests/projecttest.cpp @@ -1,10 +1,10 @@ -#include "test.h" - -using std::string; - -void ProjectTest::Run() -{ - string projectFilename ( RBUILD_BASE "tests/data/project.xml" ); - Project project( projectFilename ); - ARE_EQUAL(2, project.modules.size()); -} +#include "test.h" + +using std::string; + +void ProjectTest::Run() +{ + string projectFilename ( RBUILD_BASE "tests/data/project.xml" ); + Project project( projectFilename ); + ARE_EQUAL(2, project.modules.size()); +} diff --git a/reactos/tools/rbuild/tests/sourcefiletest.cpp b/reactos/tools/rbuild/tests/sourcefiletest.cpp index 5885baa062c..a7af1a499a5 100644 --- a/reactos/tools/rbuild/tests/sourcefiletest.cpp +++ b/reactos/tools/rbuild/tests/sourcefiletest.cpp @@ -1,70 +1,70 @@ -#include "test.h" - -using std::string; - -bool -SourceFileTest::IsParentOf ( const SourceFile* parent, - const SourceFile* child ) -{ - size_t i; - for ( i = 0; i < child->parents.size (); i++ ) - { - if ( child->parents[i] != NULL ) - { - if ( child->parents[i] == parent ) - { - return true; - } - } - } - for ( i = 0; i < child->parents.size (); i++ ) - { - if ( child->parents[i] != NULL ) - { - if ( IsParentOf ( parent, - child->parents[i] ) ) - { - return true; - } - } - } - return false; -} - -void -SourceFileTest::IncludeTest () -{ - const Project project ( RBUILD_BASE "tests" SSEP "data" SSEP "automaticdependency_include.xml" ); - AutomaticDependency automaticDependency ( project ); - automaticDependency.Process (); - ARE_EQUAL( 4, automaticDependency.sourcefile_map.size () ); - const SourceFile* include = automaticDependency.RetrieveFromCache ( RBUILD_BASE "tests" SSEP "data" SSEP "sourcefile_include.h" ); - IS_NOT_NULL( include ); - const SourceFile* includenext = automaticDependency.RetrieveFromCache ( RBUILD_BASE "tests" SSEP "data" SSEP "sourcefile1" SSEP "sourcefile_includenext.h" ); - IS_NOT_NULL( includenext ); -} - -void -SourceFileTest::FullParseTest () -{ - const Project project ( RBUILD_BASE "tests" SSEP "data" SSEP "automaticdependency.xml" ); - AutomaticDependency automaticDependency ( project ); - automaticDependency.Process (); - ARE_EQUAL( 5, automaticDependency.sourcefile_map.size () ); - const SourceFile* header1 = automaticDependency.RetrieveFromCache ( RBUILD_BASE "tests" SSEP "data" SSEP "sourcefile1_header1.h" ); - IS_NOT_NULL( header1 ); - const SourceFile* recurse = automaticDependency.RetrieveFromCache ( RBUILD_BASE "tests" SSEP "data" SSEP "sourcefile1_recurse.h" ); - IS_NOT_NULL( recurse ); - IS_TRUE( IsParentOf ( header1, - recurse ) ); - IS_FALSE( IsParentOf ( recurse, - header1 ) ); - -} - -void -SourceFileTest::Run () -{ - IncludeTest (); - FullParseTest (); -} +#include "test.h" + +using std::string; + +bool +SourceFileTest::IsParentOf ( const SourceFile* parent, + const SourceFile* child ) +{ + size_t i; + for ( i = 0; i < child->parents.size (); i++ ) + { + if ( child->parents[i] != NULL ) + { + if ( child->parents[i] == parent ) + { + return true; + } + } + } + for ( i = 0; i < child->parents.size (); i++ ) + { + if ( child->parents[i] != NULL ) + { + if ( IsParentOf ( parent, + child->parents[i] ) ) + { + return true; + } + } + } + return false; +} + +void +SourceFileTest::IncludeTest () +{ + const Project project ( RBUILD_BASE "tests" SSEP "data" SSEP "automaticdependency_include.xml" ); + AutomaticDependency automaticDependency ( project ); + automaticDependency.Process (); + ARE_EQUAL( 4, automaticDependency.sourcefile_map.size () ); + const SourceFile* include = automaticDependency.RetrieveFromCache ( RBUILD_BASE "tests" SSEP "data" SSEP "sourcefile_include.h" ); + IS_NOT_NULL( include ); + const SourceFile* includenext = automaticDependency.RetrieveFromCache ( RBUILD_BASE "tests" SSEP "data" SSEP "sourcefile1" SSEP "sourcefile_includenext.h" ); + IS_NOT_NULL( includenext ); +} + +void +SourceFileTest::FullParseTest () +{ + const Project project ( RBUILD_BASE "tests" SSEP "data" SSEP "automaticdependency.xml" ); + AutomaticDependency automaticDependency ( project ); + automaticDependency.Process (); + ARE_EQUAL( 5, automaticDependency.sourcefile_map.size () ); + const SourceFile* header1 = automaticDependency.RetrieveFromCache ( RBUILD_BASE "tests" SSEP "data" SSEP "sourcefile1_header1.h" ); + IS_NOT_NULL( header1 ); + const SourceFile* recurse = automaticDependency.RetrieveFromCache ( RBUILD_BASE "tests" SSEP "data" SSEP "sourcefile1_recurse.h" ); + IS_NOT_NULL( recurse ); + IS_TRUE( IsParentOf ( header1, + recurse ) ); + IS_FALSE( IsParentOf ( recurse, + header1 ) ); + +} + +void +SourceFileTest::Run () +{ + IncludeTest (); + FullParseTest (); +} diff --git a/reactos/tools/rbuild/tests/symboltest.cpp b/reactos/tools/rbuild/tests/symboltest.cpp index 9d6d534667a..007c49d4924 100644 --- a/reactos/tools/rbuild/tests/symboltest.cpp +++ b/reactos/tools/rbuild/tests/symboltest.cpp @@ -1,25 +1,25 @@ -#include "test.h" - -using std::string; - -void SymbolTest::Run() -{ - string projectFilename ( RBUILD_BASE "tests/data/symbol.xml" ); - Project project ( projectFilename ); - - ARE_EQUAL ( 1, project.modules.size () ); - Module& module1 = *project.modules[0]; - - ARE_EQUAL ( 1, module1.stubbedComponents.size () ); - StubbedComponent& component1 = *module1.stubbedComponents[0]; - ARE_EQUAL ( "ntdll.dll", component1.name ); - - ARE_EQUAL ( 2, component1.symbols.size () ); - StubbedSymbol& symbol1 = *component1.symbols[0]; - ARE_EQUAL ( "HeapAlloc@12", symbol1.symbol ); - ARE_EQUAL ( "RtlAllocateHeap", symbol1.newname ); - - StubbedSymbol& symbol2 = *component1.symbols[1]; - ARE_EQUAL ( "LdrAccessResource@16", symbol2.symbol ); - ARE_EQUAL ( "LdrAccessResource@16", symbol2.newname ); -} +#include "test.h" + +using std::string; + +void SymbolTest::Run() +{ + string projectFilename ( RBUILD_BASE "tests/data/symbol.xml" ); + Project project ( projectFilename ); + + ARE_EQUAL ( 1, project.modules.size () ); + Module& module1 = *project.modules[0]; + + ARE_EQUAL ( 1, module1.stubbedComponents.size () ); + StubbedComponent& component1 = *module1.stubbedComponents[0]; + ARE_EQUAL ( "ntdll.dll", component1.name ); + + ARE_EQUAL ( 2, component1.symbols.size () ); + StubbedSymbol& symbol1 = *component1.symbols[0]; + ARE_EQUAL ( "HeapAlloc@12", symbol1.symbol ); + ARE_EQUAL ( "RtlAllocateHeap", symbol1.newname ); + + StubbedSymbol& symbol2 = *component1.symbols[1]; + ARE_EQUAL ( "LdrAccessResource@16", symbol2.symbol ); + ARE_EQUAL ( "LdrAccessResource@16", symbol2.newname ); +} -- 2.17.1