home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <stdarg.h>
- #include <time.h>
- #include "kernel.h"
-
- extern void call_unsqueeze(void *);
-
- static unsigned *ImgWords;
- static unsigned squeezed_len;
- static unsigned unsqueezed_len;
- /*==================================================================*/
- static void fail(char *errmsg, ...)
- {
- va_list ap;
- va_start(ap, errmsg);
- vfprintf(stderr, errmsg, ap);
- fprintf(stderr, "\n");
- va_end(ap);
- exit(1);
- }
- /*==================================================================*/
- static void load_img(char *filename)
- {
- _kernel_osfile_block finfo;
- if (_kernel_osfile(5,filename,&finfo) != 1)
- fail("Error opening '%s'", filename);
- squeezed_len = finfo.start;
- ImgWords = malloc(squeezed_len);
- if (ImgWords==0)
- fail("Out of memory loading file '%s'",filename);
- finfo.load =(int)(ImgWords);
- finfo.exec=0;
- if (_kernel_osfile(16,filename,&finfo)<0)
- fail("Error reading '%s'", filename);
- }
- /*==================================================================*/
- static void save_img(char *filename)
- {
- _kernel_osfile_block finfo;
- finfo.load =0xff8; /* absolute file type */
- finfo.start=(int) ImgWords;
- finfo.end = finfo.start + unsqueezed_len;
- if (_kernel_osfile(10, filename, &finfo)<0)
- fail("Failed to write %s\n", filename);
- }
- /*==================================================================*/
- int main(int argc, char *argv[])
- {
- char *infile, *outfile;
- time_t timer;
-
- if (argc!=3) fail("Syntax: UnSqueeze <AIF image> <AIF image>");
- infile = argv[1];
- outfile= argv[2];
- timer = clock();
- load_img(infile);
- timer = clock() - timer;
- if (ImgWords[4]!=0xEF000011) /* SWI OS_Exit */
- fail("File '%s' is not an AIF image!", infile);
- if (ImgWords[0]==0xFB000000) /* BLNV address */
- fail("File '%s' is not squeezed!", infile);
- unsqueezed_len = ImgWords[5] + ImgWords[6]; /* AIF header ReadOnly+ReadWrite */
- /* allow a 32k buffer for decompression workspace */
- ImgWords = realloc(ImgWords, unsqueezed_len + 32*1024);
- if (ImgWords==0)
- fail("Out of memory trying to unsqueeze '%s'", infile);
- printf("-- Loaded %d bytes in %d csec\n", squeezed_len, timer);
- printf("-- Unsqueezing '%s' to '%s'\n", infile, outfile);
- timer = clock();
- call_unsqueeze(ImgWords);
- timer = clock() - timer;
- if (timer==0) timer++;
- printf("-- Uncompressed size %d, Compressed size %d\n", unsqueezed_len, squeezed_len);
- printf("-- Uncompression took %d csec, %d bytes/cpusec\n", timer, unsqueezed_len/timer );
- save_img(outfile);
- }
-