diff options
Diffstat (limited to 'src/tools')
| -rw-r--r-- | src/tools/bin2cpp.cpp | 43 |
1 files changed, 38 insertions, 5 deletions
diff --git a/src/tools/bin2cpp.cpp b/src/tools/bin2cpp.cpp index e0eab28..65e48ed 100644 --- a/src/tools/bin2cpp.cpp +++ b/src/tools/bin2cpp.cpp | |||
| @@ -4,6 +4,7 @@ | |||
| 4 | #include <bu/streamstack.h> | 4 | #include <bu/streamstack.h> |
| 5 | #include <bu/strfilter.h> | 5 | #include <bu/strfilter.h> |
| 6 | #include <bu/taf.h> | 6 | #include <bu/taf.h> |
| 7 | #include <bu/autoconfig.h> | ||
| 7 | 8 | ||
| 8 | #ifdef BU_HAS_DEFLATE | 9 | #ifdef BU_HAS_DEFLATE |
| 9 | #include <bu/deflate.h> | 10 | #include <bu/deflate.h> |
| @@ -18,6 +19,16 @@ | |||
| 18 | #include <bu/base64.h> | 19 | #include <bu/base64.h> |
| 19 | #include <bu/hex.h> | 20 | #include <bu/hex.h> |
| 20 | 21 | ||
| 22 | Bu::String cescape( const Bu::String &sIn ) | ||
| 23 | { | ||
| 24 | Bu::String sOut; | ||
| 25 | for( Bu::String::const_iterator i = sIn.begin(); i; i++ ) | ||
| 26 | { | ||
| 27 | sOut += Bu::String("\\x%1").arg( (int)*i, Bu::Fmt(2).hex() ); | ||
| 28 | } | ||
| 29 | return sOut; | ||
| 30 | } | ||
| 31 | |||
| 21 | using namespace Bu; | 32 | using namespace Bu; |
| 22 | 33 | ||
| 23 | class Options : public OptParser | 34 | class Options : public OptParser |
| @@ -223,12 +234,34 @@ int main( int argc, char *argv[] ) | |||
| 223 | << "\t{" << fSrc.nl; | 234 | << "\t{" << fSrc.nl; |
| 224 | 235 | ||
| 225 | int idx = 0; | 236 | int idx = 0; |
| 226 | for( Bu::StringList::iterator i = opt.slInput.begin(); i; i++ ) | ||
| 227 | { | 237 | { |
| 228 | fSrc << "\t\tcase " << Bu::__calcHashCode( *i ) << "UL: // \"" | 238 | typedef Bu::List<Bu::StringList::iterator> IterList; |
| 229 | << *i << "\"" << fSrc.nl | 239 | typedef Bu::Hash<uint32_t, IterList> IterHashList; |
| 230 | << "\t\t\treturn aFile[" << idx << "];" << fSrc.nl; | 240 | typedef Bu::Hash<Bu::String, int> IdxHash; |
| 231 | idx++; | 241 | |
| 242 | IdxHash hIdx; | ||
| 243 | IterHashList hCodes; | ||
| 244 | for( Bu::StringList::iterator i = opt.slInput.begin(); i; i++ ) | ||
| 245 | { | ||
| 246 | uint32_t uc = Bu::__calcHashCode( *i ); | ||
| 247 | if( !hCodes.has( uc ) ) | ||
| 248 | { | ||
| 249 | hCodes.insert( uc, IterList() ); | ||
| 250 | } | ||
| 251 | hCodes.get( uc ).append( i ); | ||
| 252 | hIdx.insert( *i, idx++ ); | ||
| 253 | } | ||
| 254 | for( IterHashList::iterator r = hCodes.begin(); r; r++ ) | ||
| 255 | { | ||
| 256 | fSrc << "\t\tcase " << r.getKey() << "UL:" << fSrc.nl; | ||
| 257 | for( IterList::iterator i = r.getValue().begin(); i; i++ ) | ||
| 258 | { | ||
| 259 | fSrc << "\t\t\tif( sName == \"" << cescape(*(*i)) << "\" ) // " | ||
| 260 | << *(*i) << fSrc.nl | ||
| 261 | << "\t\t\t\treturn aFile[" << hIdx.get(*(*i)) << "];" << fSrc.nl; | ||
| 262 | } | ||
| 263 | fSrc << "\t\t\tbreak;" << fSrc.nl; | ||
| 264 | } | ||
| 232 | } | 265 | } |
| 233 | fSrc << "\t}" << fSrc.nl | 266 | fSrc << "\t}" << fSrc.nl |
| 234 | << "\tthrow Bu::ExceptionBase(\"No file matching \\\"%s\\\" found.\", sName.getStr() );" << fSrc.nl | 267 | << "\tthrow Bu::ExceptionBase(\"No file matching \\\"%s\\\" found.\", sName.getStr() );" << fSrc.nl |
