166 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			166 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
//
 | 
						|
// EX11CON.CPP
 | 
						|
//
 | 
						|
//  C++/DOS Example program for ArchiveLib 2.0
 | 
						|
//
 | 
						|
//  Copyright (c) Greenleaf Software, Inc. 1994 - 1996
 | 
						|
//  All Rights Reserved
 | 
						|
//
 | 
						|
// MEMBERS/FUNCTIONS DEMONSTRATED
 | 
						|
//
 | 
						|
//  ALStorage::Create()
 | 
						|
//  ALStorage::IsOpen()
 | 
						|
//  ALStorage::ReadGlLong()
 | 
						|
//  ALStorage::ReadGlShort()
 | 
						|
//  ALStorage::Tell()
 | 
						|
//  ALStorage::WriteChar()
 | 
						|
//  ALStorage::WriteGlLong()
 | 
						|
//  ALStorage::WriteGlShort()
 | 
						|
//  ALStorage::WriteString()
 | 
						|
//
 | 
						|
// DESCRIPTION
 | 
						|
//
 | 
						|
//  This simple example program is used to test the hardware independent
 | 
						|
//  WriteGl...() 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 <iostream.h>
 | 
						|
#include <stdio.h>
 | 
						|
#include <conio.h>
 | 
						|
 | 
						|
#include "al.h"
 | 
						|
 | 
						|
void create_test();
 | 
						|
void read_test();
 | 
						|
 | 
						|
//
 | 
						|
// 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( int, char ** )
 | 
						|
{
 | 
						|
 FILE *f = fopen( "TESTFILE.DAT", "r" );
 | 
						|
 | 
						|
 cout << "Archive Library 2.0\nEX11CON.CPP\n\n";
 | 
						|
 cout << "The way this program works is a little funny.  The first time you run\n";
 | 
						|
 cout << "it, it just creates TESTFILE.DAT.  From then on, it will perform the\n";
 | 
						|
 cout << "read tests.  If you want it to go back and create the file again, you\n";
 | 
						|
 cout << "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.
 | 
						|
//
 | 
						|
void create_test()
 | 
						|
{
 | 
						|
 cout << "Creating TESTFILE.DAT\n";
 | 
						|
 cout << "Run this program a second time to test data file structure\n";
 | 
						|
 ALFile file( "TESTFILE.DAT" );
 | 
						|
 file.Create();
 | 
						|
 if ( !file.IsOpen() ) {
 | 
						|
     cout << "Error creating file!\n";
 | 
						|
     return;
 | 
						|
 }
 | 
						|
 file.WriteGlLong( 0x12345678L );
 | 
						|
 file.WriteGlLong( 0xfedcba98L );
 | 
						|
 file.WritePkLong( 0x87654321L );
 | 
						|
 file.WritePkShort( 0x02345 );
 | 
						|
 file.WriteGlShort( 0x5566 );
 | 
						|
 file.WriteGlShort( (short int) 0x9988 );
 | 
						|
 for ( int i = 0 ; i < 256 ; i++ )
 | 
						|
     file.WriteChar( i );
 | 
						|
 file.WriteString( "ABCDE" );
 | 
						|
 long spot = file.Tell();
 | 
						|
 file.WriteGlLong( spot );
 | 
						|
}
 | 
						|
 | 
						|
//
 | 
						|
// 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.
 | 
						|
//
 | 
						|
void read_test()
 | 
						|
{
 | 
						|
 cout << "Reading TESTFILE.DAT\n";
 | 
						|
 ALFile file( "TESTFILE.DAT" );
 | 
						|
 file.Open();
 | 
						|
 if ( !file.IsOpen() ) {
 | 
						|
     cout << "Error opening file!\n";
 | 
						|
     return;
 | 
						|
 }
 | 
						|
 long dat1 = 0;
 | 
						|
 long dat2 = 0;
 | 
						|
 file.ReadGlLong( dat1 );
 | 
						|
 file.ReadGlLong( dat2 );
 | 
						|
 if ( dat1 != 0x12345678L || dat2 != 0xfedcba98L ) {
 | 
						|
     cout << "Error reading long data\n";
 | 
						|
     return;
 | 
						|
 }
 | 
						|
 file.ReadPkLong( dat1 );
 | 
						|
 if ( dat1 != 0x87654321L ) {
 | 
						|
     cout << "Error reading long Pk data\n";
 | 
						|
     return;
 | 
						|
 }
 | 
						|
 short int dat3 = 0;
 | 
						|
 short int dat4 = 0;
 | 
						|
 file.ReadPkShort( dat3 );
 | 
						|
 if ( dat3 != 0x02345 ) {
 | 
						|
     cout << "Error reading short Pk data\n";
 | 
						|
     return;
 | 
						|
 }
 | 
						|
 file.ReadGlShort( dat3 );
 | 
						|
 file.ReadGlShort( dat4 );
 | 
						|
 if ( dat3 != 0x5566 || dat4 != (short) 0x9988 ) {
 | 
						|
     cout << "Error reading short data\n";
 | 
						|
     return;
 | 
						|
 }
 | 
						|
 for ( int i = 0 ; i < 256 ; i++ ) {
 | 
						|
     int c = file.ReadChar();
 | 
						|
     if ( c != i ) {
 | 
						|
         cout << "Error reading characater data, position " << i << ".\n";
 | 
						|
         return;
 | 
						|
     }
 | 
						|
 }
 | 
						|
//
 | 
						|
// Reading strings is still a hassle, you have to do it manually, there is
 | 
						|
// no readstring function available as a public member.
 | 
						|
//
 | 
						|
 short length = 0;
 | 
						|
 unsigned char buffer[ 5 ] = "";
 | 
						|
 file.ReadGlShort( length );
 | 
						|
 file.ReadBuffer( buffer, 5 );
 | 
						|
 if ( length != 5 || memcmp( buffer, "ABCDE", 5 ) != 0 ) {
 | 
						|
     cout << "Error reading string\n";
 | 
						|
     return;
 | 
						|
 }
 | 
						|
 long his_spot = 0;
 | 
						|
 long my_spot = file.Tell();
 | 
						|
 file.ReadGlLong( his_spot );
 | 
						|
 if ( my_spot != his_spot ) {
 | 
						|
     cerr << "Error in Tell()!\n";
 | 
						|
     return;
 | 
						|
 }
 | 
						|
 cout << "File passed all tests.\n";
 | 
						|
}
 |