#include "fs_path.h"
-class DirectoryArchive : public Archive
-{
-CopiedString m_root;
+class DirectoryArchive : public Archive {
+ CopiedString m_root;
public:
-DirectoryArchive( const char* root ) : m_root( root ){
-}
-
-void release(){
- delete this;
-}
-virtual ArchiveFile* openFile( const char* name ){
- UnixPath path( m_root.c_str() );
- path.push_filename( name );
- DirectoryArchiveFile* file = new DirectoryArchiveFile( name, path.c_str() );
- if ( !file->failed() ) {
- return file;
- }
- file->release();
- return 0;
-}
-virtual ArchiveTextFile* openTextFile( const char* name ){
- UnixPath path( m_root.c_str() );
- path.push_filename( name );
- DirectoryArchiveTextFile* file = new DirectoryArchiveTextFile( name, path.c_str() );
- if ( !file->failed() ) {
- return file;
- }
- file->release();
- return 0;
-}
-virtual bool containsFile( const char* name ){
- UnixPath path( m_root.c_str() );
- path.push_filename( name );
- return file_readable( path.c_str() );
-}
-virtual void forEachFile( VisitorFunc visitor, const char* root ){
- std::vector<Directory*> dirs;
- UnixPath path( m_root.c_str() );
- path.push( root );
- dirs.push_back( directory_open( path.c_str() ) );
-
- while ( !dirs.empty() && directory_good( dirs.back() ) )
- {
- const char* name = directory_read_and_increment( dirs.back() );
-
- if ( name == 0 ) {
- directory_close( dirs.back() );
- dirs.pop_back();
- path.pop();
- }
- else if ( !string_equal( name, "." ) && !string_equal( name, ".." ) ) {
- path.push_filename( name );
-
- bool is_directory = file_is_directory( path.c_str() );
-
- if ( !is_directory ) {
- visitor.file( path_make_relative( path.c_str(), m_root.c_str() ) );
- }
-
- path.pop();
-
- if ( is_directory ) {
- path.push( name );
-
- if ( !visitor.directory( path_make_relative( path.c_str(), m_root.c_str() ), dirs.size() ) ) {
- dirs.push_back( directory_open( path.c_str() ) );
- }
- else{
- path.pop();
- }
- }
- }
- }
-}
+ DirectoryArchive(const char *root) : m_root(root)
+ {
+ }
+
+ void release()
+ {
+ delete this;
+ }
+
+ virtual ArchiveFile *openFile(const char *name)
+ {
+ UnixPath path(m_root.c_str());
+ path.push_filename(name);
+ DirectoryArchiveFile *file = new DirectoryArchiveFile(name, path.c_str());
+ if (!file->failed()) {
+ return file;
+ }
+ file->release();
+ return 0;
+ }
+
+ virtual ArchiveTextFile *openTextFile(const char *name)
+ {
+ UnixPath path(m_root.c_str());
+ path.push_filename(name);
+ DirectoryArchiveTextFile *file = new DirectoryArchiveTextFile(name, path.c_str());
+ if (!file->failed()) {
+ return file;
+ }
+ file->release();
+ return 0;
+ }
+
+ virtual bool containsFile(const char *name)
+ {
+ UnixPath path(m_root.c_str());
+ path.push_filename(name);
+ return file_readable(path.c_str());
+ }
+
+ virtual void forEachFile(VisitorFunc visitor, const char *root)
+ {
+ std::vector<Directory *> dirs;
+ UnixPath path(m_root.c_str());
+ path.push(root);
+ dirs.push_back(directory_open(path.c_str()));
+
+ while (!dirs.empty() && directory_good(dirs.back())) {
+ const char *name = directory_read_and_increment(dirs.back());
+
+ if (name == 0) {
+ directory_close(dirs.back());
+ dirs.pop_back();
+ path.pop();
+ } else if (!string_equal(name, ".") && !string_equal(name, "..")) {
+ path.push_filename(name);
+
+ bool is_directory = file_is_directory(path.c_str());
+
+ if (!is_directory) {
+ visitor.file(path_make_relative(path.c_str(), m_root.c_str()));
+ }
+
+ path.pop();
+
+ if (is_directory) {
+ path.push(name);
+
+ if (!visitor.directory(path_make_relative(path.c_str(), m_root.c_str()), dirs.size())) {
+ dirs.push_back(directory_open(path.c_str()));
+ } else {
+ path.pop();
+ }
+ }
+ }
+ }
+ }
};
-Archive* OpenArchive( const char* name ){
- return new DirectoryArchive( name );
+Archive *OpenArchive(const char *name)
+{
+ return new DirectoryArchive(name);
}
#if 0
{
public:
virtual void visit( const char* name ){
- int bleh = 0;
+ int bleh = 0;
}
};
public:
void test1(){
- Archive* archive = OpenArchive( "d:/quake/id1/" );
- ArchiveFile* file = archive->openFile( "quake101.wad" );
- if ( file != 0 ) {
- char buffer[1024];
- file->getInputStream().read( buffer, 1024 );
- file->release();
- }
- TestVisitor visitor;
- archive->forEachFile( Archive::VisitorFunc( &visitor, Archive::eFilesAndDirectories, 0 ), "" );
- archive->release();
+ Archive* archive = OpenArchive( "d:/quake/id1/" );
+ ArchiveFile* file = archive->openFile( "quake101.wad" );
+ if ( file != 0 ) {
+ char buffer[1024];
+ file->getInputStream().read( buffer, 1024 );
+ file->release();
+ }
+ TestVisitor visitor;
+ archive->forEachFile( Archive::VisitorFunc( &visitor, Archive::eFilesAndDirectories, 0 ), "" );
+ archive->release();
}
void test2(){
- Archive* archive = OpenArchive( "d:/gtkradiant_root/baseq3/" );
- TestVisitor visitor;
- archive->forEachFile( Archive::VisitorFunc( &visitor, Archive::eFilesAndDirectories, 2 ), "" );
- archive->forEachFile( Archive::VisitorFunc( &visitor, Archive::eFiles, 1 ), "textures" );
- archive->forEachFile( Archive::VisitorFunc( &visitor, Archive::eDirectories, 1 ), "textures" );
- archive->forEachFile( Archive::VisitorFunc( &visitor, Archive::eFilesAndDirectories, 1 ), "textures" );
- archive->release();
+ Archive* archive = OpenArchive( "d:/gtkradiant_root/baseq3/" );
+ TestVisitor visitor;
+ archive->forEachFile( Archive::VisitorFunc( &visitor, Archive::eFilesAndDirectories, 2 ), "" );
+ archive->forEachFile( Archive::VisitorFunc( &visitor, Archive::eFiles, 1 ), "textures" );
+ archive->forEachFile( Archive::VisitorFunc( &visitor, Archive::eDirectories, 1 ), "textures" );
+ archive->forEachFile( Archive::VisitorFunc( &visitor, Archive::eFilesAndDirectories, 1 ), "textures" );
+ archive->release();
}
TestArchive(){
- test1();
- test2();
+ test1();
+ test2();
}
};