714dd74636
git-svn-id: svn://10.65.10.50/trunk@5350 c028cbd2-c16b-5b4b-a496-9718f37d4682
177 lines
5.7 KiB
C++
Executable File
177 lines
5.7 KiB
C++
Executable File
//
|
|
// EX16CON.CPP
|
|
//
|
|
// C++/DOS Example program for ArchiveLib 2.0
|
|
//
|
|
// Copyright (c) Greenleaf Software, Inc. 1994 - 1996
|
|
// All Rights Reserved
|
|
//
|
|
// MEMBERS/FUNCTIONS DEMONSTRATED
|
|
//
|
|
// ALEntry::~ALEntry()
|
|
// ALEntry::ClearMark()
|
|
// ALEntry::CompressionRatio()
|
|
// ALEntry::GetCrc32()
|
|
// ALEntry::SetMarkState()
|
|
// ALStatus::GetStatusDetail()
|
|
// ALStatus::GetStatusString()
|
|
//
|
|
// DESCRIPTION
|
|
//
|
|
// This example is a grab-bag, designed to highlight a bunch of barely
|
|
// related functions. So don't look for any sort of intelligence at
|
|
// work here, you won't find it. The program first creates a whole
|
|
// bunch of ALMemory objects, initializing them with a bunch of fixed
|
|
// data so that they compress fairly well. It then does a bunch of
|
|
// manipulation of the memory objects in their list, deleting some,
|
|
// changing the compression engine of others, and clearing the marks
|
|
// of even more. Finally, it creates the archive, then displays the
|
|
// list for your viewing pleasure.
|
|
//
|
|
//
|
|
// REVISION HISTORY
|
|
//
|
|
// February 1, 1996 2.0A : Second release
|
|
//
|
|
|
|
#include <iostream.h>
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <iomanip.h>
|
|
#include <conio.h>
|
|
|
|
#include "arclib.h"
|
|
#include "pkarc.h"
|
|
#include "glarc.h"
|
|
#include "glengn.h"
|
|
#include "pkengn.h"
|
|
#include "bargraph.h"
|
|
#include "memstore.h"
|
|
#include "copyengn.h"
|
|
|
|
main()
|
|
{
|
|
cout << "Archive Library 2.0\nEX16CON.CPP\n\n";
|
|
cout << "This example is a grab-bag, designed to highlight a bunch of barely\n";
|
|
cout << "related functions. So don't look for any sort of intelligence at\n";
|
|
cout << "work here, you won't find it. The program first creates a whole\n";
|
|
cout << "bunch of ALMemory objects, initializing them with a bunch of fixed\n";
|
|
cout << "data so that they compress fairly well. It then does a bunch of\n";
|
|
cout << "manipulation of the memory objects in their list, deleting some,\n";
|
|
cout << "changing the compression engine of others, and clearing the marks\n";
|
|
cout << "of even more. Finally, it creates the archive, then displays the\n";
|
|
cout << "list for your viewing pleasure.\n\n";
|
|
getch();
|
|
|
|
char temp[ 128 ];
|
|
ALBarGraph monitor( AL_MONITOR_JOB );
|
|
|
|
#if defined( ZIP )
|
|
ALPkArchive archive( "dos16.zip" );
|
|
#else
|
|
ALGlArchive archive( "dos16.gal" );
|
|
#endif
|
|
ALEntryList list( &monitor );
|
|
//
|
|
// The first step is to create 24 ALMemory objects. Each one has the
|
|
// contents of the temp buffer written out to it, with the temp buffer
|
|
// being just a little different every time. As each object is created,
|
|
// I add it to the list, along with a new copy of the greenleaf engine.
|
|
//
|
|
memset( temp, 'A', 128 );
|
|
for ( int i = 0 ; i < 24 ; i++ ) {
|
|
char name[ 20 ];
|
|
sprintf( name, "Buffer %02d", i );
|
|
ALStorage *obj = new ALMemory( name );
|
|
obj->Create();
|
|
memset( temp + i, i, i );
|
|
obj->WriteBuffer( (unsigned char *) temp, 128 );
|
|
obj->Close();
|
|
#if defined( ZIP )
|
|
new ALEntry( list, obj, new ALPkCompressor, new ALPkDecompressor );
|
|
#else
|
|
new ALEntry( list, obj, new ALGlCompressor, new ALGlDecompressor );
|
|
#endif
|
|
}
|
|
//
|
|
// Now for fun, I am going to delete every third entry in list
|
|
//
|
|
ALEntry *entry = list.GetFirstEntry();
|
|
for ( ; entry != 0 ; ) {
|
|
ALEntry *next_entry = entry->GetNextEntry();
|
|
delete entry;
|
|
entry = next_entry->GetNextEntry();
|
|
if ( entry )
|
|
entry = entry->GetNextEntry();
|
|
}
|
|
//
|
|
// Now, for more fun, I am going to change the compression engine in every
|
|
// third entry.
|
|
//
|
|
entry = list.GetFirstEntry();
|
|
for ( ; entry != 0 ; ) {
|
|
if ( entry->mpCompressor->miCompressionType !=
|
|
#if defined( ZIP )
|
|
AL_COMPRESSION_DEFLATE ) {
|
|
#else
|
|
AL_COMPRESSION_GREENLEAF ) {
|
|
#endif
|
|
cout << "Unknown engine type!\n";
|
|
exit( 1 );
|
|
}
|
|
delete entry->mpCompressor;
|
|
entry->mpCompressor = new ALCopyCompressor;
|
|
entry->SetComment( "No compression here" );
|
|
entry = entry->GetNextEntry();
|
|
if ( entry )
|
|
entry = entry->GetNextEntry();
|
|
if ( entry )
|
|
entry = entry->GetNextEntry();
|
|
}
|
|
//
|
|
// Now, for the last bit of fun, I unmark every other entry
|
|
//
|
|
entry = list.GetFirstEntry();
|
|
for ( ; entry != 0 ; ) {
|
|
entry->ClearMark();
|
|
entry = entry->GetNextEntry();
|
|
if ( entry ) {
|
|
entry->SetMarkState( 1 );
|
|
entry = entry->GetNextEntry();
|
|
}
|
|
}
|
|
//
|
|
// Having done all that, it is time to create the archive, then print
|
|
// out the list, along with the CRC and compression ratio for all
|
|
// the entries.
|
|
//
|
|
int status = archive.Create( list );
|
|
cout << "Archive status: " << archive.mStatus << endl;
|
|
cout << "\nList status:\n\n";
|
|
if ( status >= 0 ) {
|
|
for ( entry = list.GetFirstEntry() ;
|
|
entry ;
|
|
entry = entry->GetNextEntry() ) {
|
|
cout << entry->mpStorageObject->mName
|
|
<< " : ";
|
|
if ( entry->GetMark() ) {
|
|
cout << entry->CompressionRatio()
|
|
<< "% ";
|
|
(void) cout.width( 8 );
|
|
cout << hex
|
|
<< entry->GetCrc32()
|
|
<< dec
|
|
<< "\n";
|
|
} else {
|
|
cout << "Not marked\n";
|
|
}
|
|
}
|
|
}
|
|
cout << "\n";
|
|
cout << "List code: " << (int) list.mStatus << "\n";
|
|
cout << "List string: " << list.mStatus.GetStatusString() << "\n";
|
|
cout << "List detail: " << list.mStatus.GetStatusDetail() << "\n";
|
|
return status;
|
|
}
|