libsf3
Loading...
Searching...
No Matches
sf3_core.h
Go to the documentation of this file.
1#ifndef __SF3_CORE__
2#define __SF3_CORE__
3#include <stdint.h>
4#include <stddef.h>
5
6#if defined(__DOXYGEN__)
7# define SF3_PACK
8#else
9# define SF3_PACK __attribute__((packed))
10#endif
11
12#ifndef SF3_EXPORT
13#define SF3_EXPORT static
14#endif
15#ifndef SF3_INLINE
16#define SF3_INLINE static inline
17#endif
18
20typedef uint32_t sf3_crc32_checksum;
21
24typedef uint8_t sf3_format_id;
25
29typedef struct SF3_PACK sf3_str8{
30 uint8_t length;
31 char str[];
33
37typedef struct SF3_PACK sf3_str16{
38 uint16_t length;
39 char str[];
41
45typedef struct SF3_PACK sf3_str32{
46 uint32_t length;
47 char str[];
49
53typedef struct SF3_PACK sf3_str64{
54 uint64_t length;
55 char str[];
57
59#define SF3_SKIP_STR(STR) ((STR).str+(STR).length)
60
64#define SF3_SKIP_STRP(STR) ((STR)->str+(STR)->length)
65
67#define SF3_MAGIC {0x81, 0x53, 0x46, 0x33, 0x00, 0xE0, 0xD0, 0x0D, 0x0A, 0x0A}
68
81
94SF3_EXPORT int sf3_check(const void *addr, size_t size){
95 if(size < sizeof(struct sf3_identifier)) return 0;
96 const struct sf3_identifier *identifier = (const struct sf3_identifier *)addr;
97 const char magic[10] = SF3_MAGIC;
98 for(int i=0; i<10; ++i){
99 if(magic[i] != identifier->magic[i]) return 0;
100 }
101 if(identifier->null_terminator != 0) return 0;
102 return identifier->format_id;
103};
104
105const uint32_t sf3_crc32_tab[] = {
106 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
107 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
108 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
109 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
110 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
111 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
112 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
113 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
114 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
115 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
116 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
117 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
118 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
119 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
120 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
121 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
122 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
123 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
124 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
125 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
126 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
127 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
128 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
129 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
130 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
131 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
132 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
133 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
134 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
135 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
136 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
137 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
138 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
139 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
140 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
141 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
142 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
143 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
144 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
145 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
146 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
147 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
148 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
149};
150
153 const uint8_t *data = (const uint8_t *)addr;
154 sf3_crc32_checksum crc = 0xFFFFFFFF;
155 for(size_t i=0; i<size; ++i){
156 crc = sf3_crc32_tab[(crc ^ data[i]) & 0xFF] ^ (crc >> 8);
157 }
158 return crc ^ 0xFFFFFFFF;
159};
160
172SF3_EXPORT int sf3_verify(const void *addr, size_t size){
173 int result = sf3_check(addr, size);
174 if(result == 0) return 0;
175
176 const struct sf3_identifier *identifier = (const struct sf3_identifier *)addr;
177 const void *payload = (const void *)(((const uint8_t *)addr)+sizeof(struct sf3_identifier));
178 if(identifier->checksum != sf3_compute_checksum(payload, size-sizeof(struct sf3_identifier)))
179 return 0;
180 return result;
181}
182
190SF3_EXPORT int sf3_write_header(sf3_format_id format, void *addr, size_t size){
191 if(size<sizeof(struct sf3_identifier)) return 0;
192
193 struct sf3_identifier *identifier = (struct sf3_identifier *)addr;
194 const void *payload = (const void *)(((const uint8_t *)addr)+sizeof(struct sf3_identifier));
195 const char magic[10] = SF3_MAGIC;
196 for(int i=0; i<10; ++i){
197 identifier->magic[i] = magic[i];
198 }
199 identifier->format_id = format;
200 identifier->checksum = sf3_compute_checksum(payload, size-sizeof(struct sf3_identifier));
201 identifier->null_terminator = 0;
202 return 1;
203}
204#endif
#define SF3_EXPORT
Definition sf3_core.h:13
SF3_EXPORT int sf3_write_header(sf3_format_id format, void *addr, size_t size)
Definition sf3_core.h:190
SF3_EXPORT sf3_crc32_checksum sf3_compute_checksum(const void *addr, size_t size)
Computes a CRC32 checksum of the given block of memory.
Definition sf3_core.h:152
#define SF3_PACK
Definition sf3_core.h:9
SF3_EXPORT int sf3_check(const void *addr, size_t size)
Definition sf3_core.h:94
uint8_t sf3_format_id
Definition sf3_core.h:24
SF3_EXPORT int sf3_verify(const void *addr, size_t size)
Definition sf3_core.h:172
const uint32_t sf3_crc32_tab[]
Definition sf3_core.h:105
#define SF3_MAGIC
The SF3 file header magic identifier bytes.
Definition sf3_core.h:67
uint32_t sf3_crc32_checksum
Type for a CRC32 checksum.
Definition sf3_core.h:20
The basic header structure of every SF3 file.
Definition sf3_core.h:70
char null_terminator
A final null terminator marking the end of the identifier.
Definition sf3_core.h:79
sf3_crc32_checksum checksum
Definition sf3_core.h:77
sf3_format_id format_id
The ID of the actual file type contained within.
Definition sf3_core.h:74
char magic[10]
These magic bits must be the same as SF3_MAGIC.
Definition sf3_core.h:72
uint16_t length
Definition sf3_core.h:38
uint32_t length
Definition sf3_core.h:46
uint64_t length
Definition sf3_core.h:54
uint8_t length
Definition sf3_core.h:30