181 lines
4.9 KiB
C
Executable File
181 lines
4.9 KiB
C
Executable File
/*
|
|
* EX11CON.C
|
|
*
|
|
* C/DOS Example program for ArchiveLib 2.0
|
|
*
|
|
* Copyright (c) Greenleaf Software, Inc. 1994 - 1996
|
|
* All Rights Reserved
|
|
*
|
|
* MEMBERS/FUNCTIONS DEMONSTRATED
|
|
*
|
|
* ALStorageCreate()
|
|
* ALStorageIsOpen()
|
|
* ALStorageReadLong()
|
|
* ALStorageReadShort()
|
|
* ALStorageWriteChar()
|
|
* ALStorageWriteLong()
|
|
* ALStorageWriteShort()
|
|
* ALStorageWriteString()
|
|
*
|
|
* DESCRIPTION
|
|
*
|
|
* This simple example program is used to test the hardware independent
|
|
* WritePortable...() functions. It does this by creating a test
|
|
* file, writing a bunch of stuff out to it, then reading the same
|
|
* stuff back in.
|
|
*
|
|
* REVISION HISTORY
|
|
*
|
|
* February 1, 1996 2.0A : Second release
|
|
*
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <conio.h>
|
|
|
|
#include "al.h"
|
|
|
|
int create_test( void );
|
|
int read_test( void );
|
|
|
|
/*
|
|
* The way this program works is a little funny. The first time you run
|
|
* it, it just creates TESTFILE.DAT. From then on, it will perform the
|
|
* read tests. If you want it to go back and create the file again, you
|
|
* just need to delete TESTFILE.DAT.
|
|
*/
|
|
|
|
int main()
|
|
{
|
|
FILE *f = fopen( "TESTFILE.DAT", "r" );
|
|
|
|
printf( "Archive Library 2.0\nEX11CON.C\n\n" );
|
|
printf( "The way this program works is a little funny. The first time you run\n" );
|
|
printf( "it, it just creates TESTFILE.DAT. From then on, it will perform the\n" );
|
|
printf( "read tests. If you want it to go back and create the file again, you\n" );
|
|
printf( "just need to delete TESTFILE.DAT.\n\n" );
|
|
getch();
|
|
|
|
if ( f ) {
|
|
fclose( f );
|
|
read_test();
|
|
} else
|
|
create_test();
|
|
return 1;
|
|
}
|
|
|
|
/*
|
|
* This routine is called if the file didn't already exist when the program
|
|
* started. It creates the file, then writes out the data using the
|
|
* portable functions. The data is pretty simple, no tricks here.
|
|
*/
|
|
|
|
int create_test()
|
|
{
|
|
hALStorage file;
|
|
long spot;
|
|
int i;
|
|
|
|
printf( "Creating TESTFILE.DAT\n" );
|
|
printf( "Run this program a second time to test data file structure\n" );
|
|
file = newALFile( "TESTFILE.DAT" );
|
|
ALStorageCreate( file, AL_DEFAULT );
|
|
if ( !ALStorageIsOpen( file ) ) {
|
|
printf( "Error creating file!\n" );
|
|
return 1;
|
|
}
|
|
ALStorageWriteGlLong( file, 0x12345678L );
|
|
ALStorageWriteGlLong( file, 0xfedcba98L );
|
|
ALStorageWritePkLong( file, 0x87654321L );
|
|
ALStorageWritePkShort( file, 0x2345 );
|
|
ALStorageWriteGlShort( file, 0x5566 );
|
|
ALStorageWriteGlShort( file, (short int) 0x9988 );
|
|
for ( i = 0 ; i < 256 ; i++ )
|
|
ALStorageWriteChar( file, i );
|
|
ALStorageWriteString( file, "ABCDE" );
|
|
spot = ALStorageTell( file );
|
|
ALStorageWriteGlLong( file, spot );
|
|
deleteALStorage( file );
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
* The second time you run this program, you read back in all the data
|
|
* from the file that was created earlier. This gets a little more
|
|
* complicated, because all the data has to be read into local variables,
|
|
* then checked for errors. That's why this routine is twice as long
|
|
* as the guy that writes stuff out.
|
|
*/
|
|
|
|
int read_test()
|
|
{
|
|
hALStorage file;
|
|
long dat1 = 0;
|
|
long dat2 = 0;
|
|
short int dat3 = 0;
|
|
short int dat4 = 0;
|
|
int i;
|
|
short length = 0;
|
|
char buffer[ 5 ];
|
|
long my_spot;
|
|
long his_spot = 0;
|
|
|
|
printf( "Reading TESTFILE.DAT\n" );
|
|
file = newALFile( "TESTFILE.DAT" );
|
|
ALStorageOpen( file );
|
|
if ( !ALStorageIsOpen( file ) ) {
|
|
printf( "Error opening file!\n" );
|
|
return 1;
|
|
}
|
|
ALStorageReadGlLong( file, &dat1 );
|
|
ALStorageReadGlLong( file, &dat2 );
|
|
if ( dat1 != 0x12345678L || dat2 != 0xfedcba98L ) {
|
|
printf( "Error reading long data\n" );
|
|
return 1;
|
|
}
|
|
ALStorageReadPkLong( file, &dat1 );
|
|
if ( dat1 != 0x87654321L ) {
|
|
printf( "Error reading long Pk data\n" );
|
|
return 1;
|
|
}
|
|
ALStorageReadPkShort( file, &dat3 );
|
|
if ( dat3 != 0x2345 ) {
|
|
printf( "Error reading short Pk data\n" );
|
|
return 1;
|
|
}
|
|
ALStorageReadGlShort( file, &dat3 );
|
|
ALStorageReadGlShort( file, &dat4 );
|
|
if ( dat3 != 0x5566 || dat4 != (short) 0x9988 ) {
|
|
printf( "Error reading short data\n" );
|
|
return 1;
|
|
}
|
|
for ( i = 0 ; i < 256 ; i++ ) {
|
|
int c = ALStorageReadChar( file );
|
|
if ( c != i ) {
|
|
printf( "Error reading characater data, position %d\n", i );
|
|
return 1;
|
|
}
|
|
}
|
|
/*
|
|
* Reading strings is still a hassle, you have to do it manually, there is
|
|
* no readstring function available as a public member.
|
|
*/
|
|
ALStorageReadGlShort( file, &length );
|
|
ALStorageReadBuffer( file, (unsigned char *) buffer, 5 );
|
|
if ( length != 5 || memcmp( buffer, "ABCDE", 5 ) != 0 ) {
|
|
printf( "Error reading string\n" );
|
|
return 1;
|
|
}
|
|
my_spot = ALStorageTell( file );
|
|
ALStorageReadGlLong( file, &his_spot );
|
|
if ( my_spot != his_spot ) {
|
|
printf( "Error in Tell()!\n" );
|
|
return 1;
|
|
}
|
|
printf( "File passed all tests.\n" );
|
|
deleteALStorage( file );
|
|
return 0;
|
|
}
|