mirror of https://github.com/acidanthera/audk.git
227 lines
4.2 KiB
C
227 lines
4.2 KiB
C
/*++
|
|
|
|
Copyright (c) 1999-2006 Intel Corporation. All rights reserved
|
|
This program and the accompanying materials are licensed and made available
|
|
under the terms and conditions of the BSD License which accompanies this
|
|
distribution. The full text of the license may be found at
|
|
http://opensource.org/licenses/bsd-license.php
|
|
|
|
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|
|
|
|
|
Module Name:
|
|
|
|
EfiCompressMain.c
|
|
|
|
Abstract:
|
|
|
|
The main function for the compression utility.
|
|
|
|
--*/
|
|
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <ctype.h>
|
|
#include <stdarg.h>
|
|
#include <stdio.h>
|
|
|
|
#include <Common/UefiBaseTypes.h>
|
|
#include "Compress.h"
|
|
|
|
#define UTILITY_NAME "EfiCompress"
|
|
#define UTILITY_MAJOR_VERSION 1
|
|
#define UTILITY_MINOR_VERSION 1
|
|
|
|
void
|
|
Version(
|
|
void
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Print out version information for EfiCompress.
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Returns:
|
|
|
|
None
|
|
|
|
--*/
|
|
{
|
|
printf ("%s v%d.%d -Efi File Compress Utility\n", UTILITY_NAME, UTILITY_MAJOR_VERSION, UTILITY_MINOR_VERSION);
|
|
printf ("Copyright (c) 2005-2006 Intel Corporation. All rights reserved.\n");
|
|
}
|
|
|
|
void
|
|
Usage(
|
|
void
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Print out usage information for EfiCompress.
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Returns:
|
|
|
|
None
|
|
|
|
--*/
|
|
{
|
|
Version();
|
|
printf ("\nUsage: %s Inputfile Outputfile\n", UTILITY_NAME);
|
|
}
|
|
|
|
|
|
int
|
|
main (
|
|
INT32 argc,
|
|
CHAR8 *argv[]
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Compresses the input files
|
|
|
|
Arguments:
|
|
|
|
argc - number of arguments passed into the command line.
|
|
argv[] - files to compress and files to output compressed data to.
|
|
|
|
Returns:
|
|
|
|
int: 0 for successful execution of the function.
|
|
|
|
--*/
|
|
{
|
|
EFI_STATUS Status;
|
|
FILE *infile;
|
|
FILE *outfile;
|
|
UINT32 SrcSize;
|
|
UINT32 DstSize;
|
|
UINT8 *SrcBuffer;
|
|
UINT8 *DstBuffer;
|
|
UINT8 Buffer[8];
|
|
|
|
//
|
|
// Added for makefile debug - KCE
|
|
//
|
|
INT32 arg_counter;
|
|
|
|
SrcBuffer = DstBuffer = NULL;
|
|
infile = outfile = NULL;
|
|
|
|
if (argc == 1) {
|
|
Usage();
|
|
goto Done;
|
|
}
|
|
|
|
if ((strcmp(argv[1], "-h") == 0) || (strcmp(argv[1], "--help") == 0) ||
|
|
(strcmp(argv[1], "-?") == 0) || (strcmp(argv[1], "/?") == 0)) {
|
|
Usage();
|
|
goto Done;
|
|
}
|
|
|
|
if ((strcmp(argv[1], "-V") == 0) || (strcmp(argv[1], "--version") == 0)) {
|
|
Version();
|
|
goto Done;
|
|
}
|
|
|
|
if (argc != 3) {
|
|
Usage();
|
|
goto Done;
|
|
}
|
|
|
|
if ((outfile = fopen (argv[2], "wb")) == NULL) {
|
|
printf ("Can't open output file\n");
|
|
goto Done;
|
|
}
|
|
|
|
if ((infile = fopen (argv[1], "rb")) == NULL) {
|
|
printf ("Can't open input file\n");
|
|
goto Done;
|
|
}
|
|
//
|
|
// Get the size of source file
|
|
//
|
|
SrcSize = 0;
|
|
while (fread (Buffer, 1, 1, infile)) {
|
|
SrcSize++;
|
|
|
|
}
|
|
//
|
|
// Read in the source data
|
|
//
|
|
if ((SrcBuffer = malloc (SrcSize)) == NULL) {
|
|
printf ("Can't allocate memory\n");
|
|
goto Done;
|
|
}
|
|
|
|
rewind (infile);
|
|
if (fread (SrcBuffer, 1, SrcSize, infile) != SrcSize) {
|
|
printf ("Can't read from source\n");
|
|
goto Done;
|
|
}
|
|
//
|
|
// Get destination data size and do the compression
|
|
//
|
|
DstSize = 0;
|
|
Status = EfiCompress (SrcBuffer, SrcSize, DstBuffer, &DstSize);
|
|
if (Status == EFI_BUFFER_TOO_SMALL) {
|
|
if ((DstBuffer = malloc (DstSize)) == NULL) {
|
|
printf ("Can't allocate memory\n");
|
|
goto Done;
|
|
}
|
|
|
|
Status = EfiCompress (SrcBuffer, SrcSize, DstBuffer, &DstSize);
|
|
}
|
|
|
|
if (EFI_ERROR (Status)) {
|
|
printf ("Compress Error\n");
|
|
goto Done;
|
|
}
|
|
|
|
printf ("\nOrig Size = %ld\n", SrcSize);
|
|
printf ("Comp Size = %ld\n", DstSize);
|
|
|
|
if (DstBuffer == NULL) {
|
|
printf ("No destination to write to.\n");
|
|
goto Done;
|
|
}
|
|
//
|
|
// Write out the result
|
|
//
|
|
if (fwrite (DstBuffer, 1, DstSize, outfile) != DstSize) {
|
|
printf ("Can't write to destination file\n");
|
|
}
|
|
|
|
Done:
|
|
if (SrcBuffer) {
|
|
free (SrcBuffer);
|
|
}
|
|
|
|
if (DstBuffer) {
|
|
free (DstBuffer);
|
|
}
|
|
|
|
if (infile) {
|
|
fclose (infile);
|
|
}
|
|
|
|
if (outfile) {
|
|
fclose (outfile);
|
|
}
|
|
|
|
return 0;
|
|
}
|