home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / cmprss.zip / sample.zip / UnSmash.c < prev    next >
C/C++ Source or Header  |  1994-06-15  |  5KB  |  162 lines

  1. /*****************************************************************************
  2.  * UnSmash.c -- A sample program to demonstrate the usage of the
  3.  *              ExpandObject API.
  4.  *
  5.  *              Usage: UNSMASH sourcefile destfile
  6.  *
  7.  *              Reads the contents of sourcefile into memory, decompresses it,
  8.  *              and writes the expanded data to destfile.
  9.  *****************************************************************************/
  10.  
  11. #define INCL_DOSFILEMGR
  12. #define INCL_DOSMEMMGR
  13. #include <os2.h>
  14. #include <stdio.h>
  15. #include <Compress.h>
  16.  
  17. int main( int argc,char *argv[] )
  18. {
  19.     APIRET              rc          = 0;
  20.     HFILE               hsource     = NULLHANDLE,
  21.                         hdest       = NULLHANDLE;
  22.     ULONG               filesize    = 0;
  23.     PBYTE               pData       = NULL;
  24.     PCOMPRESSED_DATA    pCompressed = NULL;
  25.  
  26.     if ( argc != 3 )
  27.         {
  28.         printf( "Usage: UNSMASH sourcefile destfile\n" );
  29.         return 1;
  30.         }
  31.  
  32.     /* Open the source file */
  33.     {
  34.         ULONG ulAction = 0;
  35.  
  36.         rc = DosOpen( argv[1],
  37.                       &hsource,
  38.                       &ulAction,
  39.                       0,
  40.                       FILE_NORMAL,
  41.                       OPEN_ACTION_FAIL_IF_NEW|OPEN_ACTION_OPEN_IF_EXISTS,
  42.                       OPEN_FLAGS_SEQUENTIAL|OPEN_SHARE_DENYWRITE|OPEN_ACCESS_READONLY,
  43.                       0 );
  44.         if ( rc )
  45.             {
  46.             printf( "Error %u opening file %s.\n",rc,argv[1] );
  47.             return 1;
  48.             }
  49.     }
  50.  
  51.     /* Determine size of source file */
  52.     {
  53.         FILESTATUS3 fs;
  54.  
  55.         rc = DosQueryFileInfo( hsource,FIL_STANDARD,&fs,sizeof(fs) );
  56.         if ( rc )
  57.             {
  58.             printf( "Error %u returned by DosQueryFileInfo.\n",rc );
  59.             return 1;
  60.             }
  61.         filesize = fs.cbFile;
  62.     }
  63.  
  64.     /* Allocate storage for contents of source file. */
  65.     rc = DosAllocMem( (PPVOID)&pCompressed,filesize,PAG_READ|PAG_WRITE|PAG_COMMIT );
  66.     if ( rc )
  67.         {
  68.         printf( "Error %u allocating memory for source file contents.\n",rc );
  69.         return 1;
  70.         }
  71.  
  72.     /* Read the source file into memory */
  73.     {
  74.         ULONG ulBytesRead = 0;
  75.  
  76.         rc = DosRead( hsource,pCompressed,filesize,&ulBytesRead );
  77.         if ( rc )
  78.             {
  79.             printf( "Error %u reading source file into memory.\n",rc );
  80.             return 1;
  81.             }
  82.         if ( ulBytesRead != filesize )
  83.             {
  84.             printf( "Unable to read entire source file into memory.\n" );
  85.             return 1;
  86.             }
  87.     }
  88.  
  89.     /* Now expand the source file */
  90.     rc = ExpandObject( pCompressed,&pData );
  91.     switch ( rc ) {
  92.         case 0:
  93.             break;
  94.  
  95.         case EXPAND_INVALID_PARAMETER:
  96.             printf( "An invalid parameter was passed to ExpandObject.\n" );
  97.             return 1;
  98.  
  99.         case EXPAND_INVALID_METHOD:
  100.             printf( "The compressed data object was compressed using\n" );
  101.             printf( "a method not supported by this version of the library.\n" );
  102.             return 1;
  103.  
  104.         case EXPAND_CRC:
  105.             printf( "The contents of the compressed data object appear to have been corrupted.\n" );
  106.             return 1;
  107.  
  108.         case EXPAND_INTERNAL_ERROR:
  109.             printf( "An internal error occurred in ExpandObject.\n" );
  110.             return 1;
  111.  
  112.         default:
  113.             printf( "Error %u occurred in ExpandObject.\n",rc );
  114.             return 1;
  115.         }
  116.  
  117.     /* Create the destination file */
  118.     {
  119.         ULONG ulAction = 0;
  120.  
  121.         rc = DosOpen( argv[2],
  122.                       &hdest,
  123.                       &ulAction,
  124.                       0,
  125.                       FILE_NORMAL,
  126.                       OPEN_ACTION_CREATE_IF_NEW|OPEN_ACTION_REPLACE_IF_EXISTS,
  127.                       OPEN_FLAGS_SEQUENTIAL|OPEN_SHARE_DENYREADWRITE|OPEN_ACCESS_READWRITE,
  128.                       0 );
  129.         if ( rc )
  130.             {
  131.             printf( "Error %u opening file %s.\n",rc,argv[1] );
  132.             return 1;
  133.             }
  134.     }
  135.  
  136.     /* Write the expanded data to the destination file */
  137.     {
  138.         ULONG ulBytesWritten = 0;
  139.  
  140.         rc = DosWrite( hdest,pData,pCompressed->ulOriginalSize,&ulBytesWritten );
  141.         if ( rc )
  142.             {
  143.             printf( "Error %u writing to destination file.\n",rc );
  144.             return 1;
  145.             }
  146.         if ( ulBytesWritten != pCompressed->ulOriginalSize )
  147.             {
  148.             printf( "Unable to write entire expanded data block to destination file.\n" );
  149.             return 1;
  150.             }
  151.     }
  152.  
  153.     /* Clean up used resources and exit */
  154.     DosClose( hsource );
  155.     DosClose( hdest );
  156.     DosFreeMem( pData );
  157.     DosFreeMem( pCompressed );
  158.  
  159.     return 0;
  160. }
  161.  
  162.