home *** CD-ROM | disk | FTP | other *** search
/ Mac Mania 2 / MacMania 2.toast / Demo's / Tools&Utilities / Programming / CIncludesTool / original version / source files / writeFile.c < prev   
Encoding:
C/C++ Source or Header  |  1989-12-24  |  2.5 KB  |  135 lines  |  [TEXT/MPS ]

  1.  
  2. #include "CIncludesCode.h"
  3. #include <Memory.h>
  4. #include <Files.h>
  5. #include <StdIO.h>
  6. #include <OSUtils.h>
  7.  
  8.  
  9. extern long            numFiles;
  10. extern strArray     **filesHdl;
  11. extern Handle        dictionary[numDictionaries];
  12. extern Handle        dependencies;
  13.  
  14.  
  15.  
  16. void writeData( short fileid, long cnt, Ptr p )
  17. {
  18.     long    count = cnt;
  19.     OSErr    error;
  20.  
  21.     error = FSWrite( fileid, &count, p );
  22.     if ( error )
  23.         errorExit( "Write operation failed!" );
  24. }
  25.  
  26.  
  27. long longAlign( long value )
  28. {
  29.     long n = (value % 4);
  30.     
  31.     return ( n ? value + 4 - n : value );
  32. }
  33.  
  34.  
  35. void shrinkDictionary( Handle dict )
  36. {
  37.     long newSize;
  38.  
  39.     newSize = *( (long*) *dict );    // end pointer
  40.     newSize = longAlign( newSize );
  41.     
  42.     SetHandleSize( dict, newSize );
  43.     if ( MemError() )
  44.         errorExit( "shrinkDictionary failed" );
  45. }
  46.  
  47.  
  48. void alignHandle( Handle dict )
  49. {
  50.     long newSize = longAlign( GetHandleSize( dict ) );
  51.     
  52.     SetHandleSize( dict, newSize );
  53.     if ( MemError() )
  54.         errorExit( "alignHandle failed" );
  55. }
  56.  
  57.  
  58. short openIdentifierFile( Str255 filename )
  59. {
  60.     short        fileid = 0;
  61.     OSErr         error;
  62.     SysEnvRec    world;
  63.  
  64.     SysEnvirons( 1, &world );
  65.     error = FSOpen( filename, world.sysVRefNum, &fileid );
  66.     if ( error )
  67.     {
  68.         (void) Create( filename, world.sysVRefNum, '????', 'DATA' );
  69.         (void) FSOpen( filename, world.sysVRefNum, &fileid );
  70.     }
  71.     else
  72.         (void) SetEOF( fileid, 0L );
  73.     
  74.     return fileid;
  75. }
  76.  
  77.  
  78. void makeDataHeader( dataHeaderType *dhPtr )
  79. {
  80.     short    i;
  81.     long    p;
  82.     
  83.     dhPtr->numFiles = numFiles;
  84.  
  85.     p = sizeof( dataHeaderType );
  86.     
  87.     dhPtr->nameArrayOffset = p;
  88.     p += GetHandleSize( (Handle) filesHdl );
  89.  
  90.     dhPtr->dependencyArrayOffset = p;
  91.     p += GetHandleSize( dependencies );
  92.  
  93.     for ( i = 0; i < numDictionaries; ++i )
  94.     {
  95.         dhPtr->dictionaryOffsets[i] = p;
  96.         p += GetHandleSize( dictionary[i] );
  97.     }
  98. }
  99.  
  100. void closeFile( short fileid )
  101. {
  102.     short volRefNum;
  103.     
  104.     (void) GetVRefNum( fileid, &volRefNum );
  105.     (void) FlushVol( 0L, volRefNum );
  106.     (void) FSClose( fileid );
  107. }
  108.  
  109. void makeDataFile()
  110. {
  111.     short            i;
  112.     short              fileid;
  113.     dataHeaderType    ourHeader;
  114.     
  115.     fprintf( stderr, "\nWriting Datafile to disk...\n" );
  116.     
  117.     fileid = openIdentifierFile( dataFilename );
  118.  
  119.     alignHandle( (Handle) filesHdl );
  120.     alignHandle( dependencies );
  121.     for ( i = 0; i < numDictionaries; ++i )
  122.         shrinkDictionary( dictionary[i] );
  123.         
  124.     makeDataHeader( &ourHeader );
  125.     
  126.     writeData( fileid, sizeof( dataHeaderType ), (Ptr) &ourHeader );
  127.     writeData( fileid, GetHandleSize( (Handle) filesHdl ), (Ptr) *filesHdl );
  128.     writeData( fileid, GetHandleSize( dependencies ), *dependencies );
  129.  
  130.     for ( i = 0; i < numDictionaries; ++i )
  131.         writeData( fileid, GetHandleSize( dictionary[i] ), *dictionary[i] );
  132.  
  133.     closeFile( fileid );
  134. }
  135.