128 lines
3.4 KiB
C

/*
** Command & Conquer Generals Zero Hour(tm)
** Copyright 2025 Electronic Arts Inc.
**
** This program is free software: you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation, either version 3 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __IFF_H
#define __IFF_H
#define MakeID(a,b,c,d) ( (int) ( ( (int) (a) ) << 24 | ( (int) (b) ) << 16 | \
( (int) (c) ) << 8 | ( (int) (d) ) ) )
#define vIFF_ID_FORM MakeID('F','O','R','M')
#define vIFF_ID_CAT MakeID('C','A','T',' ')
#define vIFF_ID_LIST MakeID('L','I','S','T')
#define vIFF_ID_PROP MakeID('P','R','O','P')
#define vIFF_ID_FILLER W_MakeID(' ',' ',' ',' ')
/* IFF_FILE:
IFF File handling structure
*/
/* defines for IFF_FILE->flags */
#define mIFF_FILE_FORMOPEN (1<<0) /* in a form */
#define mIFF_FILE_CHUNKOPEN (1<<1) /* in a chunk */
#define mIFF_FILE_LOADED (1<<2) /* file is in memory */
typedef struct
{
int ID; /* Chunk ID */
int Size; /* Chunk size in bytes */
} IFF_CHUNK;
typedef struct {
/* public fields */
int FormID;
int ChunkID;
int FormSize;
int ChunkSize;
/* private fields */
int fp;
int flags;
int next_byte;
int chunk_size_pos;
int form_size_pos;
int pad_form;
int pad_chunk;
int file_size;
int file_pos;
char *mem_file;
} IFF_FILE;
IFF_FILE* IFF_Open ( const char * );
IFF_FILE* IFF_Load ( const char * );
VOID IFF_Reset ( IFF_FILE * );
VOID IFF_Close ( IFF_FILE * );
VOID IFF_goto_form_end ( IFF_FILE *);
VOID IFF_goto_chunk_end ( IFF_FILE *);
int IFF_NextForm ( IFF_FILE *);
int IFF_NextChunk ( IFF_FILE *);
int IFF_Read ( IFF_FILE *, void *, int );
int IFF_Write ( IFF_FILE *, void *, int );
IFF_FILE* IFF_New ( const char * );
int IFF_NewForm ( IFF_FILE *, int );
int IFF_NewChunk ( IFF_FILE *, int );
int IFF_CloseForm ( IFF_FILE * );
int IFF_CloseChunk ( IFF_FILE * );
#define DO_OPEN(P,N,F,E) {if (!((P)=open(N,(F)))) goto E;}
#define DO_READ(P,B,S,E) {if ( read((P),(B),(S))!=(S)) goto E;}
#define DO_WRITE(P,B,S,E) {if ( write((P),(B),(S))!=(S)) goto E;}
#define IFF_READ(iff,data,size,label) {if ( IFF_Read ( (iff), (data), (size)) != (size)) goto label;}
#define IFF_WRITE(iff,data,size,label) {if ( IFF_Write ( (iff), (data), (size)) != (size)) goto label;}
#define IFF_NEWCHUNK(iff,id,label) { if ( !IFF_NewChunk ( (iff), (id))) goto label; }
#define IFF_NEWFORM(iff,id,label) { if ( !IFF_NewForm ( (iff), (id))) goto label; }
#define Reverse32(L) ( (( (L)>>24 ) & 0xff) | (((L)>>8) &0xff00) | (((L)<<8)&0xff0000) | (((L)<<24)&0xff000000))
#define Reverse16(L) ( (( (L)>>8 ) & 0xff) | (((L)<<8)&0xff00) )
#define __CPU_BIG_ENDIAN__ 0
#if __CPU_BIG_ENDIAN__
#define BgEn32(L) (L)
#define BgEn16(L) (L)
#define LtEn32(L) Reverse32(L)
#define LtEn16(L) Reverse16(L)
#else
#define BgEn32(L) Reverse32(L)
#define BgEn16(L) Reverse16(L)
#define LtEn32(L) (L)
#define LtEn16(L) (L)
#endif
#endif /* __IFF_H */