campo-sirio/al/examples/ex09con.cpp
alex 714dd74636 Archive Library versione 2.00
git-svn-id: svn://10.65.10.50/trunk@5350 c028cbd2-c16b-5b4b-a496-9718f37d4682
1997-10-09 16:09:54 +00:00

142 lines
4.2 KiB
C++
Executable File

//
// EX09CON.CPP
//
// C++/DOS Example program for ArchiveLib 2.0
//
// Copyright (c) Greenleaf Software, Inc. 1994 - 1996
// All Rights Reserved
//
// MEMBERS/FUNCTIONS DEMONSTRATED
//
// ALStorage::Close()
// ALStorage::Open()
// ALStorage::ReadChar()
// ALArchive::ALArchive()
// ALEntry::ALEntry()
// ALEntryList::DeleteUnmarked()
// ALEntryList::SetMarks()
// ALEntryList::ToggleMarks()
//
// DESCRIPTION
//
// This is a somewhat contrived example program that demonstrates
// a bunch of miscellaneous things. It creates an in-memory archive,
// adds a bunch of source code to the archive, then adds a memory
// buffer. It then extracts EX09CON.CPP to an in-memory object, and
// finally dumps it on the screen for you to see.
//
// REVISION HISTORY
//
// February 1, 1996 2.0A : Second release
//
//
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include "arclib.h"
#include "memstore.h"
#include "glarc.h"
#include "glengn.h"
#include "pkarc.h"
#include "pkengn.h"
void create_archive( ALArchive &archive, ALEntryList &list );
void create_output_list( ALArchive &archive, ALEntryList &list );
int main( void )
{
cout << "Archive Library 2.0\nEX09CON.CPP\n\n";
cout << "This is a somewhat contrived example program that demonstrates\n";
cout << "a bunch of miscellaneous things. It creates an in-memory archive,\n";
cout << "adds a bunch of source code to the archive, then adds a memory\n";
cout << "buffer. It then extracts EX09CON.CPP to an in-memory object, and\n";
cout << "finally dumps it on the screen for you to see.\n\n";
getch();
ALMemory archive_file( "Try using a name like this for a disk file!" );
#if defined( ZIP )
ALPkArchive archive( archive_file );
#else
ALGlArchive archive( archive_file );
#endif
ALEntryList *input_list = new ALEntryList( 0, PkTools( 6, 13, 6 ) );
AL_ASSERT( input_list != 0, "ALEntryList constructor didn't work!" );
//
// This routine is called to
create_archive( archive, *input_list ); //Create the memory archive
delete input_list;
ALEntryList output_list;
//
// Next we work on the output list in order to figure out which files
// to extract. I then perform the extraction and print the results.
//
create_output_list( archive, output_list );
archive.Extract( output_list );
ALEntry *job = output_list.GetFirstEntry();
if ( !job ) {
cout << "Empty archive!\n";
return 1;
}
job->mpStorageObject->Open();
int c;
while ( ( c = job->mpStorageObject->ReadChar() ) >= 0 )
cout << (char) c;
job->mpStorageObject->Close();
cout << "Done\n";
return 0;
}
//
// This function is called to create the in-memory archive. It
// adds a bunch of example programs to the list, then a single
// memory object. After creating the archive with these
// objects, it prints out some status stuff and returns.
//
void create_archive( ALArchive &archive, ALEntryList &list )
{
char *buffer = "Adding this buffer to the archive!";
list.AddWildCardFiles( "EX0?CON.CPP" );
new ALEntry( list,
new ALMemory( "buffer", buffer, strlen( buffer ) ),
#if defined( ZIP )
new ALPkCompressor( 6, 13, 6),
new ALPkDecompressor );
#else
new ALGlCompressor,
new ALGlDecompressor );
#endif
archive.Create( list );
cout << "Returned status integer = "
<< (int) archive.mStatus << "\n";
cout << "Returned status string = "
<< archive.mStatus.GetStatusString() << "\n";
cout << "Returned status detail = "
<< archive.mStatus << "\n";
}
//
// This function is called just before extracting the list from
// the archive. Essentially all it does is insure that the only
// object to be extracted from the archive will be EX09CON.CPP, and
// it will be extracted to a memory object instead of a file.
//
void create_output_list( ALArchive &archive, ALEntryList &list )
{
archive.ReadDirectory( list );
list.ToggleMarks(); //Turns off all marks
if ( list.SetMarks( "ex09con.cpp" ) < 0 )
exit( 1 );
list.DeleteUnmarked();
ALEntry *job = list.GetFirstEntry();
if ( job ) {
delete job->mpStorageObject;
job->mpStorageObject = new ALMemory;
}
}