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