182 lines
6.5 KiB
C
Executable File
182 lines
6.5 KiB
C
Executable File
/*
|
|
* EX16CON.C
|
|
*
|
|
* C/DOS Example program for ArchiveLib 2.0
|
|
*
|
|
* Copyright (c) Greenleaf Software, Inc. 1994 - 1996
|
|
* All Rights Reserved
|
|
*
|
|
* MEMBERS/FUNCTIONS DEMONSTRATED
|
|
*
|
|
* ALEntryClearMark()
|
|
* deleteALEntry()
|
|
* ALEntryCompressionRatio()
|
|
* ALEntryGetCrc32()
|
|
* ALEntrySetMarkState()
|
|
* ALEntryGetEngine()
|
|
* ALEntryGetStorage()
|
|
* ALEntrySetEngine()
|
|
* ALEntryListGetStatusCode()
|
|
* ALEntryListGetStatusDetail()
|
|
* ALEntryListGetStatusString()
|
|
*
|
|
* 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 <string.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <conio.h>
|
|
|
|
#include "arclib.h"
|
|
#include "memstore.h"
|
|
#include "pkengn.h"
|
|
#include "glengn.h"
|
|
#include "glarc.h"
|
|
#include "copyengn.h"
|
|
#include "bargraph.h"
|
|
|
|
int main()
|
|
{
|
|
char temp[ 128 ];
|
|
hALMonitor monitor;
|
|
hALEntryList list;
|
|
hALArchive archive;
|
|
hALEntry entry;
|
|
int i;
|
|
int status;
|
|
|
|
printf( "Archive Library 2.0\nEX16CON.C\n\n" );
|
|
printf( "This example is a grab-bag, designed to highlight a bunch of barely\n" );
|
|
printf( "related functions. So don't look for any sort of intelligence at\n" );
|
|
printf( "work here, you won't find it. The program first creates a whole\n" );
|
|
printf( "bunch of ALMemory objects, initializing them with a bunch of fixed\n" );
|
|
printf( "data so that they compress fairly well. It then does a bunch of\n" );
|
|
printf( "manipulation of the memory objects in their list, deleting some,\n" );
|
|
printf( "changing the compression engine of others, and clearing the marks\n" );
|
|
printf( "of even more. Finally, it creates the archive, then displays the\n" );
|
|
printf( "list for your viewing pleasure.\n\n" );
|
|
getch();
|
|
|
|
monitor = newALBarGraph( AL_MONITOR_JOB );
|
|
list = newALListCopyTools( monitor );
|
|
archive = newALGlArchive( "dos16.gal" );
|
|
|
|
/*
|
|
* 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 ( i = 0 ; i < 24 ; i++ ) {
|
|
char name[ 20 ];
|
|
hALStorage obj;
|
|
|
|
sprintf( name, "Buffer %02d", i );
|
|
obj = newALMemory( name, 0, 0 );
|
|
ALStorageCreate( obj, AL_DEFAULT );
|
|
memset( temp + i, i, i );
|
|
ALStorageWriteBuffer( obj, (unsigned char *) temp, 128 );
|
|
ALStorageClose( obj );
|
|
if ( i & 1 )
|
|
newALEntry( list, obj, newALPkCompressor( AL_DEFAULT, AL_DEFAULT, AL_DEFAULT ), 0 );
|
|
else
|
|
newALEntry( list, obj, newALGlCompressor( AL_GREENLEAF_LEVEL_2, 0 ), 0 );
|
|
}
|
|
/*
|
|
* Now for fun, I am going to delete every third entry in list
|
|
*/
|
|
entry = ALEntryListGetFirstEntry( list );
|
|
for ( ; entry != 0 ; ) {
|
|
hALEntry next_entry = ALEntryGetNextEntry( entry );
|
|
deleteALEntry( entry );
|
|
entry = ALEntryGetNextEntry( next_entry );
|
|
if ( entry )
|
|
entry = ALEntryGetNextEntry( entry );
|
|
}
|
|
/*
|
|
* Now, for more fun, I am going to change the compression engine in every
|
|
* third entry.
|
|
*/
|
|
entry = ALEntryListGetFirstEntry( list );
|
|
for ( ; entry != 0 ; ) {
|
|
hALCompressor compressor;
|
|
hALDecompressor decompressor;
|
|
compressor = ALEntryGetCompressor( entry );
|
|
if ( ALCompressorGetTypeCode( compressor ) != AL_COMPRESSION_GREENLEAF &&
|
|
ALCompressorGetTypeCode( compressor ) != AL_COMPRESSION_DEFLATE &&
|
|
ALCompressorGetTypeCode( compressor ) != AL_COMPRESSION_COPY ) {
|
|
printf( "Unknown compressor type!\n" );
|
|
exit( 1 );
|
|
}
|
|
deleteALCompressor( compressor );
|
|
ALEntrySetCompressor( entry, newALCopyCompressor() );
|
|
ALEntrySetComment( entry, "No compression here" );
|
|
decompressor = ALEntryGetDecompressor( entry );
|
|
printf( "Decompressor = %s\n",
|
|
decompressor ? ALDecompressorGetTypeString( decompressor ) : "None" );
|
|
entry = ALEntryGetNextEntry( entry );
|
|
if ( entry )
|
|
entry = ALEntryGetNextEntry( entry );
|
|
if ( entry )
|
|
entry = ALEntryGetNextEntry( entry );
|
|
}
|
|
/*
|
|
* Now, for the last bit of fun, I unmark every other entry
|
|
*/
|
|
entry = ALEntryListGetFirstEntry( list );
|
|
for ( ; entry != 0 ; ) {
|
|
ALEntryClearMark( entry );
|
|
entry = ALEntryGetNextEntry( entry );
|
|
if ( entry ) {
|
|
ALEntrySetMarkState( entry, 1 );
|
|
entry = ALEntryGetNextEntry( entry );
|
|
}
|
|
}
|
|
/*
|
|
* 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.
|
|
*/
|
|
status = ALArchiveCreate( archive, list );
|
|
printf( "Archive status: %s\n", ALArchiveGetStatusString( archive ) );
|
|
printf( "\nList status:\n\n" );
|
|
if ( status >= 0 ) {
|
|
for ( entry = ALEntryListGetFirstEntry( list ) ;
|
|
entry ;
|
|
entry = ALEntryGetNextEntry( entry ) ) {
|
|
printf( "%s", ALStorageGetName( ALEntryGetStorage( entry ) ) );
|
|
printf( " : " );
|
|
if ( ALEntryGetMark( entry ) ) {
|
|
printf( "%d%%", ALEntryCompressionRatio( entry ) );
|
|
printf( " %08lx\n", ALEntryGetCrc32( entry ) );
|
|
} else
|
|
printf( "Not marked\n" );
|
|
}
|
|
}
|
|
printf( "\n" );
|
|
printf( "List code : %d\n", ALEntryListGetStatusCode( list ) );
|
|
printf( "List string : %s\n", ALEntryListGetStatusString( list ) );
|
|
printf( "List detail : %s\n", ALEntryListGetStatusDetail( list ) );
|
|
deleteALEntryList( list );
|
|
deleteALMonitor( monitor );
|
|
deleteALArchive( archive );
|
|
return status;
|
|
}
|