]>
git.zerfleddert.de Git - proxmark3-svn/blob - client/reveng/model.c
5a9b6580449dd20a7343f1e1e1c3e52ee4e28996
2 * Greg Cook, 9/Apr/2015
5 /* CRC RevEng, an arbitrary-precision CRC calculator and algorithm finder
6 * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015 Gregory Cook
8 * This file is part of CRC RevEng.
10 * CRC RevEng is free software: you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation, either version 3 of the License, or
13 * (at your option) any later version.
15 * CRC RevEng is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with CRC RevEng. If not, see <http://www.gnu.org/licenses/>.
24 /* 2014-01-14: added CRC-8/DVB-S2
25 * 2014-01-11: corrected CRC-40/GSM, added alias CRC-8/AES
26 * 2013-10-14: added CRC-13/BBC and six cdma2000 algorithms
27 * 2013-06-11: ensure BMP_BIT is an integer constant to compile presets
28 * 2013-01-20: big polynomials autogenerated, corrected CRC-82/DARC
29 * 2012-07-19: added CRC-8/EBU
30 * 2012-07-16: added CRC-15/MPT1327
31 * 2012-05-25: removed CRC-1/PARITY-EVEN, CRC-1/PARITY-ODD
32 * 2012-04-12: added model CRC-31/PHILIPS
33 * 2012-03-03: single-line Williams model string conversion
34 * 2012-02-20: corrected model CRC-6/DARC
35 * 2011-09-03: added mrev(), mnovel()
36 * 2011-08-28: added model CRC-64/XZ
37 * 2011-04-30: added models CRC-16/TMS37157 and CRC-A, and alias CRC-B
38 * 2011-02-10: made preset models ANSI C compliant
39 * 2011-01-17: fixed ANSI C warnings (except preset models)
40 * 2011-01-01: added mbynum(), mcount()
41 * 2010-12-26: renamed CRC RevEng
42 * 2010-12-18: minor change to mtostr() output format
43 * 2010-12-15: added mcmp(), mmatch()
44 * 2010-12-14: finished mbynam(), mnames(), mtostr()
45 * 2010-12-13: restarted with PCONST macros
46 * 2010-12-12: was having so much fun I didn't think to try compiling. :(
47 * 2010-12-12: started models.c
56 /* Private declarations */
59 const unsigned long width
; /* width of CRC algorithm */
60 const bmp_t
*const bspoly
; /* polynomial with highest-order term removed. length determines CRC width */
61 const bmp_t
*const binit
; /* initial register value. length == poly.length */
62 const int flags
; /* P_REFIN and P_REFOUT indicate reflected input/output */
63 const bmp_t
*const bxorout
; /* final register XOR mask. length == poly.length */
64 const bmp_t
*const bcheck
; /* optional check value, the CRC of the UTF-8 string "123456789" */
65 const char *const name
; /* optional canonical name of the model */
70 const struct mpreset
*model
;
76 # error config.h: BMP_BIT must be an integer constant macro to compile presets
79 /* Big polynomial constants. */
81 /* Directives for relink.pl */
82 /* CONSTANT b40 = (40, 0x0004820009) */
83 /* CONSTANT b40a = (40, 0xffffffffff) */
84 /* CONSTANT b40b = (40, 0xd4164fc646) */
85 /* CONSTANT b64 = (64, 0x42f0e1eba9ea3693) */
86 /* CONSTANT b64a = (64, 0x6c40df5f0b497347) */
87 /* CONSTANT b64b = (64, 0xffffffffffffffff) */
88 /* CONSTANT b64c = (64, 0x62ec59e3f1a4f00a) */
89 /* CONSTANT b64d = (64, 0x995dc9bbdf1939fa) */
90 /* CONSTANT b82 = (82, 0x0308c0111011401440411) */
91 /* CONSTANT b82a = (82, 0x09ea83f625023801fd612) */
93 /* The next section was generated by relink.pl from the directives above. */
95 /* DO NOT EDIT the section below, INCLUDING the next comment. */
96 /* BEGIN AUTO-GENERATED CONSTANTS */
98 static const bmp_t b40
[] = {
99 BMP_C(0x0004820009) << (BMP_BIT
- 40),
101 static const bmp_t b40a
[] = {
102 BMP_C(0xffffffffff) << (BMP_BIT
- 40),
104 static const bmp_t b40b
[] = {
105 BMP_C(0xd4164fc646) << (BMP_BIT
- 40),
108 static const bmp_t b40
[] = {
109 BMP_C(0x00048200) << (BMP_BIT
- 32) | BMP_C(0x04) >> (39 - BMP_BIT
),
110 BMP_C(0x09) << (BMP_BIT
* 2 - 40),
112 static const bmp_t b40a
[] = {
113 BMP_C(0xffffffff) << (BMP_BIT
- 32) | BMP_C(0x7f) >> (39 - BMP_BIT
),
114 BMP_C(0xff) << (BMP_BIT
* 2 - 40),
116 static const bmp_t b40b
[] = {
117 BMP_C(0xd4164fc6) << (BMP_BIT
- 32) | BMP_C(0x23) >> (39 - BMP_BIT
),
118 BMP_C(0x46) << (BMP_BIT
* 2 - 40),
120 # endif /* BMP_BIT */
123 static const bmp_t b64
[] = {
124 BMP_C(0x42f0e1eba9ea3693) << (BMP_BIT
- 64),
126 static const bmp_t b64a
[] = {
127 BMP_C(0x6c40df5f0b497347) << (BMP_BIT
- 64),
129 static const bmp_t b64b
[] = {
130 BMP_C(0xffffffffffffffff) << (BMP_BIT
- 64),
132 static const bmp_t b64c
[] = {
133 BMP_C(0x62ec59e3f1a4f00a) << (BMP_BIT
- 64),
135 static const bmp_t b64d
[] = {
136 BMP_C(0x995dc9bbdf1939fa) << (BMP_BIT
- 64),
139 static const bmp_t b64
[] = {
140 BMP_C(0x42f0e1eb) << (BMP_BIT
- 32) | BMP_C(0x54f51b49) >> (63 - BMP_BIT
),
141 BMP_C(0xa9ea3693) << (BMP_BIT
* 2 - 64),
143 static const bmp_t b64a
[] = {
144 BMP_C(0x6c40df5f) << (BMP_BIT
- 32) | BMP_C(0x05a4b9a3) >> (63 - BMP_BIT
),
145 BMP_C(0x0b497347) << (BMP_BIT
* 2 - 64),
147 static const bmp_t b64b
[] = {
148 BMP_C(0xffffffff) << (BMP_BIT
- 32) | BMP_C(0x7fffffff) >> (63 - BMP_BIT
),
149 BMP_C(0xffffffff) << (BMP_BIT
* 2 - 64),
151 static const bmp_t b64c
[] = {
152 BMP_C(0x62ec59e3) << (BMP_BIT
- 32) | BMP_C(0x78d27805) >> (63 - BMP_BIT
),
153 BMP_C(0xf1a4f00a) << (BMP_BIT
* 2 - 64),
155 static const bmp_t b64d
[] = {
156 BMP_C(0x995dc9bb) << (BMP_BIT
- 32) | BMP_C(0x6f8c9cfd) >> (63 - BMP_BIT
),
157 BMP_C(0xdf1939fa) << (BMP_BIT
* 2 - 64),
159 # endif /* BMP_BIT */
162 static const bmp_t b82
[] = {
163 BMP_C(0x0308c0111011401440411) << (BMP_BIT
- 82),
165 static const bmp_t b82a
[] = {
166 BMP_C(0x09ea83f625023801fd612) << (BMP_BIT
- 82),
169 static const bmp_t b82
[] = {
170 BMP_C(0x01846008880) << (BMP_BIT
- 41) | BMP_C(0x08a00a20208) >> (81 - BMP_BIT
),
171 BMP_C(0x11401440411) << (BMP_BIT
* 2 - 82),
173 static const bmp_t b82a
[] = {
174 BMP_C(0x04f541fb128) << (BMP_BIT
- 41) | BMP_C(0x011c00feb09) >> (81 - BMP_BIT
),
175 BMP_C(0x023801fd612) << (BMP_BIT
* 2 - 82),
178 static const bmp_t b82
[] = {
179 BMP_C(0x0c230044) << (BMP_BIT
- 32) | BMP_C(0x040) >> (40 - BMP_BIT
),
180 BMP_C(0x40450051) << (BMP_BIT
* 2 - 64) | BMP_C(0x00104) >> (80 - BMP_BIT
* 2),
181 BMP_C(0x00411) << (BMP_BIT
* 3 - 82),
183 static const bmp_t b82a
[] = {
184 BMP_C(0x27aa0fd8) << (BMP_BIT
- 32) | BMP_C(0x094) >> (40 - BMP_BIT
),
185 BMP_C(0x9408e007) << (BMP_BIT
* 2 - 64) | BMP_C(0x0f584) >> (80 - BMP_BIT
* 2),
186 BMP_C(0x3d612) << (BMP_BIT
* 3 - 82),
188 # endif /* BMP_BIT */
190 /* END AUTO-GENERATED CONSTANTS */
191 /* DO NOT EDIT the section above, INCLUDING the previous comment. */
193 /* Array of the polynomial bitmaps used in the model table. */
194 static const bmp_t b32
[] = {
195 BMP_C(0x00000000) << (BMP_BIT
- 32), /* 0 -- 5, 00 */
196 BMP_C(0x000000af) << (BMP_BIT
- 32), /* 1 -- 32,000000af */
197 BMP_C(0x00010000) << (BMP_BIT
- 32), /* 2 -- 16, 0001 */
198 BMP_C(0x00020000) << (BMP_BIT
- 32), /* 3 -- 15, 0001 */
199 BMP_C(0x007e0000) << (BMP_BIT
- 32), /* 4 -- 16, 007e */
200 BMP_C(0x007f0000) << (BMP_BIT
- 32), /* 5 -- 16, 007f */
201 BMP_C(0x03400000) << (BMP_BIT
- 32), /* 6 -- 11, 01a */
202 BMP_C(0x0376e6e7) << (BMP_BIT
- 32), /* 7 -- 32,0376e6e7 */
203 BMP_C(0x04c11db7) << (BMP_BIT
- 32), /* 8 -- 32,04c11db7 */
204 BMP_C(0x05890000) << (BMP_BIT
- 32), /* 9 -- 16, 0589 */
205 BMP_C(0x07000000) << (BMP_BIT
- 32), /* 10 -- 8, 07 */
206 BMP_C(0x09823b6e) << (BMP_BIT
- 32), /* 11 -- 31,04c11db7 */
207 BMP_C(0x0b3c0000) << (BMP_BIT
- 32), /* 12 -- 15, 059e */
208 BMP_C(0x0c000000) << (BMP_BIT
- 32), /* 13 -- 6, 03 */
209 BMP_C(0x0fb30000) << (BMP_BIT
- 32), /* 14 -- 16, 0fb3 */
210 BMP_C(0x10210000) << (BMP_BIT
- 32), /* 15 -- 16, 1021 */
211 BMP_C(0x12000000) << (BMP_BIT
- 32), /* 16 -- 7, 09 */
212 BMP_C(0x15000000) << (BMP_BIT
- 32), /* 17 -- 8, 15 */
213 BMP_C(0x18000000) << (BMP_BIT
- 32), /* 18 -- 6, 06 */
214 BMP_C(0x19d3c8d8) << (BMP_BIT
- 32), /* 19 -- 31,0ce9e46c */
215 BMP_C(0x1c000000) << (BMP_BIT
- 32), /* 20 -- 6, 07 */
216 BMP_C(0x1d000000) << (BMP_BIT
- 32), /* 21 -- 8, 1d */
217 BMP_C(0x1d0f0000) << (BMP_BIT
- 32), /* 22 -- 16, 1d0f */
218 BMP_C(0x1edc6f41) << (BMP_BIT
- 32), /* 23 -- 32,1edc6f41 */
219 BMP_C(0x1f23b800) << (BMP_BIT
- 32), /* 24 -- 24, 1f23b8 */
220 BMP_C(0x20140000) << (BMP_BIT
- 32), /* 25 -- 14, 0805 */
221 BMP_C(0x20b40000) << (BMP_BIT
- 32), /* 26 -- 14, 082d */
222 BMP_C(0x21890000) << (BMP_BIT
- 32), /* 27 -- 16, 2189 */
223 BMP_C(0x21cf0200) << (BMP_BIT
- 32), /* 28 -- 24, 21cf02 */
224 BMP_C(0x25000000) << (BMP_BIT
- 32), /* 29 -- 8, 25 */
225 BMP_C(0x26b10000) << (BMP_BIT
- 32), /* 30 -- 16, 26b1 */
226 BMP_C(0x27d00000) << (BMP_BIT
- 32), /* 31 -- 13, 04fa */
227 BMP_C(0x28000000) << (BMP_BIT
- 32), /* 32 -- 5, 05 */
228 BMP_C(0x29b10000) << (BMP_BIT
- 32), /* 33 -- 16, 29b1 */
229 BMP_C(0x30000000) << (BMP_BIT
- 32), /* 34 -- 4, 3 */
230 BMP_C(0x3010bf7f) << (BMP_BIT
- 32), /* 35 -- 32,3010bf7f */
231 BMP_C(0x31000000) << (BMP_BIT
- 32), /* 36 -- 8, 31 */
232 BMP_C(0x31c30000) << (BMP_BIT
- 32), /* 37 -- 16, 31c3 */
233 BMP_C(0x34000000) << (BMP_BIT
- 32), /* 38 -- 6, 0d */
234 BMP_C(0x340bc6d9) << (BMP_BIT
- 32), /* 39 -- 32,340bc6d9 */
235 BMP_C(0x38000000) << (BMP_BIT
- 32), /* 40 -- 5, 07 */
236 BMP_C(0x39000000) << (BMP_BIT
- 32), /* 41 -- 8, 39 */
237 BMP_C(0x3d650000) << (BMP_BIT
- 32), /* 42 -- 16, 3d65 */
238 BMP_C(0x44c20000) << (BMP_BIT
- 32), /* 43 -- 16, 44c2 */
239 BMP_C(0x48000000) << (BMP_BIT
- 32), /* 44 -- 5, 09 */
240 BMP_C(0x4acc0000) << (BMP_BIT
- 32), /* 45 -- 15, 2566 */
241 BMP_C(0x4b370000) << (BMP_BIT
- 32), /* 46 -- 16, 4b37 */
242 BMP_C(0x4c060000) << (BMP_BIT
- 32), /* 47 -- 16, 4c06 */
243 BMP_C(0x55000000) << (BMP_BIT
- 32), /* 48 -- 8, 55 */
244 BMP_C(0x5d6dcb00) << (BMP_BIT
- 32), /* 49 -- 24, 5d6dcb */
245 BMP_C(0x60000000) << (BMP_BIT
- 32), /* 50 -- 3, 3 */
246 BMP_C(0x63d00000) << (BMP_BIT
- 32), /* 51 -- 16, 63d0 */
247 BMP_C(0x64000000) << (BMP_BIT
- 32), /* 52 -- 6, 19 */
248 BMP_C(0x66400000) << (BMP_BIT
- 32), /* 53 -- 10, 199 */
249 BMP_C(0x6f910000) << (BMP_BIT
- 32), /* 54 -- 16, 6f91 */
250 BMP_C(0x70000000) << (BMP_BIT
- 32), /* 55 -- 4, 7 */
251 BMP_C(0x70a00000) << (BMP_BIT
- 32), /* 56 -- 11, 385 */
252 BMP_C(0x765e7680) << (BMP_BIT
- 32), /* 57 -- 32,765e7680 */
253 BMP_C(0x7979bd00) << (BMP_BIT
- 32), /* 58 -- 24, 7979bd */
254 BMP_C(0x7e000000) << (BMP_BIT
- 32), /* 59 -- 8, 7e */
255 BMP_C(0x80050000) << (BMP_BIT
- 32), /* 60 -- 16, 8005 */
256 BMP_C(0x800d0000) << (BMP_BIT
- 32), /* 61 -- 16, 800d */
257 BMP_C(0x80f00000) << (BMP_BIT
- 32), /* 62 -- 12, 80f */
258 BMP_C(0x814141ab) << (BMP_BIT
- 32), /* 63 -- 32,814141ab */
259 BMP_C(0x864cfb00) << (BMP_BIT
- 32), /* 64 -- 24, 864cfb */
260 BMP_C(0x87315576) << (BMP_BIT
- 32), /* 65 -- 32,87315576 */
261 BMP_C(0x89ec0000) << (BMP_BIT
- 32), /* 66 -- 16, 89ec */
262 BMP_C(0x8b320000) << (BMP_BIT
- 32), /* 67 -- 15, 4599 */
263 BMP_C(0x8bb70000) << (BMP_BIT
- 32), /* 68 -- 16, 8bb7 */
264 BMP_C(0x8cc00000) << (BMP_BIT
- 32), /* 69 -- 10, 233 */
265 BMP_C(0x906e0000) << (BMP_BIT
- 32), /* 70 -- 16, 906e */
266 BMP_C(0x97000000) << (BMP_BIT
- 32), /* 71 -- 8, 97 */
267 BMP_C(0x98000000) << (BMP_BIT
- 32), /* 72 -- 6, 26 */
268 BMP_C(0x9b000000) << (BMP_BIT
- 32), /* 73 -- 8, 9b */
269 BMP_C(0x9c000000) << (BMP_BIT
- 32), /* 74 -- 6, 27 */
270 BMP_C(0x9e000000) << (BMP_BIT
- 32), /* 75 -- 7, 4f */
271 BMP_C(0x9ecf0000) << (BMP_BIT
- 32), /* 76 -- 16, 9ecf */
272 BMP_C(0xa0970000) << (BMP_BIT
- 32), /* 77 -- 16, a097 */
273 BMP_C(0xa1000000) << (BMP_BIT
- 32), /* 78 -- 8, a1 */
274 BMP_C(0xa6000000) << (BMP_BIT
- 32), /* 79 -- 7, 53 */
275 BMP_C(0xa8000000) << (BMP_BIT
- 32), /* 80 -- 5, 15 */
276 BMP_C(0xa833982b) << (BMP_BIT
- 32), /* 81 -- 32,a833982b */
277 BMP_C(0xabcdef00) << (BMP_BIT
- 32), /* 82 -- 24, abcdef */
278 BMP_C(0xb2aa0000) << (BMP_BIT
- 32), /* 83 -- 16, b2aa */
279 BMP_C(0xb4600000) << (BMP_BIT
- 32), /* 84 -- 11, 5a3 */
280 BMP_C(0xb4c80000) << (BMP_BIT
- 32), /* 85 -- 16, b4c8 */
281 BMP_C(0xb704ce00) << (BMP_BIT
- 32), /* 86 -- 24, b704ce */
282 BMP_C(0xbb3d0000) << (BMP_BIT
- 32), /* 87 -- 16, bb3d */
283 BMP_C(0xbc000000) << (BMP_BIT
- 32), /* 88 -- 8, bc */
284 BMP_C(0xbd0be338) << (BMP_BIT
- 32), /* 89 -- 32,bd0be338 */
285 BMP_C(0xbf050000) << (BMP_BIT
- 32), /* 90 -- 16, bf05 */
286 BMP_C(0xc0000000) << (BMP_BIT
- 32), /* 91 -- 3, 6 */
287 BMP_C(0xc2b70000) << (BMP_BIT
- 32), /* 92 -- 16, c2b7 */
288 BMP_C(0xc6c60000) << (BMP_BIT
- 32), /* 93 -- 16, c6c6 */
289 BMP_C(0xc8000000) << (BMP_BIT
- 32), /* 94 -- 5, 19 */
290 BMP_C(0xc8670000) << (BMP_BIT
- 32), /* 95 -- 16, c867 */
291 BMP_C(0xcbf43926) << (BMP_BIT
- 32), /* 96 -- 32,cbf43926 */
292 BMP_C(0xd0000000) << (BMP_BIT
- 32), /* 97 -- 8, d0 */
293 BMP_C(0xd02a0000) << (BMP_BIT
- 32), /* 98 -- 15, 6815 */
294 BMP_C(0xd0db0000) << (BMP_BIT
- 32), /* 99 -- 16, d0db */
295 BMP_C(0xd4d00000) << (BMP_BIT
- 32), /* 100 -- 12, d4d */
296 BMP_C(0xd5000000) << (BMP_BIT
- 32), /* 101 -- 8, d5 */
297 BMP_C(0xd64e0000) << (BMP_BIT
- 32), /* 102 -- 16, d64e */
298 BMP_C(0xda000000) << (BMP_BIT
- 32), /* 103 -- 8, da */
299 BMP_C(0xdaf00000) << (BMP_BIT
- 32), /* 104 -- 12, daf */
300 BMP_C(0xe0000000) << (BMP_BIT
- 32), /* 105 -- 3, 7 */
301 BMP_C(0xe3069283) << (BMP_BIT
- 32), /* 106 -- 32,e3069283 */
302 BMP_C(0xe5cc0000) << (BMP_BIT
- 32), /* 107 -- 16, e5cc */
303 BMP_C(0xe7a80000) << (BMP_BIT
- 32), /* 108 -- 13, 1cf5 */
304 BMP_C(0xea000000) << (BMP_BIT
- 32), /* 109 -- 7, 75 */
305 BMP_C(0xea820000) << (BMP_BIT
- 32), /* 110 -- 16, ea82 */
306 BMP_C(0xec000000) << (BMP_BIT
- 32), /* 111 -- 6, 3b */
307 BMP_C(0xf1300000) << (BMP_BIT
- 32), /* 112 -- 12, f13 */
308 BMP_C(0xf4000000) << (BMP_BIT
- 32), /* 113 -- 8, f4 */
309 BMP_C(0xf5b00000) << (BMP_BIT
- 32), /* 114 -- 12, f5b */
310 BMP_C(0xf6400000) << (BMP_BIT
- 32), /* 115 -- 10, 3d9 */
311 BMP_C(0xf8000000) << (BMP_BIT
- 32), /* 116 -- 5, 1f */
312 BMP_C(0xfc000000) << (BMP_BIT
- 32), /* 117 -- 6, 3f */
313 BMP_C(0xfc891918) << (BMP_BIT
- 32), /* 118 -- 32,fc891918 */
314 BMP_C(0xfd000000) << (BMP_BIT
- 32), /* 119 -- 8, fd */
315 BMP_C(0xfe000000) << (BMP_BIT
- 32), /* 120 -- 7, 7f */
316 BMP_C(0xfedcba00) << (BMP_BIT
- 32), /* 121 -- 24, fedcba */
317 BMP_C(0xfee80000) << (BMP_BIT
- 32), /* 122 -- 16, fee8 */
318 BMP_C(0xff000000) << (BMP_BIT
- 32), /* 123 -- 8, ff */
319 BMP_C(0xffc00000) << (BMP_BIT
- 32), /* 124 -- 10, 3ff */
320 BMP_C(0xfff00000) << (BMP_BIT
- 32), /* 125 -- 12, fff */
321 BMP_C(0xffff0000) << (BMP_BIT
- 32), /* 126 -- 16, ffff */
322 BMP_C(0xfffffffe) << (BMP_BIT
- 32), /* 127 -- 31,7fffffff */
323 BMP_C(0xffffffff) << (BMP_BIT
- 32), /* 128 -- 32,ffffffff */
326 /* Table of preset CRC models.
327 * Sorted by left-justified polynomial for bsearch().
329 static const struct mpreset models
[] = {
330 {32UL, b32
+ 1, 0, P_BE
, 0, b32
+ 89, "XFER" }, /* 0 */
331 {40UL, b40
, 0, P_BE
, b40a
, b40b
, "CRC-40/GSM" }, /* 1 */
332 {32UL, b32
+ 8, 0, P_BE
, b32
+128, b32
+ 57, "CRC-32/POSIX" }, /* 2 */
333 {32UL, b32
+ 8, b32
+128, P_BE
, 0, b32
+ 7, "CRC-32/MPEG-2" }, /* 3 */
334 {32UL, b32
+ 8, b32
+128, P_BE
, b32
+128, b32
+118, "CRC-32/BZIP2" }, /* 4 */
335 {32UL, b32
+ 8, b32
+128, P_LE
, 0, b32
+ 39, "JAMCRC" }, /* 5 */
336 {32UL, b32
+ 8, b32
+128, P_LE
, b32
+128, b32
+ 96, "CRC-32" }, /* 6 */
337 {16UL, b32
+ 9, 0, P_BE
, 0, b32
+ 5, "CRC-16/DECT-X" }, /* 7 */
338 {16UL, b32
+ 9, 0, P_BE
, b32
+ 2, b32
+ 4, "CRC-16/DECT-R" }, /* 8 */
339 { 8UL, b32
+ 10, 0, P_BE
, 0, b32
+113, "CRC-8" }, /* 9 */
340 { 8UL, b32
+ 10, 0, P_BE
, b32
+ 48, b32
+ 78, "CRC-8/ITU" }, /* 10 */
341 { 8UL, b32
+ 10, b32
+123, P_LE
, 0, b32
+ 97, "CRC-8/ROHC" }, /* 11 */
342 {31UL, b32
+ 11, b32
+127, P_BE
, b32
+127, b32
+ 19, "CRC-31/PHILIPS" }, /* 12 */
343 { 6UL, b32
+ 13, 0, P_LE
, 0, b32
+ 18, "CRC-6/ITU" }, /* 13 */
344 {82UL, b82
, 0, P_LE
, 0, b82a
, "CRC-82/DARC" }, /* 14 */
345 {16UL, b32
+ 15, 0, P_BE
, 0, b32
+ 37, "XMODEM" }, /* 15 */
346 {16UL, b32
+ 15, 0, P_LE
, 0, b32
+ 27, "KERMIT" }, /* 16 */
347 {16UL, b32
+ 15, b32
+ 22, P_BE
, 0, b32
+107, "CRC-16/AUG-CCITT" }, /* 17 */
348 {16UL, b32
+ 15, b32
+ 66, P_LE
, 0, b32
+ 30, "CRC-16/TMS37157" }, /* 18 */
349 {16UL, b32
+ 15, b32
+ 83, P_LE
, 0, b32
+ 51, "CRC-16/RIELLO" }, /* 19 */
350 {16UL, b32
+ 15, b32
+ 93, P_LE
, 0, b32
+ 90, "CRC-A" }, /* 20 */
351 {16UL, b32
+ 15, b32
+126, P_BE
, 0, b32
+ 33, "CRC-16/CCITT-FALSE"}, /* 21 */
352 {16UL, b32
+ 15, b32
+126, P_BE
, b32
+126, b32
+102, "CRC-16/GENIBUS" }, /* 22 */
353 {16UL, b32
+ 15, b32
+126, P_LE
, 0, b32
+ 54, "CRC-16/MCRF4XX" }, /* 23 */
354 {16UL, b32
+ 15, b32
+126, P_LE
, b32
+126, b32
+ 70, "X-25" }, /* 24 */
355 { 7UL, b32
+ 16, 0, P_BE
, 0, b32
+109, "CRC-7" }, /* 25 */
356 { 6UL, b32
+ 20, b32
+117, P_BE
, 0, b32
+111, "CRC-6/CDMA2000-B" }, /* 26 */
357 { 8UL, b32
+ 21, b32
+119, P_BE
, 0, b32
+ 59, "CRC-8/I-CODE" }, /* 27 */
358 { 8UL, b32
+ 21, b32
+123, P_LE
, 0, b32
+ 71, "CRC-8/EBU" }, /* 28 */
359 {32UL, b32
+ 23, b32
+128, P_LE
, b32
+128, b32
+106, "CRC-32C" }, /* 29 */
360 {14UL, b32
+ 25, 0, P_LE
, 0, b32
+ 26, "CRC-14/DARC" }, /* 30 */
361 { 5UL, b32
+ 32, b32
+116, P_LE
, b32
+116, b32
+ 94, "CRC-5/USB" }, /* 31 */
362 { 4UL, b32
+ 34, 0, P_LE
, 0, b32
+ 55, "CRC-4/ITU" }, /* 32 */
363 { 8UL, b32
+ 36, 0, P_LE
, 0, b32
+ 78, "CRC-8/MAXIM" }, /* 33 */
364 { 8UL, b32
+ 41, 0, P_LE
, 0, b32
+ 17, "CRC-8/DARC" }, /* 34 */
365 {16UL, b32
+ 42, 0, P_BE
, b32
+126, b32
+ 92, "CRC-16/EN-13757" }, /* 35 */
366 {16UL, b32
+ 42, 0, P_LE
, b32
+126, b32
+110, "CRC-16/DNP" }, /* 36 */
367 {64UL, b64
, 0, P_BE
, 0, b64a
, "CRC-64" }, /* 37 */
368 {64UL, b64
, b64b
, P_BE
, b64b
, b64c
, "CRC-64/WE" }, /* 38 */
369 {64UL, b64
, b64b
, P_LE
, b64b
, b64d
, "CRC-64/XZ" }, /* 39 */
370 { 5UL, b32
+ 44, b32
+ 44, P_BE
, 0, b32
+ 0, "CRC-5/EPC" }, /* 40 */
371 {24UL, b32
+ 49, b32
+ 82, P_BE
, 0, b32
+ 24, "CRC-24/FLEXRAY-B" }, /* 41 */
372 {24UL, b32
+ 49, b32
+121, P_BE
, 0, b32
+ 58, "CRC-24/FLEXRAY-A" }, /* 42 */
373 { 3UL, b32
+ 50, b32
+105, P_LE
, 0, b32
+ 91, "CRC-3/ROHC" }, /* 43 */
374 { 6UL, b32
+ 52, 0, P_LE
, 0, b32
+ 72, "CRC-6/DARC" }, /* 44 */
375 {11UL, b32
+ 56, b32
+ 6, P_BE
, 0, b32
+ 84, "CRC-11" }, /* 45 */
376 {16UL, b32
+ 60, 0, P_BE
, 0, b32
+122, "CRC-16/BUYPASS" }, /* 46 */
377 {16UL, b32
+ 60, 0, P_LE
, 0, b32
+ 87, "ARC" }, /* 47 */
378 {16UL, b32
+ 60, 0, P_LE
, b32
+126, b32
+ 43, "CRC-16/MAXIM" }, /* 48 */
379 {16UL, b32
+ 60, b32
+ 61, P_BE
, 0, b32
+ 76, "CRC-16/DDS-110" }, /* 49 */
380 {16UL, b32
+ 60, b32
+126, P_LE
, 0, b32
+ 46, "MODBUS" }, /* 50 */
381 {16UL, b32
+ 60, b32
+126, P_LE
, b32
+126, b32
+ 85, "CRC-16/USB" }, /* 51 */
382 {12UL, b32
+ 62, 0, P_BE
, 0, b32
+114, "CRC-12/DECT" }, /* 52 */
383 {12UL, b32
+ 62, 0, P_BELE
, 0, b32
+104, "CRC-12/3GPP" }, /* 53 */
384 {32UL, b32
+ 63, 0, P_BE
, 0, b32
+ 35, "CRC-32Q" }, /* 54 */
385 {24UL, b32
+ 64, b32
+ 86, P_BE
, 0, b32
+ 28, "CRC-24" }, /* 55 */
386 {15UL, b32
+ 67, 0, P_BE
, 0, b32
+ 12, "CRC-15" }, /* 56 */
387 {16UL, b32
+ 68, 0, P_BE
, 0, b32
+ 99, "CRC-16/T10-DIF" }, /* 57 */
388 {10UL, b32
+ 69, 0, P_BE
, 0, b32
+ 53, "CRC-10" }, /* 58 */
389 { 8UL, b32
+ 73, 0, P_LE
, 0, b32
+ 29, "CRC-8/WCDMA" }, /* 59 */
390 { 8UL, b32
+ 73, b32
+123, P_BE
, 0, b32
+103, "CRC-8/CDMA2000" }, /* 60 */
391 { 6UL, b32
+ 74, b32
+117, P_BE
, 0, b32
+ 38, "CRC-6/CDMA2000-A" }, /* 61 */
392 { 7UL, b32
+ 75, b32
+120, P_LE
, 0, b32
+ 79, "CRC-7/ROHC" }, /* 62 */
393 {16UL, b32
+ 77, 0, P_BE
, 0, b32
+ 14, "CRC-16/TELEDISK" }, /* 63 */
394 { 5UL, b32
+ 80, 0, P_LE
, 0, b32
+ 40, "CRC-5/ITU" }, /* 64 */
395 {32UL, b32
+ 81, b32
+128, P_LE
, b32
+128, b32
+ 65, "CRC-32D" }, /* 65 */
396 {16UL, b32
+ 95, b32
+126, P_BE
, 0, b32
+ 47, "CRC-16/CDMA2000" }, /* 66 */
397 {15UL, b32
+ 98, 0, P_BE
, b32
+ 3, b32
+ 45, "CRC-15/MPT1327" }, /* 67 */
398 { 8UL, b32
+101, 0, P_BE
, 0, b32
+ 88, "CRC-8/DVB-S2" }, /* 68 */
399 {13UL, b32
+108, 0, P_BE
, 0, b32
+ 31, "CRC-13/BBC" }, /* 69 */
400 {12UL, b32
+112, b32
+125, P_BE
, 0, b32
+100, "CRC-12/CDMA2000" }, /* 70 */
401 {10UL, b32
+115, b32
+124, P_BE
, 0, b32
+ 69, "CRC-10/CDMA2000" }, /* 71 */
405 /* List of names with pointers to models, pre-sorted for use with bsearch() */
406 static const struct malias aliases
[] = {
407 {"ARC", models
+47, 1}, /* 0 */
408 {"B-CRC-32", models
+ 4, 0}, /* 1 */
409 {"CKSUM", models
+ 2, 0}, /* 2 */
410 {"CRC-10", models
+58, 1}, /* 3 */
411 {"CRC-10/CDMA2000", models
+71, 1}, /* 4 */
412 {"CRC-11", models
+45, 1}, /* 5 */
413 {"CRC-12/3GPP", models
+53, 1}, /* 6 */
414 {"CRC-12/CDMA2000", models
+70, 1}, /* 7 */
415 {"CRC-12/DECT", models
+52, 1}, /* 8 */
416 {"CRC-13/BBC", models
+69, 1}, /* 9 */
417 {"CRC-14/DARC", models
+30, 1}, /* 10 */
418 {"CRC-15", models
+56, 1}, /* 11 */
419 {"CRC-15/MPT1327", models
+67, 1}, /* 12 */
420 {"CRC-16", models
+47, 0}, /* 13 */
421 {"CRC-16/ACORN", models
+15, 0}, /* 14 */
422 {"CRC-16/ARC", models
+47, 0}, /* 15 */
423 {"CRC-16/AUG-CCITT", models
+17, 1}, /* 16 */
424 {"CRC-16/BUYPASS", models
+46, 1}, /* 17 */
425 {"CRC-16/CCITT", models
+16, 0}, /* 18 */
426 {"CRC-16/CCITT-FALSE", models
+21, 1}, /* 19 */
427 {"CRC-16/CCITT-TRUE", models
+16, 0}, /* 20 */
428 {"CRC-16/CDMA2000", models
+66, 1}, /* 21 */
429 {"CRC-16/DARC", models
+22, 0}, /* 22 */
430 {"CRC-16/DDS-110", models
+49, 1}, /* 23 */
431 {"CRC-16/DECT-R", models
+ 8, 1}, /* 24 */
432 {"CRC-16/DECT-X", models
+ 7, 1}, /* 25 */
433 {"CRC-16/DNP", models
+36, 1}, /* 26 */
434 {"CRC-16/EN-13757", models
+35, 1}, /* 27 */
435 {"CRC-16/EPC", models
+22, 0}, /* 28 */
436 {"CRC-16/GENIBUS", models
+22, 1}, /* 29 */
437 {"CRC-16/I-CODE", models
+22, 0}, /* 30 */
438 {"CRC-16/IBM-SDLC", models
+24, 0}, /* 31 */
439 {"CRC-16/ISO-HDLC", models
+24, 0}, /* 32 */
440 {"CRC-16/LHA", models
+47, 0}, /* 33 */
441 {"CRC-16/MAXIM", models
+48, 1}, /* 34 */
442 {"CRC-16/MCRF4XX", models
+23, 1}, /* 35 */
443 {"CRC-16/RIELLO", models
+19, 1}, /* 36 */
444 {"CRC-16/SPI-FUJITSU", models
+17, 0}, /* 37 */
445 {"CRC-16/T10-DIF", models
+57, 1}, /* 38 */
446 {"CRC-16/TELEDISK", models
+63, 1}, /* 39 */
447 {"CRC-16/TMS37157", models
+18, 1}, /* 40 */
448 {"CRC-16/USB", models
+51, 1}, /* 41 */
449 {"CRC-16/VERIFONE", models
+46, 0}, /* 42 */
450 {"CRC-24", models
+55, 1}, /* 43 */
451 {"CRC-24/FLEXRAY-A", models
+42, 1}, /* 44 */
452 {"CRC-24/FLEXRAY-B", models
+41, 1}, /* 45 */
453 {"CRC-24/OPENPGP", models
+55, 0}, /* 46 */
454 {"CRC-3/ROHC", models
+43, 1}, /* 47 */
455 {"CRC-31/PHILIPS", models
+12, 1}, /* 48 */
456 {"CRC-32", models
+ 6, 1}, /* 49 */
457 {"CRC-32/AAL5", models
+ 4, 0}, /* 50 */
458 {"CRC-32/ADCCP", models
+ 6, 0}, /* 51 */
459 {"CRC-32/BZIP2", models
+ 4, 1}, /* 52 */
460 {"CRC-32/CASTAGNOLI", models
+29, 0}, /* 53 */
461 {"CRC-32/DECT-B", models
+ 4, 0}, /* 54 */
462 {"CRC-32/ISCSI", models
+29, 0}, /* 55 */
463 {"CRC-32/MPEG-2", models
+ 3, 1}, /* 56 */
464 {"CRC-32/POSIX", models
+ 2, 1}, /* 57 */
465 {"CRC-32C", models
+29, 1}, /* 58 */
466 {"CRC-32D", models
+65, 1}, /* 59 */
467 {"CRC-32Q", models
+54, 1}, /* 60 */
468 {"CRC-4/ITU", models
+32, 1}, /* 61 */
469 {"CRC-40/GSM", models
+ 1, 1}, /* 62 */
470 {"CRC-5/EPC", models
+40, 1}, /* 63 */
471 {"CRC-5/ITU", models
+64, 1}, /* 64 */
472 {"CRC-5/USB", models
+31, 1}, /* 65 */
473 {"CRC-6/CDMA2000-A", models
+61, 1}, /* 66 */
474 {"CRC-6/CDMA2000-B", models
+26, 1}, /* 67 */
475 {"CRC-6/DARC", models
+44, 1}, /* 68 */
476 {"CRC-6/ITU", models
+13, 1}, /* 69 */
477 {"CRC-64", models
+37, 1}, /* 70 */
478 {"CRC-64/WE", models
+38, 1}, /* 71 */
479 {"CRC-64/XZ", models
+39, 1}, /* 72 */
480 {"CRC-7", models
+25, 1}, /* 73 */
481 {"CRC-7/ROHC", models
+62, 1}, /* 74 */
482 {"CRC-8", models
+ 9, 1}, /* 75 */
483 {"CRC-8/AES", models
+28, 0}, /* 76 */
484 {"CRC-8/CDMA2000", models
+60, 1}, /* 77 */
485 {"CRC-8/DARC", models
+34, 1}, /* 78 */
486 {"CRC-8/DVB-S2", models
+68, 1}, /* 79 */
487 {"CRC-8/EBU", models
+28, 1}, /* 80 */
488 {"CRC-8/I-CODE", models
+27, 1}, /* 81 */
489 {"CRC-8/ITU", models
+10, 1}, /* 82 */
490 {"CRC-8/MAXIM", models
+33, 1}, /* 83 */
491 {"CRC-8/ROHC", models
+11, 1}, /* 84 */
492 {"CRC-8/WCDMA", models
+59, 1}, /* 85 */
493 {"CRC-82/DARC", models
+14, 1}, /* 86 */
494 {"CRC-A", models
+20, 1}, /* 87 */
495 {"CRC-B", models
+24, 0}, /* 88 */
496 {"CRC-CCITT", models
+16, 0}, /* 89 */
497 {"CRC-IBM", models
+47, 0}, /* 90 */
498 {"DOW-CRC", models
+33, 0}, /* 91 */
499 {"JAMCRC", models
+ 5, 1}, /* 92 */
500 {"KERMIT", models
+16, 1}, /* 93 */
501 {"MODBUS", models
+50, 1}, /* 94 */
502 {"PKZIP", models
+ 6, 0}, /* 95 */
503 {"R-CRC-16", models
+ 8, 0}, /* 96 */
504 {"X-25", models
+24, 1}, /* 97 */
505 {"X-CRC-12", models
+52, 0}, /* 98 */
506 {"X-CRC-16", models
+ 7, 0}, /* 99 */
507 {"XFER", models
+ 0, 1}, /* 100 */
508 {"XMODEM", models
+15, 1}, /* 101 */
509 {"ZMODEM", models
+15, 0}, /* 102 */
510 {NULL
, NULL
, 0}, /* terminating entry */
512 # define NALIASES 103
514 # endif /* BMP_BIT */
517 static const struct mpreset models
[] = {
518 { 0UL, 0, 0, P_BE
, 0, 0, NULL
}, /* terminating entry */
522 static const struct malias aliases
[] = {
523 {NULL
, NULL
, 0}, /* terminating entry */
529 static const poly_t pzero
= PZERO
;
531 static int acmp(const struct malias
*, const struct malias
*);
532 static void munpack(model_t
*, const struct mpreset
*);
534 /* copy a parameter of a preset into a model */
535 #define MUNPACK(parm) \
536 praloc(&dest->parm, (src->b##parm ? src->width : 0UL)); \
537 for(iter=0UL, idx=0UL; iter < dest->parm.length; iter += BMP_BIT, ++idx)\
538 dest->parm.bitmap[idx] = src->b##parm[idx];
543 mcpy(model_t
*dest
, const model_t
*src
) {
544 /* Copies the parameters of src to dest.
545 * dest must be an initialised model.
547 if(!dest
|| !src
) return;
548 pcpy(&dest
->spoly
, src
->spoly
);
549 pcpy(&dest
->init
, src
->init
);
550 pcpy(&dest
->xorout
, src
->xorout
);
551 pcpy(&dest
->check
, src
->check
);
552 dest
->flags
= src
->flags
;
553 /* link to the name as it is static */
554 dest
->name
= src
->name
;
558 mfree(model_t
*model
) {
559 /* Frees the parameters of model. */
561 pfree(&model
->spoly
);
563 pfree(&model
->xorout
);
564 pfree(&model
->check
);
565 /* not name as it is static */
566 /* not model either, it might point to an array! */
570 mcmp(const model_t
*a
, const model_t
*b
) {
571 /* Compares a and b for identical effect, i.e. disregarding
572 * trailing zeroes in parameter polys.
573 * Intended for bsearch() to find a matching model in models[].
576 if(!a
|| !b
) return(!b
- !a
);
577 if((result
= psncmp(&a
->spoly
, &b
->spoly
))) return(result
);
578 if((result
= psncmp(&a
->init
, &b
->init
))) return(result
);
579 if((a
->flags
& P_REFIN
) && (~b
->flags
& P_REFIN
)) return(1);
580 if((~a
->flags
& P_REFIN
) && (b
->flags
& P_REFIN
)) return(-1);
581 if((a
->flags
& P_REFOUT
) && (~b
->flags
& P_REFOUT
)) return(1);
582 if((~a
->flags
& P_REFOUT
) && (b
->flags
& P_REFOUT
)) return(-1);
583 return(psncmp(&a
->xorout
, &b
->xorout
));
587 mbynam(model_t
*dest
, const char *key
) {
588 /* Sets parameters in dest according to the model named by key.
590 struct malias akey
= {NULL
, NULL
, 0}, *aptr
;
595 if(!(ukey
= malloc((size_t) 1 + strlen(key
))))
596 uerror("cannot allocate memory for comparison string");
597 akey
.name
= uptr
= ukey
;
599 *uptr
++ = toupper((unsigned char)*key
);
602 aptr
= bsearch(&akey
, aliases
, NALIASES
, sizeof(struct malias
), (int (*)(const void *, const void *)) &acmp
);
607 munpack(dest
, aptr
->model
);
612 mbynum(model_t
*dest
, int num
) {
613 /* Sets parameters in dest according to the model indexed by num. */
616 munpack(dest
, models
+num
);
621 /* Returns the number of preset models. */
627 /* Returns a malloc()-ed string of the names of all preset
628 * models, separated by newlines and terminated by NULL.
629 * Aliases are not listed.
633 const struct malias
*aptr
= aliases
;
637 size
+= strlen(aptr
->name
) + 1;
640 if(!size
) return(NULL
);
641 if((string
= malloc(size
))) {
646 strcpy(sptr
, aptr
->name
);
647 sptr
+= strlen(aptr
->name
);
654 uerror("cannot allocate memory for list of models");
660 mtostr(const model_t
*model
) {
661 /* Returns a malloc()-ed string containing a Williams model
662 * record representing the input model.
663 * mcanon() should be called on the argument before printing.
666 char *polystr
, *initstr
, *xorotstr
, *checkstr
, strbuf
[512], *string
= NULL
;
668 if(!model
) return(NULL
);
669 polystr
= ptostr(model
->spoly
, P_RTJUST
, 4);
670 initstr
= ptostr(model
->init
, P_RTJUST
, 4);
671 xorotstr
= ptostr(model
->xorout
, P_RTJUST
, 4);
672 checkstr
= ptostr(model
->check
, P_RTJUST
, 4);
674 sprintf(strbuf
, "%lu", plen(model
->spoly
));
677 + (model
->name
&& *model
->name
? 2 + strlen(model
->name
) : 6)
679 + (polystr
&& *polystr
? strlen(polystr
) : 6)
680 + (initstr
&& *initstr
? strlen(initstr
) : 6)
681 + (model
->flags
& P_REFIN
? 4 : 5)
682 + (model
->flags
& P_REFOUT
? 4 : 5)
683 + (xorotstr
&& *xorotstr
? strlen(xorotstr
) : 6)
684 + (checkstr
&& *checkstr
? strlen(checkstr
) : 6);
685 if((string
= malloc(size
))) {
686 sprintf(strbuf
, "\"%s\"", model
->name
);
697 polystr
&& *polystr
? polystr
: "(none)",
698 initstr
&& *initstr
? initstr
: "(none)",
699 (model
->flags
& P_REFIN
) ? "true" : "false",
700 (model
->flags
& P_REFOUT
) ? "true" : "false",
701 xorotstr
&& *xorotstr
? xorotstr
: "(none)",
702 checkstr
&& *checkstr
? checkstr
: "(none)",
703 (model
->name
&& *model
->name
) ? strbuf
: "(none)");
710 uerror("cannot allocate memory for model description");
715 mmatch(model_t
*model
, int flags
) {
716 /* searches models[] for a model matching the argument, and links a name if found
717 * if flags & M_OVERWR, copies the found model onto the argument. */
721 mptr
= bsearch(model
, models
, NPRESETS
, sizeof(model_t
), (int (*)(const void *, const void *)) &mcmp
);
723 model
->name
= mptr
->name
;
730 mcanon(model_t
*model
) {
731 /* canonicalise a model */
736 /* extending on the right here. This preserves the functionality
737 * of a presumed working model.
739 psnorm(&model
->spoly
);
740 dlen
= plen(model
->spoly
);
741 praloc(&model
->init
, dlen
);
742 praloc(&model
->xorout
, dlen
);
744 if(!plen(model
->check
))
749 mcheck(model_t
*model
) {
750 /* calculate a check for the model */
751 poly_t checkstr
, check
;
753 /* generate the check string with the correct bit order */
754 checkstr
= strtop("313233343536373839", model
->flags
, 8);
755 check
= pcrc(checkstr
, model
->spoly
, model
->init
, pzero
, model
->flags
);
756 if(model
->flags
& P_REFOUT
)
758 psum(&check
, model
->xorout
, 0UL);
759 model
->check
= check
;
764 mrev(model_t
*model
) {
765 /* reverse the model to calculate reversed CRCs */
766 /* Here we invert RefIn and RefOut so that the user need only
767 * reverse the order of characters in the arguments, not the
768 * characters themselves. If RefOut=True, the mirror image of
769 * Init seen through RefOut becomes XorOut, and as RefOut
770 * becomes false, the XorOut value moved to Init stays upright.
771 * If RefOut=False, Init transfers to XorOut without reflection
772 * but the new Init must be reflected to present the same image,
773 * as RefOut becomes true.
778 if(model
->flags
& P_REFOUT
)
781 prev(&model
->xorout
);
783 /* exchange init and xorout */
785 model
->init
= model
->xorout
;
786 model
->xorout
= temp
;
788 /* invert refin and refout */
789 model
->flags
^= P_REFIN
| P_REFOUT
;
795 mnovel(model_t
*model
) {
796 /* remove name and check string from modified model */
798 pfree(&model
->check
);
802 acmp(const struct malias
*a
, const struct malias
*b
) {
803 /* compares two aliases, for use in bsearch */
804 if(!a
|| !b
) return(!b
- !a
);
805 if(!a
->name
|| !b
->name
) return(!b
->name
- !a
->name
);
806 return(strcmp(a
->name
, b
->name
));
810 munpack(model_t
*dest
, const struct mpreset
*src
) {
811 /* Copies the parameters of src to dest.
812 * dest must be an initialised model.
814 unsigned long iter
, idx
;
815 if(!dest
|| !src
) return;
820 dest
->flags
= src
->flags
;
821 /* link to the name as it is static */
822 dest
->name
= src
->name
;