// // 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 #include #include #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"; }