-
Notifications
You must be signed in to change notification settings - Fork 23
/
wcc.h
231 lines (189 loc) · 9.25 KB
/
wcc.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
// Definitions for sfArk / WaveComp
// Copyright 1998-2000 Andy Inman
// Contact via: http://netgenius.co.uk or http://melodymachine.com
// This file is part of sfArkLib.
//
// sfArkLib 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.
//
// sfArkLib 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 sfArkLib. If not, see <http://www.gnu.org/licenses/>.
#if defined(USE_MANUAL_ENDIANNESS) && \
(defined(MANUAL_LITTLE_ENDIAN) || defined(MANUAL_BIG_ENDIAN))
#define LITTLE_ENDIAN 1234
#define BIG_ENDIAN 4321
#ifdef MANUAL_LITTLE_ENDIAN
#define BYTE_ORDER LITTLE_ENDIAN
#else
#define BYTE_ORDER BIG_ENDIAN
#endif
#elif defined(USE_SYS_ENDIAN_H)
/* BSD */
#include <sys/endian.h>
#elif defined(USE_ENDIAN_H)
/* GNU */
#include <endian.h>
#endif
#if !defined(LITTLE_ENDIAN) || !defined(BIG_ENDIAN) || !defined(BYTE_ORDER)
#error ENDIAN system undefined
#endif
#if (BYTE_ORDER != LITTLE_ENDIAN) && (BYTE_ORDER != BIG_ENDIAN)
/* PDP endian or something */
#error only big or little endian systems are supported
#endif
#include "sfArkLib.h"
// ------------------------------------------------------------------------------------
// The following are now defined in sfarklib.h ... redefined here for compatibility...
#define MAX_FILENAME SFARKLIB_MAX_FILENAME
#define MAX_FILEPATH SFARKLIB_MAX_FILEPATH
#define MAX_MSGTEXT SFARKLIB_MAX_MSGTEXT
#define MSG_SameLine SFARKLIB_MSG_SameLine
#define MSG_AppendLine SFARKLIB_MSG_AppendLine
#define MSG_PopUp SFARKLIB_MSG_PopUp
#define msg(a, b) sfkl_msg(a, b) // Message display function
#define UpdateProgress(a) sfkl_UpdateProgress(a) // Progress indication
#define GetLicenseAgreement(a, b) sfkl_GetLicenseAgreement(a, b)// Display/confirm license
#define DisplayNotes(a, b) sfkl_DisplayNotes(a, b) // Display notes text file
#define GetsfArkLibVersion(a) sfkl_GetVersion(a)
#define Decode(a, b) sfkl_Decode(a, b)
// ------------------------------------------------------------------------------------
// -------- Global flags and data ----------
#ifdef SFARKLIB_GLOBAL // Compiling main file?
//bool Aborted;
int GlobalErrorFlag;
const char ProgName[] = "sfArkLib";
const char ProgVersion[] = " 3.00"; // 5 characters xx.xx
const unsigned char ProgVersionMaj = 30; // 0-255 = V0 to V25.5xx, etc.
const unsigned char ProgVersionMin = 00; // 0-99 = Vx.x99, etc.
char MsgTxt[MAX_MSGTEXT]; // Used with sprintf to build message // Text buffer for msg()
unsigned SourceFileOffset = 0; // Set non-zero by app for self-extraction
#else
//extern bool Aborted;
extern int GlobalErrorFlag;
extern char *MsgTxt;
extern const char *ProgName; // e.g. "sfArkLib"
extern const char *ProgVersion; // e.g."2.10 "
extern const unsigned char ProgVersionMaj; // 00-255 = V25.5x, etc.
extern const unsigned char ProgVersionMin; // 00-99 = Vx.x99, etc.
extern unsigned SourceFileOffset; // Set non-zero by app for self-extraction
#endif
// ----- typdefs -----
typedef unsigned short USHORT;
typedef unsigned char BYTE;
typedef unsigned int ULONG;
//typedef int bool;
typedef short AWORD; // Audio word, i.e. 16-bit audio
typedef unsigned short UAWORD;
typedef int LAWORD; // "long" audio word, i.e. 32 bits
typedef unsigned int ULAWORD;
// Types used by Bit I/O (BIO) routines...
typedef USHORT BIOWORD;
typedef ULONG BIOWORD2;
// -------------------
// ----- Constants -----
#ifndef true
#define true 1
#define false 0
#endif
#define SHIFTWIN 64 // window size used for shift operations
// Just for readability...
#define SIGNBIT 1
#define FLAGBIT 1
// Some max sizes...
#define MAX_BUFSIZE 4096 // Largest buffer size
#define MAX_AWORD ( (1 << (AWORD_BITS-1)) -1 ) // 32767 for 16-Bit AWORD
#define MAX_UAWORD ( (1 << AWORD_BITS)-1 ) // 65535 for 16-Bit AWORD
// Typed NULLs ...
#define FL_NULL ((float *) 0)
#define AW_NULL ((AWORD *) 0)
#define LAW_NULL ((LAWORD *) 0)
// Compression methods...
#define COMPRESSION_v1 0 // sfArk V1 compression
#define COMPRESSION_v1Fast 1 // sfArk V1.1 "Fast" compression
#define COMPRESSION_v1Full 2 // sfArk V1.1 "Full" compression
#define COMPRESSION_v2 3 // Lowest value for V2 compression
#define COMPRESSION_v2NonAudio 3 // sfArk V2 "NonAudio" (uses ZLib MemComp)
#define COMPRESSION_v2Turbo 4 // sfArk V2 "Turbo" compression (BD2 only, maxloops 3)
#define COMPRESSION_v2Fast 5 // sfArk V2 "Fast" compression (BD2,3,4, maxloops 15)
#define COMPRESSION_v2Standard 6 // sfArk V2 "Standard" compression (BD2 + LPC, 8 LPC parameters)
#define COMPRESSION_v2Max 7 // sfArk V2 "Max" compression (BD2, 3, 4 + LPC with 128(?) LPC parameters)
#define COMPRESSION_v2Custom 8 // sfArk V2 "Custom" compression (user choices)
#define COMPRESSION_NotV1 254 // Returned by ReadV1Header() for non-V1 files
#define COMPRESSION_Error 255 // Returned by ReadV1Header() for unrecognised compression type
// ----------------------
// ------ Macros -------
#define RETURN_ON_ERROR() if (GlobalErrorFlag != SFARKLIB_SUCCESS) return(GlobalErrorFlag)
#define JUMP_ON_ERROR(label) if (GlobalErrorFlag != SFARKLIB_SUCCESS) goto label
#if BYTE_ORDER == BIG_ENDIAN
#define FIX_ENDIAN16(w) ((((BYTE) w) << 8) | (((USHORT)w) >> 8))
#else
#define FIX_ENDIAN16(w) (w)
#endif
#define BIT_SIZEOF(x) (sizeof(x) * 8)
#define AWORD_BITS BIT_SIZEOF(AWORD) // Number of bits in Audio Word
#define ABS(x) ( ((x) > 0) ? (x) : -(x))
#define MIN(x, y) ( ( (x) < (y) )? (x) : (y) )
#define MAX(x, y) ( ( (x) > (y) )? (x) : (y) )
#define NZSIGN(w) ((w) != 0) // Used to add 1 for SignBit if value is non-zero
#define LOWBITS(w, n) ( (w) & ((1 << (n))-1) )
#if 0 // Safer methods (use in case of compile compatibility problems, etc)...
#define SIGN(x) ( ((x) >= 0) ? 0 : 1)
#define QUICKABS(x) ABS(x)
#define QUICKABS2(x) ( ABS(x) - SIGN(x) )
#else
// Quick "absolute value" for (much faster than using conditional) ...
// if x is positive QUICKABS2(x) = abs(x) ... but...
// if x is negative QUICKABS2(x) = abs(x)-1 -- wrong! but suits many of our purposes here!
#define SIGN(x) ( (((x)) >> (BIT_SIZEOF(x)-1)) & 1 ) // Fast! Returns 0 for positive, 1 for negative
#define QUICKABS2(x) ( (x) ^ ( (x) >> (BIT_SIZEOF(x)-1) ) ) // Fast version (inaccurate for negative value)
#define QUICKABS(x) ( QUICKABS2(x) + SIGN(x) ) // Correct ABS value
#endif
// Fast division using Shift for Unsigned numbers (or where innacuracy isn't a problem)
// Innacurate on negative odd numbers, e.g. NSDIV(-100, 1) gives -51 instead of -50. (Use SDIV instead).
#define NSDIV(x, y) ( (x) >> (y) )
// Fast division using Shift for Signed numbers
#define SDIV(x, y) ( ((x) >= 0)? (x) >> (y) : -((-(x)) >> (y)) )
// ------- Prototypes -------
// sfArkLib_Coding...
//extern USHORT GetsfArkLibVersion(void);
//extern int Decode(const char *InFileName, const char *ReqOutFileName);
extern void FixEndian(void *num, int nsize);
// sfArkLib_Diff...
extern long BufSum(const AWORD *buf, USHORT bufsize);
extern void UnBufDif2(AWORD *OutBuf, const AWORD *InBuf, USHORT bufsize, AWORD *prev);
extern void UnBufDif4(AWORD *OutBuf, const AWORD *InBuf, USHORT bufsize, AWORD *prev);
extern void UnBufDif3(AWORD *OutBuf, const AWORD *InBuf, USHORT bufsize, AWORD *prev);
extern void UnBufShift(AWORD *Buf, USHORT SizeOfBuf, short *Shifts);
// sfArkLib_Crunch...
extern long UnCrunchWin(AWORD *Buf, USHORT BufSize, USHORT WinSize);
extern void BioDecompInit(void);
extern void BioDecompEnd(void);
extern BIOWORD BioRead(int NumberOfBits);
extern bool BioReadFlag(void);
extern long BioReadBuf(BYTE *Buf, long BufSize);
extern AWORD InputDiff(AWORD PrevValue);
extern short GetNBits(short w);
// sfArkLib_File (or supplied by SDL.cpp)...
extern void OpenOutputFile(const char *FileName);
extern void OpenInputFile(const char *FileName);
extern int ReadInputFile(BYTE *Buf, int NumberOfBytesToRead);
extern int WriteOutputFile(const BYTE *Buf, int NumberOfBytesToWrite);
extern bool SetInputFilePosition(int NewPos);
extern bool SetOutputFilePosition(int NewPos);
extern void CloseInputFile(void);
extern void CloseOutputFile(void);
// sfArkLib_LPC...
extern void LPCinit(void);
extern long UnLPC(AWORD *OutBuf, AWORD *InBuf, short bufsize, short nc, ULONG *Flags);
// sfArkLib_Zip...
extern ULONG UnMemcomp(const BYTE *InBuf, int InBytes, BYTE *OutBuf, int OutBufLen);
// sfArkLib_String...
extern char *StrncpyEnsureNul(char *destination, const char *source, int num);
void ChangeFileExt(const char *path, const char *newExtension, char *out, int outSize);