campo-sirio/al/examples/ex16con.c
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

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;
}