1 /* Catacomb Armageddon Source Code
\r
2 * Copyright (C) 1993-2014 Flat Rock Software
\r
4 * This program is free software; you can redistribute it and/or modify
\r
5 * it under the terms of the GNU General Public License as published by
\r
6 * the Free Software Foundation; either version 2 of the License, or
\r
7 * (at your option) any later version.
\r
9 * This program is distributed in the hope that it will be useful,
\r
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
12 * GNU General Public License for more details.
\r
14 * You should have received a copy of the GNU General Public License along
\r
15 * with this program; if not, write to the Free Software Foundation, Inc.,
\r
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
\r
40 //===========================================================================
\r
44 //===========================================================================
\r
46 #define LZH_SUPPORT 1
\r
47 #define LZW_SUPPORT 0
\r
52 //=========================================================================
\r
55 // GENERAL LOAD ROUTINES
\r
58 //=========================================================================
\r
62 //--------------------------------------------------------------------------
\r
63 // BLoad() -- THIS HAS NOT BEEN FULLY TESTED!
\r
65 // NOTICE : This version of BLOAD is compatable with JAMPak V3.0 and the
\r
66 // new fileformat...
\r
67 //--------------------------------------------------------------------------
\r
68 unsigned long BLoad(char *SourceFile, memptr *DstPtr)
\r
73 unsigned long i, j, k, r, c;
\r
76 unsigned long SrcLen,DstLen;
\r
77 struct CMP1Header CompHeader;
\r
78 boolean Compressed = false;
\r
81 memset((void *)&CompHeader,0,sizeof(struct CMP1Header));
\r
84 // Open file to load....
\r
87 if ((handle = open(SourceFile, O_RDONLY|O_BINARY)) == -1)
\r
91 // Look for JAMPAK headers
\r
94 read(handle,Buffer,4);
\r
96 if (!strncmp(Buffer,COMP,4))
\r
99 // Compressed under OLD file format
\r
103 SrcLen = Verify(SourceFile);
\r
105 read(handle,(void *)&CompHeader.OrginalLen,4);
\r
106 CompHeader.CompType = ct_LZW;
\r
107 MM_GetPtr(DstPtr,CompHeader.OrginalLen);
\r
112 if (!strncmp(Buffer,CMP1,4))
\r
115 // Compressed under new file format...
\r
119 SrcLen = Verify(SourceFile);
\r
121 read(handle,(void *)&CompHeader,sizeof(struct CMP1Header));
\r
122 MM_GetPtr(DstPtr,CompHeader.OrginalLen);
\r
127 DstLen = Verify(SourceFile);
\r
131 // Load the file in memory...
\r
136 DstLen = CompHeader.OrginalLen;
\r
138 if ((MM_TotalFree() < SrcLen) && (CompHeader.CompType))
\r
140 if (!InitBufferedIO(handle,&lzwBIO))
\r
141 TrashProg("No memory for buffered I/O.");
\r
143 switch (CompHeader.CompType)
\r
147 lzwDecompress(&lzwBIO,MK_FP(*DstPtr,0),CompHeader.OrginalLen,(SRC_BFILE|DEST_MEM));
\r
153 lzhDecompress(&lzwBIO,MK_FP(*DstPtr,0),CompHeader.OrginalLen,CompHeader.CompressLen,(SRC_BFILE|DEST_MEM));
\r
158 TrashProg("BLoad() - Unrecognized/Supported compression");
\r
162 FreeBufferedIO(&lzwBIO);
\r
166 CA_LoadFile(SourceFile,&SrcPtr);
\r
167 switch (CompHeader.CompType)
\r
171 lzwDecompress(MK_FP(SrcPtr,8),MK_FP(*DstPtr,0),CompHeader.OrginalLen,(SRC_MEM|DEST_MEM));
\r
177 lzhDecompress(MK_FP(SrcPtr,8),MK_FP(*DstPtr,0),CompHeader.OrginalLen,CompHeader.CompressLen,(SRC_MEM|DEST_MEM));
\r
182 TrashProg("BLoad() - Unrecognized/Supported compression");
\r
185 MM_FreePtr(&SrcPtr);
\r
189 CA_LoadFile(SourceFile,DstPtr);
\r
198 ////////////////////////////////////////////////////////////////////////////
\r
202 int LoadLIBShape(char *SLIB_Filename, char *Filename,struct Shape *SHP)
\r
204 #define CHUNK(Name) (*ptr == *Name) && \
\r
205 (*(ptr+1) == *(Name+1)) && \
\r
206 (*(ptr+2) == *(Name+2)) && \
\r
207 (*(ptr+3) == *(Name+3))
\r
214 memptr IFFfile = NULL;
\r
215 unsigned long FileLen, size, ChunkLen;
\r
221 // Decompress to ram and return ptr to data and return len of data in
\r
222 // passed variable...
\r
224 if (!LoadLIBFile(SLIB_Filename,Filename,&IFFfile))
\r
225 TrashProg("Error Loading Compressed lib shape!");
\r
227 // Evaluate the file
\r
229 ptr = MK_FP(IFFfile,0);
\r
230 if (!CHUNK("FORM"))
\r
234 FileLen = *(long far *)ptr;
\r
235 SwapLong((long far *)&FileLen);
\r
238 if (!CHUNK("ILBM"))
\r
245 ChunkLen = *(long far *)(ptr+4);
\r
246 SwapLong((long far *)&ChunkLen);
\r
247 ChunkLen = (ChunkLen+1) & 0xFFFFFFFE;
\r
252 SHP->bmHdr.w = ((struct BitMapHeader far *)ptr)->w;
\r
253 SHP->bmHdr.h = ((struct BitMapHeader far *)ptr)->h;
\r
254 SHP->bmHdr.x = ((struct BitMapHeader far *)ptr)->x;
\r
255 SHP->bmHdr.y = ((struct BitMapHeader far *)ptr)->y;
\r
256 SHP->bmHdr.d = ((struct BitMapHeader far *)ptr)->d;
\r
257 SHP->bmHdr.trans = ((struct BitMapHeader far *)ptr)->trans;
\r
258 SHP->bmHdr.comp = ((struct BitMapHeader far *)ptr)->comp;
\r
259 SHP->bmHdr.pad = ((struct BitMapHeader far *)ptr)->pad;
\r
260 SwapWord(&SHP->bmHdr.w);
\r
261 SwapWord(&SHP->bmHdr.h);
\r
262 SwapWord(&SHP->bmHdr.x);
\r
263 SwapWord(&SHP->bmHdr.y);
\r
270 size = *((long far *)ptr);
\r
272 SwapLong((long far *)&size);
\r
273 SHP->BPR = (SHP->bmHdr.w+7) >> 3;
\r
274 MM_GetPtr(&SHP->Data,size);
\r
277 movedata(FP_SEG(ptr),FP_OFF(ptr),FP_SEG(SHP->Data),0,size);
\r
285 FileLen -= ChunkLen+8;
\r
293 // segptr = (memptr)FP_SEG(IFFfile);
\r
294 MM_FreePtr(&IFFfile);
\r
304 //----------------------------------------------------------------------------
\r
305 // LoadLIBFile() -- Copies a file from an existing archive to dos.
\r
309 // LibName - Name of lib file created with SoftLib V1.0
\r
311 // FileName - Name of file to load from lib file.
\r
313 // MemPtr - (IF !NULL) - Pointer to memory to load into ..
\r
314 // (IF NULL) - Routine allocates necessary memory and
\r
315 // returns a MEM(SEG) pointer to memory allocated.
\r
319 // (IF !NULL) - A pointer to the loaded data.
\r
320 // (IF NULL) - Error!
\r
322 //----------------------------------------------------------------------------
\r
323 memptr LoadLIBFile(char *LibName,char *FileName,memptr *MemPtr)
\r
326 unsigned long header;
\r
327 struct ChunkHeader Header;
\r
328 unsigned long ChunkLen;
\r
330 struct FileEntryHdr FileEntry; // Storage for file once found
\r
331 struct FileEntryHdr FileEntryHeader; // Header used durring searching
\r
332 struct SoftLibHdr LibraryHeader; // Library header - Version Checking
\r
333 boolean FileFound = false;
\r
334 unsigned long id_slib = ID_SLIB;
\r
335 unsigned long id_chunk = ID_CHUNK;
\r
339 // OPEN SOFTLIB FILE
\r
342 if ((handle = open(LibName,O_RDONLY|O_BINARY, S_IREAD)) == -1)
\r
347 // VERIFY it is a SOFTLIB (SLIB) file
\r
350 if (read(handle,&header,4) == -1)
\r
356 if (header != id_slib)
\r
364 // CHECK LIBRARY HEADER VERSION NUMBER
\r
367 if (read(handle, &LibraryHeader,sizeof(struct SoftLibHdr)) == -1)
\r
368 TrashProg("read error in LoadSLIBFile()\n%c",7);
\r
370 if (LibraryHeader.Version > SOFTLIB_VER)
\r
371 TrashProg("Unsupported file ver %d",LibraryHeader.Version);
\r
375 // MANAGE FILE ENTRY HEADERS...
\r
378 for (x = 1;x<=LibraryHeader.FileCount;x++)
\r
380 if (read(handle, &FileEntryHeader,sizeof(struct FileEntryHdr)) == -1)
\r
386 if (!stricmp(FileEntryHeader.FileName,FileName))
\r
388 FileEntry = FileEntryHeader;
\r
394 // IF FILE HAS BEEN FOUND THEN SEEK TO POSITION AND EXTRACT
\r
395 // ELSE RETURN WITH ERROR CODE...
\r
400 if (lseek(handle,FileEntry.Offset,SEEK_CUR) == -1)
\r
407 // READ CHUNK HEADER - Verify we are at the beginning of a chunk..
\r
410 if (read(handle,(char *)&Header,sizeof(struct ChunkHeader)) == -1)
\r
411 TrashProg("LIB File - Unable to read Header!");
\r
413 if (Header.HeaderID != id_chunk)
\r
414 TrashProg("LIB File - BAD HeaderID!");
\r
417 // Allocate memory if Necessary...
\r
422 MM_GetPtr(MemPtr,FileEntry.OrginalLength);
\r
425 // Calculate the length of the data (without the chunk header).
\r
428 ChunkLen = FileEntry.ChunkLen - sizeof(struct ChunkHeader);
\r
432 // Extract Data from file
\r
435 switch (Header.Compression)
\r
440 if (!InitBufferedIO(handle,&lzwBIO))
\r
441 TrashProg("No memory for buffered I/O.");
\r
442 lzwDecompress(&lzwBIO,MK_FP(*MemPtr,0),FileEntry.OrginalLength,(SRC_BFILE|DEST_MEM));
\r
443 FreeBufferedIO(&lzwBIO);
\r
449 if (!InitBufferedIO(handle,&lzwBIO))
\r
450 TrashProg("No memory for buffered I/O.");
\r
451 lzhDecompress(&lzwBIO, MK_FP(*MemPtr,0), FileEntry.OrginalLength, ChunkLen, (SRC_BFILE|DEST_MEM));
\r
452 FreeBufferedIO(&lzwBIO);
\r
457 if (!CA_FarRead(handle,MK_FP(*MemPtr,0),ChunkLen))
\r
466 TrashProg("Unknown Chunk.Compression Type!");
\r