home *** CD-ROM | disk | FTP | other *** search
-
- #include "CIncludesCode.h"
- #include <Memory.h>
- #include <Files.h>
- #include <StdIO.h>
- #include <OSUtils.h>
-
-
- extern long numFiles;
- extern strArray **filesHdl;
- extern Handle dictionary[numDictionaries];
- extern Handle dependencies;
-
-
-
- void writeData( short fileid, long cnt, Ptr p )
- {
- long count = cnt;
- OSErr error;
-
- error = FSWrite( fileid, &count, p );
- if ( error )
- errorExit( "Write operation failed!" );
- }
-
-
- long longAlign( long value )
- {
- long n = (value % 4);
-
- return ( n ? value + 4 - n : value );
- }
-
-
- void shrinkDictionary( Handle dict )
- {
- long newSize;
-
- newSize = *( (long*) *dict ); // end pointer
- newSize = longAlign( newSize );
-
- SetHandleSize( dict, newSize );
- if ( MemError() )
- errorExit( "shrinkDictionary failed" );
- }
-
-
- void alignHandle( Handle dict )
- {
- long newSize = longAlign( GetHandleSize( dict ) );
-
- SetHandleSize( dict, newSize );
- if ( MemError() )
- errorExit( "alignHandle failed" );
- }
-
-
- short openIdentifierFile( Str255 filename )
- {
- short fileid = 0;
- OSErr error;
- SysEnvRec world;
-
- SysEnvirons( 1, &world );
- error = FSOpen( filename, world.sysVRefNum, &fileid );
- if ( error )
- {
- (void) Create( filename, world.sysVRefNum, '????', 'DATA' );
- (void) FSOpen( filename, world.sysVRefNum, &fileid );
- }
- else
- (void) SetEOF( fileid, 0L );
-
- return fileid;
- }
-
-
- void makeDataHeader( dataHeaderType *dhPtr )
- {
- short i;
- long p;
-
- dhPtr->numFiles = numFiles;
-
- p = sizeof( dataHeaderType );
-
- dhPtr->nameArrayOffset = p;
- p += GetHandleSize( (Handle) filesHdl );
-
- dhPtr->dependencyArrayOffset = p;
- p += GetHandleSize( dependencies );
-
- for ( i = 0; i < numDictionaries; ++i )
- {
- dhPtr->dictionaryOffsets[i] = p;
- p += GetHandleSize( dictionary[i] );
- }
- }
-
- void closeFile( short fileid )
- {
- short volRefNum;
-
- (void) GetVRefNum( fileid, &volRefNum );
- (void) FlushVol( 0L, volRefNum );
- (void) FSClose( fileid );
- }
-
- void makeDataFile()
- {
- short i;
- short fileid;
- dataHeaderType ourHeader;
-
- fprintf( stderr, "\nWriting Datafile to disk...\n" );
-
- fileid = openIdentifierFile( dataFilename );
-
- alignHandle( (Handle) filesHdl );
- alignHandle( dependencies );
- for ( i = 0; i < numDictionaries; ++i )
- shrinkDictionary( dictionary[i] );
-
- makeDataHeader( &ourHeader );
-
- writeData( fileid, sizeof( dataHeaderType ), (Ptr) &ourHeader );
- writeData( fileid, GetHandleSize( (Handle) filesHdl ), (Ptr) *filesHdl );
- writeData( fileid, GetHandleSize( dependencies ), *dependencies );
-
- for ( i = 0; i < numDictionaries; ++i )
- writeData( fileid, GetHandleSize( dictionary[i] ), *dictionary[i] );
-
- closeFile( fileid );
- }
-