diff options
Diffstat (limited to '')
| -rw-r--r-- | src/tools/bin2cpp.cpp | 414 | ||||
| -rw-r--r-- | src/tools/mkunit.cpp | 962 | ||||
| -rw-r--r-- | src/tools/myriad.cpp | 438 | ||||
| -rw-r--r-- | src/tools/viewcsv.cpp | 868 |
4 files changed, 1341 insertions, 1341 deletions
diff --git a/src/tools/bin2cpp.cpp b/src/tools/bin2cpp.cpp index 0b822f0..4214b34 100644 --- a/src/tools/bin2cpp.cpp +++ b/src/tools/bin2cpp.cpp | |||
| @@ -16,244 +16,244 @@ using namespace Bu; | |||
| 16 | class Options : public OptParser | 16 | class Options : public OptParser |
| 17 | { | 17 | { |
| 18 | public: | 18 | public: |
| 19 | Options( int argc, char *argv[] ) : | 19 | Options( int argc, char *argv[] ) : |
| 20 | sClass("Datafiles") | 20 | sClass("Datafiles") |
| 21 | { | 21 | { |
| 22 | addHelpBanner("bin2cpp - convert files into executable-embeddable C++ code.\n"); | 22 | addHelpBanner("bin2cpp - convert files into executable-embeddable C++ code.\n"); |
| 23 | addHelpBanner("Each file in the input is loaded, filtered according to your options, and written as stack allocated, static variables in a generated class. You can then access the files as though they were on disk through that class."); | 23 | addHelpBanner("Each file in the input is loaded, filtered according to your options, and written as stack allocated, static variables in a generated class. You can then access the files as though they were on disk through that class."); |
| 24 | addHelpBanner("\nUsage: bin2cpp [options] [input1] [input2] [...] [inputN]"); | 24 | addHelpBanner("\nUsage: bin2cpp [options] [input1] [input2] [...] [inputN]"); |
| 25 | addHelpBanner( " Or: bin2cpp -s <taf spec file>\n"); | 25 | addHelpBanner( " Or: bin2cpp -s <taf spec file>\n"); |
| 26 | addOption( sClass, 'c', "Class name [default=\"Datafiles\"]"); | 26 | addOption( sClass, 'c', "Class name [default=\"Datafiles\"]"); |
| 27 | addOption( sOutBase, 'o', "Output base filename [defaults to classname]"); | 27 | addOption( sOutBase, 'o', "Output base filename [defaults to classname]"); |
| 28 | addOption( sOutDir, 'd', "Output directory [defaults to current dir]"); | 28 | addOption( sOutDir, 'd', "Output directory [defaults to current dir]"); |
| 29 | addOption( slot(this, &Options::addFilter), 'f', "Add filter: deflate, bzip2, lzma, base64, hex"); | 29 | addOption( slot(this, &Options::addFilter), 'f', "Add filter: deflate, bzip2, lzma, base64, hex"); |
| 30 | addOption( sSpecFile, 's', "Use the specified spec file instead of providing options on the command line. If you use this option all others are ignored."); | 30 | addOption( sSpecFile, 's', "Use the specified spec file instead of providing options on the command line. If you use this option all others are ignored."); |
| 31 | setNonOption( slot(this, &Options::addInput) ); | 31 | setNonOption( slot(this, &Options::addInput) ); |
| 32 | addHelpOption(); | 32 | addHelpOption(); |
| 33 | 33 | ||
| 34 | parse( argc, argv ); | 34 | parse( argc, argv ); |
| 35 | 35 | ||
| 36 | if( !sOutBase.isSet() ) | 36 | if( !sOutBase.isSet() ) |
| 37 | sOutBase = sClass.toLower(); | 37 | sOutBase = sClass.toLower(); |
| 38 | if( sOutDir.isSet() ) | 38 | if( sOutDir.isSet() ) |
| 39 | sOutDir += "/"; | 39 | sOutDir += "/"; |
| 40 | } | 40 | } |
| 41 | 41 | ||
| 42 | virtual ~Options() | 42 | virtual ~Options() |
| 43 | { | 43 | { |
| 44 | } | 44 | } |
| 45 | 45 | ||
| 46 | int addFilter( Bu::StrArray aArgs ) | 46 | int addFilter( Bu::StrArray aArgs ) |
| 47 | { | 47 | { |
| 48 | slFilter.append( aArgs[1] ); | 48 | slFilter.append( aArgs[1] ); |
| 49 | return 1; | 49 | return 1; |
| 50 | } | 50 | } |
| 51 | 51 | ||
| 52 | int addInput( Bu::StrArray aArgs ) | 52 | int addInput( Bu::StrArray aArgs ) |
| 53 | { | 53 | { |
| 54 | slInput.append( aArgs[0] ); | 54 | slInput.append( aArgs[0] ); |
| 55 | return 0; | 55 | return 0; |
| 56 | } | 56 | } |
| 57 | 57 | ||
| 58 | Bu::String sClass; | 58 | Bu::String sClass; |
| 59 | Bu::String sOutBase; | 59 | Bu::String sOutBase; |
| 60 | Bu::String sOutDir; | 60 | Bu::String sOutDir; |
| 61 | Bu::StringList slInput; | 61 | Bu::StringList slInput; |
| 62 | Bu::StringList slFilter; | 62 | Bu::StringList slFilter; |
| 63 | Bu::String sSpecFile; | 63 | Bu::String sSpecFile; |
| 64 | }; | 64 | }; |
| 65 | 65 | ||
| 66 | int main( int argc, char *argv[] ) | 66 | int main( int argc, char *argv[] ) |
| 67 | { | 67 | { |
| 68 | Options opt( argc, argv ); | 68 | Options opt( argc, argv ); |
| 69 | 69 | ||
| 70 | if( !opt.sSpecFile.isEmpty() ) | 70 | if( !opt.sSpecFile.isEmpty() ) |
| 71 | { | 71 | { |
| 72 | Bu::File fTaf( opt.sSpecFile, Bu::File::Read ); | 72 | Bu::File fTaf( opt.sSpecFile, Bu::File::Read ); |
| 73 | Bu::TafReader rTaf( fTaf ); | 73 | Bu::TafReader rTaf( fTaf ); |
| 74 | Bu::TafGroup *pRoot = rTaf.readGroup(); | 74 | Bu::TafGroup *pRoot = rTaf.readGroup(); |
| 75 | 75 | ||
| 76 | if( pRoot == NULL || pRoot->getName() != "bin2cpp" ) | 76 | if( pRoot == NULL || pRoot->getName() != "bin2cpp" ) |
| 77 | { | 77 | { |
| 78 | sio << "Specfied spec file does not appear to be a bin2cpp taf " | 78 | sio << "Specfied spec file does not appear to be a bin2cpp taf " |
| 79 | "specifications file." << sio.nl; | 79 | "specifications file." << sio.nl; |
| 80 | return 5; | 80 | return 5; |
| 81 | } | 81 | } |
| 82 | 82 | ||
| 83 | opt.sOutBase = opt.sClass = pRoot->getProperty("class"); | 83 | opt.sOutBase = opt.sClass = pRoot->getProperty("class"); |
| 84 | if( pRoot->hasProperty("output") ) | 84 | if( pRoot->hasProperty("output") ) |
| 85 | opt.sOutBase = pRoot->getProperty("output"); | 85 | opt.sOutBase = pRoot->getProperty("output"); |
| 86 | opt.sOutDir = pRoot->getProperty("dir", ".") + "/"; | 86 | opt.sOutDir = pRoot->getProperty("dir", ".") + "/"; |
| 87 | 87 | ||
| 88 | delete pRoot; | 88 | delete pRoot; |
| 89 | } | 89 | } |
| 90 | 90 | ||
| 91 | File fHdrOut( opt.sOutDir + opt.sOutBase + ".h", File::WriteNew ); | 91 | File fHdrOut( opt.sOutDir + opt.sOutBase + ".h", File::WriteNew ); |
| 92 | File fSrcOut( opt.sOutDir + opt.sOutBase + ".cpp", File::WriteNew ); | 92 | File fSrcOut( opt.sOutDir + opt.sOutBase + ".cpp", File::WriteNew ); |
| 93 | 93 | ||
| 94 | Bu::Hash<char, bool> hFilters; | 94 | Bu::Hash<char, bool> hFilters; |
| 95 | 95 | ||
| 96 | Formatter fHdr( fHdrOut ); | 96 | Formatter fHdr( fHdrOut ); |
| 97 | Formatter fSrc( fSrcOut ); | 97 | Formatter fSrc( fSrcOut ); |
| 98 | fHdr << "#ifndef BIN2CPP_" << opt.sClass.toUpper() << "_H" << fHdr.nl | 98 | fHdr << "#ifndef BIN2CPP_" << opt.sClass.toUpper() << "_H" << fHdr.nl |
| 99 | << "#define BIN2CPP_" << opt.sClass.toUpper() << "_H" << fHdr.nl << fHdr.nl | 99 | << "#define BIN2CPP_" << opt.sClass.toUpper() << "_H" << fHdr.nl << fHdr.nl |
| 100 | << "#include <bu/string.h>" << fHdr.nl | 100 | << "#include <bu/string.h>" << fHdr.nl |
| 101 | << "#include <bu/streamstack.h>" << fHdr.nl | 101 | << "#include <bu/streamstack.h>" << fHdr.nl |
| 102 | << fHdr.nl | 102 | << fHdr.nl |
| 103 | << "class " << opt.sClass << fHdr.nl | 103 | << "class " << opt.sClass << fHdr.nl |
| 104 | << "{" << fHdr.nl | 104 | << "{" << fHdr.nl |
| 105 | << "public:" << fHdr.nl | 105 | << "public:" << fHdr.nl |
| 106 | << "\tclass File { public: int iSize; const char *data; const char *flt; };" << fHdr.nl << fHdr.nl | 106 | << "\tclass File { public: int iSize; const char *data; const char *flt; };" << fHdr.nl << fHdr.nl |
| 107 | << "\tstatic const File &getFile( const Bu::String &sName );" << fHdr.nl | 107 | << "\tstatic const File &getFile( const Bu::String &sName );" << fHdr.nl |
| 108 | << "\tstatic Bu::StreamStack *open( const Bu::String &sName );" << fHdr.nl | 108 | << "\tstatic Bu::StreamStack *open( const Bu::String &sName );" << fHdr.nl |
| 109 | << "\tstatic Bu::StreamStack *openRaw( const Bu::String &sName );" << fHdr.nl | 109 | << "\tstatic Bu::StreamStack *openRaw( const Bu::String &sName );" << fHdr.nl |
| 110 | << "\tstatic Bu::String getString( const Bu::String &sName );" << fHdr.nl | 110 | << "\tstatic Bu::String getString( const Bu::String &sName );" << fHdr.nl |
| 111 | << "\tstatic Bu::String getStringRaw( const Bu::String &sName );" << fHdr.nl | 111 | << "\tstatic Bu::String getStringRaw( const Bu::String &sName );" << fHdr.nl |
| 112 | << fHdr.nl; | 112 | << fHdr.nl; |
| 113 | fHdr << "public:" << fHdr.nl | 113 | fHdr << "public:" << fHdr.nl |
| 114 | << "\tstatic const File aFile[];" << fHdr.nl | 114 | << "\tstatic const File aFile[];" << fHdr.nl |
| 115 | << "};" << fHdr.nl << fHdr.nl; | 115 | << "};" << fHdr.nl << fHdr.nl; |
| 116 | fHdr << "#endif"; | 116 | fHdr << "#endif"; |
| 117 | 117 | ||
| 118 | fSrc << "#include \"" << opt.sOutBase << ".h\"" << fSrc.nl | 118 | fSrc << "#include \"" << opt.sOutBase << ".h\"" << fSrc.nl |
| 119 | << "#include <bu/deflate.h>" << fSrc.nl | 119 | << "#include <bu/deflate.h>" << fSrc.nl |
| 120 | << "#include <bu/bzip2.h>" << fSrc.nl | 120 | << "#include <bu/bzip2.h>" << fSrc.nl |
| 121 | << "#include <bu/base64.h>" << fSrc.nl | 121 | << "#include <bu/base64.h>" << fSrc.nl |
| 122 | << "#include <bu/lzma.h>" << fSrc.nl | 122 | << "#include <bu/lzma.h>" << fSrc.nl |
| 123 | << "#include <bu/hex.h>" << fSrc.nl | 123 | << "#include <bu/hex.h>" << fSrc.nl |
| 124 | << "#include <bu/strfilter.h>" << fSrc.nl | 124 | << "#include <bu/strfilter.h>" << fSrc.nl |
| 125 | << "#include <bu/staticmembuf.h>" << fSrc.nl << fSrc.nl | 125 | << "#include <bu/staticmembuf.h>" << fSrc.nl << fSrc.nl |
| 126 | << "const " << opt.sClass << "::File " << opt.sClass << "::aFile[] = {" << fSrc.nl; | 126 | << "const " << opt.sClass << "::File " << opt.sClass << "::aFile[] = {" << fSrc.nl; |
| 127 | 127 | ||
| 128 | for( Bu::StringList::iterator i = opt.slInput.begin(); i; i++ ) | 128 | for( Bu::StringList::iterator i = opt.slInput.begin(); i; i++ ) |
| 129 | { | 129 | { |
| 130 | File fIn( *i, File::Read ); | 130 | File fIn( *i, File::Read ); |
| 131 | Bu::String sDat; | 131 | Bu::String sDat; |
| 132 | char buf[1024]; | 132 | char buf[1024]; |
| 133 | while( !fIn.isEos() ) | 133 | while( !fIn.isEos() ) |
| 134 | { | 134 | { |
| 135 | sDat.append( buf, fIn.read( buf, 1024 ) ); | 135 | sDat.append( buf, fIn.read( buf, 1024 ) ); |
| 136 | } | 136 | } |
| 137 | 137 | ||
| 138 | Bu::String sFltDesc; | 138 | Bu::String sFltDesc; |
| 139 | for( Bu::StringList::iterator f = opt.slFilter.begin(); f; f++ ) | 139 | for( Bu::StringList::iterator f = opt.slFilter.begin(); f; f++ ) |
| 140 | { | 140 | { |
| 141 | if( *f == "deflate" ) | 141 | if( *f == "deflate" ) |
| 142 | { | 142 | { |
| 143 | sDat = encodeStr<Deflate>( sDat ); | 143 | sDat = encodeStr<Deflate>( sDat ); |
| 144 | sFltDesc.prepend("d"); | 144 | sFltDesc.prepend("d"); |
| 145 | hFilters.insert('d', true ); | 145 | hFilters.insert('d', true ); |
| 146 | } | 146 | } |
| 147 | else if( *f == "bzip2" ) | 147 | else if( *f == "bzip2" ) |
| 148 | { | 148 | { |
| 149 | sDat = encodeStr<BZip2>( sDat ); | 149 | sDat = encodeStr<BZip2>( sDat ); |
| 150 | sFltDesc.prepend("b"); | 150 | sFltDesc.prepend("b"); |
| 151 | hFilters.insert('b', true ); | 151 | hFilters.insert('b', true ); |
| 152 | } | 152 | } |
| 153 | else if( *f == "lzma" ) | 153 | else if( *f == "lzma" ) |
| 154 | { | 154 | { |
| 155 | sDat = encodeStr<Lzma>( sDat ); | 155 | sDat = encodeStr<Lzma>( sDat ); |
| 156 | sFltDesc.prepend("l"); | 156 | sFltDesc.prepend("l"); |
| 157 | hFilters.insert('l', true ); | 157 | hFilters.insert('l', true ); |
| 158 | } | 158 | } |
| 159 | else if( *f == "base64" ) | 159 | else if( *f == "base64" ) |
| 160 | { | 160 | { |
| 161 | sDat = encodeStr<Base64>( sDat ); | 161 | sDat = encodeStr<Base64>( sDat ); |
| 162 | sFltDesc.prepend("6"); | 162 | sFltDesc.prepend("6"); |
| 163 | hFilters.insert('6', true ); | 163 | hFilters.insert('6', true ); |
| 164 | } | 164 | } |
| 165 | else if( *f == "hex" ) | 165 | else if( *f == "hex" ) |
| 166 | { | 166 | { |
| 167 | sDat = encodeStr<Hex>( sDat ); | 167 | sDat = encodeStr<Hex>( sDat ); |
| 168 | sFltDesc.prepend("h"); | 168 | sFltDesc.prepend("h"); |
| 169 | hFilters.insert('h', true ); | 169 | hFilters.insert('h', true ); |
| 170 | } | 170 | } |
| 171 | else | 171 | else |
| 172 | { | 172 | { |
| 173 | sio << "No known filter named " << *f << sio.nl; | 173 | sio << "No known filter named " << *f << sio.nl; |
| 174 | return 1; | 174 | return 1; |
| 175 | } | 175 | } |
| 176 | } | 176 | } |
| 177 | 177 | ||
| 178 | fSrc << " {" << sDat.getSize() << ", \""; | 178 | fSrc << " {" << sDat.getSize() << ", \""; |
| 179 | 179 | ||
| 180 | for( Bu::String::iterator j = sDat.begin(); j; j++ ) | 180 | for( Bu::String::iterator j = sDat.begin(); j; j++ ) |
| 181 | { | 181 | { |
| 182 | fSrc << "\\x" << Fmt::hex() << (unsigned char)*j; | 182 | fSrc << "\\x" << Fmt::hex() << (unsigned char)*j; |
| 183 | } | 183 | } |
| 184 | fSrc << "\", \"" << sFltDesc << "\"}," << fSrc.nl; | 184 | fSrc << "\", \"" << sFltDesc << "\"}," << fSrc.nl; |
| 185 | } | 185 | } |
| 186 | fSrc << "};" << fSrc.nl << fSrc.nl; | 186 | fSrc << "};" << fSrc.nl << fSrc.nl; |
| 187 | 187 | ||
| 188 | fSrc << "const " << opt.sClass << "::File &" << opt.sClass << "::getFile( const Bu::String &sName )" | 188 | fSrc << "const " << opt.sClass << "::File &" << opt.sClass << "::getFile( const Bu::String &sName )" |
| 189 | << fSrc.nl | 189 | << fSrc.nl |
| 190 | << "{" << fSrc.nl | 190 | << "{" << fSrc.nl |
| 191 | << "\tswitch( Bu::__calcHashCode( sName ) )" << fSrc.nl | 191 | << "\tswitch( Bu::__calcHashCode( sName ) )" << fSrc.nl |
| 192 | << "\t{" << fSrc.nl; | 192 | << "\t{" << fSrc.nl; |
| 193 | 193 | ||
| 194 | int idx = 0; | 194 | int idx = 0; |
| 195 | for( Bu::StringList::iterator i = opt.slInput.begin(); i; i++ ) | 195 | for( Bu::StringList::iterator i = opt.slInput.begin(); i; i++ ) |
| 196 | { | 196 | { |
| 197 | fSrc << "\t\tcase " << Bu::__calcHashCode( *i ) << "UL:" << fSrc.nl | 197 | fSrc << "\t\tcase " << Bu::__calcHashCode( *i ) << "UL:" << fSrc.nl |
| 198 | << "\t\t\treturn aFile[" << idx << "];" << fSrc.nl; | 198 | << "\t\t\treturn aFile[" << idx << "];" << fSrc.nl; |
| 199 | idx++; | 199 | idx++; |
| 200 | } | 200 | } |
| 201 | fSrc << "\t}" << fSrc.nl | 201 | fSrc << "\t}" << fSrc.nl |
| 202 | << "\tthrow Bu::ExceptionBase(\"No file matching \\\"%s\\\" found.\", sName.getStr() );" << fSrc.nl | 202 | << "\tthrow Bu::ExceptionBase(\"No file matching \\\"%s\\\" found.\", sName.getStr() );" << fSrc.nl |
| 203 | << "}" << fSrc.nl << fSrc.nl; | 203 | << "}" << fSrc.nl << fSrc.nl; |
| 204 | 204 | ||
| 205 | fSrc << "Bu::StreamStack *" << opt.sClass << "::open( const Bu::String &sName )" << fSrc.nl | 205 | fSrc << "Bu::StreamStack *" << opt.sClass << "::open( const Bu::String &sName )" << fSrc.nl |
| 206 | << "{" << fSrc.nl | 206 | << "{" << fSrc.nl |
| 207 | << "\tconst File &f = getFile( sName );" << fSrc.nl | 207 | << "\tconst File &f = getFile( sName );" << fSrc.nl |
| 208 | << "\tBu::StreamStack *s = new Bu::StreamStack( new Bu::StaticMemBuf( f.data, f.iSize ) );" << fSrc.nl; | 208 | << "\tBu::StreamStack *s = new Bu::StreamStack( new Bu::StaticMemBuf( f.data, f.iSize ) );" << fSrc.nl; |
| 209 | 209 | ||
| 210 | if( !hFilters.isEmpty() ) | 210 | if( !hFilters.isEmpty() ) |
| 211 | { | 211 | { |
| 212 | fSrc << "\tfor( const char *t = f.flt; *t; t++ )" << fSrc.nl | 212 | fSrc << "\tfor( const char *t = f.flt; *t; t++ )" << fSrc.nl |
| 213 | << "\t{" << fSrc.nl | 213 | << "\t{" << fSrc.nl |
| 214 | << "\t\tswitch( *t )" << fSrc.nl | 214 | << "\t\tswitch( *t )" << fSrc.nl |
| 215 | << "\t\t{" << fSrc.nl; | 215 | << "\t\t{" << fSrc.nl; |
| 216 | if( hFilters.has('d') ) | 216 | if( hFilters.has('d') ) |
| 217 | fSrc << "\t\t\tcase 'd': s->pushFilter<Bu::Deflate>(); break;" << fSrc.nl; | 217 | fSrc << "\t\t\tcase 'd': s->pushFilter<Bu::Deflate>(); break;" << fSrc.nl; |
| 218 | if( hFilters.has('b') ) | 218 | if( hFilters.has('b') ) |
| 219 | fSrc << "\t\t\tcase 'b': s->pushFilter<Bu::BZip2>(); break;" << fSrc.nl; | 219 | fSrc << "\t\t\tcase 'b': s->pushFilter<Bu::BZip2>(); break;" << fSrc.nl; |
| 220 | if( hFilters.has('l') ) | 220 | if( hFilters.has('l') ) |
| 221 | fSrc << "\t\t\tcase 'l': s->pushFilter<Bu::Lzma>(); break;" << fSrc.nl; | 221 | fSrc << "\t\t\tcase 'l': s->pushFilter<Bu::Lzma>(); break;" << fSrc.nl; |
| 222 | if( hFilters.has('6') ) | 222 | if( hFilters.has('6') ) |
| 223 | fSrc << "\t\t\tcase '6': s->pushFilter<Bu::Base64>(); break;" << fSrc.nl; | 223 | fSrc << "\t\t\tcase '6': s->pushFilter<Bu::Base64>(); break;" << fSrc.nl; |
| 224 | if( hFilters.has('h') ) | 224 | if( hFilters.has('h') ) |
| 225 | fSrc << "\t\t\tcase 'h': s->pushFilter<Bu::Hex>(); break;" << fSrc.nl; | 225 | fSrc << "\t\t\tcase 'h': s->pushFilter<Bu::Hex>(); break;" << fSrc.nl; |
| 226 | fSrc << "\t\t}" << fSrc.nl | 226 | fSrc << "\t\t}" << fSrc.nl |
| 227 | << "\t}" << fSrc.nl; | 227 | << "\t}" << fSrc.nl; |
| 228 | } | 228 | } |
| 229 | fSrc << "\treturn s;" << fSrc.nl | 229 | fSrc << "\treturn s;" << fSrc.nl |
| 230 | << "}" << fSrc.nl << fSrc.nl; | 230 | << "}" << fSrc.nl << fSrc.nl; |
| 231 | 231 | ||
| 232 | fSrc << "Bu::StreamStack *" << opt.sClass << "::openRaw( const Bu::String &sName )" << fSrc.nl | 232 | fSrc << "Bu::StreamStack *" << opt.sClass << "::openRaw( const Bu::String &sName )" << fSrc.nl |
| 233 | << "{" << fSrc.nl | 233 | << "{" << fSrc.nl |
| 234 | << "\tconst File &f = getFile( sName );" << fSrc.nl | 234 | << "\tconst File &f = getFile( sName );" << fSrc.nl |
| 235 | << "\treturn new Bu::StreamStack( new Bu::StaticMemBuf( f.data, f.iSize ) );" << fSrc.nl | 235 | << "\treturn new Bu::StreamStack( new Bu::StaticMemBuf( f.data, f.iSize ) );" << fSrc.nl |
| 236 | << "}" << fSrc.nl << fSrc.nl; | 236 | << "}" << fSrc.nl << fSrc.nl; |
| 237 | 237 | ||
| 238 | fSrc << "Bu::String " << opt.sClass << "::getString( const Bu::String &sName )" << fSrc.nl | 238 | fSrc << "Bu::String " << opt.sClass << "::getString( const Bu::String &sName )" << fSrc.nl |
| 239 | << "{" << fSrc.nl | 239 | << "{" << fSrc.nl |
| 240 | << "\tBu::StreamStack *ss = open( sName );" << fSrc.nl | 240 | << "\tBu::StreamStack *ss = open( sName );" << fSrc.nl |
| 241 | << "\tBu::String s;" << fSrc.nl | 241 | << "\tBu::String s;" << fSrc.nl |
| 242 | << "\tchar buf[1024];" << fSrc.nl | 242 | << "\tchar buf[1024];" << fSrc.nl |
| 243 | << "\twhile( !ss->isEos() )" << fSrc.nl | 243 | << "\twhile( !ss->isEos() )" << fSrc.nl |
| 244 | << "\t{" << fSrc.nl | 244 | << "\t{" << fSrc.nl |
| 245 | << "\t\ts.append( buf, ss->read( buf, 1024 ) );" << fSrc.nl | 245 | << "\t\ts.append( buf, ss->read( buf, 1024 ) );" << fSrc.nl |
| 246 | << "\t}" << fSrc.nl | 246 | << "\t}" << fSrc.nl |
| 247 | << "\tdelete ss;" << fSrc.nl | 247 | << "\tdelete ss;" << fSrc.nl |
| 248 | << "\treturn s;" << fSrc.nl | 248 | << "\treturn s;" << fSrc.nl |
| 249 | << "}" << fSrc.nl << fSrc.nl; | 249 | << "}" << fSrc.nl << fSrc.nl; |
| 250 | 250 | ||
| 251 | fSrc << "Bu::String " << opt.sClass << "::getStringRaw( const Bu::String &sName )" << fSrc.nl | 251 | fSrc << "Bu::String " << opt.sClass << "::getStringRaw( const Bu::String &sName )" << fSrc.nl |
| 252 | << "{" << fSrc.nl | 252 | << "{" << fSrc.nl |
| 253 | << "\tconst File &f = getFile( sName );" << fSrc.nl | 253 | << "\tconst File &f = getFile( sName );" << fSrc.nl |
| 254 | << "\treturn Bu::String( f.data, f.iSize );" << fSrc.nl | 254 | << "\treturn Bu::String( f.data, f.iSize );" << fSrc.nl |
| 255 | << "}" << fSrc.nl << fSrc.nl; | 255 | << "}" << fSrc.nl << fSrc.nl; |
| 256 | 256 | ||
| 257 | return 0; | 257 | return 0; |
| 258 | } | 258 | } |
| 259 | 259 | ||
diff --git a/src/tools/mkunit.cpp b/src/tools/mkunit.cpp index d634feb..96deb6b 100644 --- a/src/tools/mkunit.cpp +++ b/src/tools/mkunit.cpp | |||
| @@ -17,236 +17,236 @@ using namespace Bu; | |||
| 17 | class Test | 17 | class Test |
| 18 | { | 18 | { |
| 19 | public: | 19 | public: |
| 20 | Test() : | 20 | Test() : |
| 21 | bExpectPass( true ) | 21 | bExpectPass( true ) |
| 22 | { | 22 | { |
| 23 | } | 23 | } |
| 24 | 24 | ||
| 25 | Bu::String sName; | 25 | Bu::String sName; |
| 26 | bool bExpectPass; | 26 | bool bExpectPass; |
| 27 | }; | 27 | }; |
| 28 | typedef Bu::List<Test> TestList; | 28 | typedef Bu::List<Test> TestList; |
| 29 | 29 | ||
| 30 | class Suite | 30 | class Suite |
| 31 | { | 31 | { |
| 32 | public: | 32 | public: |
| 33 | Bu::String sName; | 33 | Bu::String sName; |
| 34 | TestList lTest; | 34 | TestList lTest; |
| 35 | }; | 35 | }; |
| 36 | //typedef Bu::List<Suite> SuiteList; | 36 | //typedef Bu::List<Suite> SuiteList; |
| 37 | 37 | ||
| 38 | enum TokType | 38 | enum TokType |
| 39 | { | 39 | { |
| 40 | tokFluff, | 40 | tokFluff, |
| 41 | tokSuite, | 41 | tokSuite, |
| 42 | tokTest, | 42 | tokTest, |
| 43 | tokChar, | 43 | tokChar, |
| 44 | tokBlock, | 44 | tokBlock, |
| 45 | tokEof | 45 | tokEof |
| 46 | }; | 46 | }; |
| 47 | 47 | ||
| 48 | Bu::Formatter &operator<<( Bu::Formatter &f, TokType t ) | 48 | Bu::Formatter &operator<<( Bu::Formatter &f, TokType t ) |
| 49 | { | 49 | { |
| 50 | switch( t ) | 50 | switch( t ) |
| 51 | { | 51 | { |
| 52 | case tokFluff: return f << "tokFluff"; | 52 | case tokFluff: return f << "tokFluff"; |
| 53 | case tokSuite: return f << "tokSuite"; | 53 | case tokSuite: return f << "tokSuite"; |
| 54 | case tokTest: return f << "tokTest"; | 54 | case tokTest: return f << "tokTest"; |
| 55 | case tokChar: return f << "tokChar"; | 55 | case tokChar: return f << "tokChar"; |
| 56 | case tokBlock: return f << "tokBlock"; | 56 | case tokBlock: return f << "tokBlock"; |
| 57 | case tokEof: return f << "tokEof"; | 57 | case tokEof: return f << "tokEof"; |
| 58 | } | 58 | } |
| 59 | 59 | ||
| 60 | return f; | 60 | return f; |
| 61 | } | 61 | } |
| 62 | 62 | ||
| 63 | Bu::Formatter &operator<<( Bu::Formatter &f, const Test &t ) | 63 | Bu::Formatter &operator<<( Bu::Formatter &f, const Test &t ) |
| 64 | { | 64 | { |
| 65 | return f << "{" << t.sName << ", bExpectPass=" << t.bExpectPass << "}"; | 65 | return f << "{" << t.sName << ", bExpectPass=" << t.bExpectPass << "}"; |
| 66 | } | 66 | } |
| 67 | 67 | ||
| 68 | Bu::Formatter &operator<<( Bu::Formatter &f, const Suite &s ) | 68 | Bu::Formatter &operator<<( Bu::Formatter &f, const Suite &s ) |
| 69 | { | 69 | { |
| 70 | return f << "Suite[" << s.sName << "] = " << s.lTest << f.nl; | 70 | return f << "Suite[" << s.sName << "] = " << s.lTest << f.nl; |
| 71 | } | 71 | } |
| 72 | 72 | ||
| 73 | class Parser | 73 | class Parser |
| 74 | { | 74 | { |
| 75 | public: | 75 | public: |
| 76 | Parser( const Bu::String &sFile ) : | 76 | Parser( const Bu::String &sFile ) : |
| 77 | sIn( sFile ), | 77 | sIn( sFile ), |
| 78 | fIn( sFile, File::Read ), | 78 | fIn( sFile, File::Read ), |
| 79 | bIn( fIn ), | 79 | bIn( fIn ), |
| 80 | cBuf( 0 ), | 80 | cBuf( 0 ), |
| 81 | bAvail( false ), | 81 | bAvail( false ), |
| 82 | eMode( mRoot ), | 82 | eMode( mRoot ), |
| 83 | iLine( 1 ), | 83 | iLine( 1 ), |
| 84 | iChar( 0 ), | 84 | iChar( 0 ), |
| 85 | iDepth( 0 ) | 85 | iDepth( 0 ) |
| 86 | { | 86 | { |
| 87 | } | 87 | } |
| 88 | 88 | ||
| 89 | char nextChar() | 89 | char nextChar() |
| 90 | { | 90 | { |
| 91 | if( bAvail ) | 91 | if( bAvail ) |
| 92 | return cBuf; | 92 | return cBuf; |
| 93 | 93 | ||
| 94 | if( bIn.read( &cBuf, 1 ) < 1 ) | 94 | if( bIn.read( &cBuf, 1 ) < 1 ) |
| 95 | throw Bu::ExceptionBase("End of stream"); | 95 | throw Bu::ExceptionBase("End of stream"); |
| 96 | bAvail = true; | 96 | bAvail = true; |
| 97 | 97 | ||
| 98 | if( cBuf == '\n' ) | 98 | if( cBuf == '\n' ) |
| 99 | { | 99 | { |
| 100 | iLine++; | 100 | iLine++; |
| 101 | iChar = 0; | 101 | iChar = 0; |
| 102 | } | 102 | } |
| 103 | else | 103 | else |
| 104 | iChar++; | 104 | iChar++; |
| 105 | 105 | ||
| 106 | return cBuf; | 106 | return cBuf; |
| 107 | } | 107 | } |
| 108 | 108 | ||
| 109 | TokType nextToken( Variant &v, Bu::String &sWsOut, int &iLineStart, | 109 | TokType nextToken( Variant &v, Bu::String &sWsOut, int &iLineStart, |
| 110 | int &iCharStart ) | 110 | int &iCharStart ) |
| 111 | { | 111 | { |
| 112 | Bu::String sTok, sWs; | 112 | Bu::String sTok, sWs; |
| 113 | 113 | ||
| 114 | char buf; | 114 | char buf; |
| 115 | try | 115 | try |
| 116 | { | 116 | { |
| 117 | buf = nextChar(); | 117 | buf = nextChar(); |
| 118 | } | 118 | } |
| 119 | catch(...) | 119 | catch(...) |
| 120 | { | 120 | { |
| 121 | return tokEof; | 121 | return tokEof; |
| 122 | } | 122 | } |
| 123 | 123 | ||
| 124 | for(;;) | 124 | for(;;) |
| 125 | { | 125 | { |
| 126 | if( buf == ' ' || buf == '\t' || buf == '\n' || buf == '\r' ) | 126 | if( buf == ' ' || buf == '\t' || buf == '\n' || buf == '\r' ) |
| 127 | { | 127 | { |
| 128 | sWs += buf; | 128 | sWs += buf; |
| 129 | bAvail = false; | 129 | bAvail = false; |
| 130 | } | 130 | } |
| 131 | else | 131 | else |
| 132 | break; | 132 | break; |
| 133 | 133 | ||
| 134 | try | 134 | try |
| 135 | { | 135 | { |
| 136 | buf = nextChar(); | 136 | buf = nextChar(); |
| 137 | } | 137 | } |
| 138 | catch(...) | 138 | catch(...) |
| 139 | { | 139 | { |
| 140 | sWsOut = sWs; | 140 | sWsOut = sWs; |
| 141 | return tokEof; | 141 | return tokEof; |
| 142 | } | 142 | } |
| 143 | } | 143 | } |
| 144 | 144 | ||
| 145 | sWsOut = sWs; | 145 | sWsOut = sWs; |
| 146 | 146 | ||
| 147 | iLineStart = iLine; | 147 | iLineStart = iLine; |
| 148 | iCharStart = iChar; | 148 | iCharStart = iChar; |
| 149 | bool bInStr = false; | 149 | bool bInStr = false; |
| 150 | bool bDblStr; | 150 | bool bDblStr; |
| 151 | 151 | ||
| 152 | for(;;) | 152 | for(;;) |
| 153 | { | 153 | { |
| 154 | switch( eMode ) | 154 | switch( eMode ) |
| 155 | { | 155 | { |
| 156 | case mRoot: | 156 | case mRoot: |
| 157 | if( buf == ' ' || buf == '\t' || buf == '\n' | 157 | if( buf == ' ' || buf == '\t' || buf == '\n' |
| 158 | || buf == '\r' ) | 158 | || buf == '\r' ) |
| 159 | { | 159 | { |
| 160 | if( sTok == "suite" ) | 160 | if( sTok == "suite" ) |
| 161 | return tokSuite; | 161 | return tokSuite; |
| 162 | else | 162 | else |
| 163 | { | 163 | { |
| 164 | v = sTok; | 164 | v = sTok; |
| 165 | return tokFluff; | 165 | return tokFluff; |
| 166 | } | 166 | } |
| 167 | } | 167 | } |
| 168 | else if( buf == '(' || buf == ')' || buf == '{' | 168 | else if( buf == '(' || buf == ')' || buf == '{' |
| 169 | || buf == '}' || buf == ';' ) | 169 | || buf == '}' || buf == ';' ) |
| 170 | { | 170 | { |
| 171 | if( sTok.getSize() == 0 ) | 171 | if( sTok.getSize() == 0 ) |
| 172 | { | 172 | { |
| 173 | bAvail = false; | 173 | bAvail = false; |
| 174 | v = buf; | 174 | v = buf; |
| 175 | return tokChar; | 175 | return tokChar; |
| 176 | } | 176 | } |
| 177 | else | 177 | else |
| 178 | { | 178 | { |
| 179 | v = sTok; | 179 | v = sTok; |
| 180 | return tokFluff; | 180 | return tokFluff; |
| 181 | } | 181 | } |
| 182 | } | 182 | } |
| 183 | else | 183 | else |
| 184 | { | 184 | { |
| 185 | sTok += buf; | 185 | sTok += buf; |
| 186 | bAvail = false; | 186 | bAvail = false; |
| 187 | } | 187 | } |
| 188 | break; | 188 | break; |
| 189 | 189 | ||
| 190 | case mSuite: | 190 | case mSuite: |
| 191 | if( buf == ' ' || buf == '\t' || buf == '\n' | 191 | if( buf == ' ' || buf == '\t' || buf == '\n' |
| 192 | || buf == '\r' ) | 192 | || buf == '\r' ) |
| 193 | { | 193 | { |
| 194 | if( sTok == "test" ) | 194 | if( sTok == "test" ) |
| 195 | return tokTest; | 195 | return tokTest; |
| 196 | else | 196 | else |
| 197 | { | 197 | { |
| 198 | v = sTok; | 198 | v = sTok; |
| 199 | return tokFluff; | 199 | return tokFluff; |
| 200 | } | 200 | } |
| 201 | } | 201 | } |
| 202 | else if( buf == '(' || buf == ')' | 202 | else if( buf == '(' || buf == ')' |
| 203 | || buf == '}' || buf == ';' ) | 203 | || buf == '}' || buf == ';' ) |
| 204 | { | 204 | { |
| 205 | if( sTok.getSize() == 0 ) | 205 | if( sTok.getSize() == 0 ) |
| 206 | { | 206 | { |
| 207 | bAvail = false; | 207 | bAvail = false; |
| 208 | v = buf; | 208 | v = buf; |
| 209 | return tokChar; | 209 | return tokChar; |
| 210 | } | 210 | } |
| 211 | else | 211 | else |
| 212 | { | 212 | { |
| 213 | v = sTok; | 213 | v = sTok; |
| 214 | return tokFluff; | 214 | return tokFluff; |
| 215 | } | 215 | } |
| 216 | } | 216 | } |
| 217 | else if( buf == '{' ) | 217 | else if( buf == '{' ) |
| 218 | { | 218 | { |
| 219 | if( sTok.getSize() > 0 ) | 219 | if( sTok.getSize() > 0 ) |
| 220 | { | 220 | { |
| 221 | v = sTok; | 221 | v = sTok; |
| 222 | return tokFluff; | 222 | return tokFluff; |
| 223 | } | 223 | } |
| 224 | else | 224 | else |
| 225 | { | 225 | { |
| 226 | sTok += buf; | 226 | sTok += buf; |
| 227 | bAvail = false; | 227 | bAvail = false; |
| 228 | eMode = mBlock; | 228 | eMode = mBlock; |
| 229 | iDepth = 1; | 229 | iDepth = 1; |
| 230 | } | 230 | } |
| 231 | } | 231 | } |
| 232 | else | 232 | else |
| 233 | { | 233 | { |
| 234 | sTok += buf; | 234 | sTok += buf; |
| 235 | bAvail = false; | 235 | bAvail = false; |
| 236 | } | 236 | } |
| 237 | break; | 237 | break; |
| 238 | 238 | ||
| 239 | case mBlock: | 239 | case mBlock: |
| 240 | if( bInStr ) | 240 | if( bInStr ) |
| 241 | { | 241 | { |
| 242 | if( buf == '\\' ) | 242 | if( buf == '\\' ) |
| 243 | { | 243 | { |
| 244 | sTok += buf; | 244 | sTok += buf; |
| 245 | bAvail = false; | 245 | bAvail = false; |
| 246 | sTok += nextChar(); | 246 | sTok += nextChar(); |
| 247 | bAvail = false; | 247 | bAvail = false; |
| 248 | } | 248 | } |
| 249 | else if( bDblStr == true && buf == '\"' ) | 249 | else if( bDblStr == true && buf == '\"' ) |
| 250 | { | 250 | { |
| 251 | sTok += buf; | 251 | sTok += buf; |
| 252 | bAvail = false; | 252 | bAvail = false; |
| @@ -267,295 +267,295 @@ public: | |||
| 267 | else | 267 | else |
| 268 | { | 268 | { |
| 269 | if( buf == '\"' ) | 269 | if( buf == '\"' ) |
| 270 | { | 270 | { |
| 271 | bInStr = true; | 271 | bInStr = true; |
| 272 | bDblStr = true; | 272 | bDblStr = true; |
| 273 | sTok += buf; | 273 | sTok += buf; |
| 274 | bAvail = false; | 274 | bAvail = false; |
| 275 | } | 275 | } |
| 276 | else if( buf == '\'' ) | 276 | else if( buf == '\'' ) |
| 277 | { | 277 | { |
| 278 | bInStr = true; | 278 | bInStr = true; |
| 279 | bDblStr = false; | 279 | bDblStr = false; |
| 280 | sTok += buf; | 280 | sTok += buf; |
| 281 | bAvail = false; | 281 | bAvail = false; |
| 282 | } | 282 | } |
| 283 | else if( buf == '}' ) | 283 | else if( buf == '}' ) |
| 284 | { | 284 | { |
| 285 | sTok += buf; | 285 | sTok += buf; |
| 286 | bAvail = false; | 286 | bAvail = false; |
| 287 | iDepth--; | 287 | iDepth--; |
| 288 | if( iDepth == 0 ) | 288 | if( iDepth == 0 ) |
| 289 | { | 289 | { |
| 290 | v = sTok; | 290 | v = sTok; |
| 291 | eMode = mSuite; | 291 | eMode = mSuite; |
| 292 | return tokBlock; | 292 | return tokBlock; |
| 293 | } | 293 | } |
| 294 | } | 294 | } |
| 295 | else if( buf == '{' ) | 295 | else if( buf == '{' ) |
| 296 | { | 296 | { |
| 297 | sTok += buf; | 297 | sTok += buf; |
| 298 | bAvail = false; | 298 | bAvail = false; |
| 299 | iDepth++; | 299 | iDepth++; |
| 300 | } | 300 | } |
| 301 | else | 301 | else |
| 302 | { | 302 | { |
| 303 | sTok += buf; | 303 | sTok += buf; |
| 304 | bAvail = false; | 304 | bAvail = false; |
| 305 | } | 305 | } |
| 306 | } | 306 | } |
| 307 | break; | 307 | break; |
| 308 | } | 308 | } |
| 309 | 309 | ||
| 310 | buf = nextChar(); | 310 | buf = nextChar(); |
| 311 | } | 311 | } |
| 312 | } | 312 | } |
| 313 | 313 | ||
| 314 | void firstPass() | 314 | void firstPass() |
| 315 | { | 315 | { |
| 316 | Variant v; | 316 | Variant v; |
| 317 | Bu::String sWs; | 317 | Bu::String sWs; |
| 318 | int iL, iC; | 318 | int iL, iC; |
| 319 | for(;;) | 319 | for(;;) |
| 320 | { | 320 | { |
| 321 | TokType t = nextToken( v, sWs, iL, iC ); | 321 | TokType t = nextToken( v, sWs, iL, iC ); |
| 322 | if( t == tokEof ) | 322 | if( t == tokEof ) |
| 323 | return; | 323 | return; |
| 324 | switch( eMode ) | 324 | switch( eMode ) |
| 325 | { | 325 | { |
| 326 | case mRoot: | 326 | case mRoot: |
| 327 | if( t == tokSuite ) | 327 | if( t == tokSuite ) |
| 328 | { | 328 | { |
| 329 | if( nextToken( v, sWs, iL, iC ) != tokFluff ) | 329 | if( nextToken( v, sWs, iL, iC ) != tokFluff ) |
| 330 | throw Bu::ExceptionBase("%d:%d: Expected string " | 330 | throw Bu::ExceptionBase("%d:%d: Expected string " |
| 331 | "following suite.", iL, iC ); | 331 | "following suite.", iL, iC ); |
| 332 | s.sName = v.get<Bu::String>(); | 332 | s.sName = v.get<Bu::String>(); |
| 333 | if( nextToken( v, sWs, iL, iC ) != tokChar || | 333 | if( nextToken( v, sWs, iL, iC ) != tokChar || |
| 334 | v.get<char>() != '{' ) | 334 | v.get<char>() != '{' ) |
| 335 | throw Bu::ExceptionBase("%d:%d: Expected {, got " | 335 | throw Bu::ExceptionBase("%d:%d: Expected {, got " |
| 336 | "'%s'", iL, iC, v.toString().getStr() ); | 336 | "'%s'", iL, iC, v.toString().getStr() ); |
| 337 | eMode = mSuite; | 337 | eMode = mSuite; |
| 338 | } | 338 | } |
| 339 | break; | 339 | break; |
| 340 | 340 | ||
| 341 | case mSuite: | 341 | case mSuite: |
| 342 | switch( t ) | 342 | switch( t ) |
| 343 | { | 343 | { |
| 344 | case tokFluff: | 344 | case tokFluff: |
| 345 | break; | 345 | break; |
| 346 | 346 | ||
| 347 | case tokBlock: | 347 | case tokBlock: |
| 348 | break; | 348 | break; |
| 349 | 349 | ||
| 350 | case tokTest: | 350 | case tokTest: |
| 351 | { | 351 | { |
| 352 | if( nextToken( v, sWs, iL, iC ) != tokFluff ) | 352 | if( nextToken( v, sWs, iL, iC ) != tokFluff ) |
| 353 | throw Bu::ExceptionBase("%d:%d: Expected " | 353 | throw Bu::ExceptionBase("%d:%d: Expected " |
| 354 | "string following test.", iL, iC ); | 354 | "string following test.", iL, iC ); |
| 355 | Test t; | 355 | Test t; |
| 356 | t.sName = v.get<Bu::String>(); | 356 | t.sName = v.get<Bu::String>(); |
| 357 | if( nextToken( v, sWs, iL, iC ) != tokBlock ) | 357 | if( nextToken( v, sWs, iL, iC ) != tokBlock ) |
| 358 | throw Bu::ExceptionBase("%d:%d: Expected " | 358 | throw Bu::ExceptionBase("%d:%d: Expected " |
| 359 | "{...} block.", | 359 | "{...} block.", |
| 360 | iL, iC ); | 360 | iL, iC ); |
| 361 | s.lTest.append( t ); | 361 | s.lTest.append( t ); |
| 362 | } | 362 | } |
| 363 | break; | 363 | break; |
| 364 | 364 | ||
| 365 | case tokChar: | 365 | case tokChar: |
| 366 | if( v.get<char>() == '}' ) | 366 | if( v.get<char>() == '}' ) |
| 367 | { | 367 | { |
| 368 | eMode = mRoot; | 368 | eMode = mRoot; |
| 369 | } | 369 | } |
| 370 | else | 370 | else |
| 371 | { | 371 | { |
| 372 | } | 372 | } |
| 373 | break; | 373 | break; |
| 374 | 374 | ||
| 375 | default: | 375 | default: |
| 376 | sio << iL << ":" << iC << ": Unexpected " | 376 | sio << iL << ":" << iC << ": Unexpected " |
| 377 | << t << " found." << sio.nl; | 377 | << t << " found." << sio.nl; |
| 378 | return; | 378 | return; |
| 379 | break; | 379 | break; |
| 380 | } | 380 | } |
| 381 | break; | 381 | break; |
| 382 | 382 | ||
| 383 | default: | 383 | default: |
| 384 | sio << "???" << sio.nl; | 384 | sio << "???" << sio.nl; |
| 385 | break; | 385 | break; |
| 386 | } | 386 | } |
| 387 | } | 387 | } |
| 388 | } | 388 | } |
| 389 | 389 | ||
| 390 | void secondPass( const Bu::String &sOut ) | 390 | void secondPass( const Bu::String &sOut ) |
| 391 | { | 391 | { |
| 392 | File fOut( sOut, File::WriteNew ); | 392 | File fOut( sOut, File::WriteNew ); |
| 393 | Formatter f( fOut ); | 393 | Formatter f( fOut ); |
| 394 | fIn.setPos( 0 ); | 394 | fIn.setPos( 0 ); |
| 395 | bIn.stop(); | 395 | bIn.stop(); |
| 396 | bIn.start(); | 396 | bIn.start(); |
| 397 | bAvail = false; | 397 | bAvail = false; |
| 398 | eMode = mRoot; | 398 | eMode = mRoot; |
| 399 | iLine = 1; | 399 | iLine = 1; |
| 400 | iChar = 0; | 400 | iChar = 0; |
| 401 | bool bHasIncluded = false; | 401 | bool bHasIncluded = false; |
| 402 | 402 | ||
| 403 | Bu::String sWs; | 403 | Bu::String sWs; |
| 404 | Variant v; | 404 | Variant v; |
| 405 | int iL, iC; | 405 | int iL, iC; |
| 406 | for(;;) | 406 | for(;;) |
| 407 | { | 407 | { |
| 408 | TokType t = nextToken( v, sWs, iL, iC ); | 408 | TokType t = nextToken( v, sWs, iL, iC ); |
| 409 | switch( eMode ) | 409 | switch( eMode ) |
| 410 | { | 410 | { |
| 411 | case mRoot: | 411 | case mRoot: |
| 412 | if( t == tokSuite ) | 412 | if( t == tokSuite ) |
| 413 | { | 413 | { |
| 414 | fOut.write( sWs ); | 414 | fOut.write( sWs ); |
| 415 | if( nextToken( v, sWs, iL, iC ) != tokFluff ) | 415 | if( nextToken( v, sWs, iL, iC ) != tokFluff ) |
| 416 | throw Bu::ExceptionBase("%d:%d: Expected string " | 416 | throw Bu::ExceptionBase("%d:%d: Expected string " |
| 417 | "following suite.", iL, iC ); | 417 | "following suite.", iL, iC ); |
| 418 | s.sName = v.get<Bu::String>(); | 418 | s.sName = v.get<Bu::String>(); |
| 419 | if( nextToken( v, sWs, iL, iC ) != tokChar || | 419 | if( nextToken( v, sWs, iL, iC ) != tokChar || |
| 420 | v.get<char>() != '{' ) | 420 | v.get<char>() != '{' ) |
| 421 | throw Bu::ExceptionBase("%d:%d: Expected {", | 421 | throw Bu::ExceptionBase("%d:%d: Expected {", |
| 422 | iL, iC ); | 422 | iL, iC ); |
| 423 | eMode = mSuite; | 423 | eMode = mSuite; |
| 424 | 424 | ||
| 425 | if( bHasIncluded == false ) | 425 | if( bHasIncluded == false ) |
| 426 | { | 426 | { |
| 427 | fOut.write("#include <bu/unitsuite.h>\n"); | 427 | fOut.write("#include <bu/unitsuite.h>\n"); |
| 428 | bHasIncluded = true; | 428 | bHasIncluded = true; |
| 429 | } | 429 | } |
| 430 | 430 | ||
| 431 | Bu::String sClass = "_UnitSuite_" + s.sName; | 431 | Bu::String sClass = "_UnitSuite_" + s.sName; |
| 432 | f << "class " << sClass | 432 | f << "class " << sClass |
| 433 | << " : public Bu::UnitSuite" << f.nl | 433 | << " : public Bu::UnitSuite" << f.nl |
| 434 | << "{" << f.nl << "public:" << f.nl | 434 | << "{" << f.nl << "public:" << f.nl |
| 435 | << "\t" << sClass << "()" << f.nl | 435 | << "\t" << sClass << "()" << f.nl |
| 436 | << "\t{" << f.nl | 436 | << "\t{" << f.nl |
| 437 | << "\t\tsetName(\"" << s.sName << "\");" << f.nl; | 437 | << "\t\tsetName(\"" << s.sName << "\");" << f.nl; |
| 438 | for( TestList::iterator i = s.lTest.begin(); i; i++ ) | 438 | for( TestList::iterator i = s.lTest.begin(); i; i++ ) |
| 439 | { | 439 | { |
| 440 | f << "\t\tadd( static_cast<Bu::UnitSuite::Test>(" | 440 | f << "\t\tadd( static_cast<Bu::UnitSuite::Test>(" |
| 441 | "&" << sClass << "::" << (*i).sName << "), \"" | 441 | "&" << sClass << "::" << (*i).sName << "), \"" |
| 442 | << (*i).sName << "\", Bu::UnitSuite::" | 442 | << (*i).sName << "\", Bu::UnitSuite::" |
| 443 | "expectPass );" << f.nl; | 443 | "expectPass );" << f.nl; |
| 444 | } | 444 | } |
| 445 | f << "\t}" << f.nl << f.nl | 445 | f << "\t}" << f.nl << f.nl |
| 446 | << "\tvirtual ~" << sClass << "() { }" << f.nl | 446 | << "\tvirtual ~" << sClass << "() { }" << f.nl |
| 447 | << f.nl; | 447 | << f.nl; |
| 448 | } | 448 | } |
| 449 | else if( t == tokEof ) | 449 | else if( t == tokEof ) |
| 450 | { | 450 | { |
| 451 | Bu::String sClass = "_UnitSuite_" + s.sName; | 451 | Bu::String sClass = "_UnitSuite_" + s.sName; |
| 452 | f << sWs << f.nl << "int main( int argc, char *argv[] )" | 452 | f << sWs << f.nl << "int main( int argc, char *argv[] )" |
| 453 | << f.nl << "{" << f.nl << "\treturn " << sClass | 453 | << f.nl << "{" << f.nl << "\treturn " << sClass |
| 454 | << "().run( argc, argv );" << f.nl << "}" << f.nl; | 454 | << "().run( argc, argv );" << f.nl << "}" << f.nl; |
| 455 | } | 455 | } |
| 456 | else | 456 | else |
| 457 | { | 457 | { |
| 458 | fOut.write( sWs ); | 458 | fOut.write( sWs ); |
| 459 | f << v; | 459 | f << v; |
| 460 | } | 460 | } |
| 461 | break; | 461 | break; |
| 462 | 462 | ||
| 463 | case mSuite: | 463 | case mSuite: |
| 464 | switch( t ) | 464 | switch( t ) |
| 465 | { | 465 | { |
| 466 | case tokFluff: | 466 | case tokFluff: |
| 467 | fOut.write( sWs ); | 467 | fOut.write( sWs ); |
| 468 | fOut.write( v.get<Bu::String>() ); | 468 | fOut.write( v.get<Bu::String>() ); |
| 469 | break; | 469 | break; |
| 470 | 470 | ||
| 471 | case tokTest: | 471 | case tokTest: |
| 472 | { | 472 | { |
| 473 | fOut.write( sWs ); | 473 | fOut.write( sWs ); |
| 474 | if( nextToken( v, sWs, iL, iC ) != tokFluff ) | 474 | if( nextToken( v, sWs, iL, iC ) != tokFluff ) |
| 475 | throw Bu::ExceptionBase("%d:%d: Expected " | 475 | throw Bu::ExceptionBase("%d:%d: Expected " |
| 476 | "string following test.", iL, iC ); | 476 | "string following test.", iL, iC ); |
| 477 | Test t; | 477 | Test t; |
| 478 | t.sName = v.get<Bu::String>(); | 478 | t.sName = v.get<Bu::String>(); |
| 479 | if( nextToken( v, sWs, iL, iC ) != tokBlock ) | 479 | if( nextToken( v, sWs, iL, iC ) != tokBlock ) |
| 480 | throw Bu::ExceptionBase("%d:%d: Expected " | 480 | throw Bu::ExceptionBase("%d:%d: Expected " |
| 481 | "{...} block.", | 481 | "{...} block.", |
| 482 | iL, iC ); | 482 | iL, iC ); |
| 483 | 483 | ||
| 484 | f << "\tvoid " << t.sName << "()" | 484 | f << "\tvoid " << t.sName << "()" |
| 485 | << f.nl << "#line " << iL | 485 | << f.nl << "#line " << iL |
| 486 | << " \"" << sIn << "\"" << f.nl | 486 | << " \"" << sIn << "\"" << f.nl |
| 487 | << v << f.nl; | 487 | << v << f.nl; |
| 488 | } | 488 | } |
| 489 | break; | 489 | break; |
| 490 | 490 | ||
| 491 | case tokChar: | 491 | case tokChar: |
| 492 | if( v.get<char>() == '}' ) | 492 | if( v.get<char>() == '}' ) |
| 493 | { | 493 | { |
| 494 | f << "};" << f.nl << f.nl; | 494 | f << "};" << f.nl << f.nl; |
| 495 | eMode = mRoot; | 495 | eMode = mRoot; |
| 496 | } | 496 | } |
| 497 | else | 497 | else |
| 498 | { | 498 | { |
| 499 | char buf = v.get<char>(); | 499 | char buf = v.get<char>(); |
| 500 | fOut.write( sWs ); | 500 | fOut.write( sWs ); |
| 501 | fOut.write( &buf, 1 ); | 501 | fOut.write( &buf, 1 ); |
| 502 | } | 502 | } |
| 503 | break; | 503 | break; |
| 504 | 504 | ||
| 505 | case tokBlock: | 505 | case tokBlock: |
| 506 | fOut.write( sWs ); | 506 | fOut.write( sWs ); |
| 507 | f << f.nl << "#line " << iL << " \"" << sIn | 507 | f << f.nl << "#line " << iL << " \"" << sIn |
| 508 | << "\"" << f.nl; | 508 | << "\"" << f.nl; |
| 509 | fOut.write( v.get<Bu::String>() ); | 509 | fOut.write( v.get<Bu::String>() ); |
| 510 | 510 | ||
| 511 | break; | 511 | break; |
| 512 | 512 | ||
| 513 | default: | 513 | default: |
| 514 | sio << iL << ":" << iC << ": Unexpected " | 514 | sio << iL << ":" << iC << ": Unexpected " |
| 515 | << t << " found." << sio.nl; | 515 | << t << " found." << sio.nl; |
| 516 | return; | 516 | return; |
| 517 | break; | 517 | break; |
| 518 | } | 518 | } |
| 519 | break; | 519 | break; |
| 520 | 520 | ||
| 521 | default: | 521 | default: |
| 522 | sio << "???" << sio.nl; | 522 | sio << "???" << sio.nl; |
| 523 | break; | 523 | break; |
| 524 | } | 524 | } |
| 525 | if( t == tokEof ) | 525 | if( t == tokEof ) |
| 526 | return; | 526 | return; |
| 527 | } | 527 | } |
| 528 | } | 528 | } |
| 529 | 529 | ||
| 530 | private: | 530 | private: |
| 531 | Bu::String sIn; | 531 | Bu::String sIn; |
| 532 | File fIn; | 532 | File fIn; |
| 533 | Buffer bIn; | 533 | Buffer bIn; |
| 534 | char cBuf; | 534 | char cBuf; |
| 535 | bool bAvail; | 535 | bool bAvail; |
| 536 | enum Mode | 536 | enum Mode |
| 537 | { | 537 | { |
| 538 | mRoot, | 538 | mRoot, |
| 539 | mSuite, | 539 | mSuite, |
| 540 | mBlock | 540 | mBlock |
| 541 | }; | 541 | }; |
| 542 | Mode eMode; | 542 | Mode eMode; |
| 543 | int iLine, iChar; | 543 | int iLine, iChar; |
| 544 | int iDepth; | 544 | int iDepth; |
| 545 | Suite s; | 545 | Suite s; |
| 546 | }; | 546 | }; |
| 547 | 547 | ||
| 548 | int main( int argc, char *argv[] ) | 548 | int main( int argc, char *argv[] ) |
| 549 | { | 549 | { |
| 550 | if( argc < 3 ) | 550 | if( argc < 3 ) |
| 551 | { | 551 | { |
| 552 | sio << "Too few parameters." << sio.nl; | 552 | sio << "Too few parameters." << sio.nl; |
| 553 | return 0; | 553 | return 0; |
| 554 | } | 554 | } |
| 555 | Parser p( argv[1] ); | 555 | Parser p( argv[1] ); |
| 556 | 556 | ||
| 557 | p.firstPass(); | 557 | p.firstPass(); |
| 558 | 558 | ||
| 559 | p.secondPass( argv[2] ); | 559 | p.secondPass( argv[2] ); |
| 560 | } | 560 | } |
| 561 | 561 | ||
diff --git a/src/tools/myriad.cpp b/src/tools/myriad.cpp index 7cab628..8a288b0 100644 --- a/src/tools/myriad.cpp +++ b/src/tools/myriad.cpp | |||
| @@ -17,237 +17,237 @@ using namespace Bu; | |||
| 17 | 17 | ||
| 18 | enum Mode | 18 | enum Mode |
| 19 | { | 19 | { |
| 20 | modeCreate, | 20 | modeCreate, |
| 21 | modeInfo, | 21 | modeInfo, |
| 22 | modeStreamNew, | 22 | modeStreamNew, |
| 23 | modeStreamDump, | 23 | modeStreamDump, |
| 24 | modeStreamPut, | 24 | modeStreamPut, |
| 25 | modeStreamGet, | 25 | modeStreamGet, |
| 26 | 26 | ||
| 27 | modeNone | 27 | modeNone |
| 28 | }; | 28 | }; |
| 29 | 29 | ||
| 30 | class Options : public OptParser | 30 | class Options : public OptParser |
| 31 | { | 31 | { |
| 32 | public: | 32 | public: |
| 33 | Options( int argc, char *argv[] ) : | 33 | Options( int argc, char *argv[] ) : |
| 34 | eMode( modeNone ), | 34 | eMode( modeNone ), |
| 35 | iBlockSize( 64 ), | 35 | iBlockSize( 64 ), |
| 36 | iPreallocate( 0 ), | 36 | iPreallocate( 0 ), |
| 37 | iStream( 0 ) | 37 | iStream( 0 ) |
| 38 | { | 38 | { |
| 39 | addHelpBanner("Mode of operation:"); | 39 | addHelpBanner("Mode of operation:"); |
| 40 | addOption( eMode, 'c', "create", | 40 | addOption( eMode, 'c', "create", |
| 41 | "Create a new Myriad file." ); | 41 | "Create a new Myriad file." ); |
| 42 | addOption( eMode, 'i', "info", | 42 | addOption( eMode, 'i', "info", |
| 43 | "Display some info about a Myriad file." ); | 43 | "Display some info about a Myriad file." ); |
| 44 | addOption( eMode, 'n', "new", | 44 | addOption( eMode, 'n', "new", |
| 45 | "Create a new sub-stream in a Myriad file."); | 45 | "Create a new sub-stream in a Myriad file."); |
| 46 | addOption( eMode, 'd', "dump", | 46 | addOption( eMode, 'd', "dump", |
| 47 | "Display a hexdump of a stream from a Myriad file."); | 47 | "Display a hexdump of a stream from a Myriad file."); |
| 48 | addOption( eMode, "get", | 48 | addOption( eMode, "get", |
| 49 | "Get a file out of a Myriad stream (use --dst)."); | 49 | "Get a file out of a Myriad stream (use --dst)."); |
| 50 | addOption( eMode, "put", | 50 | addOption( eMode, "put", |
| 51 | "Put a file into a Myriad stream (usr --src)."); | 51 | "Put a file into a Myriad stream (usr --src)."); |
| 52 | addHelpOption(); | 52 | addHelpOption(); |
| 53 | 53 | ||
| 54 | addHelpBanner("\nGeneral options:"); | 54 | addHelpBanner("\nGeneral options:"); |
| 55 | addOption( iBlockSize, 'b', "block-size", "Set the block size." ); | 55 | addOption( iBlockSize, 'b', "block-size", "Set the block size." ); |
| 56 | addOption( iPreallocate, 'p', "preallocate", | 56 | addOption( iPreallocate, 'p', "preallocate", |
| 57 | "Number of blocks to preallocate." ); | 57 | "Number of blocks to preallocate." ); |
| 58 | addOption( sFile, 'f', "file", "Set the Myriad filename." ); | 58 | addOption( sFile, 'f', "file", "Set the Myriad filename." ); |
| 59 | addOption( iStream, 's', "stream", "Substream to work with."); | 59 | addOption( iStream, 's', "stream", "Substream to work with."); |
| 60 | addOption( sSrc, "src", "Source file for copying into a Myriad file."); | 60 | addOption( sSrc, "src", "Source file for copying into a Myriad file."); |
| 61 | addOption( sDst, "dst", | 61 | addOption( sDst, "dst", |
| 62 | "Destination file for copying out of a Myriad file."); | 62 | "Destination file for copying out of a Myriad file."); |
| 63 | 63 | ||
| 64 | setOverride( "create", modeCreate ); | 64 | setOverride( "create", modeCreate ); |
| 65 | setOverride( "info", modeInfo ); | 65 | setOverride( "info", modeInfo ); |
| 66 | setOverride( "new", modeStreamNew ); | 66 | setOverride( "new", modeStreamNew ); |
| 67 | setOverride( "dump", modeStreamDump ); | 67 | setOverride( "dump", modeStreamDump ); |
| 68 | setOverride( "put", modeStreamPut ); | 68 | setOverride( "put", modeStreamPut ); |
| 69 | setOverride( "get", modeStreamGet ); | 69 | setOverride( "get", modeStreamGet ); |
| 70 | 70 | ||
| 71 | parse( argc, argv ); | 71 | parse( argc, argv ); |
| 72 | } | 72 | } |
| 73 | 73 | ||
| 74 | Mode eMode; | 74 | Mode eMode; |
| 75 | int iBlockSize; | 75 | int iBlockSize; |
| 76 | int iPreallocate; | 76 | int iPreallocate; |
| 77 | int iStream; | 77 | int iStream; |
| 78 | Bu::String sFile; | 78 | Bu::String sFile; |
| 79 | Bu::String sSrc; | 79 | Bu::String sSrc; |
| 80 | Bu::String sDst; | 80 | Bu::String sDst; |
| 81 | }; | 81 | }; |
| 82 | 82 | ||
| 83 | Bu::Formatter &operator>>( Bu::Formatter &f, Mode & /*e*/ ) | 83 | Bu::Formatter &operator>>( Bu::Formatter &f, Mode & /*e*/ ) |
| 84 | { | 84 | { |
| 85 | sio << "Uh oh, the formatter was called..." << sio.nl; | 85 | sio << "Uh oh, the formatter was called..." << sio.nl; |
| 86 | return f; | 86 | return f; |
| 87 | } | 87 | } |
| 88 | 88 | ||
| 89 | int main( int argc, char *argv[] ) | 89 | int main( int argc, char *argv[] ) |
| 90 | { | 90 | { |
| 91 | Options opts( argc, argv ); | 91 | Options opts( argc, argv ); |
| 92 | 92 | ||
| 93 | switch( opts.eMode ) | 93 | switch( opts.eMode ) |
| 94 | { | 94 | { |
| 95 | case modeCreate: | 95 | case modeCreate: |
| 96 | if( !opts.sFile.isSet() ) | 96 | if( !opts.sFile.isSet() ) |
| 97 | { | 97 | { |
| 98 | sio << "Please specify a file to create." << sio.nl; | 98 | sio << "Please specify a file to create." << sio.nl; |
| 99 | return 0; | 99 | return 0; |
| 100 | } | 100 | } |
| 101 | else | 101 | else |
| 102 | { | 102 | { |
| 103 | File fOut( opts.sFile, File::WriteNew|File::Read ); | 103 | File fOut( opts.sFile, File::WriteNew|File::Read ); |
| 104 | Myriad m( fOut, opts.iBlockSize, opts.iPreallocate ); | 104 | Myriad m( fOut, opts.iBlockSize, opts.iPreallocate ); |
| 105 | } | 105 | } |
| 106 | break; | 106 | break; |
| 107 | 107 | ||
| 108 | case modeInfo: | 108 | case modeInfo: |
| 109 | if( !opts.sFile.isSet() ) | 109 | if( !opts.sFile.isSet() ) |
| 110 | { | 110 | { |
| 111 | sio << "Please specify a file to display info about." << sio.nl; | 111 | sio << "Please specify a file to display info about." << sio.nl; |
| 112 | return 0; | 112 | return 0; |
| 113 | } | 113 | } |
| 114 | else | 114 | else |
| 115 | { | 115 | { |
| 116 | File fIn( opts.sFile, File::Read ); | 116 | File fIn( opts.sFile, File::Read ); |
| 117 | Myriad m( fIn ); | 117 | Myriad m( fIn ); |
| 118 | sio << "Myriad info:" << sio.nl | 118 | sio << "Myriad info:" << sio.nl |
| 119 | << " Block size: " << m.getBlockSize() << sio.nl | 119 | << " Block size: " << m.getBlockSize() << sio.nl |
| 120 | << " Block count: " << m.getNumBlocks() << sio.nl | 120 | << " Block count: " << m.getNumBlocks() << sio.nl |
| 121 | << " Blocks used: " << m.getNumUsedBlocks() << " (" | 121 | << " Blocks used: " << m.getNumUsedBlocks() << " (" |
| 122 | << m.getNumUsedBlocks()*100/m.getNumBlocks() << "%)" | 122 | << m.getNumUsedBlocks()*100/m.getNumBlocks() << "%)" |
| 123 | << sio.nl | 123 | << sio.nl |
| 124 | << " Stream count: " << m.getNumStreams() << sio.nl | 124 | << " Stream count: " << m.getNumStreams() << sio.nl |
| 125 | << " Used space: " << m.getTotalUsedBytes() << sio.nl | 125 | << " Used space: " << m.getTotalUsedBytes() << sio.nl |
| 126 | << " Unused space: " << m.getTotalUnusedBytes() << sio.nl | 126 | << " Unused space: " << m.getTotalUnusedBytes() << sio.nl |
| 127 | << " % of files: " << (double)(m.getNumBlocks()*m.getBlockSize())/(double)(m.getTotalUsedBytes() + m.getTotalUnusedBytes( 4096 ))*100.0 << sio.nl; | 127 | << " % of files: " << (double)(m.getNumBlocks()*m.getBlockSize())/(double)(m.getTotalUsedBytes() + m.getTotalUnusedBytes( 4096 ))*100.0 << sio.nl; |
| 128 | /* Bu::Array<int> aStreams = m.getStreamIds(); | 128 | /* Bu::Array<int> aStreams = m.getStreamIds(); |
| 129 | sio << " Stream info:" << sio.nl; | 129 | sio << " Stream info:" << sio.nl; |
| 130 | for( Bu::Array<int>::iterator i = aStreams.begin(); i; i++ ) | 130 | for( Bu::Array<int>::iterator i = aStreams.begin(); i; i++ ) |
| 131 | { | 131 | { |
| 132 | sio << " " << Fmt(4) << *i << ") " | 132 | sio << " " << Fmt(4) << *i << ") " |
| 133 | << m.getStreamSize( *i ) << "b" << sio.nl; | 133 | << m.getStreamSize( *i ) << "b" << sio.nl; |
| 134 | } */ | 134 | } */ |
| 135 | } | 135 | } |
| 136 | break; | 136 | break; |
| 137 | 137 | ||
| 138 | case modeStreamNew: | 138 | case modeStreamNew: |
| 139 | if( !opts.sFile.isSet() ) | 139 | if( !opts.sFile.isSet() ) |
| 140 | { | 140 | { |
| 141 | sio << "Please specify a file manipulate." << sio.nl; | 141 | sio << "Please specify a file manipulate." << sio.nl; |
| 142 | return 0; | 142 | return 0; |
| 143 | } | 143 | } |
| 144 | else | 144 | else |
| 145 | { | 145 | { |
| 146 | File fOut( opts.sFile, File::Write|File::Read ); | 146 | File fOut( opts.sFile, File::Write|File::Read ); |
| 147 | Myriad m( fOut ); | 147 | Myriad m( fOut ); |
| 148 | m.createStream( opts.iPreallocate ); | 148 | m.createStream( opts.iPreallocate ); |
| 149 | } | 149 | } |
| 150 | break; | 150 | break; |
| 151 | 151 | ||
| 152 | case modeStreamDump: | 152 | case modeStreamDump: |
| 153 | if( !opts.sFile.isSet() ) | 153 | if( !opts.sFile.isSet() ) |
| 154 | { | 154 | { |
| 155 | sio << "Please specify a file to manipulate." << sio.nl; | 155 | sio << "Please specify a file to manipulate." << sio.nl; |
| 156 | return 0; | 156 | return 0; |
| 157 | } | 157 | } |
| 158 | else | 158 | else |
| 159 | { | 159 | { |
| 160 | File fOut( opts.sFile, File::Read ); | 160 | File fOut( opts.sFile, File::Read ); |
| 161 | Myriad m( fOut ); | 161 | Myriad m( fOut ); |
| 162 | MyriadStream s = m.openStream( opts.iStream ); | 162 | MyriadStream s = m.openStream( opts.iStream ); |
| 163 | sio << "Stream " << opts.iStream << ":" << sio.nl; | 163 | sio << "Stream " << opts.iStream << ":" << sio.nl; |
| 164 | char buf[8]; | 164 | char buf[8]; |
| 165 | int iPos = 0; | 165 | int iPos = 0; |
| 166 | while( !s.isEos() ) | 166 | while( !s.isEos() ) |
| 167 | { | 167 | { |
| 168 | size_t sAmnt = s.read( buf, 8 ); | 168 | size_t sAmnt = s.read( buf, 8 ); |
| 169 | sio << Fmt(5) << iPos << ": "; | 169 | sio << Fmt(5) << iPos << ": "; |
| 170 | iPos += sAmnt; | 170 | iPos += sAmnt; |
| 171 | for( size_t j = 0; j < sAmnt; j++ ) | 171 | for( size_t j = 0; j < sAmnt; j++ ) |
| 172 | { | 172 | { |
| 173 | sio << Fmt::hex(2) << (int)((unsigned char)buf[j]) | 173 | sio << Fmt::hex(2) << (int)((unsigned char)buf[j]) |
| 174 | << " "; | 174 | << " "; |
| 175 | } | 175 | } |
| 176 | for( size_t j = sAmnt; j < 8; j++ ) | 176 | for( size_t j = sAmnt; j < 8; j++ ) |
| 177 | { | 177 | { |
| 178 | sio << "-- "; | 178 | sio << "-- "; |
| 179 | } | 179 | } |
| 180 | sio << "| "; | 180 | sio << "| "; |
| 181 | for( size_t j = 0; j < sAmnt; j++ ) | 181 | for( size_t j = 0; j < sAmnt; j++ ) |
| 182 | { | 182 | { |
| 183 | if( buf[j] >= 32 && buf[j] <= 126 ) | 183 | if( buf[j] >= 32 && buf[j] <= 126 ) |
| 184 | sio << buf[j] << " "; | 184 | sio << buf[j] << " "; |
| 185 | else | 185 | else |
| 186 | sio << " "; | 186 | sio << " "; |
| 187 | } | 187 | } |
| 188 | sio << sio.nl; | 188 | sio << sio.nl; |
| 189 | } | 189 | } |
| 190 | sio << "Position: " << s.tell() << ", isEos()=" << s.isEos() | 190 | sio << "Position: " << s.tell() << ", isEos()=" << s.isEos() |
| 191 | << sio.nl; | 191 | << sio.nl; |
| 192 | } | 192 | } |
| 193 | break; | 193 | break; |
| 194 | 194 | ||
| 195 | case modeStreamPut: | 195 | case modeStreamPut: |
| 196 | if( !opts.sFile.isSet() ) | 196 | if( !opts.sFile.isSet() ) |
| 197 | { | 197 | { |
| 198 | sio << "Please specify a file manipulate." << sio.nl; | 198 | sio << "Please specify a file manipulate." << sio.nl; |
| 199 | return 0; | 199 | return 0; |
| 200 | } | 200 | } |
| 201 | else if( !opts.sSrc.isSet() ) | 201 | else if( !opts.sSrc.isSet() ) |
| 202 | { | 202 | { |
| 203 | sio << "Please specify a source file to read." << sio.nl; | 203 | sio << "Please specify a source file to read." << sio.nl; |
| 204 | } | 204 | } |
| 205 | else | 205 | else |
| 206 | { | 206 | { |
| 207 | File fOut( opts.sFile, File::Write|File::Read ); | 207 | File fOut( opts.sFile, File::Write|File::Read ); |
| 208 | Myriad m( fOut ); | 208 | Myriad m( fOut ); |
| 209 | MyriadStream sOut = m.openStream( | 209 | MyriadStream sOut = m.openStream( |
| 210 | m.createStream( opts.iPreallocate ) | 210 | m.createStream( opts.iPreallocate ) |
| 211 | ); | 211 | ); |
| 212 | File fIn( opts.sSrc, File::Read ); | 212 | File fIn( opts.sSrc, File::Read ); |
| 213 | char buf[1024]; | 213 | char buf[1024]; |
| 214 | while( !fIn.isEos() ) | 214 | while( !fIn.isEos() ) |
| 215 | { | 215 | { |
| 216 | sOut.write( buf, fIn.read( buf, 1024 ) ); | 216 | sOut.write( buf, fIn.read( buf, 1024 ) ); |
| 217 | } | 217 | } |
| 218 | } | 218 | } |
| 219 | break; | 219 | break; |
| 220 | 220 | ||
| 221 | case modeStreamGet: | 221 | case modeStreamGet: |
| 222 | if( !opts.sFile.isSet() ) | 222 | if( !opts.sFile.isSet() ) |
| 223 | { | 223 | { |
| 224 | sio << "Please specify a file manipulate." << sio.nl; | 224 | sio << "Please specify a file manipulate." << sio.nl; |
| 225 | return 0; | 225 | return 0; |
| 226 | } | 226 | } |
| 227 | else if( !opts.sDst.isSet() ) | 227 | else if( !opts.sDst.isSet() ) |
| 228 | { | 228 | { |
| 229 | sio << "Please specify a destination file to write." << sio.nl; | 229 | sio << "Please specify a destination file to write." << sio.nl; |
| 230 | } | 230 | } |
| 231 | else | 231 | else |
| 232 | { | 232 | { |
| 233 | File fIn( opts.sFile, File::Write|File::Read ); | 233 | File fIn( opts.sFile, File::Write|File::Read ); |
| 234 | Myriad m( fIn ); | 234 | Myriad m( fIn ); |
| 235 | MyriadStream sIn = m.openStream( opts.iStream ); | 235 | MyriadStream sIn = m.openStream( opts.iStream ); |
| 236 | File fOut( opts.sDst, File::Write|File::Create|File::Truncate ); | 236 | File fOut( opts.sDst, File::Write|File::Create|File::Truncate ); |
| 237 | char buf[1024]; | 237 | char buf[1024]; |
| 238 | while( !sIn.isEos() ) | 238 | while( !sIn.isEos() ) |
| 239 | { | 239 | { |
| 240 | fOut.write( buf, sIn.read( buf, 1024 ) ); | 240 | fOut.write( buf, sIn.read( buf, 1024 ) ); |
| 241 | } | 241 | } |
| 242 | } | 242 | } |
| 243 | break; | 243 | break; |
| 244 | 244 | ||
| 245 | case modeNone: | 245 | case modeNone: |
| 246 | sio << "Please select a mode, for more info, try --help." | 246 | sio << "Please select a mode, for more info, try --help." |
| 247 | << sio.nl << sio.nl; | 247 | << sio.nl << sio.nl; |
| 248 | break; | 248 | break; |
| 249 | } | 249 | } |
| 250 | 250 | ||
| 251 | return 0; | 251 | return 0; |
| 252 | } | 252 | } |
| 253 | 253 | ||
diff --git a/src/tools/viewcsv.cpp b/src/tools/viewcsv.cpp index 5009ea8..328cafc 100644 --- a/src/tools/viewcsv.cpp +++ b/src/tools/viewcsv.cpp | |||
| @@ -20,33 +20,33 @@ using namespace Bu; | |||
| 20 | class Options : public Bu::OptParser | 20 | class Options : public Bu::OptParser |
| 21 | { | 21 | { |
| 22 | public: | 22 | public: |
| 23 | Options( int argc, char *argv[] ) : | 23 | Options( int argc, char *argv[] ) : |
| 24 | bHeader( true ) | 24 | bHeader( true ) |
| 25 | { | 25 | { |
| 26 | addOption( bHeader, "no-header", | 26 | addOption( bHeader, "no-header", |
| 27 | "Don't use the first line as a header row. This behaviour can " | 27 | "Don't use the first line as a header row. This behaviour can " |
| 28 | "also be toggled while running with 'h'." ); | 28 | "also be toggled while running with 'h'." ); |
| 29 | setNonOption( slot( this, &Options::onNonOption ) ); | 29 | setNonOption( slot( this, &Options::onNonOption ) ); |
| 30 | addHelpOption(); | 30 | addHelpOption(); |
| 31 | 31 | ||
| 32 | setOverride( "no-header", "true" ); | 32 | setOverride( "no-header", "true" ); |
| 33 | parse( argc, argv ); | 33 | parse( argc, argv ); |
| 34 | } | 34 | } |
| 35 | 35 | ||
| 36 | virtual ~Options() | 36 | virtual ~Options() |
| 37 | { | 37 | { |
| 38 | } | 38 | } |
| 39 | 39 | ||
| 40 | int onNonOption( StrArray aParams ) | 40 | int onNonOption( StrArray aParams ) |
| 41 | { | 41 | { |
| 42 | //sio << aParams << sio.nl; | 42 | //sio << aParams << sio.nl; |
| 43 | sFileIn = aParams[0]; | 43 | sFileIn = aParams[0]; |
| 44 | 44 | ||
| 45 | return 0; | 45 | return 0; |
| 46 | } | 46 | } |
| 47 | 47 | ||
| 48 | Bu::String sFileIn; | 48 | Bu::String sFileIn; |
| 49 | bool bHeader; | 49 | bool bHeader; |
| 50 | }; | 50 | }; |
| 51 | 51 | ||
| 52 | typedef Bu::Array<StrArray> StrGrid; | 52 | typedef Bu::Array<StrArray> StrGrid; |
| @@ -54,421 +54,421 @@ typedef Bu::Array<int> IntArray; | |||
| 54 | class CsvDoc | 54 | class CsvDoc |
| 55 | { | 55 | { |
| 56 | public: | 56 | public: |
| 57 | CsvDoc() : | 57 | CsvDoc() : |
| 58 | iMaxCols( 0 ) | 58 | iMaxCols( 0 ) |
| 59 | { | 59 | { |
| 60 | } | 60 | } |
| 61 | 61 | ||
| 62 | virtual ~CsvDoc() | 62 | virtual ~CsvDoc() |
| 63 | { | 63 | { |
| 64 | } | 64 | } |
| 65 | 65 | ||
| 66 | void addRow( StrArray aStr ) | 66 | void addRow( StrArray aStr ) |
| 67 | { | 67 | { |
| 68 | sgData.append( aStr ); | 68 | sgData.append( aStr ); |
| 69 | if( iMaxCols < aStr.getSize() ) | 69 | if( iMaxCols < aStr.getSize() ) |
| 70 | iMaxCols = aStr.getSize(); | 70 | iMaxCols = aStr.getSize(); |
| 71 | while( aWidths.getSize() < iMaxCols ) | 71 | while( aWidths.getSize() < iMaxCols ) |
| 72 | { | 72 | { |
| 73 | aWidths.append( 0 ); | 73 | aWidths.append( 0 ); |
| 74 | } | 74 | } |
| 75 | for( int j = 0; j < aStr.getSize(); j++ ) | 75 | for( int j = 0; j < aStr.getSize(); j++ ) |
| 76 | { | 76 | { |
| 77 | if( aWidths[j] < aStr[j].getSize() ) | 77 | if( aWidths[j] < aStr[j].getSize() ) |
| 78 | aWidths[j] = aStr[j].getSize(); | 78 | aWidths[j] = aStr[j].getSize(); |
| 79 | } | 79 | } |
| 80 | } | 80 | } |
| 81 | 81 | ||
| 82 | int iMaxCols; | 82 | int iMaxCols; |
| 83 | StrGrid sgData; | 83 | StrGrid sgData; |
| 84 | IntArray aWidths; | 84 | IntArray aWidths; |
| 85 | }; | 85 | }; |
| 86 | 86 | ||
| 87 | class CsvView | 87 | class CsvView |
| 88 | { | 88 | { |
| 89 | public: | 89 | public: |
| 90 | CsvView( CsvDoc &doc ) : | 90 | CsvView( CsvDoc &doc ) : |
| 91 | doc( doc ), | 91 | doc( doc ), |
| 92 | iXOff( 0 ), | 92 | iXOff( 0 ), |
| 93 | iYOff( 0 ), | 93 | iYOff( 0 ), |
| 94 | bHeaderRow( false ) | 94 | bHeaderRow( false ) |
| 95 | { | 95 | { |
| 96 | } | 96 | } |
| 97 | 97 | ||
| 98 | virtual ~CsvView() | 98 | virtual ~CsvView() |
| 99 | { | 99 | { |
| 100 | } | 100 | } |
| 101 | 101 | ||
| 102 | void render() | 102 | void render() |
| 103 | { | 103 | { |
| 104 | erase(); | 104 | erase(); |
| 105 | int maxx, maxy; | 105 | int maxx, maxy; |
| 106 | getmaxyx( stdscr, maxy, maxx ); | 106 | getmaxyx( stdscr, maxy, maxx ); |
| 107 | 107 | ||
| 108 | int iRows = buMin( (int)doc.sgData.getSize(), maxy-((bHeaderRow)?(4):(3)) ); | 108 | int iRows = buMin( (int)doc.sgData.getSize(), maxy-((bHeaderRow)?(4):(3)) ); |
| 109 | int iCols = buMin( doc.iMaxCols, (int)maxx-1 ); | 109 | int iCols = buMin( doc.iMaxCols, (int)maxx-1 ); |
| 110 | 110 | ||
| 111 | int iHdrHeight = 1; | 111 | int iHdrHeight = 1; |
| 112 | if( bHeaderRow ) | 112 | if( bHeaderRow ) |
| 113 | iHdrHeight++; | 113 | iHdrHeight++; |
| 114 | 114 | ||
| 115 | // Draw the headers | 115 | // Draw the headers |
| 116 | for( int iRow = 0; iRow < iRows; iRow++ ) | 116 | for( int iRow = 0; iRow < iRows; iRow++ ) |
| 117 | { | 117 | { |
| 118 | if( iRow+iYOff >= doc.sgData.getSize() ) | 118 | if( iRow+iYOff >= doc.sgData.getSize() ) |
| 119 | break; | 119 | break; |
| 120 | char buf[6]; | 120 | char buf[6]; |
| 121 | snprintf( buf, 6, "%5d", iRow+iYOff ); | 121 | snprintf( buf, 6, "%5d", iRow+iYOff ); |
| 122 | mvaddnstr( iRow+iHdrHeight+1, 0, buf, 5 ); | 122 | mvaddnstr( iRow+iHdrHeight+1, 0, buf, 5 ); |
| 123 | mvaddch( iRow+iHdrHeight+1, 6, ACS_VLINE ); | 123 | mvaddch( iRow+iHdrHeight+1, 6, ACS_VLINE ); |
| 124 | } | 124 | } |
| 125 | int iXPos = 6; | 125 | int iXPos = 6; |
| 126 | try | 126 | try |
| 127 | { | 127 | { |
| 128 | for( int iCol = 0; iCol < iCols; iCol++ ) | 128 | for( int iCol = 0; iCol < iCols; iCol++ ) |
| 129 | { | 129 | { |
| 130 | if( iXPos >= maxx ) | 130 | if( iXPos >= maxx ) |
| 131 | break; | 131 | break; |
| 132 | int iWidth = buMin( doc.aWidths[iCol+iXOff], maxx-iXPos-1 ); | 132 | int iWidth = buMin( doc.aWidths[iCol+iXOff], maxx-iXPos-1 ); |
| 133 | char buf[6]; | 133 | char buf[6]; |
| 134 | snprintf( buf, 6, "%d", iCol+iXOff ); | 134 | snprintf( buf, 6, "%d", iCol+iXOff ); |
| 135 | mvaddch( 0, iXPos, ACS_VLINE ); | 135 | mvaddch( 0, iXPos, ACS_VLINE ); |
| 136 | mvaddch( iHdrHeight, iXPos, ACS_PLUS ); | 136 | mvaddch( iHdrHeight, iXPos, ACS_PLUS ); |
| 137 | mvaddnstr( 0, iXPos+1, buf, 5 ); | 137 | mvaddnstr( 0, iXPos+1, buf, 5 ); |
| 138 | if( bHeaderRow ) | 138 | if( bHeaderRow ) |
| 139 | { | 139 | { |
| 140 | mvaddnstr( | 140 | mvaddnstr( |
| 141 | 1, iXPos+1, doc.sgData[0][iCol+iXOff].getStr(), iWidth | 141 | 1, iXPos+1, doc.sgData[0][iCol+iXOff].getStr(), iWidth |
| 142 | ); | 142 | ); |
| 143 | mvaddch( 1, iXPos, ACS_VLINE ); | 143 | mvaddch( 1, iXPos, ACS_VLINE ); |
| 144 | } | 144 | } |
| 145 | for( int j = 0; j < iWidth; j++ ) | 145 | for( int j = 0; j < iWidth; j++ ) |
| 146 | { | 146 | { |
| 147 | mvaddch( iHdrHeight, iXPos+j+1, ACS_HLINE ); | 147 | mvaddch( iHdrHeight, iXPos+j+1, ACS_HLINE ); |
| 148 | } | 148 | } |
| 149 | iXPos += iWidth+1; | 149 | iXPos += iWidth+1; |
| 150 | } | 150 | } |
| 151 | } | 151 | } |
| 152 | catch(...) { } | 152 | catch(...) { } |
| 153 | for( int j = 0; j < 6; j++ ) | 153 | for( int j = 0; j < 6; j++ ) |
| 154 | { | 154 | { |
| 155 | mvaddch( iHdrHeight, j, ACS_HLINE ); | 155 | mvaddch( iHdrHeight, j, ACS_HLINE ); |
| 156 | } | 156 | } |
| 157 | 157 | ||
| 158 | // Draw some data | 158 | // Draw some data |
| 159 | for( int iRow = 0; iRow < iRows; iRow++ ) | 159 | for( int iRow = 0; iRow < iRows; iRow++ ) |
| 160 | { | 160 | { |
| 161 | try | 161 | try |
| 162 | { | 162 | { |
| 163 | int iXPos = 6; | 163 | int iXPos = 6; |
| 164 | for( int iCol = 0; iCol < iCols; iCol++ ) | 164 | for( int iCol = 0; iCol < iCols; iCol++ ) |
| 165 | { | 165 | { |
| 166 | if( iXPos >= maxx ) | 166 | if( iXPos >= maxx ) |
| 167 | break; | 167 | break; |
| 168 | int iWidth = buMin( doc.aWidths[iCol+iXOff], maxx-iXPos-1 ); | 168 | int iWidth = buMin( doc.aWidths[iCol+iXOff], maxx-iXPos-1 ); |
| 169 | mvaddch( iRow+iHdrHeight+1, iXPos, ACS_VLINE ); | 169 | mvaddch( iRow+iHdrHeight+1, iXPos, ACS_VLINE ); |
| 170 | mvaddnstr( iRow+iHdrHeight+1, iXPos+1, | 170 | mvaddnstr( iRow+iHdrHeight+1, iXPos+1, |
| 171 | doc.sgData[iRow+iYOff][iCol+iXOff].getStr(), iWidth ); | 171 | doc.sgData[iRow+iYOff][iCol+iXOff].getStr(), iWidth ); |
| 172 | iXPos += iWidth+1; | 172 | iXPos += iWidth+1; |
| 173 | } | 173 | } |
| 174 | } catch(...) { } | 174 | } catch(...) { } |
| 175 | } | 175 | } |
| 176 | 176 | ||
| 177 | attron( A_REVERSE ); | 177 | attron( A_REVERSE ); |
| 178 | for( int j = 0; j < maxx; j++ ) | 178 | for( int j = 0; j < maxx; j++ ) |
| 179 | { | 179 | { |
| 180 | mvaddch( maxy-1, j, ' ' ); | 180 | mvaddch( maxy-1, j, ' ' ); |
| 181 | } | 181 | } |
| 182 | mvaddstr( maxy-1, 1, "q) quit h) toggle header row" ); | 182 | mvaddstr( maxy-1, 1, "q) quit h) toggle header row" ); |
| 183 | char buf[30]; | 183 | char buf[30]; |
| 184 | int iWidth = sprintf( buf, "[%dx%ld]", | 184 | int iWidth = sprintf( buf, "[%dx%ld]", |
| 185 | doc.iMaxCols, doc.sgData.getSize() | 185 | doc.iMaxCols, doc.sgData.getSize() |
| 186 | ); | 186 | ); |
| 187 | mvaddstr( maxy-1, maxx-iWidth-1, buf ); | 187 | mvaddstr( maxy-1, maxx-iWidth-1, buf ); |
| 188 | attroff( A_REVERSE ); | 188 | attroff( A_REVERSE ); |
| 189 | } | 189 | } |
| 190 | 190 | ||
| 191 | void move( int iX, int iY ) | 191 | void move( int iX, int iY ) |
| 192 | { | 192 | { |
| 193 | iXOff += iX; | 193 | iXOff += iX; |
| 194 | iYOff += iY; | 194 | iYOff += iY; |
| 195 | if( iXOff < 0 ) | 195 | if( iXOff < 0 ) |
| 196 | iXOff = 0; | 196 | iXOff = 0; |
| 197 | 197 | ||
| 198 | if( bHeaderRow ) | 198 | if( bHeaderRow ) |
| 199 | { | 199 | { |
| 200 | if( iYOff < 1 ) | 200 | if( iYOff < 1 ) |
| 201 | iYOff = 1; | 201 | iYOff = 1; |
| 202 | } | 202 | } |
| 203 | else | 203 | else |
| 204 | { | 204 | { |
| 205 | if( iYOff < 0 ) | 205 | if( iYOff < 0 ) |
| 206 | iYOff = 0; | 206 | iYOff = 0; |
| 207 | } | 207 | } |
| 208 | 208 | ||
| 209 | if( iYOff >= doc.sgData.getSize() ) | 209 | if( iYOff >= doc.sgData.getSize() ) |
| 210 | iYOff = doc.sgData.getSize()-1; | 210 | iYOff = doc.sgData.getSize()-1; |
| 211 | 211 | ||
| 212 | if( iXOff >= doc.iMaxCols ) | 212 | if( iXOff >= doc.iMaxCols ) |
| 213 | iXOff = doc.iMaxCols-1; | 213 | iXOff = doc.iMaxCols-1; |
| 214 | } | 214 | } |
| 215 | 215 | ||
| 216 | void pageDown() | 216 | void pageDown() |
| 217 | { | 217 | { |
| 218 | int maxx, maxy; | 218 | int maxx, maxy; |
| 219 | getmaxyx( stdscr, maxy, maxx ); | 219 | getmaxyx( stdscr, maxy, maxx ); |
| 220 | move( 0, maxy-((bHeaderRow)?(4):(3)) ); | 220 | move( 0, maxy-((bHeaderRow)?(4):(3)) ); |
| 221 | } | 221 | } |
| 222 | 222 | ||
| 223 | void pageUp() | 223 | void pageUp() |
| 224 | { | 224 | { |
| 225 | int maxx, maxy; | 225 | int maxx, maxy; |
| 226 | getmaxyx( stdscr, maxy, maxx ); | 226 | getmaxyx( stdscr, maxy, maxx ); |
| 227 | move( 0, -(maxy-((bHeaderRow)?(4):(3))) ); | 227 | move( 0, -(maxy-((bHeaderRow)?(4):(3))) ); |
| 228 | } | 228 | } |
| 229 | 229 | ||
| 230 | void home() | 230 | void home() |
| 231 | { | 231 | { |
| 232 | iYOff = 0; | 232 | iYOff = 0; |
| 233 | if( bHeaderRow ) iYOff++; | 233 | if( bHeaderRow ) iYOff++; |
| 234 | } | 234 | } |
| 235 | 235 | ||
| 236 | void end() | 236 | void end() |
| 237 | { | 237 | { |
| 238 | iYOff = doc.sgData.getSize()-1; | 238 | iYOff = doc.sgData.getSize()-1; |
| 239 | } | 239 | } |
| 240 | 240 | ||
| 241 | void setHeaderRow( bool bOn ) | 241 | void setHeaderRow( bool bOn ) |
| 242 | { | 242 | { |
| 243 | if( bHeaderRow == bOn ) | 243 | if( bHeaderRow == bOn ) |
| 244 | return; | 244 | return; |
| 245 | 245 | ||
| 246 | bHeaderRow = bOn; | 246 | bHeaderRow = bOn; |
| 247 | move( 0, ((bOn)?(1):(-1)) ); | 247 | move( 0, ((bOn)?(1):(-1)) ); |
| 248 | } | 248 | } |
| 249 | 249 | ||
| 250 | void toggleHeaderRow() | 250 | void toggleHeaderRow() |
| 251 | { | 251 | { |
| 252 | setHeaderRow( !bHeaderRow ); | 252 | setHeaderRow( !bHeaderRow ); |
| 253 | } | 253 | } |
| 254 | 254 | ||
| 255 | Bu::String prompt( const Bu::String &sPrompt ) | 255 | Bu::String prompt( const Bu::String &sPrompt ) |
| 256 | { | 256 | { |
| 257 | int maxx, maxy; | 257 | int maxx, maxy; |
| 258 | Bu::String sStr; | 258 | Bu::String sStr; |
| 259 | 259 | ||
| 260 | RegEx re( sPrompt ); | 260 | RegEx re( sPrompt ); |
| 261 | 261 | ||
| 262 | curs_set( 1 ); | 262 | curs_set( 1 ); |
| 263 | for(;;) | 263 | for(;;) |
| 264 | { | 264 | { |
| 265 | getmaxyx( stdscr, maxy, maxx ); | 265 | getmaxyx( stdscr, maxy, maxx ); |
| 266 | for( int j = 0; j < maxx; j++ ) | 266 | for( int j = 0; j < maxx; j++ ) |
| 267 | { | 267 | { |
| 268 | mvaddch( maxy-1, j, ' ' ); | 268 | mvaddch( maxy-1, j, ' ' ); |
| 269 | } | 269 | } |
| 270 | mvaddstr( maxy-1, 0, sPrompt.getStr() ); | 270 | mvaddstr( maxy-1, 0, sPrompt.getStr() ); |
| 271 | 271 | ||
| 272 | mvaddstr( maxy-1, sPrompt.getSize(), sStr.getStr() ); | 272 | mvaddstr( maxy-1, sPrompt.getSize(), sStr.getStr() ); |
| 273 | 273 | ||
| 274 | int iCh = getch(); | 274 | int iCh = getch(); |
| 275 | switch( iCh ) | 275 | switch( iCh ) |
| 276 | { | 276 | { |
| 277 | case '\n': | 277 | case '\n': |
| 278 | case '\r': | 278 | case '\r': |
| 279 | case KEY_ENTER: | 279 | case KEY_ENTER: |
| 280 | curs_set( 0 ); | 280 | curs_set( 0 ); |
| 281 | return sStr; | 281 | return sStr; |
| 282 | break; | 282 | break; |
| 283 | 283 | ||
| 284 | case KEY_BACKSPACE: | 284 | case KEY_BACKSPACE: |
| 285 | if( sStr.getSize() > 0 ) | 285 | if( sStr.getSize() > 0 ) |
| 286 | sStr.resize( sStr.getSize()-1 ); | 286 | sStr.resize( sStr.getSize()-1 ); |
| 287 | break; | 287 | break; |
| 288 | 288 | ||
| 289 | default: | 289 | default: |
| 290 | if( iCh < 127 ) | 290 | if( iCh < 127 ) |
| 291 | sStr += (char)iCh; | 291 | sStr += (char)iCh; |
| 292 | break; | 292 | break; |
| 293 | } | 293 | } |
| 294 | } | 294 | } |
| 295 | } | 295 | } |
| 296 | 296 | ||
| 297 | void resetCaret() | 297 | void resetCaret() |
| 298 | { | 298 | { |
| 299 | sysCaret.reset(); | 299 | sysCaret.reset(); |
| 300 | } | 300 | } |
| 301 | 301 | ||
| 302 | void findNext( const Bu::String &sTerm ) | 302 | void findNext( const Bu::String &sTerm ) |
| 303 | { | 303 | { |
| 304 | RegEx re( sTerm ); | 304 | RegEx re( sTerm ); |
| 305 | 305 | ||
| 306 | int y = sysCaret.iRow; | 306 | int y = sysCaret.iRow; |
| 307 | if( y < 0 ) | 307 | if( y < 0 ) |
| 308 | y = 0; | 308 | y = 0; |
| 309 | int x = sysCaret.iCol+1; | 309 | int x = sysCaret.iCol+1; |
| 310 | for( ; y < doc.sgData.getSize(); y++ ) | 310 | for( ; y < doc.sgData.getSize(); y++ ) |
| 311 | { | 311 | { |
| 312 | StrArray &aRow = doc.sgData[y]; | 312 | StrArray &aRow = doc.sgData[y]; |
| 313 | for( ; x < aRow.getSize(); x++ ) | 313 | for( ; x < aRow.getSize(); x++ ) |
| 314 | { | 314 | { |
| 315 | if( re.execute( aRow[x] ) ) //aRow[x].find( sTerm ) ) | 315 | if( re.execute( aRow[x] ) ) //aRow[x].find( sTerm ) ) |
| 316 | { | 316 | { |
| 317 | sysCaret.iRow = y; | 317 | sysCaret.iRow = y; |
| 318 | sysCaret.iCol = x; | 318 | sysCaret.iCol = x; |
| 319 | scrollToCaret(); | 319 | scrollToCaret(); |
| 320 | return; | 320 | return; |
| 321 | } | 321 | } |
| 322 | } | 322 | } |
| 323 | x = 0; | 323 | x = 0; |
| 324 | } | 324 | } |
| 325 | } | 325 | } |
| 326 | 326 | ||
| 327 | void scrollToCaret() | 327 | void scrollToCaret() |
| 328 | { | 328 | { |
| 329 | iXOff = sysCaret.iCol; | 329 | iXOff = sysCaret.iCol; |
| 330 | iYOff = sysCaret.iRow; | 330 | iYOff = sysCaret.iRow; |
| 331 | } | 331 | } |
| 332 | 332 | ||
| 333 | CsvDoc &doc; | 333 | CsvDoc &doc; |
| 334 | int iXOff; | 334 | int iXOff; |
| 335 | int iYOff; | 335 | int iYOff; |
| 336 | bool bHeaderRow; | 336 | bool bHeaderRow; |
| 337 | 337 | ||
| 338 | class Caret | 338 | class Caret |
| 339 | { | 339 | { |
| 340 | public: | 340 | public: |
| 341 | Caret() : | 341 | Caret() : |
| 342 | iRow( -1 ), | 342 | iRow( -1 ), |
| 343 | iCol( -1 ) | 343 | iCol( -1 ) |
| 344 | { | 344 | { |
| 345 | } | 345 | } |
| 346 | 346 | ||
| 347 | virtual ~Caret() | 347 | virtual ~Caret() |
| 348 | { | 348 | { |
| 349 | } | 349 | } |
| 350 | 350 | ||
| 351 | 351 | ||
| 352 | void reset() | 352 | void reset() |
| 353 | { | 353 | { |
| 354 | iRow = iCol = -1; | 354 | iRow = iCol = -1; |
| 355 | } | 355 | } |
| 356 | 356 | ||
| 357 | bool isSet() | 357 | bool isSet() |
| 358 | { | 358 | { |
| 359 | if( iRow < 0 || iCol < 0 ) | 359 | if( iRow < 0 || iCol < 0 ) |
| 360 | return false; | 360 | return false; |
| 361 | return true; | 361 | return true; |
| 362 | } | 362 | } |
| 363 | 363 | ||
| 364 | int iRow; | 364 | int iRow; |
| 365 | int iCol; | 365 | int iCol; |
| 366 | }; | 366 | }; |
| 367 | 367 | ||
| 368 | Caret sysCaret; | 368 | Caret sysCaret; |
| 369 | }; | 369 | }; |
| 370 | 370 | ||
| 371 | int main( int argc, char *argv[] ) | 371 | int main( int argc, char *argv[] ) |
| 372 | { | 372 | { |
| 373 | Options opt( argc, argv ); | 373 | Options opt( argc, argv ); |
| 374 | 374 | ||
| 375 | if( !opt.sFileIn.isSet() ) | 375 | if( !opt.sFileIn.isSet() ) |
| 376 | { | 376 | { |
| 377 | sio << "No file specified." << sio.nl; | 377 | sio << "No file specified." << sio.nl; |
| 378 | return 1; | 378 | return 1; |
| 379 | } | 379 | } |
| 380 | 380 | ||
| 381 | CsvDoc doc; | 381 | CsvDoc doc; |
| 382 | { | 382 | { |
| 383 | File fIn( opt.sFileIn, File::Read ); | 383 | File fIn( opt.sFileIn, File::Read ); |
| 384 | NewLine nlIn( fIn ); | 384 | NewLine nlIn( fIn ); |
| 385 | Buffer bIn( nlIn ); | 385 | Buffer bIn( nlIn ); |
| 386 | CsvReader cr( bIn ); | 386 | CsvReader cr( bIn ); |
| 387 | 387 | ||
| 388 | while( !fIn.isEos() ) | 388 | while( !fIn.isEos() ) |
| 389 | { | 389 | { |
| 390 | StrArray sa = cr.readLine(); | 390 | StrArray sa = cr.readLine(); |
| 391 | if( fIn.isEos() ) | 391 | if( fIn.isEos() ) |
| 392 | break; | 392 | break; |
| 393 | doc.addRow( sa ); | 393 | doc.addRow( sa ); |
| 394 | } | 394 | } |
| 395 | } | 395 | } |
| 396 | 396 | ||
| 397 | initscr(); | 397 | initscr(); |
| 398 | cbreak(); | 398 | cbreak(); |
| 399 | noecho(); | 399 | noecho(); |
| 400 | nonl(); | 400 | nonl(); |
| 401 | intrflush( stdscr, FALSE ); | 401 | intrflush( stdscr, FALSE ); |
| 402 | keypad( stdscr, TRUE ); | 402 | keypad( stdscr, TRUE ); |
| 403 | curs_set( 0 ); | 403 | curs_set( 0 ); |
| 404 | 404 | ||
| 405 | CsvView view( doc ); | 405 | CsvView view( doc ); |
| 406 | view.setHeaderRow( opt.bHeader ); | 406 | view.setHeaderRow( opt.bHeader ); |
| 407 | 407 | ||
| 408 | Bu::String sSearchTerm; | 408 | Bu::String sSearchTerm; |
| 409 | 409 | ||
| 410 | bool bRun = true; | 410 | bool bRun = true; |
| 411 | do | 411 | do |
| 412 | { | 412 | { |
| 413 | view.render(); | 413 | view.render(); |
| 414 | 414 | ||
| 415 | int ch = getch(); | 415 | int ch = getch(); |
| 416 | switch( ch ) | 416 | switch( ch ) |
| 417 | { | 417 | { |
| 418 | case 'q': | 418 | case 'q': |
| 419 | bRun = false; | 419 | bRun = false; |
| 420 | break; | 420 | break; |
| 421 | 421 | ||
| 422 | case KEY_DOWN: | 422 | case KEY_DOWN: |
| 423 | view.move( 0, 1 ); | 423 | view.move( 0, 1 ); |
| 424 | break; | 424 | break; |
| 425 | 425 | ||
| 426 | case KEY_UP: | 426 | case KEY_UP: |
| 427 | view.move( 0, -1 ); | 427 | view.move( 0, -1 ); |
| 428 | break; | 428 | break; |
| 429 | 429 | ||
| 430 | case KEY_LEFT: | 430 | case KEY_LEFT: |
| 431 | view.move( -1, 0 ); | 431 | view.move( -1, 0 ); |
| 432 | break; | 432 | break; |
| 433 | 433 | ||
| 434 | case KEY_RIGHT: | 434 | case KEY_RIGHT: |
| 435 | view.move( 1, 0 ); | 435 | view.move( 1, 0 ); |
| 436 | break; | 436 | break; |
| 437 | 437 | ||
| 438 | case KEY_NPAGE: | 438 | case KEY_NPAGE: |
| 439 | view.pageDown(); | 439 | view.pageDown(); |
| 440 | break; | 440 | break; |
| 441 | 441 | ||
| 442 | case KEY_PPAGE: | 442 | case KEY_PPAGE: |
| 443 | view.pageUp(); | 443 | view.pageUp(); |
| 444 | break; | 444 | break; |
| 445 | 445 | ||
| 446 | case KEY_HOME: | 446 | case KEY_HOME: |
| 447 | view.home(); | 447 | view.home(); |
| 448 | break; | 448 | break; |
| 449 | 449 | ||
| 450 | case KEY_END: | 450 | case KEY_END: |
| 451 | view.end(); | 451 | view.end(); |
| 452 | break; | 452 | break; |
| 453 | 453 | ||
| 454 | case '/': | 454 | case '/': |
| 455 | sSearchTerm = view.prompt("find: "); | 455 | sSearchTerm = view.prompt("find: "); |
| 456 | view.resetCaret(); | 456 | view.resetCaret(); |
| 457 | view.findNext( sSearchTerm ); | 457 | view.findNext( sSearchTerm ); |
| 458 | break; | 458 | break; |
| 459 | 459 | ||
| 460 | case 'n': | 460 | case 'n': |
| 461 | view.findNext( sSearchTerm ); | 461 | view.findNext( sSearchTerm ); |
| 462 | break; | 462 | break; |
| 463 | 463 | ||
| 464 | case 'h': | 464 | case 'h': |
| 465 | view.toggleHeaderRow(); | 465 | view.toggleHeaderRow(); |
| 466 | break; | 466 | break; |
| 467 | } | 467 | } |
| 468 | } while( bRun ); | 468 | } while( bRun ); |
| 469 | 469 | ||
| 470 | endwin(); | 470 | endwin(); |
| 471 | 471 | ||
| 472 | return 0; | 472 | return 0; |
| 473 | } | 473 | } |
| 474 | 474 | ||
