text: //========= Copyright Valve Corporation, All rights reserved. ============//
  //
  // Purpose:
  //
  //=============================================================================
  
  #ifndef CAPTIONCOMPILER_H
  #define CAPTIONCOMPILER_H
  #ifdef _WIN32
  #pragma once
  #endif
  
  #include "datamap.h"
  #include "checksum_crc.h"
  
  #define MAX_BLOCK_BITS  13
  
  #define MAX_BLOCK_SIZE (1<<MAX_BLOCK_BITS )
  
  #define COMPILED_CAPTION_FILEID         MAKEID( 'V', 'C', 'C', 'D' )
  #define COMPILED_CAPTION_VERSION        1
  
  #pragma pack(1)
  struct CompiledCaptionHeader_t
  {
      DECLARE_BYTESWAP_DATADESC()
      int             magic;
      int             version;
      int             numblocks;
      int             blocksize;
      int             directorysize;
      int             dataoffset;
  };
  
  struct CaptionLookup_t
  {
      DECLARE_BYTESWAP_DATADESC()
      unsigned int    hash;
      int             blockNum;
      unsigned short  offset;
      unsigned short  length;
  
      void SetHash( char const *string )
      {
          int len = Q_strlen( string );
          char *tempstr = (char *)_alloca( len + 1 );
          Q_strncpy( tempstr, string, len + 1 );
          Q_strlower( tempstr );
          CRC32_t temp;
          CRC32_Init( &temp );
          CRC32_ProcessBuffer( &temp, tempstr, len );
          CRC32_Final( &temp );
  
          hash = ( unsigned int )temp;
      }
  };
  #pragma pack()
  
  class CCaptionLookupLess
  {
  public:
      bool    Less( const CaptionLookup_t& lhs, const CaptionLookup_t& rhs, void *pContext )
      {
          return lhs.hash < rhs.hash;
      }
  };
  
  struct CaptionBlock_t
  {
      byte    data[ MAX_BLOCK_SIZE ];
  };
  
  // For swapping compiled caption files
  bool    SwapClosecaptionFile( void *pData );
  int     UpdateOrCreateCaptionFile( const char *pSourceName, char *pTargetName, int targetLen, bool bForce = false );
  
  #endif // CAPTIONCOMPILER_H
  