├── .gitmodules ├── LICENSE ├── README.md ├── bundler.cc ├── bundler.exe ├── bundler.osx └── deps ├── bundler.ico ├── bundler.png └── rh ├── Help ├── bm00.png ├── bm01.png ├── bm02.png ├── bm03.png ├── bm04.png ├── bm05.png ├── bm06.png ├── bm09.png ├── bm10.png ├── bm11.png ├── bm12.png ├── bm14.png ├── desktop.ini ├── help.html └── resource_hacker.png ├── ReadMe.txt ├── ResourceHacker.def ├── ResourceHacker.exe ├── ResourceHacker.ini └── changes.txt /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "bundle"] 2 | path = deps/bundle 3 | url = https://github.com/r-lyeh/bundle 4 | [submodule "bubble"] 5 | path = deps/bubble 6 | url = https://github.com/r-lyeh/bubble 7 | [submodule "sao"] 8 | path = deps/sao 9 | url = https://github.com/r-lyeh/sao 10 | [submodule "wire"] 11 | path = deps/wire 12 | url = https://github.com/r-lyeh/wire 13 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2015 r-lyeh (https://github.com/r-lyeh) 2 | 3 | This software is provided 'as-is', without any express or implied 4 | warranty. In no event will the authors be held liable for any damages 5 | arising from the use of this software. 6 | 7 | Permission is granted to anyone to use this software for any purpose, 8 | including commercial applications, and to alter it and redistribute it 9 | freely, subject to the following restrictions: 10 | 11 | 1. The origin of this software must not be misrepresented; you must not 12 | claim that you wrote the original software. If you use this software 13 | in a product, an acknowledgment in the product documentation would be 14 | appreciated but is not required. 15 | 2. Altered source versions must be plainly marked as such, and must not be 16 | misrepresented as being the original software. 17 | 3. This notice may not be removed or altered from any source distribution. 18 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | bundler :package: 2 | ======= 3 | 4 | A command-line archiver that uses [bundle compression suite](https://github.com/r-lyeh/bundle). 5 | 6 | ### Usage 7 | ```lisp 8 | bundler: Bundler 2.1.3 (64-bit RELEASE). Compiled on Feb 8 2016 - https://github.com/r-lyeh/bundler 9 | 10 | Usage: 11 | bundler command archive.zip files[...] [options[...]] 12 | bundler command archive.zip @filelist.txt[...] [options[...]] 13 | 14 | Command: 15 | a or add pack files into archive 16 | p or pack pack files into archive (same than above) 17 | m or move move files to archive 18 | x or extract extract archive 19 | t or test test archive 20 | l or list list archive 21 | Options: 22 | -h or --help this screen 23 | -v or --verbose show extra info 24 | -b or --bypass-slow SIZE bypass slow compressors on files larger than given size (in KiB). defaults to 0 (disabled) 25 | -d or --delete ENCODER delete compression encoder from useable list (useful after -u all) 26 | -f or --flat discard path filename information, if using --pack or --move 27 | -i or --ignore PERCENTAGE ignore compression on files that compress less than given treshold percentage. defaults to 95.0 (percent) 28 | -q or --quiet be silent, unless errors are found 29 | -r or --recursive recurse subdirectories 30 | -t or --threads NUM maximum number of parallel threads, if possible. defaults to 8 (threads) 31 | -u or --use ENCODER use compression encoder = { none, all, lz4, lz4f, zstd, zstdf, lzma20 (default), lzma25, brotli9, brotli11, 32 | bsc, csc20, shrinker, shoco, miniz, lzip, zpaq, tangelo, zmolly, zling, bcm, mcm, crush, lzjb, bzip2 } (*) 33 | 34 | (*): Specify as many encoders as desired. Bundler will evaluate and choose the best compressor for each file. 35 | ``` 36 | 37 | ### Build 38 | 39 | ``` 40 | git clone https://github.com/r-lyeh/bundler --recursive 41 | ``` 42 | 43 | ``` 44 | echo windows && cl bundler.cc -I deps /Ox /Oy /MT /DNDEBUG /DBUNDLE_USE_OMP_TIMER=1 /EHsc /link setargv.obj 45 | echo windows && mt.exe -manifest bundler.exe.manifest -outputresource:bundler.exe;1 46 | echo windows && deps\rh\ResourceHacker.exe -addoverwrite bundler.exe,bundler.exe,deps\bundler.ico,ICONGROUP,MAINICON,0 47 | echo mac osx && clang++ bundler.cc -obundler.osx -I deps -O3 -DNDEBUG --std=c++11 48 | ``` 49 | 50 | ### Changelog 51 | - v2.1.3 (2016/02/08): Add BZIP2 support 52 | - v2.1.2 (2015/12/04): Update Bundle library 53 | - v2.1.1 (2015/12/02): Add CRUNCH/LZJB support 54 | - v2.1.0 (2015/11/24): Add ZMOLLY/ZLING/ZSTDF/TANGELO/BCM/MCM support 55 | - v2.0.9 (2015/10/29): Display extra listing information 56 | - v2.0.8 (2015/10/10): Display compression ranking for all processed files; new icon 57 | - v2.0.7 (2015/10/05): Recreate folder structure when unpacking (@snail23) 58 | - v2.0.6 (2015/09/28): Add CSC20/SHRINKER support 59 | - v2.0.5 (2015/09/24): Pump up bundle (pump up brotli; split brotli9/11 enums) 60 | - v2.0.4 (2015/04/08): BSC stream support 61 | - v2.0.3 (2015/04/07): Pump up bundle (new brotli; new zstd; split lzma20/25 enums) 62 | - v2.0.2 (2015/04/06): Add bypass flag for slow compressors 63 | - v2.0.2 (2015/04/06): Pump up bubble 64 | - v2.0.1 (2015/04/06): Add @filelist.txt support 65 | - v2.0.0 (2015/01/28): Enforce brotli single-thread 66 | - v2.0.0 (2015/01/28): Add zstd 67 | - v1.8.5 (2014/08/29): Bugfix de/compressing empty data 68 | - v1.8.5 (2014/08/29): Write aligned data unconditionally 69 | - v1.8.4 (2014/07/31): Limit up to 16 threads max 70 | - v1.8.3 (2014/07/17): Bugfix case when decompressing malformed streams 71 | - v1.8.2 (2014/06/30): Pump up bundle 72 | - v1.8.1 (2014/06/27): Add list command 73 | - v1.1.8 (2014/06/26): Pump up bundle 74 | - v1.1.8 (2014/06/26): Remove extra check guard in test mode 75 | - v1.1.8 (2014/06/26): Extract mode 76 | - v1.1.7 (2014/06/23): Add lzh4c mode 77 | - v1.1.6 (2014/06/09): Add zpaq, -a/--add aliases, bugfix --quiet 78 | - v1.1.5 (2014/06/05): Pump up bundle 79 | - v1.1.5 (2014/06/05): Default to lzma sdk 9.22 80 | - v1.1.5 (2014/06/05): Add about dialog 81 | - v1.1.4 (2014/06/02): Pump up libraries, bugfix for missing files in bundles and dialogs on top 82 | - v1.1.4 (2014/06/02): Add multithread support (experimental) 83 | - v1.1.3 (2014/05/28): Pump up sao and bundle libraries 84 | - v1.1.2 (2014/05/23): Bugfix for nil sized files 85 | - v1.1.2 (2014/05/23): Simplify usage 86 | - v1.1.2 (2014/05/23): Handle destructive operations safely 87 | - v1.1.1 (2014/05/21): Add optional arg to specify compression algorithm 88 | - v1.1.0 (2014/05/20): Add move parameter 89 | - v1.1.0 (2014/05/20): Bugfix crash with very small files 90 | - v1.1.0 (2014/05/20): Add progress dialog 91 | - v1.0.0 (2014/05/14): Initial version 92 | -------------------------------------------------------------------------------- /bundler.cc: -------------------------------------------------------------------------------- 1 | // @todo: bundle: flush zip stream while compressing (flushing a single memory block when compressing large folders is a crazy idea) 2 | // @todo: bundler: parallel unpack (good idea?) 3 | // @todo: bundler: if lzma_big_dicts * num threads > current_mem force threads=1; || warn "allocation error" 4 | 5 | #ifdef _WIN32 6 | #define NOMINMAX 7 | #include 8 | #include 9 | #define mkdir(str,mode) _mkdir(str) 10 | #else 11 | #include 12 | #endif 13 | 14 | #include 15 | #include 16 | #include 17 | #include 18 | 19 | #include 20 | #include 21 | #include 22 | #include 23 | #include 24 | #include 25 | #include 26 | #include 27 | #include 28 | 29 | #define BUNDLER_VERSION "2.1.3" /* (2016/02/08) add BZIP2 support 30 | #define BUNDLER_VERSION "2.1.2" // (2015/12/04) update BUNDLE library 31 | #define BUNDLER_VERSION "2.1.1" // (2015/12/02) add CRUSH/LZJB support 32 | #define BUNDLER_VERSION "2.1.0" // (2015/11/24) add ZMOLLY/ZLING/ZSTDF/TANGELO/BCM/MCM support 33 | #define BUNDLER_VERSION "2.0.9" // (2015/10/29) display extra listing information 34 | #define BUNDLER_VERSION "2.0.8" // (2015/10/09) display compression ranking for all processed files; new icon 35 | #define BUNDLER_VERSION "2.0.7" // (2015/10/05) recreate folder structure when unpacking (@snail23) 36 | #define BUNDLER_VERSION "2.0.6" // (2015/09/28) add CSC/SHRINKER support 37 | #define BUNDLER_VERSION "2.0.5" // (2015/09/24) pump up bundle (pump up brotli; split brotli9/11) 38 | #define BUNDLER_VERSION "2.0.4" // (2015/04/08) BSC stream support 39 | #define BUNDLER_VERSION "2.0.3" // (2015/04/07) pump up bundle (new brotli; new zstd; split lzma20/25) 40 | #define BUNDLER_VERSION "2.0.2" // (2015/04/06) add bypass flag for slow compressors; pump up bubble 41 | #define BUNDLER_VERSION "2.0.1" // (2015/04/06) add @filelist.txt support 42 | #define BUNDLER_VERSION "2.0.0" // (2015/01/28) enforce brotli single-thread; add zstd 43 | #define BUNDLER_VERSION "1.8.5" // (2014/08/29) bugfix de/compressing empty data; write aligned data unconditionally 44 | #define BUNDLER_VERSION "1.8.4" // (2014/07/31) limit up to 16 threads max 45 | #define BUNDLER_VERSION "1.8.3" // (2014/07/17) bugfix case when decompressing malformed streams 46 | #define BUNDLER_VERSION "1.8.2" // (2014/06/30) pump up bundle 47 | #define BUNDLER_VERSION "1.8.1" // (2014/06/27) add list command; 48 | #define BUNDLER_VERSION "1.1.8" // (2014/06/26) pump up bundle; remove extra check guard in test mode; extract mode 49 | #define BUNDLER_VERSION "1.1.7" // (2014/06/23) add lzh4c mode 50 | #define BUNDLER_VERSION "1.1.6" // (2014/06/09) add zpaq, -a/--add aliases, bugfix --quiet 51 | #define BUNDLER_VERSION "1.1.5" // (2014/06/05) pump up bundle; default to lzma sdk 9.22; add about dialog 52 | #define BUNDLER_VERSION "1.1.4" // (2014/06/02) pump up libraries, bugfix for missing files in bundles and dialogs on top; add multithread support (experimental) 53 | #define BUNDLER_VERSION "1.1.3" // (2014/05/28) pump up sao and bundle libraries 54 | #define BUNDLER_VERSION "1.1.2" // (2014/05/23) bugfix for nil sized files; simplify usage; handle destructive operations safely 55 | #define BUNDLER_VERSION "1.1.1" // (2014/05/21) add optional arg to specify compression algorithm 56 | #define BUNDLER_VERSION "1.1.0" // (2014/05/20) add move parameter; bugfix crash with very small files; add progress dialog 57 | #define BUNDLER_VERSION "1.0.0" // (2014/05/14) initial version */ 58 | 59 | #if ULONG_MAX == 4294967295 60 | # define BUNDLER_BITS "64-bit" 61 | #else 62 | # define BUNDLER_BITS "32-bit" 63 | #endif 64 | 65 | #define BUNDLER_BUILD "DEBUG" 66 | #define BUNDLER_URL "https://github.com/r-lyeh/bundler" 67 | #define BUNDLER_TEXT "Bundler " BUNDLER_VERSION " (" BUNDLER_BITS " " BUNDLER_BUILD ")" 68 | 69 | #if defined(NDEBUG) || defined(_NDEBUG) 70 | #undef BUNDLER_BUILD 71 | #define BUNDLER_BUILD "RELEASE" 72 | #endif 73 | 74 | auto now = []() { 75 | return std::chrono::steady_clock::now(); 76 | }; 77 | auto then = now(); 78 | auto taken = []() -> double { 79 | return std::chrono::duration_cast< std::chrono::milliseconds >( now() - then ).count() / 1000.0; 80 | }; 81 | 82 | struct getopt : public std::map< wire::string, wire::string > 83 | { 84 | getopt() 85 | {} 86 | 87 | explicit 88 | getopt( int argc, const char **argv ) { 89 | wire::strings args( argc, argv ); 90 | 91 | // create key=value and key= args as well 92 | for( auto &it : args ) { 93 | wire::strings tokens = it.split( "=" ); 94 | 95 | if( tokens.size() == 3 && tokens[1] == "=" ) 96 | (*this)[ tokens[0] ] = tokens[2]; 97 | else 98 | if( tokens.size() == 2 && tokens[1] == "=" ) 99 | (*this)[ tokens[0] ] = true; 100 | else 101 | if( tokens.size() == 1 && tokens[0] != argv[0] ) 102 | (*this)[ tokens[0] ] = true; 103 | } 104 | 105 | // create args 106 | while( argc-- ) { 107 | (*this)[ argc ] = argv[argc]; 108 | } 109 | } 110 | 111 | bool has( const wire::string &op ) const { 112 | return this->find(op) != this->end(); 113 | } 114 | 115 | std::string str() const { 116 | wire::string ss; 117 | for( auto &it : *this ) 118 | ss << it.first << "=" << it.second << ','; 119 | return ss.str(); 120 | } 121 | 122 | std::string cmdline() const { 123 | wire::string cmd; 124 | 125 | // concatenate args 126 | for( unsigned i = 0; has(i); ++i ) { 127 | const auto it = this->find(i); 128 | cmd << it->second << ' '; 129 | } 130 | 131 | // remove trailing space, if needed 132 | if( cmd.size() ) 133 | cmd.pop_back(); 134 | 135 | return cmd; 136 | } 137 | }; 138 | 139 | std::string head( const std::string &appname ) { 140 | std::stringstream cout; 141 | cout << appname << ": " << BUNDLER_TEXT ". Compiled on " __DATE__ " - " BUNDLER_URL; 142 | return cout.str(); 143 | } 144 | 145 | std::string help( const std::string &appname ) { 146 | std::stringstream cout; 147 | cout << std::endl; 148 | cout << "Usage:" << std::endl; 149 | cout << "\t" << appname << " command archive.zip files[...] [options[...]]" << std::endl; 150 | cout << "\t" << appname << " command archive.zip @filelist.txt[...] [options[...]]" << std::endl; 151 | cout << std::endl; 152 | cout << "Command:" << std::endl; 153 | cout << "\ta or add pack files into archive" << std::endl; 154 | cout << "\tp or pack pack files into archive (same than above)" << std::endl; 155 | cout << "\tm or move move files to archive" << std::endl; 156 | cout << "\tx or extract extract archive" << std::endl; 157 | cout << "\tt or test test archive" << std::endl; 158 | cout << "\tl or list list archive" << std::endl; 159 | cout << "Options:" << std::endl; 160 | cout << "\t-h or --help this screen" << std::endl; 161 | cout << "\t-v or --verbose show extra info" << std::endl; 162 | cout << "\t-b or --bypass-slow SIZE bypass slow compressors on files larger than given size (in KiB). defaults to 0 (disabled)" << std::endl; 163 | cout << "\t-d or --delete ENCODER delete compression encoder from useable list (useful after -u all)" << std::endl; 164 | cout << "\t-f or --flat discard path filename information, if using --pack or --move" << std::endl; 165 | cout << "\t-i or --ignore PERCENTAGE ignore compression on files that compress less than given treshold percentage. defaults to 95.0 (percent)" << std::endl; 166 | cout << "\t-q or --quiet be silent, unless errors are found" << std::endl; 167 | cout << "\t-r or --recursive recurse subdirectories" << std::endl; 168 | cout << "\t-t or --threads NUM maximum number of parallel threads, if possible. defaults to 8 (threads)" << std::endl; 169 | cout << "\t-u or --use ENCODER use compression encoder = { none, all, lz4, lz4f, zstd, zstdf, lzma20 (default), lzma25, brotli9, brotli11," << std::endl 170 | << "\t bsc, csc20, shrinker, shoco, miniz, lzip, zpaq, tangelo, zmolly, zling, bcm, mcm, crush, lzjb, bzip2 } (*)" << std::endl; 171 | cout << std::endl; 172 | cout << "\t(*): Specify as many encoders as desired. Bundler will evaluate and choose the best compressor for each file." << std::endl; 173 | cout << std::endl; 174 | 175 | return cout.str(); 176 | } 177 | 178 | template 179 | double ratio( const T &A, const U &B ) { 180 | if( A <= 0 || B <= 0 ) return 0; 181 | double min = ( A < B ? double(A) : double(B) ); 182 | double max = ( A >= B ? double(A) : double(B) ); 183 | double ratio = (100 * min) / max; 184 | return ratio; 185 | } 186 | 187 | int main( int argc, const char **argv ) { 188 | struct getopt args( argc, argv ); 189 | 190 | if( args.has("-?") || args.has("-h") || args.has("--help") || args.size() <= 3 ) { 191 | std::cout << head(args[0]) << std::endl; 192 | std::cout << help(args[0]); 193 | 194 | bubble::show( bubble::string() << 195 | "title.text=About;" 196 | "body.icon=8;" //8 197 | "head.text=" << BUNDLER_TEXT << ";" 198 | "body.text=" << "" << BUNDLER_URL << ";" 199 | "style.minimizable=1;" 200 | ); 201 | 202 | return 0; 203 | } 204 | 205 | const bool moveit = args[1] == "m" || args[1] == "move"; 206 | const bool packit = args[1] == "p" || args[1] == "pack" || args[1] == "a" || args[1] == "add"; 207 | const bool testit = args[1] == "t" || args[1] == "test"; 208 | const bool upckit = args[1] == "x" || args[1] == "extract"; 209 | const bool listit = args[1] == "l" || args[1] == "list"; 210 | 211 | std::vector encoders, fast_encoders; 212 | const std::string archive = args[2]; 213 | unsigned max_threads = 8; 214 | 215 | const bool flat = args.has("-f") || args.has("--flat"); 216 | const bool quiet = args.has("-q") || args.has("--quiet"); 217 | const bool recursive = args.has("-r") || args.has("--recursive"); 218 | const bool use = args.has("-u") || args.has("--use"); 219 | const bool verbose = ( args.has("-v") || args.has("--verbose") ) && !quiet; 220 | double treshold = 95.00; // ignore compression settings if compression ratio below of given treshold 221 | size_t lte = 0; // bypass slow encoders on files larger or equal than given size (in KiB) 222 | 223 | if( !quiet ) { 224 | std::cout << head(args[0]) << std::endl; 225 | } 226 | 227 | if( verbose ) { 228 | std::cout << "options: "; 229 | std::cout << "moveit=" << moveit << ','; 230 | std::cout << "packit=" << packit << ','; 231 | std::cout << "testit=" << testit << ','; 232 | std::cout << "xtrcit=" << upckit << ','; 233 | std::cout << "archive=" << archive << ','; 234 | std::cout << "flat=" << flat << ','; 235 | std::cout << "quiet=" << quiet << ','; 236 | std::cout << "recursive=" << recursive << ','; 237 | std::cout << "use=" << use << ','; 238 | std::cout << "verbose=" << verbose << ','; 239 | std::cout << "treshold=" << treshold << ','; 240 | std::cout << "lte=" << lte; 241 | /* 242 | std::cout << "args="; 243 | for( auto &arg : args ) { 244 | std::cout << arg.first << ' '; 245 | } 246 | */ 247 | std::cout << std::endl; 248 | } 249 | 250 | int numerrors = 0, processed = 0; 251 | std::uint64_t total_input = 0, total_output = 0; 252 | 253 | if( !moveit && !packit && !testit && !upckit && !listit ) { 254 | std::cout << help(args[0]); 255 | std::cout << "No command." << std::endl; 256 | return -1; 257 | } 258 | 259 | bundle::archive archived; 260 | sao::folder to_pack; 261 | 262 | for( int i = 3; args.has(i); ++i ) { 263 | if( args[i] == "-f" || args[i] == "--flat" || 264 | args[i] == "-q" || args[i] == "--quiet" || 265 | args[i] == "-r" || args[i] == "--recursive" || 266 | args[i] == "-v" || args[i] == "--verbose" ) { 267 | continue; 268 | } 269 | if( args[i] == "-t" || args[i] == "--threads" ) { 270 | if( args.has(++i) ) { 271 | max_threads = args[i].as(); 272 | } 273 | continue; 274 | } 275 | if( args[i] == "-i" || args[i] == "--ignore" ) { 276 | if( args.has(++i) ) { 277 | treshold = args[i].as(); 278 | } 279 | continue; 280 | } 281 | if( args[i] == "-b" || args[i] == "--bypass-slow" ) { 282 | if( args.has(++i) ) { 283 | lte = args[i].as(); 284 | } 285 | continue; 286 | } 287 | if( args[i] == "-u" || args[i] == "--use" ) { 288 | if( args.has(++i) ) { 289 | /**/ if( args[i].lowercase() == "bcm" ) encoders.push_back( bundle::BCM ); 290 | else if( args[i].lowercase() == "brotli11" ) encoders.push_back( bundle::BROTLI11 ); 291 | else if( args[i].lowercase() == "brotli9" ) encoders.push_back( bundle::BROTLI9 ); 292 | else if( args[i].lowercase() == "bsc" ) encoders.push_back( bundle::BSC ); 293 | else if( args[i].lowercase() == "bzip2" ) encoders.push_back( bundle::BZIP2 ), fast_encoders.push_back( bundle::BZIP2 ); 294 | else if( args[i].lowercase() == "crush" ) encoders.push_back( bundle::CRUSH ), fast_encoders.push_back( bundle::CRUSH ); 295 | else if( args[i].lowercase() == "csc20" ) encoders.push_back( bundle::CSC20 ); 296 | else if( args[i].lowercase() == "deflate" ) encoders.push_back( bundle::MINIZ ), fast_encoders.push_back( bundle::MINIZ ); 297 | else if( args[i].lowercase() == "lz4" ) encoders.push_back( bundle::LZ4 ), fast_encoders.push_back( bundle::LZ4 ); 298 | else if( args[i].lowercase() == "lz4f" ) encoders.push_back( bundle::LZ4F ), fast_encoders.push_back( bundle::LZ4F ); 299 | else if( args[i].lowercase() == "lzip" ) encoders.push_back( bundle::LZIP ); 300 | else if( args[i].lowercase() == "lzjb" ) encoders.push_back( bundle::LZJB ), fast_encoders.push_back( bundle::LZJB ); 301 | else if( args[i].lowercase() == "lzma" ) encoders.push_back( bundle::LZMA20 ), fast_encoders.push_back( bundle::LZMA20 ); 302 | else if( args[i].lowercase() == "lzma20" ) encoders.push_back( bundle::LZMA20 ), fast_encoders.push_back( bundle::LZMA20 ); 303 | else if( args[i].lowercase() == "lzma25" ) encoders.push_back( bundle::LZMA25 ), fast_encoders.push_back( bundle::LZMA25 ); 304 | else if( args[i].lowercase() == "mcm" ) encoders.push_back( bundle::MCM ); 305 | else if( args[i].lowercase() == "miniz" ) encoders.push_back( bundle::MINIZ ), fast_encoders.push_back( bundle::MINIZ ); 306 | else if( args[i].lowercase() == "none" ) encoders.push_back( bundle::RAW ), fast_encoders.push_back( bundle::RAW ); 307 | else if( args[i].lowercase() == "shoco" ) encoders.push_back( bundle::SHOCO ), fast_encoders.push_back( bundle::SHOCO ); 308 | else if( args[i].lowercase() == "shrinker" ) encoders.push_back( bundle::SHRINKER ), fast_encoders.push_back( bundle::SHRINKER ); 309 | else if( args[i].lowercase() == "tangelo" ) encoders.push_back( bundle::TANGELO ); 310 | else if( args[i].lowercase() == "zling" ) encoders.push_back( bundle::ZLING ), fast_encoders.push_back( bundle::ZLING ); 311 | else if( args[i].lowercase() == "zmolly" ) encoders.push_back( bundle::ZMOLLY ); 312 | else if( args[i].lowercase() == "zpaq" ) encoders.push_back( bundle::ZPAQ ); 313 | else if( args[i].lowercase() == "zstd" ) encoders.push_back( bundle::ZSTD ), fast_encoders.push_back( bundle::ZSTD ); 314 | else if( args[i].lowercase() == "zstdf" ) encoders.push_back( bundle::ZSTDF ), fast_encoders.push_back( bundle::ZSTDF ); 315 | else if( args[i].lowercase() == "all" ) encoders = fast_encoders = bundle::encodings(); 316 | else --i; 317 | } 318 | continue; 319 | } 320 | if( args[i] == "-d" || args[i] == "--delete" ) { 321 | auto erase = [&]( int Q ) { 322 | encoders.erase( std::remove( encoders.begin(), encoders.end(), Q ), encoders.end() ); 323 | fast_encoders.erase( std::remove( fast_encoders.begin(), fast_encoders.end(), Q ), fast_encoders.end() ); 324 | }; 325 | if( args.has(++i) ) { 326 | /**/ if( args[i].lowercase() == "bcm" ) erase( bundle::BCM ); 327 | else if( args[i].lowercase() == "brotli11" ) erase( bundle::BROTLI11 ); 328 | else if( args[i].lowercase() == "brotli9" ) erase( bundle::BROTLI9 ); 329 | else if( args[i].lowercase() == "bsc" ) erase( bundle::BSC ); 330 | else if( args[i].lowercase() == "bzip2" ) erase( bundle::BZIP2 ); 331 | else if( args[i].lowercase() == "crush" ) erase( bundle::CRUSH ); 332 | else if( args[i].lowercase() == "csc20" ) erase( bundle::CSC20 ); 333 | else if( args[i].lowercase() == "deflate" ) erase( bundle::MINIZ ); 334 | else if( args[i].lowercase() == "lz4" ) erase( bundle::LZ4 ); 335 | else if( args[i].lowercase() == "lz4f" ) erase( bundle::LZ4F ); 336 | else if( args[i].lowercase() == "lzip" ) erase( bundle::LZIP ); 337 | else if( args[i].lowercase() == "lzjb" ) erase( bundle::LZJB ); 338 | else if( args[i].lowercase() == "lzma" ) erase( bundle::LZMA20 ); 339 | else if( args[i].lowercase() == "lzma20" ) erase( bundle::LZMA20 ); 340 | else if( args[i].lowercase() == "lzma25" ) erase( bundle::LZMA25 ); 341 | else if( args[i].lowercase() == "mcm" ) erase( bundle::MCM ); 342 | else if( args[i].lowercase() == "miniz" ) erase( bundle::MINIZ ); 343 | else if( args[i].lowercase() == "shoco" ) erase( bundle::SHOCO ); 344 | else if( args[i].lowercase() == "shrinker" ) erase( bundle::SHRINKER ); 345 | else if( args[i].lowercase() == "tangelo" ) erase( bundle::TANGELO ); 346 | else if( args[i].lowercase() == "zling" ) erase( bundle::ZLING ); 347 | else if( args[i].lowercase() == "zmolly" ) erase( bundle::ZMOLLY ); 348 | else if( args[i].lowercase() == "zpaq" ) erase( bundle::ZPAQ ); 349 | else if( args[i].lowercase() == "zstd" ) erase( bundle::ZSTD ); 350 | else if( args[i].lowercase() == "zstdf" ) erase( bundle::ZSTDF ); 351 | else --i; 352 | } 353 | continue; 354 | } 355 | 356 | if( args[i][0] == '@' ) { 357 | // is it a @list.txt kind of file ? 358 | std::ifstream ifs( &args[i][1] ); 359 | if( ifs.good() ) { 360 | std::stringstream ss; 361 | if( ss << ifs.rdbuf() ) { 362 | auto lines = wire::string( ss.str() ).tokenize("\t\f\v\r\n"); 363 | for( auto end = lines.size(), it = end - end; it < end; ++it ) { 364 | to_pack.include( lines[it], {"*"}, recursive ); 365 | } 366 | } 367 | } 368 | } else { 369 | // regular file or mask 370 | to_pack.include( args[i], {"*"}, recursive ); 371 | } 372 | } 373 | 374 | if( encoders.empty() ) { 375 | encoders.push_back( bundle::LZMA20 ); 376 | } 377 | 378 | if( fast_encoders.empty() ) { 379 | fast_encoders.push_back( bundle::LZMA20 ); 380 | } 381 | 382 | if( (packit || moveit) && to_pack.empty() ) { 383 | std::cout << help(args[0]); 384 | std::cout << "No files provided." << std::endl; 385 | return -1; 386 | } 387 | 388 | int progress_pct = 0, progress_idx = 0, appexit = 0; 389 | std::string title_mode, title_name; 390 | std::thread bubble( [&]() { 391 | if( !quiet ) 392 | bubble::show( bubble::string() << 393 | "title.text=" << BUNDLER_TEXT ";" 394 | "body.icon=8;" 395 | "head.text=;" 396 | "body.text=;" 397 | "style.minimizable=1;" 398 | // "style.minimized=1;" 399 | "progress=0;", 400 | [&]( bubble::vars &vars ) { 401 | vars["head.text"] = title_mode; 402 | vars["title.text"] = std::string() + BUNDLER_TEXT " - " + std::to_string( progress_pct > 100 ? 100 : progress_pct ) + "%"; 403 | vars["progress"] = progress_pct; 404 | vars["body.text"] = title_name; 405 | if( appexit ) vars["exit"] = 0; 406 | } 407 | ); 408 | } ) ; 409 | 410 | auto readfile = [&]( const std::string &pathfile ) -> std::pair { 411 | std::stringstream ss; 412 | std::ifstream file( pathfile.c_str(), std::ios::binary | std::ios::ate); 413 | if( file.good() && !file.tellg() ) 414 | return std::pair( true, std::string() ); 415 | std::ifstream ifs( pathfile.c_str(), std::ios::binary ); 416 | if( ifs.good() ) { 417 | if( ss << ifs.rdbuf() ) 418 | return std::pair( true, ss.str() ); 419 | } 420 | std::cerr << "[FAIL] " << pathfile << ": cannot read file" << std::endl; 421 | numerrors ++; 422 | return std::pair( false, std::string() ); 423 | }; 424 | 425 | auto writefile = [&]( const std::string &pathfile, const std::string &data ) -> bool { 426 | std::ofstream ofs( pathfile.c_str(), std::ios::binary ); 427 | if( ofs.good() ) { 428 | ofs.write( &data[0], data.size() ); 429 | if( ofs.good() ) { 430 | return true; 431 | } 432 | } 433 | std::cerr << "[FAIL] " << pathfile << ": cannot write to disk" << std::endl; 434 | numerrors ++; 435 | return false; 436 | }; 437 | 438 | auto flatten = []( const std::string &pathfile ) -> std::string { 439 | unsigned a = pathfile.find_last_of('/'); a = ( a == std::string::npos ? 0 : a + 1 ); 440 | unsigned b = pathfile.find_last_of('\\'); b = ( b == std::string::npos ? 0 : b + 1 ); 441 | return pathfile.substr( a > b ? a : b ); 442 | }; 443 | 444 | auto normalize = []( std::string pathfile ) -> std::string { 445 | for( auto &p : pathfile ) { 446 | if( p == '\\' ) p = '/'; 447 | if( p == ':' ) p = '/'; 448 | } 449 | return pathfile.size() && pathfile[0] == '/' ? pathfile.substr(1) : pathfile; 450 | }; 451 | 452 | // app starts here 453 | 454 | std::vector threads; 455 | auto wait_for_threads = [&]() { 456 | for( auto &in : threads ) { 457 | if( in.joinable() ) { 458 | in.join(); 459 | } 460 | } 461 | }; 462 | 463 | progress_idx = 0; 464 | 465 | if( moveit || packit ) { 466 | 467 | bool single_thread = false; 468 | for( auto &PACKING_ALGORITHM : encoders ) { 469 | if( PACKING_ALGORITHM == bundle::ZPAQ || PACKING_ALGORITHM == bundle::BROTLI11 || PACKING_ALGORITHM == bundle::BROTLI9 ) { 470 | single_thread = true; 471 | } 472 | } 473 | 474 | std::string algorithms; 475 | for( auto &u : encoders ) { algorithms += std::string( bundle::name_of(u) ) + ","; } 476 | if( algorithms.size() ) algorithms.pop_back(); 477 | title_mode = std::string() + ( packit ? "pack" : "move" ) + " (" + algorithms + ")"; 478 | 479 | archived.resize( to_pack.size() ); 480 | 481 | for( auto &file : to_pack ) { 482 | progress_pct = (++progress_idx * 100) / to_pack.size(); 483 | 484 | if( file.is_dir() ) { 485 | title_name.clear(); 486 | continue; 487 | } else { 488 | title_name = file.name(); 489 | } 490 | 491 | static std::mutex mutex; 492 | 493 | threads.emplace_back( [&]( int idx, std::string filename ){ 494 | 495 | auto &with = archived[idx]; 496 | 497 | auto pair = readfile( filename ); 498 | const std::string &input = pair.second; 499 | 500 | if( !pair.first ) { 501 | return; 502 | } 503 | 504 | auto measures = bundle::measures( input, lte && (input.size() >= lte) * 1024 ? fast_encoders : encoders ); 505 | 506 | auto slot1 = bundle::sort_smallest_encoders( measures, 100.00 - treshold ); // for_fastest_decompressor 507 | auto slot2 = bundle::sort_fastest_decoders( measures ); 508 | bool skipped = slot1.empty(); 509 | 510 | const std::string &output = skipped ? input : measures[ slot1[0] ].packed; 511 | 512 | double ratio = ::ratio( input.size(), output.size() ); 513 | bool ignored = ratio >= treshold; 514 | 515 | bool valid = !skipped && !ignored; 516 | 517 | with["name"] = flat ? flatten( normalize(filename) ) : normalize(filename); 518 | with["data"] = valid ? output : input; 519 | //with["/**/"] = valid ? with.toc() : std::string(); 520 | 521 | mutex.lock(); 522 | 523 | if( !quiet ) { 524 | std::string rank, sep; 525 | if( valid ) { 526 | for( auto &slot : slot1 ) { 527 | rank += sep + bundle::name_of( measures[ slot ].q ); 528 | sep = "<"; 529 | } 530 | // update title w/ latest rank 531 | title_mode = std::string() + ( packit ? "pack" : "move" ) + " (" + rank + ")"; 532 | } else { 533 | rank = "skipped"; 534 | } 535 | std::cout << "[ OK ] " /*<< title_mode << ": "*/ << filename << ": " << input.size() << " -> " << output.size() << " (" << ratio << "%) (" << rank << ")" << std::endl; 536 | } 537 | 538 | total_input += input.size(); 539 | total_output += valid ? output.size() : input.size(); 540 | 541 | mutex.unlock(); 542 | }, processed++, file.name() ); 543 | 544 | if( single_thread ) { 545 | if( threads.back().joinable() ) { 546 | threads.back().join(); 547 | } 548 | } 549 | 550 | if( threads.size() > max_threads ) { 551 | wait_for_threads(); 552 | threads.clear(); 553 | } 554 | } 555 | 556 | wait_for_threads(); 557 | progress_pct = 101; // show marquee 558 | 559 | if( 0 == numerrors ) { 560 | if( !quiet ) { 561 | std::cout << "[ ] flushing to disk..." << '\r'; 562 | } 563 | archived.resize( processed ); 564 | bool ok = writefile( archive, archived.bnd() ); 565 | if( !quiet ) { 566 | std::cout << ( ok ? "[ OK ] " : "[FAIL] " ) << "flushing to disk..." << std::endl; 567 | } 568 | } 569 | 570 | if( 0 == numerrors && verbose ) { 571 | std::cout << "TOC " << archived.toc() << std::endl; 572 | } 573 | 574 | if( 0 == numerrors && moveit ) { 575 | for( auto &file : to_pack ) { 576 | bool ok = sao::file( file ).remove(); 577 | if( !ok ) numerrors ++; 578 | if( !ok ) std::cout << "[FAIL] cannot delete file: " << file.name() << std::endl; 579 | } 580 | } 581 | 582 | } else { 583 | // testit, listit or extractit 584 | title_mode = listit ? "list" : (testit ? "test" : "extract"); 585 | 586 | { 587 | auto result = readfile( archive ); 588 | if( 0 == numerrors ) { 589 | archived.bnd( result.second ); 590 | } 591 | } 592 | 593 | auto is_ok = []( std::string &output, const std::string &input ) -> bool { 594 | if( bundle::is_packed( input ) ) { 595 | return bundle::unpack(output, input); 596 | } else { 597 | return bundle::unpack(output, input), true; 598 | } 599 | }; 600 | 601 | if( listit ) { 602 | std::cout << archived.toc() << std::endl; 603 | } 604 | 605 | for( auto &file : archived ) { 606 | progress_pct = (++progress_idx * 100) / archived.size(); 607 | 608 | #if 0 609 | bool found = false; 610 | for( auto &m : to_pack ) { 611 | if( wire::string( file["name"] ).matches( m.name() ) ) { 612 | found = true; 613 | break; 614 | } 615 | } 616 | 617 | if( !found ) { 618 | continue; 619 | } 620 | #endif 621 | 622 | title_name = file["name"]; 623 | 624 | std::cout << "[ ] " << title_mode << ": " << file["name"] << " ...\r"; 625 | 626 | std::string uncmp; 627 | bool ok = true; 628 | 629 | if( upckit || testit ) { 630 | ok = is_ok( uncmp, file["data"] ); 631 | } 632 | 633 | if( upckit && ok ) { 634 | // recreate folder structure 635 | wire::string path = file["name"]; 636 | wire::strings dirs = path.tokenize("\\/"); 637 | 638 | if( path[-1] != '\\' && path[-1] != '/' ) { 639 | dirs.pop_back(); 640 | } 641 | 642 | path.clear(); 643 | for( auto &dir : dirs ) { 644 | path += dir + "/"; 645 | mkdir(path.c_str(), 0777); 646 | } 647 | 648 | // try to unpack it 649 | std::ofstream ofs( file["name"].c_str(), std::ios::binary ); 650 | ofs << uncmp; 651 | ok = ofs.good(); 652 | } 653 | 654 | std::cout << ( ok ? "[ OK ] " : "[FAIL] " ) << title_mode << ": " << file["name"] << " \n"; 655 | numerrors += ok ? 0 : 1; 656 | 657 | processed++; 658 | } 659 | } 660 | 661 | bool resume = ( quiet ? ( numerrors > 0 ) : true ); 662 | if( resume ) { 663 | std::cout << (numerrors > 0 ? "[FAIL] " : "[ OK ] "); 664 | if( moveit || packit ) { 665 | std::cout << processed << " processed files, " << numerrors << " errors; " << total_input << " bytes -> " << total_output << " bytes (" << ratio( total_input, total_output ) << "%); " << taken() << " secs" << std::endl; 666 | } else { 667 | std::cout << processed << " processed files, " << numerrors << " errors;" << std::endl; 668 | } 669 | } 670 | 671 | appexit = 1; 672 | bubble.join(); 673 | 674 | return numerrors; 675 | } 676 | 677 | #include 678 | #include 679 | #include 680 | -------------------------------------------------------------------------------- /bundler.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/r-lyeh-archived/bundler/d664bc39a385004bbc7332cec2aa4dda8dd44a77/bundler.exe -------------------------------------------------------------------------------- /bundler.osx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/r-lyeh-archived/bundler/d664bc39a385004bbc7332cec2aa4dda8dd44a77/bundler.osx -------------------------------------------------------------------------------- /deps/bundler.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/r-lyeh-archived/bundler/d664bc39a385004bbc7332cec2aa4dda8dd44a77/deps/bundler.ico -------------------------------------------------------------------------------- /deps/bundler.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/r-lyeh-archived/bundler/d664bc39a385004bbc7332cec2aa4dda8dd44a77/deps/bundler.png -------------------------------------------------------------------------------- /deps/rh/Help/bm00.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/r-lyeh-archived/bundler/d664bc39a385004bbc7332cec2aa4dda8dd44a77/deps/rh/Help/bm00.png -------------------------------------------------------------------------------- /deps/rh/Help/bm01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/r-lyeh-archived/bundler/d664bc39a385004bbc7332cec2aa4dda8dd44a77/deps/rh/Help/bm01.png -------------------------------------------------------------------------------- /deps/rh/Help/bm02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/r-lyeh-archived/bundler/d664bc39a385004bbc7332cec2aa4dda8dd44a77/deps/rh/Help/bm02.png -------------------------------------------------------------------------------- /deps/rh/Help/bm03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/r-lyeh-archived/bundler/d664bc39a385004bbc7332cec2aa4dda8dd44a77/deps/rh/Help/bm03.png -------------------------------------------------------------------------------- /deps/rh/Help/bm04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/r-lyeh-archived/bundler/d664bc39a385004bbc7332cec2aa4dda8dd44a77/deps/rh/Help/bm04.png -------------------------------------------------------------------------------- /deps/rh/Help/bm05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/r-lyeh-archived/bundler/d664bc39a385004bbc7332cec2aa4dda8dd44a77/deps/rh/Help/bm05.png -------------------------------------------------------------------------------- /deps/rh/Help/bm06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/r-lyeh-archived/bundler/d664bc39a385004bbc7332cec2aa4dda8dd44a77/deps/rh/Help/bm06.png -------------------------------------------------------------------------------- /deps/rh/Help/bm09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/r-lyeh-archived/bundler/d664bc39a385004bbc7332cec2aa4dda8dd44a77/deps/rh/Help/bm09.png -------------------------------------------------------------------------------- /deps/rh/Help/bm10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/r-lyeh-archived/bundler/d664bc39a385004bbc7332cec2aa4dda8dd44a77/deps/rh/Help/bm10.png -------------------------------------------------------------------------------- /deps/rh/Help/bm11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/r-lyeh-archived/bundler/d664bc39a385004bbc7332cec2aa4dda8dd44a77/deps/rh/Help/bm11.png -------------------------------------------------------------------------------- /deps/rh/Help/bm12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/r-lyeh-archived/bundler/d664bc39a385004bbc7332cec2aa4dda8dd44a77/deps/rh/Help/bm12.png -------------------------------------------------------------------------------- /deps/rh/Help/bm14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/r-lyeh-archived/bundler/d664bc39a385004bbc7332cec2aa4dda8dd44a77/deps/rh/Help/bm14.png -------------------------------------------------------------------------------- /deps/rh/Help/desktop.ini: -------------------------------------------------------------------------------- 1 | [ViewState] 2 | Mode= 3 | Vid= 4 | FolderType=Generic 5 | -------------------------------------------------------------------------------- /deps/rh/Help/help.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/r-lyeh-archived/bundler/d664bc39a385004bbc7332cec2aa4dda8dd44a77/deps/rh/Help/help.html -------------------------------------------------------------------------------- /deps/rh/Help/resource_hacker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/r-lyeh-archived/bundler/d664bc39a385004bbc7332cec2aa4dda8dd44a77/deps/rh/Help/resource_hacker.png -------------------------------------------------------------------------------- /deps/rh/ReadMe.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/r-lyeh-archived/bundler/d664bc39a385004bbc7332cec2aa4dda8dd44a77/deps/rh/ReadMe.txt -------------------------------------------------------------------------------- /deps/rh/ResourceHacker.def: -------------------------------------------------------------------------------- 1 | //Definitions of default DIALOG and CONTROL classes for the dialog editor. 2 | //This is a text file to enable simple customization and the addition of custom controls 3 | 4 | [DIALOG] 5 | //default values for dialogs... 6 | width=300 7 | height=150 8 | fontname=Arial 9 | fontsize=9 10 | style=DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU 11 | language=LANG_ENGLISH, SUBLANG_ENGLISH_US 12 | //style flags and MASK values 13 | sf=DS_ABSALIGN 14 | sf=DS_SYSMODAL 15 | sf=DS_LOCALEDIT 16 | sf=DS_SETFONT 17 | sf=DS_MODALFRAME 18 | sf=DS_NOIDLEMSG 19 | sf=DS_SETFOREGROUND 20 | sf=DS_FIXEDSYS 21 | sf=DS_NOFAILCREATE 22 | sf=DS_CONTROL 23 | sf=DS_CENTER 24 | sf=DS_CENTERMOUSE 25 | sf=DS_CONTEXTHELP 26 | sf=WS_CHILD, (WS_POPUP | WS_CHILD) //ie: either WS_POPUP or WS_CHILD but not both! 27 | sf=WS_POPUP, (WS_CHILD | WS_POPUP) 28 | sf=WS_CLIPSIBLINGS 29 | sf=WS_CLIPCHILDREN 30 | sf=WS_DISABLED 31 | sf=WS_VISIBLE 32 | sf=WS_CAPTION 33 | sf=WS_BORDER, WS_CAPTION 34 | sf=WS_DLGFRAME, WS_CAPTION 35 | sf=WS_MINIMIZEBOX 36 | sf=WS_MAXIMIZEBOX 37 | sf=WS_SYSMENU 38 | sf=WS_THICKFRAME 39 | sf=WS_TILEDWINDOW 40 | sf=WS_POPUPWINDOW 41 | sf=WS_MINIMIZE 42 | sf=WS_MAXIMIZE 43 | sf=WS_VSCROLL 44 | sf=WS_HSCROLL 45 | //exstyle flags and MASK values 46 | esf=WS_EX_DLGMODALFRAME 47 | esf=WS_EX_NOPARENTNOTIFY 48 | esf=WS_EX_TOPMOST 49 | esf=WS_EX_ACCEPTFILES 50 | esf=WS_EX_TRANSPARENT 51 | esf=WS_EX_MDICHILD 52 | esf=WS_EX_TOOLWINDOW 53 | esf=WS_EX_WINDOWEDGE 54 | esf=WS_EX_CLIENTEDGE 55 | esf=WS_EX_CONTEXTHELP 56 | esf=WS_EX_RIGHT 57 | esf=WS_EX_LEFT, WS_EX_RIGHT 58 | esf=WS_EX_RTLREADING 59 | esf=WS_EX_LTRREADING, WS_EX_RTLREADING 60 | esf=WS_EX_LEFTSCROLLBAR 61 | esf=WS_EX_RIGHTSCROLLBAR, WS_EX_LEFTSCROLLBAR 62 | esf=WS_EX_CONTROLPARENT 63 | esf=WS_EX_STATICEDGE 64 | esf=WS_EX_APPWINDOW 65 | esf=WS_EX_OVERLAPPEDWINDOW 66 | esf=WS_EX_PALETTEWINDOW 67 | esf=WS_EX_LAYERED 68 | esf=WS_EX_NOINHERITLAYOUT 69 | esf=WS_EX_LAYOUTRTL 70 | esf=WS_EX_NOACTIVATE 71 | 72 | 73 | [BUTTON] 74 | //default values ... 75 | width=60 76 | height=14 77 | style= WS_CHILD | WS_VISIBLE | WS_TABSTOP 78 | //style flags and MASK values 79 | sf=BS_PUSHBUTTON, 0x1F 80 | sf=BS_DEFPUSHBUTTON, 0x1F 81 | sf=BS_CHECKBOX, 0x1F 82 | sf=BS_AUTOCHECKBOX, 0x1F 83 | sf=BS_3STATE, 0x1F 84 | sf=BS_AUTO3STATE, 0x1F 85 | sf=BS_RADIOBUTTON, 0x1F 86 | sf=BS_AUTORADIOBUTTON, 0x1F 87 | sf=BS_GROUPBOX, 0x1F 88 | sf=BS_USERBUTTON, 0x1F 89 | sf=BS_OWNERDRAW, 0x1F 90 | sf=BS_SPLITBUTTON, 0x1F 91 | sf=BS_DEFSPLITBUTTON, 0x1F 92 | sf=BS_COMMANDLINK, 0x1F 93 | sf=BS_DEFCOMMANDLINK, 0x1F 94 | sf=BS_LEFTTEXT 95 | sf=BS_ICON 96 | sf=BS_BITMAP 97 | sf=BS_LEFT, BS_CENTER 98 | sf=BS_RIGHT, BS_CENTER 99 | sf=BS_CENTER, BS_CENTER 100 | sf=BS_TOP, BS_VCENTER 101 | sf=BS_BOTTOM, BS_VCENTER 102 | sf=BS_VCENTER, BS_VCENTER 103 | sf=BS_PUSHLIKE 104 | sf=BS_MULTILINE 105 | sf=BS_NOTIFY 106 | sf=BS_FLAT 107 | 108 | [CHECKBOX] 109 | //default values ... 110 | width=60 111 | height=14 112 | style= BS_CHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP 113 | classname=BUTTON 114 | //style flags and MASK values 115 | sf=BS_CHECKBOX, 0x1F 116 | sf=BS_AUTOCHECKBOX, 0x1F 117 | sf=BS_3STATE, 0x1F 118 | sf=BS_AUTO3STATE, 0x1F 119 | sf=BS_LEFTTEXT 120 | sf=BS_LEFT, BS_CENTER 121 | sf=BS_RIGHT, BS_CENTER 122 | sf=BS_CENTER, BS_CENTER 123 | sf=BS_TOP, BS_VCENTER 124 | sf=BS_BOTTOM, BS_VCENTER 125 | sf=BS_VCENTER, BS_VCENTER 126 | sf=BS_PUSHLIKE 127 | sf=BS_MULTILINE 128 | sf=BS_NOTIFY 129 | sf=BS_FLAT 130 | 131 | [RADIOBUTTON] 132 | //default values ... 133 | width=60 134 | height=14 135 | style= BS_RADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP 136 | classname=BUTTON 137 | //style flags and MASK values 138 | sf=BS_RADIOBUTTON, 0x1F 139 | sf=BS_AUTORADIOBUTTON, 0x1F 140 | sf=BS_LEFTTEXT 141 | sf=BS_LEFT, BS_CENTER 142 | sf=BS_RIGHT, BS_CENTER 143 | sf=BS_CENTER, BS_CENTER 144 | sf=BS_TOP, BS_VCENTER 145 | sf=BS_BOTTOM, BS_VCENTER 146 | sf=BS_VCENTER, BS_VCENTER 147 | sf=BS_PUSHLIKE 148 | sf=BS_MULTILINE 149 | sf=BS_NOTIFY 150 | sf=BS_FLAT 151 | 152 | [GROUPBOX] 153 | //default values ... 154 | width=60 155 | height=60 156 | style= BS_GROUPBOX | WS_CHILD | WS_VISIBLE 157 | classname=BUTTON 158 | //style flags and MASK values 159 | sf=BS_GROUPBOX, 0x1F 160 | sf=BS_LEFT, BS_CENTER 161 | sf=BS_RIGHT, BS_CENTER 162 | sf=BS_CENTER, BS_CENTER 163 | sf=BS_NOTIFY 164 | sf=BS_FLAT 165 | 166 | [COMBOBOX] 167 | //default values ... 168 | width=60 169 | height=60 170 | style= WS_CHILD | WS_VISIBLE | WS_TABSTOP | CBS_DROPDOWN 171 | //style flags and MASK values 172 | sf=CBS_SIMPLE, CBS_DROPDOWNLIST 173 | sf=CBS_DROPDOWN, CBS_DROPDOWNLIST 174 | sf=CBS_DROPDOWNLIST, CBS_DROPDOWNLIST 175 | sf=CBS_OWNERDRAWFIXED 176 | sf=CBS_OWNERDRAWVARIABLE 177 | sf=CBS_AUTOHSCROLL 178 | sf=CBS_OEMCONVERT 179 | sf=CBS_SORT 180 | sf=CBS_HASSTRINGS 181 | sf=CBS_NOINTEGRALHEIGHT 182 | sf=CBS_DISABLENOSCROLL 183 | sf=CBS_UPPERCASE 184 | sf=CBS_LOWERCASE 185 | 186 | [EDIT] 187 | //default values ... 188 | width=60 189 | height=14 190 | style= WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP 191 | //style flags and MASK values 192 | sf=ES_LEFT, (ES_CENTER | ES_RIGHT) 193 | sf=ES_CENTER, (ES_CENTER | ES_RIGHT) 194 | sf=ES_RIGHT, (ES_CENTER | ES_RIGHT) 195 | sf=ES_MULTILINE 196 | sf=ES_UPPERCASE 197 | sf=ES_LOWERCASE 198 | sf=ES_PASSWORD 199 | sf=ES_AUTOVSCROLL 200 | sf=ES_AUTOHSCROLL 201 | sf=ES_NOHIDESEL 202 | sf=ES_OEMCONVERT 203 | sf=ES_READONLY 204 | sf=ES_WANTRETURN 205 | sf=ES_NUMBER 206 | 207 | [MEMO] 208 | //default values ... 209 | width=60 210 | height=60 211 | classname=EDIT 212 | style= ES_MULTILINE | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP | WS_HSCROLL | WS_VSCROLL 213 | //style flags and MASK values 214 | sf=ES_LEFT, (ES_CENTER | ES_RIGHT) 215 | sf=ES_CENTER, (ES_CENTER | ES_RIGHT) 216 | sf=ES_RIGHT, (ES_CENTER | ES_RIGHT) 217 | sf=ES_MULTILINE 218 | sf=ES_UPPERCASE 219 | sf=ES_LOWERCASE 220 | sf=ES_PASSWORD 221 | sf=ES_AUTOVSCROLL 222 | sf=ES_AUTOHSCROLL 223 | sf=ES_NOHIDESEL 224 | sf=ES_OEMCONVERT 225 | sf=ES_READONLY 226 | sf=ES_WANTRETURN 227 | sf=ES_NUMBER 228 | 229 | [LISTBOX] 230 | //default values ... 231 | width=60 232 | height=60 233 | style= WS_CHILD | WS_VISIBLE | WS_TABSTOP | LBS_STANDARD 234 | //LBS_STANDARD = (LBS_NOTIFY | LBS_SORT | WS_VSCROLL | WS_BORDER) 235 | //style flags 236 | sf=LBS_NOTIFY 237 | sf=LBS_SORT 238 | sf=LBS_NOREDRAW 239 | sf=LBS_MULTIPLESEL 240 | sf=LBS_OWNERDRAWFIXED 241 | sf=LBS_OWNERDRAWVARIABLE 242 | sf=LBS_HASSTRINGS 243 | sf=LBS_USETABSTOPS 244 | sf=LBS_NOINTEGRALHEIGHT 245 | sf=LBS_MULTICOLUMN 246 | sf=LBS_WANTKEYBOARDINPUT 247 | sf=LBS_EXTENDEDSEL 248 | sf=LBS_DISABLENOSCROLL 249 | sf=LBS_NODATA 250 | sf=LBS_NOSEL 251 | 252 | [SCROLLBAR] 253 | //default values ... 254 | width=30 255 | height=14 256 | style= WS_CHILD | WS_VISIBLE 257 | //style flags and MASK values 258 | sf=SBS_HORZ, SBS_VERT 259 | sf=SBS_VERT, SBS_VERT 260 | sf=SBS_TOPALIGN 261 | sf=SBS_LEFTALIGN 262 | sf=SBS_BOTTOMALIGN 263 | sf=SBS_RIGHTALIGN 264 | sf=SBS_SIZEBOXTOPLEFTALIGN 265 | sf=SBS_SIZEBOXBOTTOMRIGHTALIGN 266 | sf=SBS_SIZEBOX 267 | sf=SBS_SIZEGRIP 268 | 269 | [STATIC] 270 | //default values ... 271 | width=32 272 | height=32 273 | style= WS_CHILD | WS_VISIBLE | WS_GROUP 274 | //style flags and MASK values 275 | sf=SS_LEFT, 0x1F 276 | sf=SS_CENTER, 0x1F 277 | sf=SS_RIGHT, 0x1F 278 | sf=SS_ICON, 0x1F 279 | sf=SS_BLACKRECT, 0x1F 280 | sf=SS_GRAYRECT, 0x1F 281 | sf=SS_WHITERECT, 0x1F 282 | sf=SS_BLACKFRAME, 0x1F 283 | sf=SS_GRAYFRAME, 0x1F 284 | sf=SS_WHITEFRAME, 0x1F 285 | sf=SS_USERITEM, 0x1F 286 | sf=SS_SIMPLE, 0x1F 287 | sf=SS_LEFTNOWORDWRAP, 0x1F 288 | sf=SS_BITMAP, 0x1F 289 | sf=SS_OWNERDRAW, 0x1F 290 | sf=SS_ENHMETAFILE, 0x1F 291 | sf=SS_ETCHEDHORZ, 0x1F 292 | sf=SS_ETCHEDVERT, 0x1F 293 | sf=SS_ETCHEDFRAME, 0x1F 294 | sf=SS_NOPREFIX 295 | sf=SS_NOTIFY 296 | sf=SS_CENTERIMAGE 297 | sf=SS_RIGHTJUST 298 | sf=SS_REALSIZEIMAGE 299 | sf=SS_SUNKEN 300 | sf=SS_ENDELLIPSIS, SS_ELLIPSISMASK 301 | sf=SS_PATHELLIPSIS, SS_ELLIPSISMASK 302 | sf=SS_WORDELLIPSIS, SS_ELLIPSISMASK 303 | 304 | [LTEXT] 305 | //default values ... 306 | width=60 307 | height=18 308 | classname=STATIC 309 | style= WS_CHILD | WS_VISIBLE | WS_GROUP 310 | //style flags 311 | sf=SS_NOPREFIX 312 | sf=SS_NOTIFY 313 | sf=SS_CENTERIMAGE 314 | sf=SS_RIGHTJUST 315 | sf=SS_SUNKEN 316 | 317 | [ICON] 318 | //default values ... 319 | width=20 320 | height=20 321 | classname=STATIC 322 | style= WS_CHILD | WS_VISIBLE | WS_GROUP | SS_ICON 323 | //style flags 324 | sf=SS_ICON, 0x1F 325 | sf=SS_NOPREFIX 326 | sf=SS_NOTIFY 327 | sf=SS_CENTERIMAGE 328 | sf=SS_RIGHTJUST 329 | sf=SS_REALSIZEIMAGE 330 | sf=SS_SUNKEN 331 | 332 | [BITMAP] 333 | //default values ... 334 | width=60 335 | height=60 336 | classname=STATIC 337 | style= WS_CHILD | WS_VISIBLE | WS_GROUP | SS_BITMAP 338 | //style flags 339 | sf=SS_BITMAP, 0x1F 340 | sf=SS_NOPREFIX 341 | sf=SS_NOTIFY 342 | sf=SS_CENTERIMAGE 343 | sf=SS_RIGHTJUST 344 | sf=SS_REALSIZEIMAGE 345 | sf=SS_SUNKEN 346 | 347 | ["RICHEDIT"] 348 | //default values ... 349 | width=60 350 | height=60 351 | style= ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP 352 | //style flags and MASK values 353 | sf=ES_LEFT, (ES_CENTER | ES_RIGHT) 354 | sf=ES_CENTER, (ES_CENTER | ES_RIGHT) 355 | sf=ES_RIGHT, (ES_CENTER | ES_RIGHT) 356 | sf=ES_MULTILINE 357 | sf=ES_AUTOVSCROLL 358 | sf=ES_AUTOHSCROLL 359 | sf=ES_NOHIDESEL 360 | sf=ES_READONLY 361 | sf=ES_WANTRETURN 362 | sf=ES_PASSWORD 363 | sf=ES_SAVESEL 364 | sf=ES_SUNKEN 365 | sf=ES_DISABLENOSCROLL 366 | sf=ES_SELECTIONBAR 367 | sf=ES_NOOLEDRAGDROP 368 | sf=ES_VERTICAL 369 | sf=ES_NOIME 370 | sf=ES_SELFIME 371 | 372 | esf=ES_EX_NOCALLOLEINIT 373 | 374 | ["SysAnimate32"] 375 | //default values ... 376 | width=60 377 | height=60 378 | style= WS_CHILD | WS_VISIBLE 379 | sf=ACS_CENTER 380 | sf=ACS_TRANSPARENT 381 | sf=ACS_AUTOPLAY 382 | sf=ACS_TIMER 383 | 384 | ["SysDateTimePick32"] 385 | //default values ... 386 | width=80 387 | height=14 388 | style= WS_CHILD | WS_VISIBLE 389 | sf=DTS_UPDOWN 390 | sf=DTS_SHOWNONE 391 | sf=DTS_SHORTDATEFORMAT, DTS_LONGDATEFORMAT 392 | sf=DTS_LONGDATEFORMAT, DTS_LONGDATEFORMAT 393 | sf=DTS_TIMEFORMAT //nb: must be DTS_UPDOWN (not calendar) with DTS_TIMEFORMAT 394 | sf=DTS_APPCANPARSE 395 | sf=DTS_RIGHTALIGN 396 | 397 | ["SysHeader32"] 398 | //default values ... 399 | width=60 400 | height=12 401 | style= WS_CHILD | WS_VISIBLE 402 | //style flags and MASK values 403 | sf=HDS_BUTTONS 404 | sf=HDS_HOTTRACK 405 | sf=HDS_HIDDEN 406 | sf=HDS_DRAGDROP 407 | sf=HDS_FULLDRAG 408 | sf=CCS_TOP, CCS_BOTTOM 409 | sf=CCS_NOMOVEY, CCS_BOTTOM 410 | sf=CCS_BOTTOM, CCS_BOTTOM 411 | sf=CCS_NORESIZE 412 | sf=CCS_NOPARENTALIGN 413 | sf=CCS_ADJUSTABLE 414 | sf=CCS_NODIVIDER 415 | sf=CCS_VERT 416 | sf=CCS_LEFT 417 | sf=CCS_RIGHT 418 | sf=CCS_NOMOVEX 419 | 420 | ["SysListView32"] 421 | //default values ... 422 | width=60 423 | height=60 424 | style= WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP 425 | //style flags and MASK values 426 | sf=LVS_ICON, LVS_TYPEMASK 427 | sf=LVS_REPORT, LVS_TYPEMASK 428 | sf=LVS_SMALLICON, LVS_TYPEMASK 429 | sf=LVS_LIST, LVS_TYPEMASK 430 | sf=LVS_SINGLESEL 431 | sf=LVS_SHOWSELALWAYS 432 | sf=LVS_SORTASCENDING 433 | sf=LVS_SORTDESCENDING 434 | sf=LVS_SHAREIMAGELISTS 435 | sf=LVS_NOLABELWRAP 436 | sf=LVS_AUTOARRANGE 437 | sf=LVS_EDITLABELS 438 | sf=LVS_OWNERDATA 439 | sf=LVS_NOSCROLL 440 | sf=LVS_ALIGNTOP, LVS_ALIGNLEFT 441 | sf=LVS_ALIGNLEFT, LVS_ALIGNLEFT 442 | sf=LVS_OWNERDRAWFIXED 443 | sf=LVS_NOCOLUMNHEADER 444 | sf=LVS_NOSORTHEADER 445 | 446 | esf=LVS_EX_GRIDLINES 447 | esf=LVS_EX_SUBITEMIMAGES 448 | esf=LVS_EX_CHECKBOXES 449 | esf=LVS_EX_TRACKSELECT 450 | esf=LVS_EX_HEADERDRAGDROP 451 | esf=LVS_EX_FULLROWSELECT 452 | esf=LVS_EX_ONECLICKACTIVATE 453 | esf=LVS_EX_TWOCLICKACTIVATE 454 | 455 | ["SysMonthCal32"] 456 | //default values ... 457 | width=130 458 | height=100 459 | style= WS_CHILD | WS_VISIBLE 460 | sf=MCS_DAYSTATE 461 | sf=MCS_MULTISELECT 462 | sf=MCS_WEEKNUMBERS 463 | sf=MCS_NOTODAY 464 | 465 | ["SysPager"] 466 | //default values ... 467 | width=60 468 | height=20 469 | style= WS_CHILD | WS_VISIBLE 470 | //style flags and MASK values 471 | sf=PGS_VERT, PGS_HORZ 472 | sf=PGS_HORZ, PGS_HORZ 473 | sf=PGS_AUTOSCROLL 474 | sf=PGS_DRAGNDROP 475 | 476 | ["SysTabControl32"] 477 | //default values ... 478 | width=60 479 | height=60 480 | style= WS_CHILD | WS_VISIBLE | TCS_RAGGEDRIGHT 481 | sf=TCS_SCROLLOPPOSITE 482 | sf=TCS_BOTTOM 483 | sf=TCS_RIGHT 484 | sf=TCS_FORCEICONLEFT 485 | sf=TCS_FORCELABELLEFT 486 | sf=TCS_HOTTRACK 487 | sf=TCS_VERTICAL 488 | sf=TCS_TABS, TCS_BUTTONS 489 | sf=TCS_BUTTONS, TCS_BUTTONS 490 | sf=TCS_SINGLELINE, TCS_MULTILINE 491 | sf=TCS_MULTILINE, TCS_MULTILINE 492 | sf=TCS_RIGHTJUSTIFY, TCS_FIXEDWIDTH 493 | sf=TCS_FIXEDWIDTH, TCS_FIXEDWIDTH 494 | sf=TCS_RAGGEDRIGHT 495 | sf=TCS_FOCUSONBUTTONDOWN 496 | sf=TCS_OWNERDRAWFIXED 497 | sf=TCS_TOOLTIPS 498 | sf=TCS_FOCUSNEVER 499 | 500 | esf=TCS_EX_FLATSEPARATORS 501 | esf=TCS_EX_REGISTERDROP 502 | 503 | ["SysTreeView32"] 504 | //default values ... 505 | width=60 506 | height=60 507 | style= WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP 508 | //style flags 509 | sf=TVS_HASBUTTONS 510 | sf=TVS_HASLINES 511 | sf=TVS_LINESATROOT 512 | sf=TVS_EDITLABELS 513 | sf=TVS_DISABLEDRAGDROP 514 | sf=TVS_SHOWSELALWAYS 515 | 516 | esf=TVS_EX_MULTISELECT 517 | esf=TVS_EX_DOUBLEBUFFER 518 | esf=TVS_EX_NOINDENTSTATE 519 | esf=TVS_EX_RICHTOOLTIP 520 | esf=TVS_EX_AUTOHSCROLL 521 | esf=TVS_EX_FADEINOUTEXPANDOS 522 | esf=TVS_EX_PARTIALCHECKBOXES 523 | esf=TVS_EX_EXCLUSIONCHECKBOXES 524 | esf=TVS_EX_DIMMEDCHECKBOXES 525 | esf=TVS_EX_DRAWIMAGEASYNC 526 | 527 | ["msctls_hotkey32"] 528 | //default values ... 529 | width=60 530 | height=14 531 | style= WS_CHILD | WS_VISIBLE 532 | 533 | ["msctls_progress32"] 534 | //default values ... 535 | width=60 536 | height=12 537 | style= WS_CHILD | WS_VISIBLE 538 | sf=PBS_SMOOTH 539 | sf=PBS_VERTICAL 540 | 541 | ["msctls_statusbar32"] 542 | //default values ... 543 | width=60 544 | height=12 545 | style= WS_CHILD | WS_VISIBLE | SBARS_SIZEGRIP 546 | sf=SBARS_SIZEGRIP 547 | sf=SBT_TOOLTIPS 548 | sf=CCS_TOP, CCS_BOTTOM 549 | sf=CCS_NOMOVEY, CCS_BOTTOM 550 | sf=CCS_BOTTOM, CCS_BOTTOM 551 | sf=CCS_NORESIZE 552 | sf=CCS_NOPARENTALIGN 553 | sf=CCS_ADJUSTABLE 554 | sf=CCS_NODIVIDER 555 | sf=CCS_VERT 556 | sf=CCS_LEFT 557 | sf=CCS_RIGHT 558 | sf=CCS_NOMOVEX 559 | 560 | ["msctls_trackbar32"] 561 | //default values ... 562 | width=60 563 | height=18 564 | style= WS_CHILD | WS_VISIBLE | WS_TABSTOP 565 | //style flags and MASK values 566 | sf=TBS_HORZ, TBS_VERT 567 | sf=TBS_VERT, TBS_VERT 568 | sf=TBS_AUTOTICKS 569 | sf=TBS_BOTTOM, TBS_TOP 570 | sf=TBS_TOP, TBS_TOP 571 | sf=TBS_RIGHT, TBS_LEFT 572 | sf=TBS_LEFT, TBS_LEFT 573 | sf=TBS_BOTH 574 | sf=TBS_NOTICKS 575 | sf=TBS_ENABLESELRANGE 576 | sf=TBS_FIXEDLENGTH 577 | sf=TBS_NOTHUMB 578 | 579 | ["msctls_updown32"] 580 | //default values ... 581 | width=12 582 | height=20 583 | style= WS_CHILD | WS_VISIBLE 584 | //style flags 585 | sf=UDS_WRAP 586 | sf=UDS_SETBUDDYINT 587 | sf=UDS_ALIGNRIGHT 588 | sf=UDS_ALIGNLEFT 589 | sf=UDS_AUTOBUDDY 590 | sf=UDS_ARROWKEYS 591 | sf=UDS_HORZ 592 | sf=UDS_NOTHOUSANDS 593 | 594 | ["ComboBoxEx32"] 595 | //default values ... 596 | width=60 597 | height=60 598 | style= WS_CHILD | WS_VISIBLE | WS_TABSTOP 599 | //style flags and MASK values 600 | sf=CBS_SIMPLE, CBS_DROPDOWNLIST 601 | sf=CBS_DROPDOWN, CBS_DROPDOWNLIST 602 | sf=CBS_DROPDOWNLIST, CBS_DROPDOWNLIST 603 | sf=CBS_AUTOHSCROLL 604 | sf=CBS_OEMCONVERT 605 | sf=CBS_SORT 606 | sf=CBS_HASSTRINGS 607 | sf=CBS_NOINTEGRALHEIGHT 608 | sf=CBS_DISABLENOSCROLL 609 | sf=CBS_UPPERCASE 610 | sf=CBS_LOWERCASE 611 | 612 | esf=CBES_EX_CASESENSITIVE 613 | esf=CBES_EX_NOEDITIMAGE 614 | esf=CBES_EX_NOEDITIMAGEINDENT 615 | esf=CBES_EX_NOSIZELIMIT 616 | esf=CBES_EX_PATHWORDBREAKPROC 617 | 618 | ["ReBarWindow32"] 619 | //default values ... 620 | width=60 621 | height=12 622 | style= WS_CHILD | WS_VISIBLE 623 | //style flags 624 | sf=RBS_TOOLTIPS 625 | sf=RBS_VARHEIGHT 626 | sf=RBS_BANDBORDERS 627 | sf=RBS_FIXEDORDER 628 | sf=RBS_REGISTERDROP 629 | sf=RBS_AUTOSIZE 630 | sf=RBS_VERTICALGRIPPER 631 | sf=RBS_DBLCLKTOGGLE 632 | sf=CCS_TOP, CCS_BOTTOM 633 | sf=CCS_NOMOVEY, CCS_BOTTOM 634 | sf=CCS_BOTTOM, CCS_BOTTOM 635 | sf=CCS_NORESIZE 636 | sf=CCS_NOPARENTALIGN 637 | sf=CCS_ADJUSTABLE 638 | sf=CCS_NODIVIDER 639 | sf=CCS_VERT 640 | sf=CCS_LEFT 641 | sf=CCS_RIGHT 642 | sf=CCS_NOMOVEX 643 | 644 | ["ToolbarWindow32"] 645 | //default values ... 646 | width=60 647 | height=12 648 | style= WS_CHILD | WS_VISIBLE 649 | //style flags and MASK value 650 | sf=TBSTYLE_TOOLTIPS 651 | sf=TBSTYLE_WRAPABLE 652 | sf=TBSTYLE_ALTDRAG 653 | sf=TBSTYLE_FLAT 654 | sf=TBSTYLE_LIST 655 | sf=TBSTYLE_CUSTOMERASE 656 | sf=TBSTYLE_REGISTERDROP 657 | sf=TBSTYLE_TRANSPARENT 658 | sf=CCS_TOP, CCS_BOTTOM 659 | sf=CCS_NOMOVEY, CCS_BOTTOM 660 | sf=CCS_BOTTOM, CCS_BOTTOM 661 | sf=CCS_NORESIZE 662 | sf=CCS_NOPARENTALIGN 663 | sf=CCS_ADJUSTABLE 664 | sf=CCS_NODIVIDER 665 | sf=CCS_VERT 666 | sf=CCS_LEFT 667 | sf=CCS_RIGHT 668 | sf=CCS_NOMOVEX 669 | 670 | esf=TBSTYLE_EX_DRAWDDARROWS 671 | //esf=TBSTYLE_EX_HIDECLIPPEDBUTTONS 672 | //esf=TBSTYLE_EX_MIXEDBUTTONS 673 | 674 | ["RichEdit20W"] 675 | //default values ... 676 | width=60 677 | height=60 678 | style= ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP 679 | //style flags and MASK values 680 | sf=ES_LEFT, (ES_CENTER | ES_RIGHT) 681 | sf=ES_CENTER, (ES_CENTER | ES_RIGHT) 682 | sf=ES_RIGHT, (ES_CENTER | ES_RIGHT) 683 | sf=ES_MULTILINE 684 | sf=ES_AUTOVSCROLL 685 | sf=ES_AUTOHSCROLL 686 | sf=ES_NOHIDESEL 687 | sf=ES_READONLY 688 | sf=ES_WANTRETURN 689 | sf=ES_PASSWORD 690 | sf=ES_SAVESEL 691 | sf=ES_SUNKEN 692 | sf=ES_DISABLENOSCROLL 693 | sf=ES_SELECTIONBAR 694 | sf=ES_NOOLEDRAGDROP 695 | sf=ES_VERTICAL 696 | sf=ES_NOIME 697 | sf=ES_SELFIME 698 | 699 | esf=ES_EX_NOCALLOLEINIT 700 | 701 | ["SysLink"] 702 | //default values ... 703 | width=60 704 | height=18 705 | classname="SysLink" 706 | style= WS_CHILD | WS_VISIBLE | WS_GROUP 707 | 708 | 709 | ["SysIPAddress32"] 710 | //default values ... 711 | width=60 712 | height=14 713 | classname="SysIPAddress32" 714 | style= WS_CHILD | WS_VISIBLE | WS_GROUP 715 | -------------------------------------------------------------------------------- /deps/rh/ResourceHacker.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/r-lyeh-archived/bundler/d664bc39a385004bbc7332cec2aa4dda8dd44a77/deps/rh/ResourceHacker.exe -------------------------------------------------------------------------------- /deps/rh/ResourceHacker.ini: -------------------------------------------------------------------------------- 1 | [Setup] 2 | left=560 3 | top=300 4 | width=800 5 | height=440 6 | MaximizedState=0 7 | vsplit=200 8 | LastDir= 9 | BkColor=16185078 10 | DefaultLang=0 11 | HideToolbar=0 12 | 13 | [MonospaceFont] 14 | Name=Courier New 15 | Size=9 16 | Color=-16777208 17 | Style=0 18 | 19 | [Font] 20 | Name=Tahoma 21 | Size=9 22 | Color=-16777208 23 | CharSet=1 24 | Style=0 25 | 26 | [MRU List] 27 | 1=bundler.exe 28 | 2= 29 | 3= 30 | 4= 31 | 5= 32 | 6= 33 | 7= 34 | 8= 35 | 36 | -------------------------------------------------------------------------------- /deps/rh/changes.txt: -------------------------------------------------------------------------------- 1 | Changes in 4.2.5 2 | Bugfix: Compiling Delphi form resources was buggy. 3 | Bugfix: Adding a resource to a file without any resources was broken 4 | New: Can now change a text resource's format (unicode, UTF-8, ANSI) 5 | Changes in 4.2.4 6 | Bugfix: Error when compiling ansi encoded *.rc files 7 | Bugfix: RCDATA resources not displayed in their optimal format 8 | Bugfix: Error when trying to display 'compressed' resources 9 | Bugfix: 'Compressed' files can no longer be modified and saved 10 | Changes in 4.2.3 11 | Bugfix: Significant bug in the recompiler 12 | Bugfix: Minor bug displaying animated cursors 13 | Changes in 4.2.2 14 | Bugfix: Some monochrome images weren't being displayed 15 | Bugfix: Removed extraneous button in "Import Resources" dialog 16 | Bugfix: Manifest resources were being converted to UCS-2 format. 17 | Modified: Increased font sizes in all dialogs 18 | Changes in 4.2.1 (from 4.2.0) 19 | Bugfix: occasional Delphi form was not being decompiled 20 | Bugfix: hiding the toolbar disabled hide/show dialogs/menus. --------------------------------------------------------------------------------