File: | libs/libsndfile/src/common.c |
Location: | line 954, column 37 |
Description: | The left operand of '<<' is a garbage value |
1 | /* | |||
2 | ** Copyright (C) 1999-2013 Erik de Castro Lopo <erikd@mega-nerd.com> | |||
3 | ** | |||
4 | ** This program is free software; you can redistribute it and/or modify | |||
5 | ** it under the terms of the GNU Lesser General Public License as published by | |||
6 | ** the Free Software Foundation; either version 2.1 of the License, or | |||
7 | ** (at your option) any later version. | |||
8 | ** | |||
9 | ** This program is distributed in the hope that it will be useful, | |||
10 | ** but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
11 | ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
12 | ** GNU Lesser General Public License for more details. | |||
13 | ** | |||
14 | ** You should have received a copy of the GNU Lesser General Public License | |||
15 | ** along with this program; if not, write to the Free Software | |||
16 | ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
17 | */ | |||
18 | ||||
19 | #include <config.h> | |||
20 | ||||
21 | #include <stdarg.h> | |||
22 | #include <string.h> | |||
23 | ||||
24 | #ifndef _MSC_VER | |||
25 | #include <unistd.h> | |||
26 | #endif | |||
27 | #include <ctype.h> | |||
28 | #include <math.h> | |||
29 | #include <time.h> | |||
30 | #ifndef _MSC_VER | |||
31 | #include <sys/time.h> | |||
32 | #endif | |||
33 | ||||
34 | #include "sndfile.h" | |||
35 | #include "sfendian.h" | |||
36 | #include "common.h" | |||
37 | ||||
38 | /*----------------------------------------------------------------------------------------------- | |||
39 | ** psf_log_printf allows libsndfile internal functions to print to an internal parselog which | |||
40 | ** can later be displayed. | |||
41 | ** The format specifiers are as for printf but without the field width and other modifiers. | |||
42 | ** Printing is performed to the parselog char array of the SF_PRIVATE struct. | |||
43 | ** Printing is done in such a way as to guarantee that the log never overflows the end of the | |||
44 | ** parselog array. | |||
45 | */ | |||
46 | ||||
47 | static inline void | |||
48 | log_putchar (SF_PRIVATE *psf, char ch) | |||
49 | { if (psf->parselog.indx < SIGNED_SIZEOF (psf->parselog.buf)((int) sizeof (psf->parselog.buf)) - 1) | |||
50 | { psf->parselog.buf [psf->parselog.indx++] = ch ; | |||
51 | psf->parselog.buf [psf->parselog.indx] = 0 ; | |||
52 | } ; | |||
53 | return ; | |||
54 | } /* log_putchar */ | |||
55 | ||||
56 | void | |||
57 | psf_log_printf (SF_PRIVATE *psf, const char *format, ...) | |||
58 | { va_list ap ; | |||
59 | unsigned int u ; | |||
60 | int d, tens, shift, width, width_specifier, left_align ; | |||
61 | char c, *strptr, istr [5], lead_char, sign_char ; | |||
62 | ||||
63 | va_start (ap, format)__builtin_va_start(ap, format) ; | |||
64 | ||||
65 | while ((c = *format++)) | |||
66 | { if (c != '%') | |||
67 | { log_putchar (psf, c) ; | |||
68 | continue ; | |||
69 | } ; | |||
70 | ||||
71 | if (format [0] == '%') /* Handle %% */ | |||
72 | { log_putchar (psf, '%') ; | |||
73 | format ++ ; | |||
74 | continue ; | |||
75 | } ; | |||
76 | ||||
77 | sign_char = 0 ; | |||
78 | left_align = SF_FALSE ; | |||
79 | while (1) | |||
80 | { switch (format [0]) | |||
81 | { case ' ' : | |||
82 | case '+' : | |||
83 | sign_char = format [0] ; | |||
84 | format ++ ; | |||
85 | continue ; | |||
86 | ||||
87 | case '-' : | |||
88 | left_align = SF_TRUE ; | |||
89 | format ++ ; | |||
90 | continue ; | |||
91 | ||||
92 | default : break ; | |||
93 | } ; | |||
94 | ||||
95 | break ; | |||
96 | } ; | |||
97 | ||||
98 | if (format [0] == 0) | |||
99 | break ; | |||
100 | ||||
101 | lead_char = ' ' ; | |||
102 | if (format [0] == '0') | |||
103 | lead_char = '0' ; | |||
104 | ||||
105 | width_specifier = 0 ; | |||
106 | while ((c = *format++) && isdigit (c)((*__ctype_b_loc ())[(int) ((c))] & (unsigned short int) _ISdigit )) | |||
107 | width_specifier = width_specifier * 10 + (c - '0') ; | |||
108 | ||||
109 | switch (c) | |||
110 | { case 0 : /* NULL character. */ | |||
111 | va_end (ap)__builtin_va_end(ap) ; | |||
112 | return ; | |||
113 | ||||
114 | case 's': /* string */ | |||
115 | strptr = va_arg (ap, char *)__builtin_va_arg(ap, char *) ; | |||
116 | if (strptr == NULL((void*)0)) | |||
117 | break ; | |||
118 | width_specifier -= strlen (strptr) ; | |||
119 | if (left_align == SF_FALSE) | |||
120 | while (width_specifier -- > 0) | |||
121 | log_putchar (psf, ' ') ; | |||
122 | while (*strptr) | |||
123 | log_putchar (psf, *strptr++) ; | |||
124 | while (width_specifier -- > 0) | |||
125 | log_putchar (psf, ' ') ; | |||
126 | break ; | |||
127 | ||||
128 | case 'd': /* int */ | |||
129 | d = va_arg (ap, int)__builtin_va_arg(ap, int) ; | |||
130 | ||||
131 | if (d < 0) | |||
132 | { d = -d ; | |||
133 | sign_char = '-' ; | |||
134 | if (lead_char != '0' && left_align == SF_FALSE) | |||
135 | width_specifier -- ; | |||
136 | } ; | |||
137 | ||||
138 | tens = 1 ; | |||
139 | width = 1 ; | |||
140 | while (d / tens >= 10) | |||
141 | { tens *= 10 ; | |||
142 | width ++ ; | |||
143 | } ; | |||
144 | ||||
145 | width_specifier -= width ; | |||
146 | ||||
147 | if (sign_char == ' ') | |||
148 | { log_putchar (psf, ' ') ; | |||
149 | width_specifier -- ; | |||
150 | } ; | |||
151 | ||||
152 | if (left_align == SF_FALSE && lead_char != '0') | |||
153 | { if (sign_char == '+') | |||
154 | width_specifier -- ; | |||
155 | ||||
156 | while (width_specifier -- > 0) | |||
157 | log_putchar (psf, lead_char) ; | |||
158 | } ; | |||
159 | ||||
160 | if (sign_char == '+' || sign_char == '-') | |||
161 | { log_putchar (psf, sign_char) ; | |||
162 | width_specifier -- ; | |||
163 | } ; | |||
164 | ||||
165 | if (left_align == SF_FALSE) | |||
166 | while (width_specifier -- > 0) | |||
167 | log_putchar (psf, lead_char) ; | |||
168 | ||||
169 | while (tens > 0) | |||
170 | { log_putchar (psf, '0' + d / tens) ; | |||
171 | d %= tens ; | |||
172 | tens /= 10 ; | |||
173 | } ; | |||
174 | ||||
175 | while (width_specifier -- > 0) | |||
176 | log_putchar (psf, lead_char) ; | |||
177 | break ; | |||
178 | ||||
179 | case 'D': /* sf_count_t */ | |||
180 | { sf_count_t D, Tens ; | |||
181 | ||||
182 | D = va_arg (ap, sf_count_t)__builtin_va_arg(ap, sf_count_t) ; | |||
183 | ||||
184 | if (D == 0) | |||
185 | { while (-- width_specifier > 0) | |||
186 | log_putchar (psf, lead_char) ; | |||
187 | log_putchar (psf, '0') ; | |||
188 | break ; | |||
189 | } | |||
190 | if (D < 0) | |||
191 | { log_putchar (psf, '-') ; | |||
192 | D = -D ; | |||
193 | } ; | |||
194 | Tens = 1 ; | |||
195 | width = 1 ; | |||
196 | while (D / Tens >= 10) | |||
197 | { Tens *= 10 ; | |||
198 | width ++ ; | |||
199 | } ; | |||
200 | ||||
201 | while (width_specifier > width) | |||
202 | { log_putchar (psf, lead_char) ; | |||
203 | width_specifier-- ; | |||
204 | } ; | |||
205 | ||||
206 | while (Tens > 0) | |||
207 | { log_putchar (psf, '0' + D / Tens) ; | |||
208 | D %= Tens ; | |||
209 | Tens /= 10 ; | |||
210 | } ; | |||
211 | } ; | |||
212 | break ; | |||
213 | ||||
214 | case 'u': /* unsigned int */ | |||
215 | u = va_arg (ap, unsigned int)__builtin_va_arg(ap, unsigned int) ; | |||
216 | ||||
217 | tens = 1 ; | |||
218 | width = 1 ; | |||
219 | while (u / tens >= 10) | |||
220 | { tens *= 10 ; | |||
221 | width ++ ; | |||
222 | } ; | |||
223 | ||||
224 | width_specifier -= width ; | |||
225 | ||||
226 | if (sign_char == ' ') | |||
227 | { log_putchar (psf, ' ') ; | |||
228 | width_specifier -- ; | |||
229 | } ; | |||
230 | ||||
231 | if (left_align == SF_FALSE && lead_char != '0') | |||
232 | { if (sign_char == '+') | |||
233 | width_specifier -- ; | |||
234 | ||||
235 | while (width_specifier -- > 0) | |||
236 | log_putchar (psf, lead_char) ; | |||
237 | } ; | |||
238 | ||||
239 | if (sign_char == '+' || sign_char == '-') | |||
240 | { log_putchar (psf, sign_char) ; | |||
241 | width_specifier -- ; | |||
242 | } ; | |||
243 | ||||
244 | if (left_align == SF_FALSE) | |||
245 | while (width_specifier -- > 0) | |||
246 | log_putchar (psf, lead_char) ; | |||
247 | ||||
248 | while (tens > 0) | |||
249 | { log_putchar (psf, '0' + u / tens) ; | |||
250 | u %= tens ; | |||
251 | tens /= 10 ; | |||
252 | } ; | |||
253 | ||||
254 | while (width_specifier -- > 0) | |||
255 | log_putchar (psf, lead_char) ; | |||
256 | break ; | |||
257 | ||||
258 | case 'c': /* char */ | |||
259 | c = va_arg (ap, int)__builtin_va_arg(ap, int) & 0xFF ; | |||
260 | log_putchar (psf, c) ; | |||
261 | break ; | |||
262 | ||||
263 | case 'x': /* hex */ | |||
264 | case 'X': /* hex */ | |||
265 | d = va_arg (ap, int)__builtin_va_arg(ap, int) ; | |||
266 | ||||
267 | if (d == 0) | |||
268 | { while (--width_specifier > 0) | |||
269 | log_putchar (psf, lead_char) ; | |||
270 | log_putchar (psf, '0') ; | |||
271 | break ; | |||
272 | } ; | |||
273 | shift = 28 ; | |||
274 | width = (width_specifier < 8) ? 8 : width_specifier ; | |||
275 | while (! ((0xF << shift) & d)) | |||
276 | { shift -= 4 ; | |||
277 | width -- ; | |||
278 | } ; | |||
279 | ||||
280 | while (width > 0 && width_specifier > width) | |||
281 | { log_putchar (psf, lead_char) ; | |||
282 | width_specifier-- ; | |||
283 | } ; | |||
284 | ||||
285 | while (shift >= 0) | |||
286 | { c = (d >> shift) & 0xF ; | |||
287 | log_putchar (psf, (c > 9) ? c + 'A' - 10 : c + '0') ; | |||
288 | shift -= 4 ; | |||
289 | } ; | |||
290 | break ; | |||
291 | ||||
292 | case 'M': /* int2str */ | |||
293 | d = va_arg (ap, int)__builtin_va_arg(ap, int) ; | |||
294 | if (CPU_IS_LITTLE_ENDIAN1) | |||
295 | { istr [0] = d & 0xFF ; | |||
296 | istr [1] = (d >> 8) & 0xFF ; | |||
297 | istr [2] = (d >> 16) & 0xFF ; | |||
298 | istr [3] = (d >> 24) & 0xFF ; | |||
299 | } | |||
300 | else | |||
301 | { istr [3] = d & 0xFF ; | |||
302 | istr [2] = (d >> 8) & 0xFF ; | |||
303 | istr [1] = (d >> 16) & 0xFF ; | |||
304 | istr [0] = (d >> 24) & 0xFF ; | |||
305 | } ; | |||
306 | istr [4] = 0 ; | |||
307 | strptr = istr ; | |||
308 | while (*strptr) | |||
309 | { c = *strptr++ ; | |||
310 | log_putchar (psf, c) ; | |||
311 | } ; | |||
312 | break ; | |||
313 | ||||
314 | default : | |||
315 | log_putchar (psf, '*') ; | |||
316 | log_putchar (psf, c) ; | |||
317 | log_putchar (psf, '*') ; | |||
318 | break ; | |||
319 | } /* switch */ | |||
320 | } /* while */ | |||
321 | ||||
322 | va_end (ap)__builtin_va_end(ap) ; | |||
323 | return ; | |||
324 | } /* psf_log_printf */ | |||
325 | ||||
326 | /*----------------------------------------------------------------------------------------------- | |||
327 | ** ASCII header printf functions. | |||
328 | ** Some formats (ie NIST) use ascii text in their headers. | |||
329 | ** Format specifiers are the same as the standard printf specifiers (uses vsnprintf). | |||
330 | ** If this generates a compile error on any system, the author should be notified | |||
331 | ** so an alternative vsnprintf can be provided. | |||
332 | */ | |||
333 | ||||
334 | void | |||
335 | psf_asciiheader_printf (SF_PRIVATE *psf, const char *format, ...) | |||
336 | { va_list argptr ; | |||
337 | int maxlen ; | |||
338 | char *start ; | |||
339 | ||||
340 | maxlen = strlen ((char*) psf->header) ; | |||
341 | start = ((char*) psf->header) + maxlen ; | |||
342 | maxlen = sizeof (psf->header) - maxlen ; | |||
343 | ||||
344 | va_start (argptr, format)__builtin_va_start(argptr, format) ; | |||
345 | vsnprintf (start, maxlen, format, argptr) ; | |||
346 | va_end (argptr)__builtin_va_end(argptr) ; | |||
347 | ||||
348 | /* Make sure the string is properly terminated. */ | |||
349 | start [maxlen - 1] = 0 ; | |||
350 | ||||
351 | psf->headindex = strlen ((char*) psf->header) ; | |||
352 | ||||
353 | return ; | |||
354 | } /* psf_asciiheader_printf */ | |||
355 | ||||
356 | /*----------------------------------------------------------------------------------------------- | |||
357 | ** Binary header writing functions. Returns number of bytes written. | |||
358 | ** | |||
359 | ** Format specifiers for psf_binheader_writef are as follows | |||
360 | ** m - marker - four bytes - no endian manipulation | |||
361 | ** | |||
362 | ** e - all following numerical values will be little endian | |||
363 | ** E - all following numerical values will be big endian | |||
364 | ** | |||
365 | ** t - all following O types will be truncated to 4 bytes | |||
366 | ** T - switch off truncation of all following O types | |||
367 | ** | |||
368 | ** 1 - single byte value | |||
369 | ** 2 - two byte value | |||
370 | ** 3 - three byte value | |||
371 | ** 4 - four byte value | |||
372 | ** 8 - eight byte value (sometimes written as 4 bytes) | |||
373 | ** | |||
374 | ** s - string preceded by a four byte length | |||
375 | ** S - string including null terminator | |||
376 | ** f - floating point data | |||
377 | ** d - double precision floating point data | |||
378 | ** h - 16 binary bytes value | |||
379 | ** | |||
380 | ** b - binary data (see below) | |||
381 | ** z - zero bytes (ses below) | |||
382 | ** j - jump forwards or backwards | |||
383 | ** | |||
384 | ** To write a word followed by an int (both little endian) use: | |||
385 | ** psf_binheader_writef ("e24", wordval, longval) ; | |||
386 | ** | |||
387 | ** To write binary data use: | |||
388 | ** psf_binheader_writef ("b", &bindata, sizeof (bindata)) ; | |||
389 | ** | |||
390 | ** To write N zero bytes use: | |||
391 | ** NOTE: due to platform issues (ie x86-64) you should cast the | |||
392 | ** argument to size_t or ensure the variable type is size_t. | |||
393 | ** psf_binheader_writef ("z", N) ; | |||
394 | */ | |||
395 | ||||
396 | /* These macros may seem a bit messy but do prevent problems with processors which | |||
397 | ** seg. fault when asked to write an int or short to a non-int/short aligned address. | |||
398 | */ | |||
399 | ||||
400 | static inline void | |||
401 | header_put_byte (SF_PRIVATE *psf, char x) | |||
402 | { if (psf->headindex < SIGNED_SIZEOF (psf->header)((int) sizeof (psf->header)) - 1) | |||
403 | psf->header [psf->headindex++] = x ; | |||
404 | } /* header_put_byte */ | |||
405 | ||||
406 | #if (CPU_IS_BIG_ENDIAN0 == 1) | |||
407 | static inline void | |||
408 | header_put_marker (SF_PRIVATE *psf, int x) | |||
409 | { if (psf->headindex < SIGNED_SIZEOF (psf->header)((int) sizeof (psf->header)) - 4) | |||
410 | { psf->header [psf->headindex++] = (x >> 24) ; | |||
411 | psf->header [psf->headindex++] = (x >> 16) ; | |||
412 | psf->header [psf->headindex++] = (x >> 8) ; | |||
413 | psf->header [psf->headindex++] = x ; | |||
414 | } ; | |||
415 | } /* header_put_marker */ | |||
416 | ||||
417 | #elif (CPU_IS_LITTLE_ENDIAN1 == 1) | |||
418 | static inline void | |||
419 | header_put_marker (SF_PRIVATE *psf, int x) | |||
420 | { if (psf->headindex < SIGNED_SIZEOF (psf->header)((int) sizeof (psf->header)) - 4) | |||
421 | { psf->header [psf->headindex++] = x ; | |||
422 | psf->header [psf->headindex++] = (x >> 8) ; | |||
423 | psf->header [psf->headindex++] = (x >> 16) ; | |||
424 | psf->header [psf->headindex++] = (x >> 24) ; | |||
425 | } ; | |||
426 | } /* header_put_marker */ | |||
427 | ||||
428 | #else | |||
429 | # error "Cannot determine endian-ness of processor." | |||
430 | #endif | |||
431 | ||||
432 | ||||
433 | static inline void | |||
434 | header_put_be_short (SF_PRIVATE *psf, int x) | |||
435 | { if (psf->headindex < SIGNED_SIZEOF (psf->header)((int) sizeof (psf->header)) - 2) | |||
436 | { psf->header [psf->headindex++] = (x >> 8) ; | |||
437 | psf->header [psf->headindex++] = x ; | |||
438 | } ; | |||
439 | } /* header_put_be_short */ | |||
440 | ||||
441 | static inline void | |||
442 | header_put_le_short (SF_PRIVATE *psf, int x) | |||
443 | { if (psf->headindex < SIGNED_SIZEOF (psf->header)((int) sizeof (psf->header)) - 2) | |||
444 | { psf->header [psf->headindex++] = x ; | |||
445 | psf->header [psf->headindex++] = (x >> 8) ; | |||
446 | } ; | |||
447 | } /* header_put_le_short */ | |||
448 | ||||
449 | static inline void | |||
450 | header_put_be_3byte (SF_PRIVATE *psf, int x) | |||
451 | { if (psf->headindex < SIGNED_SIZEOF (psf->header)((int) sizeof (psf->header)) - 3) | |||
452 | { psf->header [psf->headindex++] = (x >> 16) ; | |||
453 | psf->header [psf->headindex++] = (x >> 8) ; | |||
454 | psf->header [psf->headindex++] = x ; | |||
455 | } ; | |||
456 | } /* header_put_be_3byte */ | |||
457 | ||||
458 | static inline void | |||
459 | header_put_le_3byte (SF_PRIVATE *psf, int x) | |||
460 | { if (psf->headindex < SIGNED_SIZEOF (psf->header)((int) sizeof (psf->header)) - 3) | |||
461 | { psf->header [psf->headindex++] = x ; | |||
462 | psf->header [psf->headindex++] = (x >> 8) ; | |||
463 | psf->header [psf->headindex++] = (x >> 16) ; | |||
464 | } ; | |||
465 | } /* header_put_le_3byte */ | |||
466 | ||||
467 | static inline void | |||
468 | header_put_be_int (SF_PRIVATE *psf, int x) | |||
469 | { if (psf->headindex < SIGNED_SIZEOF (psf->header)((int) sizeof (psf->header)) - 4) | |||
470 | { psf->header [psf->headindex++] = (x >> 24) ; | |||
471 | psf->header [psf->headindex++] = (x >> 16) ; | |||
472 | psf->header [psf->headindex++] = (x >> 8) ; | |||
473 | psf->header [psf->headindex++] = x ; | |||
474 | } ; | |||
475 | } /* header_put_be_int */ | |||
476 | ||||
477 | static inline void | |||
478 | header_put_le_int (SF_PRIVATE *psf, int x) | |||
479 | { if (psf->headindex < SIGNED_SIZEOF (psf->header)((int) sizeof (psf->header)) - 4) | |||
480 | { psf->header [psf->headindex++] = x ; | |||
481 | psf->header [psf->headindex++] = (x >> 8) ; | |||
482 | psf->header [psf->headindex++] = (x >> 16) ; | |||
483 | psf->header [psf->headindex++] = (x >> 24) ; | |||
484 | } ; | |||
485 | } /* header_put_le_int */ | |||
486 | ||||
487 | #if (SIZEOF_SF_COUNT_T8 == 4) | |||
488 | ||||
489 | static inline void | |||
490 | header_put_be_8byte (SF_PRIVATE *psf, sf_count_t x) | |||
491 | { if (psf->headindex < SIGNED_SIZEOF (psf->header)((int) sizeof (psf->header)) - 8) | |||
492 | { psf->header [psf->headindex++] = 0 ; | |||
493 | psf->header [psf->headindex++] = 0 ; | |||
494 | psf->header [psf->headindex++] = 0 ; | |||
495 | psf->header [psf->headindex++] = 0 ; | |||
496 | psf->header [psf->headindex++] = (x >> 24) ; | |||
497 | psf->header [psf->headindex++] = (x >> 16) ; | |||
498 | psf->header [psf->headindex++] = (x >> 8) ; | |||
499 | psf->header [psf->headindex++] = x ; | |||
500 | } ; | |||
501 | } /* header_put_be_8byte */ | |||
502 | ||||
503 | static inline void | |||
504 | header_put_le_8byte (SF_PRIVATE *psf, sf_count_t x) | |||
505 | { if (psf->headindex < SIGNED_SIZEOF (psf->header)((int) sizeof (psf->header)) - 8) | |||
506 | { psf->header [psf->headindex++] = x ; | |||
507 | psf->header [psf->headindex++] = (x >> 8) ; | |||
508 | psf->header [psf->headindex++] = (x >> 16) ; | |||
509 | psf->header [psf->headindex++] = (x >> 24) ; | |||
510 | psf->header [psf->headindex++] = 0 ; | |||
511 | psf->header [psf->headindex++] = 0 ; | |||
512 | psf->header [psf->headindex++] = 0 ; | |||
513 | psf->header [psf->headindex++] = 0 ; | |||
514 | } ; | |||
515 | } /* header_put_le_8byte */ | |||
516 | ||||
517 | #elif (SIZEOF_SF_COUNT_T8 == 8) | |||
518 | ||||
519 | static inline void | |||
520 | header_put_be_8byte (SF_PRIVATE *psf, sf_count_t x) | |||
521 | { if (psf->headindex < SIGNED_SIZEOF (psf->header)((int) sizeof (psf->header)) - 8) | |||
522 | { psf->header [psf->headindex++] = (x >> 56) ; | |||
523 | psf->header [psf->headindex++] = (x >> 48) ; | |||
524 | psf->header [psf->headindex++] = (x >> 40) ; | |||
525 | psf->header [psf->headindex++] = (x >> 32) ; | |||
526 | psf->header [psf->headindex++] = (x >> 24) ; | |||
527 | psf->header [psf->headindex++] = (x >> 16) ; | |||
528 | psf->header [psf->headindex++] = (x >> 8) ; | |||
529 | psf->header [psf->headindex++] = x ; | |||
530 | } ; | |||
531 | } /* header_put_be_8byte */ | |||
532 | ||||
533 | static inline void | |||
534 | header_put_le_8byte (SF_PRIVATE *psf, sf_count_t x) | |||
535 | { if (psf->headindex < SIGNED_SIZEOF (psf->header)((int) sizeof (psf->header)) - 8) | |||
536 | { psf->header [psf->headindex++] = x ; | |||
537 | psf->header [psf->headindex++] = (x >> 8) ; | |||
538 | psf->header [psf->headindex++] = (x >> 16) ; | |||
539 | psf->header [psf->headindex++] = (x >> 24) ; | |||
540 | psf->header [psf->headindex++] = (x >> 32) ; | |||
541 | psf->header [psf->headindex++] = (x >> 40) ; | |||
542 | psf->header [psf->headindex++] = (x >> 48) ; | |||
543 | psf->header [psf->headindex++] = (x >> 56) ; | |||
544 | } ; | |||
545 | } /* header_put_le_8byte */ | |||
546 | ||||
547 | #else | |||
548 | #error "SIZEOF_SF_COUNT_T is not defined." | |||
549 | #endif | |||
550 | ||||
551 | int | |||
552 | psf_binheader_writef (SF_PRIVATE *psf, const char *format, ...) | |||
553 | { va_list argptr ; | |||
554 | sf_count_t countdata ; | |||
555 | unsigned long longdata ; | |||
556 | unsigned int data ; | |||
557 | float floatdata ; | |||
558 | double doubledata ; | |||
559 | void *bindata ; | |||
560 | size_t size ; | |||
561 | char c, *strptr ; | |||
562 | int count = 0, trunc_8to4 ; | |||
563 | ||||
564 | trunc_8to4 = SF_FALSE ; | |||
565 | ||||
566 | va_start (argptr, format)__builtin_va_start(argptr, format) ; | |||
567 | ||||
568 | while ((c = *format++)) | |||
569 | { switch (c) | |||
570 | { case ' ' : /* Do nothing. Just used to space out format string. */ | |||
571 | break ; | |||
572 | ||||
573 | case 'e' : /* All conversions are now from LE to host. */ | |||
574 | psf->rwf_endian = SF_ENDIAN_LITTLE ; | |||
575 | break ; | |||
576 | ||||
577 | case 'E' : /* All conversions are now from BE to host. */ | |||
578 | psf->rwf_endian = SF_ENDIAN_BIG ; | |||
579 | break ; | |||
580 | ||||
581 | case 't' : /* All 8 byte values now get written as 4 bytes. */ | |||
582 | trunc_8to4 = SF_TRUE ; | |||
583 | break ; | |||
584 | ||||
585 | case 'T' : /* All 8 byte values now get written as 8 bytes. */ | |||
586 | trunc_8to4 = SF_FALSE ; | |||
587 | break ; | |||
588 | ||||
589 | case 'm' : | |||
590 | data = va_arg (argptr, unsigned int)__builtin_va_arg(argptr, unsigned int) ; | |||
591 | header_put_marker (psf, data) ; | |||
592 | count += 4 ; | |||
593 | break ; | |||
594 | ||||
595 | case '1' : | |||
596 | data = va_arg (argptr, unsigned int)__builtin_va_arg(argptr, unsigned int) ; | |||
597 | header_put_byte (psf, data) ; | |||
598 | count += 1 ; | |||
599 | break ; | |||
600 | ||||
601 | case '2' : | |||
602 | data = va_arg (argptr, unsigned int)__builtin_va_arg(argptr, unsigned int) ; | |||
603 | if (psf->rwf_endian == SF_ENDIAN_BIG) | |||
604 | { header_put_be_short (psf, data) ; | |||
605 | } | |||
606 | else | |||
607 | { header_put_le_short (psf, data) ; | |||
608 | } ; | |||
609 | count += 2 ; | |||
610 | break ; | |||
611 | ||||
612 | case '3' : /* tribyte */ | |||
613 | data = va_arg (argptr, unsigned int)__builtin_va_arg(argptr, unsigned int) ; | |||
614 | if (psf->rwf_endian == SF_ENDIAN_BIG) | |||
615 | { header_put_be_3byte (psf, data) ; | |||
616 | } | |||
617 | else | |||
618 | { header_put_le_3byte (psf, data) ; | |||
619 | } ; | |||
620 | count += 3 ; | |||
621 | break ; | |||
622 | ||||
623 | case '4' : | |||
624 | data = va_arg (argptr, unsigned int)__builtin_va_arg(argptr, unsigned int) ; | |||
625 | if (psf->rwf_endian == SF_ENDIAN_BIG) | |||
626 | { header_put_be_int (psf, data) ; | |||
627 | } | |||
628 | else | |||
629 | { header_put_le_int (psf, data) ; | |||
630 | } ; | |||
631 | count += 4 ; | |||
632 | break ; | |||
633 | ||||
634 | case '8' : | |||
635 | countdata = va_arg (argptr, sf_count_t)__builtin_va_arg(argptr, sf_count_t) ; | |||
636 | if (psf->rwf_endian == SF_ENDIAN_BIG && trunc_8to4 == SF_FALSE) | |||
637 | { header_put_be_8byte (psf, countdata) ; | |||
638 | count += 8 ; | |||
639 | } | |||
640 | else if (psf->rwf_endian == SF_ENDIAN_LITTLE && trunc_8to4 == SF_FALSE) | |||
641 | { header_put_le_8byte (psf, countdata) ; | |||
642 | count += 8 ; | |||
643 | } | |||
644 | else if (psf->rwf_endian == SF_ENDIAN_BIG && trunc_8to4 == SF_TRUE) | |||
645 | { longdata = countdata & 0xFFFFFFFF ; | |||
646 | header_put_be_int (psf, longdata) ; | |||
647 | count += 4 ; | |||
648 | } | |||
649 | else if (psf->rwf_endian == SF_ENDIAN_LITTLE && trunc_8to4 == SF_TRUE) | |||
650 | { longdata = countdata & 0xFFFFFFFF ; | |||
651 | header_put_le_int (psf, longdata) ; | |||
652 | count += 4 ; | |||
653 | } | |||
654 | break ; | |||
655 | ||||
656 | case 'f' : | |||
657 | /* Floats are passed as doubles. Is this always true? */ | |||
658 | floatdata = (float) va_arg (argptr, double)__builtin_va_arg(argptr, double) ; | |||
659 | if (psf->rwf_endian == SF_ENDIAN_BIG) | |||
660 | float32_be_write (floatdata, psf->header + psf->headindex) ; | |||
661 | else | |||
662 | float32_le_write (floatdata, psf->header + psf->headindex) ; | |||
663 | psf->headindex += 4 ; | |||
664 | count += 4 ; | |||
665 | break ; | |||
666 | ||||
667 | case 'd' : | |||
668 | doubledata = va_arg (argptr, double)__builtin_va_arg(argptr, double) ; | |||
669 | if (psf->rwf_endian == SF_ENDIAN_BIG) | |||
670 | double64_be_write (doubledata, psf->header + psf->headindex) ; | |||
671 | else | |||
672 | double64_le_write (doubledata, psf->header + psf->headindex) ; | |||
673 | psf->headindex += 8 ; | |||
674 | count += 8 ; | |||
675 | break ; | |||
676 | ||||
677 | case 's' : | |||
678 | /* Write a C string (guaranteed to have a zero terminator). */ | |||
679 | strptr = va_arg (argptr, char *)__builtin_va_arg(argptr, char *) ; | |||
680 | size = strlen (strptr) + 1 ; | |||
681 | size += (size & 1) ; | |||
682 | if (psf->rwf_endian == SF_ENDIAN_BIG) | |||
683 | header_put_be_int (psf, size) ; | |||
684 | else | |||
685 | header_put_le_int (psf, size) ; | |||
686 | memcpy (&(psf->header [psf->headindex]), strptr, size) ; | |||
687 | psf->headindex += size ; | |||
688 | psf->header [psf->headindex - 1] = 0 ; | |||
689 | count += 4 + size ; | |||
690 | break ; | |||
691 | ||||
692 | case 'S' : | |||
693 | /* | |||
694 | ** Write an AIFF style string (no zero terminator but possibly | |||
695 | ** an extra pad byte if the string length is odd). | |||
696 | */ | |||
697 | strptr = va_arg (argptr, char *)__builtin_va_arg(argptr, char *) ; | |||
698 | size = strlen (strptr) ; | |||
699 | if (psf->rwf_endian == SF_ENDIAN_BIG) | |||
700 | header_put_be_int (psf, size) ; | |||
701 | else | |||
702 | header_put_le_int (psf, size) ; | |||
703 | memcpy (&(psf->header [psf->headindex]), strptr, size + 1) ; | |||
704 | size += (size & 1) ; | |||
705 | psf->headindex += size ; | |||
706 | psf->header [psf->headindex] = 0 ; | |||
707 | count += 4 + size ; | |||
708 | break ; | |||
709 | ||||
710 | case 'b' : | |||
711 | bindata = va_arg (argptr, void *)__builtin_va_arg(argptr, void *) ; | |||
712 | size = va_arg (argptr, size_t)__builtin_va_arg(argptr, size_t) ; | |||
713 | memcpy (&(psf->header [psf->headindex]), bindata, size) ; | |||
714 | psf->headindex += size ; | |||
715 | count += size ; | |||
716 | break ; | |||
717 | ||||
718 | case 'z' : | |||
719 | size = va_arg (argptr, size_t)__builtin_va_arg(argptr, size_t) ; | |||
720 | count += size ; | |||
721 | while (size) | |||
722 | { psf->header [psf->headindex] = 0 ; | |||
723 | psf->headindex ++ ; | |||
724 | size -- ; | |||
725 | } ; | |||
726 | break ; | |||
727 | ||||
728 | case 'h' : | |||
729 | bindata = va_arg (argptr, void *)__builtin_va_arg(argptr, void *) ; | |||
730 | memcpy (&(psf->header [psf->headindex]), bindata, 16) ; | |||
731 | psf->headindex += 16 ; | |||
732 | count += 16 ; | |||
733 | break ; | |||
734 | ||||
735 | case 'j' : | |||
736 | size = va_arg (argptr, size_t)__builtin_va_arg(argptr, size_t) ; | |||
737 | psf->headindex += size ; | |||
738 | count = size ; | |||
739 | break ; | |||
740 | ||||
741 | default : | |||
742 | psf_log_printf (psf, "*** Invalid format specifier `%c'\n", c) ; | |||
743 | psf->error = SFE_INTERNAL ; | |||
744 | break ; | |||
745 | } ; | |||
746 | } ; | |||
747 | ||||
748 | va_end (argptr)__builtin_va_end(argptr) ; | |||
749 | return count ; | |||
750 | } /* psf_binheader_writef */ | |||
751 | ||||
752 | /*----------------------------------------------------------------------------------------------- | |||
753 | ** Binary header reading functions. Returns number of bytes read. | |||
754 | ** | |||
755 | ** Format specifiers are the same as for header write function above with the following | |||
756 | ** additions: | |||
757 | ** | |||
758 | ** p - jump a given number of position from start of file. | |||
759 | ** | |||
760 | ** If format is NULL, psf_binheader_readf returns the current offset. | |||
761 | */ | |||
762 | ||||
763 | #if (CPU_IS_BIG_ENDIAN0 == 1) | |||
764 | #define GET_MARKER(ptr)( ((ptr) [0]) | ((ptr) [1] << 8) | ((ptr) [2] << 16 ) | ((ptr) [3] << 24)) ( ((ptr) [0] << 24) | ((ptr) [1] << 16) | \ | |||
765 | ((ptr) [2] << 8) | ((ptr) [3])) | |||
766 | ||||
767 | #elif (CPU_IS_LITTLE_ENDIAN1 == 1) | |||
768 | #define GET_MARKER(ptr)( ((ptr) [0]) | ((ptr) [1] << 8) | ((ptr) [2] << 16 ) | ((ptr) [3] << 24)) ( ((ptr) [0]) | ((ptr) [1] << 8) | \ | |||
769 | ((ptr) [2] << 16) | ((ptr) [3] << 24)) | |||
770 | ||||
771 | #else | |||
772 | # error "Cannot determine endian-ness of processor." | |||
773 | #endif | |||
774 | ||||
775 | #define GET_LE_SHORT(ptr)(((ptr) [1] << 8) | ((ptr) [0])) (((ptr) [1] << 8) | ((ptr) [0])) | |||
776 | #define GET_BE_SHORT(ptr)(((ptr) [0] << 8) | ((ptr) [1])) (((ptr) [0] << 8) | ((ptr) [1])) | |||
777 | ||||
778 | #define GET_LE_3BYTE(ptr)( ((ptr) [2] << 16) | ((ptr) [1] << 8) | ((ptr) [ 0])) ( ((ptr) [2] << 16) | ((ptr) [1] << 8) | ((ptr) [0])) | |||
779 | #define GET_BE_3BYTE(ptr)( ((ptr) [0] << 16) | ((ptr) [1] << 8) | ((ptr) [ 2])) ( ((ptr) [0] << 16) | ((ptr) [1] << 8) | ((ptr) [2])) | |||
780 | ||||
781 | #define GET_LE_INT(ptr)( ((ptr) [3] << 24) | ((ptr) [2] << 16) | ((ptr) [ 1] << 8) | ((ptr) [0])) ( ((ptr) [3] << 24) | ((ptr) [2] << 16) | \ | |||
782 | ((ptr) [1] << 8) | ((ptr) [0])) | |||
783 | ||||
784 | #define GET_BE_INT(ptr)( ((ptr) [0] << 24) | ((ptr) [1] << 16) | ((ptr) [ 2] << 8) | ((ptr) [3])) ( ((ptr) [0] << 24) | ((ptr) [1] << 16) | \ | |||
785 | ((ptr) [2] << 8) | ((ptr) [3])) | |||
786 | ||||
787 | #define GET_LE_8BYTE(ptr)( (((sf_count_t) (ptr) [7]) << 56) | (((sf_count_t) (ptr ) [6]) << 48) | (((sf_count_t) (ptr) [5]) << 40) | (((sf_count_t) (ptr) [4]) << 32) | (((sf_count_t) (ptr ) [3]) << 24) | (((sf_count_t) (ptr) [2]) << 16) | (((sf_count_t) (ptr) [1]) << 8) | ((ptr) [0])) ( (((sf_count_t) (ptr) [7]) << 56) | (((sf_count_t) (ptr) [6]) << 48) | \ | |||
788 | (((sf_count_t) (ptr) [5]) << 40) | (((sf_count_t) (ptr) [4]) << 32) | \ | |||
789 | (((sf_count_t) (ptr) [3]) << 24) | (((sf_count_t) (ptr) [2]) << 16) | \ | |||
790 | (((sf_count_t) (ptr) [1]) << 8) | ((ptr) [0])) | |||
791 | ||||
792 | #define GET_BE_8BYTE(ptr)( (((sf_count_t) (ptr) [0]) << 56) | (((sf_count_t) (ptr ) [1]) << 48) | (((sf_count_t) (ptr) [2]) << 40) | (((sf_count_t) (ptr) [3]) << 32) | (((sf_count_t) (ptr ) [4]) << 24) | (((sf_count_t) (ptr) [5]) << 16) | (((sf_count_t) (ptr) [6]) << 8) | ((ptr) [7])) ( (((sf_count_t) (ptr) [0]) << 56) | (((sf_count_t) (ptr) [1]) << 48) | \ | |||
793 | (((sf_count_t) (ptr) [2]) << 40) | (((sf_count_t) (ptr) [3]) << 32) | \ | |||
794 | (((sf_count_t) (ptr) [4]) << 24) | (((sf_count_t) (ptr) [5]) << 16) | \ | |||
795 | (((sf_count_t) (ptr) [6]) << 8) | ((ptr) [7])) | |||
796 | ||||
797 | ||||
798 | ||||
799 | static int | |||
800 | header_read (SF_PRIVATE *psf, void *ptr, int bytes) | |||
801 | { int count = 0 ; | |||
802 | ||||
803 | if (psf->headindex >= SIGNED_SIZEOF (psf->header)((int) sizeof (psf->header))) | |||
804 | { memset (ptr, 0, SIGNED_SIZEOF (psf->header)((int) sizeof (psf->header)) - psf->headindex) ; | |||
805 | ||||
806 | /* This is the best that we can do. */ | |||
807 | psf_fseek (psf, bytes, SEEK_CUR1) ; | |||
808 | return bytes ; | |||
809 | } ; | |||
810 | ||||
811 | if (psf->headindex + bytes > SIGNED_SIZEOF (psf->header)((int) sizeof (psf->header))) | |||
812 | { int most ; | |||
813 | ||||
814 | most = SIGNED_SIZEOF (psf->header)((int) sizeof (psf->header)) - psf->headindex ; | |||
815 | psf_fread (psf->header + psf->headend, 1, most, psf) ; | |||
816 | memset ((char *) ptr + most, 0, bytes - most) ; | |||
817 | ||||
818 | psf_fseek (psf, bytes - most, SEEK_CUR1) ; | |||
819 | return bytes ; | |||
820 | } ; | |||
821 | ||||
822 | if (psf->headindex + bytes > psf->headend) | |||
823 | { count = psf_fread (psf->header + psf->headend, 1, bytes - (psf->headend - psf->headindex), psf) ; | |||
824 | if (count != bytes - (int) (psf->headend - psf->headindex)) | |||
825 | { psf_log_printf (psf, "Error : psf_fread returned short count.\n") ; | |||
826 | return 0 ; | |||
827 | } ; | |||
828 | psf->headend += count ; | |||
829 | } ; | |||
830 | ||||
831 | memcpy (ptr, psf->header + psf->headindex, bytes) ; | |||
832 | psf->headindex += bytes ; | |||
833 | ||||
834 | return bytes ; | |||
835 | } /* header_read */ | |||
836 | ||||
837 | static void | |||
838 | header_seek (SF_PRIVATE *psf, sf_count_t position, int whence) | |||
839 | { | |||
840 | ||||
841 | switch (whence) | |||
842 | { case SEEK_SET0 : | |||
843 | if (position > SIGNED_SIZEOF (psf->header)((int) sizeof (psf->header))) | |||
844 | { /* Too much header to cache so just seek instead. */ | |||
845 | psf_fseek (psf, position, whence) ; | |||
846 | return ; | |||
847 | } ; | |||
848 | if (position > psf->headend) | |||
849 | psf->headend += psf_fread (psf->header + psf->headend, 1, position - psf->headend, psf) ; | |||
850 | psf->headindex = position ; | |||
851 | break ; | |||
852 | ||||
853 | case SEEK_CUR1 : | |||
854 | if (psf->headindex + position < 0) | |||
855 | break ; | |||
856 | ||||
857 | if (psf->headindex >= SIGNED_SIZEOF (psf->header)((int) sizeof (psf->header))) | |||
858 | { psf_fseek (psf, position, whence) ; | |||
859 | return ; | |||
860 | } ; | |||
861 | ||||
862 | if (psf->headindex + position <= psf->headend) | |||
863 | { psf->headindex += position ; | |||
864 | break ; | |||
865 | } ; | |||
866 | ||||
867 | if (psf->headindex + position > SIGNED_SIZEOF (psf->header)((int) sizeof (psf->header))) | |||
868 | { /* Need to jump this without caching it. */ | |||
869 | psf->headindex = psf->headend ; | |||
870 | psf_fseek (psf, position, SEEK_CUR1) ; | |||
871 | break ; | |||
872 | } ; | |||
873 | ||||
874 | psf->headend += psf_fread (psf->header + psf->headend, 1, position - (psf->headend - psf->headindex), psf) ; | |||
875 | psf->headindex = psf->headend ; | |||
876 | break ; | |||
877 | ||||
878 | case SEEK_END2 : | |||
879 | default : | |||
880 | psf_log_printf (psf, "Bad whence param in header_seek().\n") ; | |||
881 | break ; | |||
882 | } ; | |||
883 | ||||
884 | return ; | |||
885 | } /* header_seek */ | |||
886 | ||||
887 | static int | |||
888 | header_gets (SF_PRIVATE *psf, char *ptr, int bufsize) | |||
889 | { | |||
890 | int k ; | |||
891 | ||||
892 | for (k = 0 ; k < bufsize - 1 ; k++) | |||
893 | { if (psf->headindex < psf->headend) | |||
894 | { ptr [k] = psf->header [psf->headindex] ; | |||
895 | psf->headindex ++ ; | |||
896 | } | |||
897 | else | |||
898 | { psf->headend += psf_fread (psf->header + psf->headend, 1, 1, psf) ; | |||
899 | ptr [k] = psf->header [psf->headindex] ; | |||
900 | psf->headindex = psf->headend ; | |||
901 | } ; | |||
902 | ||||
903 | if (ptr [k] == '\n') | |||
904 | break ; | |||
905 | } ; | |||
906 | ||||
907 | ptr [k] = 0 ; | |||
908 | ||||
909 | return k ; | |||
910 | } /* header_gets */ | |||
911 | ||||
912 | int | |||
913 | psf_binheader_readf (SF_PRIVATE *psf, char const *format, ...) | |||
914 | { va_list argptr ; | |||
915 | sf_count_t *countptr, countdata ; | |||
916 | unsigned char *ucptr, sixteen_bytes [16] ; | |||
917 | unsigned int *intptr, intdata ; | |||
918 | unsigned short *shortptr ; | |||
919 | char *charptr ; | |||
920 | float *floatptr ; | |||
921 | double *doubleptr ; | |||
922 | char c ; | |||
923 | int byte_count = 0, count ; | |||
924 | ||||
925 | if (! format) | |||
| ||||
926 | return psf_ftell (psf) ; | |||
927 | ||||
928 | va_start (argptr, format)__builtin_va_start(argptr, format) ; | |||
929 | ||||
930 | while ((c = *format++)) | |||
931 | { switch (c) | |||
932 | { case 'e' : /* All conversions are now from LE to host. */ | |||
933 | psf->rwf_endian = SF_ENDIAN_LITTLE ; | |||
934 | break ; | |||
935 | ||||
936 | case 'E' : /* All conversions are now from BE to host. */ | |||
937 | psf->rwf_endian = SF_ENDIAN_BIG ; | |||
938 | break ; | |||
939 | ||||
940 | case 'm' : | |||
941 | intptr = va_arg (argptr, unsigned int*)__builtin_va_arg(argptr, unsigned int*) ; | |||
942 | ucptr = (unsigned char*) intptr ; | |||
943 | byte_count += header_read (psf, ucptr, sizeof (int)) ; | |||
944 | *intptr = GET_MARKER (ucptr)( ((ucptr) [0]) | ((ucptr) [1] << 8) | ((ucptr) [2] << 16) | ((ucptr) [3] << 24)) ; | |||
945 | break ; | |||
946 | ||||
947 | case 'h' : | |||
948 | intptr = va_arg (argptr, unsigned int*)__builtin_va_arg(argptr, unsigned int*) ; | |||
949 | ucptr = (unsigned char*) intptr ; | |||
950 | byte_count += header_read (psf, sixteen_bytes, sizeof (sixteen_bytes)) ; | |||
951 | { int k ; | |||
952 | intdata = 0 ; | |||
953 | for (k = 0 ; k < 16 ; k++) | |||
954 | intdata ^= sixteen_bytes [k] << k ; | |||
| ||||
955 | } | |||
956 | *intptr = intdata ; | |||
957 | break ; | |||
958 | ||||
959 | case '1' : | |||
960 | charptr = va_arg (argptr, char*)__builtin_va_arg(argptr, char*) ; | |||
961 | *charptr = 0 ; | |||
962 | byte_count += header_read (psf, charptr, sizeof (char)) ; | |||
963 | break ; | |||
964 | ||||
965 | case '2' : | |||
966 | shortptr = va_arg (argptr, unsigned short*)__builtin_va_arg(argptr, unsigned short*) ; | |||
967 | *shortptr = 0 ; | |||
968 | ucptr = (unsigned char*) shortptr ; | |||
969 | byte_count += header_read (psf, ucptr, sizeof (short)) ; | |||
970 | if (psf->rwf_endian == SF_ENDIAN_BIG) | |||
971 | *shortptr = GET_BE_SHORT (ucptr)(((ucptr) [0] << 8) | ((ucptr) [1])) ; | |||
972 | else | |||
973 | *shortptr = GET_LE_SHORT (ucptr)(((ucptr) [1] << 8) | ((ucptr) [0])) ; | |||
974 | break ; | |||
975 | ||||
976 | case '3' : | |||
977 | intptr = va_arg (argptr, unsigned int*)__builtin_va_arg(argptr, unsigned int*) ; | |||
978 | *intptr = 0 ; | |||
979 | byte_count += header_read (psf, sixteen_bytes, 3) ; | |||
980 | if (psf->rwf_endian == SF_ENDIAN_BIG) | |||
981 | *intptr = GET_BE_3BYTE (sixteen_bytes)( ((sixteen_bytes) [0] << 16) | ((sixteen_bytes) [1] << 8) | ((sixteen_bytes) [2])) ; | |||
982 | else | |||
983 | *intptr = GET_LE_3BYTE (sixteen_bytes)( ((sixteen_bytes) [2] << 16) | ((sixteen_bytes) [1] << 8) | ((sixteen_bytes) [0])) ; | |||
984 | break ; | |||
985 | ||||
986 | case '4' : | |||
987 | intptr = va_arg (argptr, unsigned int*)__builtin_va_arg(argptr, unsigned int*) ; | |||
988 | *intptr = 0 ; | |||
989 | ucptr = (unsigned char*) intptr ; | |||
990 | byte_count += header_read (psf, ucptr, sizeof (int)) ; | |||
991 | if (psf->rwf_endian == SF_ENDIAN_BIG) | |||
992 | *intptr = GET_BE_INT (ucptr)( ((ucptr) [0] << 24) | ((ucptr) [1] << 16) | ((ucptr ) [2] << 8) | ((ucptr) [3])) ; | |||
993 | else | |||
994 | *intptr = GET_LE_INT (ucptr)( ((ucptr) [3] << 24) | ((ucptr) [2] << 16) | ((ucptr ) [1] << 8) | ((ucptr) [0])) ; | |||
995 | break ; | |||
996 | ||||
997 | case '8' : | |||
998 | countptr = va_arg (argptr, sf_count_t *)__builtin_va_arg(argptr, sf_count_t *) ; | |||
999 | *countptr = 0 ; | |||
1000 | byte_count += header_read (psf, sixteen_bytes, 8) ; | |||
1001 | if (psf->rwf_endian == SF_ENDIAN_BIG) | |||
1002 | countdata = GET_BE_8BYTE (sixteen_bytes)( (((sf_count_t) (sixteen_bytes) [0]) << 56) | (((sf_count_t ) (sixteen_bytes) [1]) << 48) | (((sf_count_t) (sixteen_bytes ) [2]) << 40) | (((sf_count_t) (sixteen_bytes) [3]) << 32) | (((sf_count_t) (sixteen_bytes) [4]) << 24) | ((( sf_count_t) (sixteen_bytes) [5]) << 16) | (((sf_count_t ) (sixteen_bytes) [6]) << 8) | ((sixteen_bytes) [7])) ; | |||
1003 | else | |||
1004 | countdata = GET_LE_8BYTE (sixteen_bytes)( (((sf_count_t) (sixteen_bytes) [7]) << 56) | (((sf_count_t ) (sixteen_bytes) [6]) << 48) | (((sf_count_t) (sixteen_bytes ) [5]) << 40) | (((sf_count_t) (sixteen_bytes) [4]) << 32) | (((sf_count_t) (sixteen_bytes) [3]) << 24) | ((( sf_count_t) (sixteen_bytes) [2]) << 16) | (((sf_count_t ) (sixteen_bytes) [1]) << 8) | ((sixteen_bytes) [0])) ; | |||
1005 | *countptr = countdata ; | |||
1006 | break ; | |||
1007 | ||||
1008 | case 'f' : /* Float conversion */ | |||
1009 | floatptr = va_arg (argptr, float *)__builtin_va_arg(argptr, float *) ; | |||
1010 | *floatptr = 0.0 ; | |||
1011 | byte_count += header_read (psf, floatptr, sizeof (float)) ; | |||
1012 | if (psf->rwf_endian == SF_ENDIAN_BIG) | |||
1013 | *floatptr = float32_be_read ((unsigned char*) floatptr) ; | |||
1014 | else | |||
1015 | *floatptr = float32_le_read ((unsigned char*) floatptr) ; | |||
1016 | break ; | |||
1017 | ||||
1018 | case 'd' : /* double conversion */ | |||
1019 | doubleptr = va_arg (argptr, double *)__builtin_va_arg(argptr, double *) ; | |||
1020 | *doubleptr = 0.0 ; | |||
1021 | byte_count += header_read (psf, doubleptr, sizeof (double)) ; | |||
1022 | if (psf->rwf_endian == SF_ENDIAN_BIG) | |||
1023 | *doubleptr = double64_be_read ((unsigned char*) doubleptr) ; | |||
1024 | else | |||
1025 | *doubleptr = double64_le_read ((unsigned char*) doubleptr) ; | |||
1026 | break ; | |||
1027 | ||||
1028 | case 's' : | |||
1029 | psf_log_printf (psf, "Format conversion 's' not implemented yet.\n") ; | |||
1030 | /* | |||
1031 | strptr = va_arg (argptr, char *) ; | |||
1032 | size = strlen (strptr) + 1 ; | |||
1033 | size += (size & 1) ; | |||
1034 | longdata = H2LE_32 (size) ; | |||
1035 | get_int (psf, longdata) ; | |||
1036 | memcpy (&(psf->header [psf->headindex]), strptr, size) ; | |||
1037 | psf->headindex += size ; | |||
1038 | */ | |||
1039 | break ; | |||
1040 | ||||
1041 | case 'b' : | |||
1042 | charptr = va_arg (argptr, char*)__builtin_va_arg(argptr, char*) ; | |||
1043 | count = va_arg (argptr, size_t)__builtin_va_arg(argptr, size_t) ; | |||
1044 | if (count > 0) | |||
1045 | byte_count += header_read (psf, charptr, count) ; | |||
1046 | break ; | |||
1047 | ||||
1048 | case 'G' : | |||
1049 | charptr = va_arg (argptr, char*)__builtin_va_arg(argptr, char*) ; | |||
1050 | count = va_arg (argptr, size_t)__builtin_va_arg(argptr, size_t) ; | |||
1051 | if (count > 0) | |||
1052 | byte_count += header_gets (psf, charptr, count) ; | |||
1053 | break ; | |||
1054 | ||||
1055 | case 'z' : | |||
1056 | psf_log_printf (psf, "Format conversion 'z' not implemented yet.\n") ; | |||
1057 | /* | |||
1058 | size = va_arg (argptr, size_t) ; | |||
1059 | while (size) | |||
1060 | { psf->header [psf->headindex] = 0 ; | |||
1061 | psf->headindex ++ ; | |||
1062 | size -- ; | |||
1063 | } ; | |||
1064 | */ | |||
1065 | break ; | |||
1066 | ||||
1067 | case 'p' : | |||
1068 | /* Get the seek position first. */ | |||
1069 | count = va_arg (argptr, size_t)__builtin_va_arg(argptr, size_t) ; | |||
1070 | header_seek (psf, count, SEEK_SET0) ; | |||
1071 | byte_count = count ; | |||
1072 | break ; | |||
1073 | ||||
1074 | case 'j' : | |||
1075 | /* Get the seek position first. */ | |||
1076 | count = va_arg (argptr, size_t)__builtin_va_arg(argptr, size_t) ; | |||
1077 | header_seek (psf, count, SEEK_CUR1) ; | |||
1078 | byte_count += count ; | |||
1079 | break ; | |||
1080 | ||||
1081 | default : | |||
1082 | psf_log_printf (psf, "*** Invalid format specifier `%c'\n", c) ; | |||
1083 | psf->error = SFE_INTERNAL ; | |||
1084 | break ; | |||
1085 | } ; | |||
1086 | } ; | |||
1087 | ||||
1088 | va_end (argptr)__builtin_va_end(argptr) ; | |||
1089 | ||||
1090 | return byte_count ; | |||
1091 | } /* psf_binheader_readf */ | |||
1092 | ||||
1093 | /*----------------------------------------------------------------------------------------------- | |||
1094 | */ | |||
1095 | ||||
1096 | sf_count_t | |||
1097 | psf_default_seek (SF_PRIVATE *psf, int UNUSED (mode)UNUSED_mode __attribute__ ((unused)), sf_count_t samples_from_start) | |||
1098 | { sf_count_t position, retval ; | |||
1099 | ||||
1100 | if (! (psf->blockwidth && psf->dataoffset >= 0)) | |||
1101 | { psf->error = SFE_BAD_SEEK ; | |||
1102 | return PSF_SEEK_ERROR((sf_count_t) -1) ; | |||
1103 | } ; | |||
1104 | ||||
1105 | if (! psf->sf.seekable) | |||
1106 | { psf->error = SFE_NOT_SEEKABLE ; | |||
1107 | return PSF_SEEK_ERROR((sf_count_t) -1) ; | |||
1108 | } ; | |||
1109 | ||||
1110 | position = psf->dataoffset + psf->blockwidth * samples_from_start ; | |||
1111 | ||||
1112 | if ((retval = psf_fseek (psf, position, SEEK_SET0)) != position) | |||
1113 | { psf->error = SFE_SEEK_FAILED ; | |||
1114 | return PSF_SEEK_ERROR((sf_count_t) -1) ; | |||
1115 | } ; | |||
1116 | ||||
1117 | return samples_from_start ; | |||
1118 | } /* psf_default_seek */ | |||
1119 | ||||
1120 | /*----------------------------------------------------------------------------------------------- | |||
1121 | */ | |||
1122 | ||||
1123 | void | |||
1124 | psf_hexdump (const void *ptr, int len) | |||
1125 | { const char *data ; | |||
1126 | char ascii [17] ; | |||
1127 | int k, m ; | |||
1128 | ||||
1129 | if ((data = ptr) == NULL((void*)0)) | |||
1130 | return ; | |||
1131 | if (len <= 0) | |||
1132 | return ; | |||
1133 | ||||
1134 | puts ("") ; | |||
1135 | for (k = 0 ; k < len ; k += 16) | |||
1136 | { memset (ascii, ' ', sizeof (ascii)) ; | |||
1137 | ||||
1138 | printf ("%08X: ", k)__printf_chk (2 - 1, "%08X: ", k) ; | |||
1139 | for (m = 0 ; m < 16 && k + m < len ; m++) | |||
1140 | { printf (m == 8 ? " %02X " : "%02X ", data [k + m] & 0xFF)__printf_chk (2 - 1, m == 8 ? " %02X " : "%02X ", data [k + m ] & 0xFF) ; | |||
1141 | ascii [m] = psf_isprint (data [k + m]) ? data [k + m] : '.' ; | |||
1142 | } ; | |||
1143 | ||||
1144 | if (m <= 8) printf (" ")__printf_chk (2 - 1, " ") ; | |||
1145 | for ( ; m < 16 ; m++) printf (" ")__printf_chk (2 - 1, " ") ; | |||
1146 | ||||
1147 | ascii [16] = 0 ; | |||
1148 | printf (" %s\n", ascii)__printf_chk (2 - 1, " %s\n", ascii) ; | |||
1149 | } ; | |||
1150 | ||||
1151 | puts ("") ; | |||
1152 | } /* psf_hexdump */ | |||
1153 | ||||
1154 | void | |||
1155 | psf_log_SF_INFO (SF_PRIVATE *psf) | |||
1156 | { psf_log_printf (psf, "---------------------------------\n") ; | |||
1157 | ||||
1158 | psf_log_printf (psf, " Sample rate : %d\n", psf->sf.samplerate) ; | |||
1159 | if (psf->sf.frames == SF_COUNT_MAX0x7FFFFFFFFFFFFFFFLL) | |||
1160 | psf_log_printf (psf, " Frames : unknown\n") ; | |||
1161 | else | |||
1162 | psf_log_printf (psf, " Frames : %D\n", psf->sf.frames) ; | |||
1163 | psf_log_printf (psf, " Channels : %d\n", psf->sf.channels) ; | |||
1164 | ||||
1165 | psf_log_printf (psf, " Format : 0x%X\n", psf->sf.format) ; | |||
1166 | psf_log_printf (psf, " Sections : %d\n", psf->sf.sections) ; | |||
1167 | psf_log_printf (psf, " Seekable : %s\n", psf->sf.seekable ? "TRUE" : "FALSE") ; | |||
1168 | ||||
1169 | psf_log_printf (psf, "---------------------------------\n") ; | |||
1170 | } /* psf_dump_SFINFO */ | |||
1171 | ||||
1172 | /*======================================================================================== | |||
1173 | */ | |||
1174 | ||||
1175 | void* | |||
1176 | psf_memset (void *s, int c, sf_count_t len) | |||
1177 | { char *ptr ; | |||
1178 | int setcount ; | |||
1179 | ||||
1180 | ptr = (char *) s ; | |||
1181 | ||||
1182 | while (len > 0) | |||
1183 | { setcount = (len > 0x10000000) ? 0x10000000 : (int) len ; | |||
1184 | ||||
1185 | memset (ptr, c, setcount) ; | |||
1186 | ||||
1187 | ptr += setcount ; | |||
1188 | len -= setcount ; | |||
1189 | } ; | |||
1190 | ||||
1191 | return s ; | |||
1192 | } /* psf_memset */ | |||
1193 | ||||
1194 | SF_INSTRUMENT * | |||
1195 | psf_instrument_alloc (void) | |||
1196 | { SF_INSTRUMENT *instr ; | |||
1197 | ||||
1198 | instr = calloc (1, sizeof (SF_INSTRUMENT)) ; | |||
1199 | ||||
1200 | if (instr == NULL((void*)0)) | |||
1201 | return NULL((void*)0) ; | |||
1202 | ||||
1203 | /* Set non-zero default values. */ | |||
1204 | instr->basenote = -1 ; | |||
1205 | instr->velocity_lo = -1 ; | |||
1206 | instr->velocity_hi = -1 ; | |||
1207 | instr->key_lo = -1 ; | |||
1208 | instr->key_hi = -1 ; | |||
1209 | ||||
1210 | return instr ; | |||
1211 | } /* psf_instrument_alloc */ | |||
1212 | ||||
1213 | void | |||
1214 | psf_sanitize_string (char * cptr, int len) | |||
1215 | { | |||
1216 | do | |||
1217 | { | |||
1218 | len -- ; | |||
1219 | cptr [len] = psf_isprint (cptr [len]) ? cptr [len] : '.' ; | |||
1220 | } | |||
1221 | while (len > 0) ; | |||
1222 | } /* psf_sanitize_string */ | |||
1223 | ||||
1224 | void | |||
1225 | psf_get_date_str (char *str, int maxlen) | |||
1226 | { time_t current ; | |||
1227 | struct tm timedata, *tmptr ; | |||
1228 | ||||
1229 | time (¤t) ; | |||
1230 | ||||
1231 | #if defined (HAVE_GMTIME_R1) | |||
1232 | /* If the re-entrant version is available, use it. */ | |||
1233 | tmptr = gmtime_r (¤t, &timedata) ; | |||
1234 | #elif defined (HAVE_GMTIME1) | |||
1235 | /* Otherwise use the standard one and copy the data to local storage. */ | |||
1236 | tmptr = gmtime (¤t) ; | |||
1237 | memcpy (&timedata, tmptr, sizeof (timedata)) ; | |||
1238 | #else | |||
1239 | tmptr = NULL((void*)0) ; | |||
1240 | #endif | |||
1241 | ||||
1242 | if (tmptr) | |||
1243 | snprintf (str, maxlen, "%4d-%02d-%02d %02d:%02d:%02d UTC",__builtin___snprintf_chk (str, maxlen, 2 - 1, __builtin_object_size (str, 2 > 1), "%4d-%02d-%02d %02d:%02d:%02d UTC", 1900 + timedata .tm_year, timedata.tm_mon, timedata.tm_mday, timedata.tm_hour , timedata.tm_min, timedata.tm_sec) | |||
1244 | 1900 + timedata.tm_year, timedata.tm_mon, timedata.tm_mday,__builtin___snprintf_chk (str, maxlen, 2 - 1, __builtin_object_size (str, 2 > 1), "%4d-%02d-%02d %02d:%02d:%02d UTC", 1900 + timedata .tm_year, timedata.tm_mon, timedata.tm_mday, timedata.tm_hour , timedata.tm_min, timedata.tm_sec) | |||
1245 | timedata.tm_hour, timedata.tm_min, timedata.tm_sec)__builtin___snprintf_chk (str, maxlen, 2 - 1, __builtin_object_size (str, 2 > 1), "%4d-%02d-%02d %02d:%02d:%02d UTC", 1900 + timedata .tm_year, timedata.tm_mon, timedata.tm_mday, timedata.tm_hour , timedata.tm_min, timedata.tm_sec) ; | |||
1246 | else | |||
1247 | snprintf (str, maxlen, "Unknown date")__builtin___snprintf_chk (str, maxlen, 2 - 1, __builtin_object_size (str, 2 > 1), "Unknown date") ; | |||
1248 | ||||
1249 | return ; | |||
1250 | } /* psf_get_date_str */ | |||
1251 | ||||
1252 | int | |||
1253 | subformat_to_bytewidth (int format) | |||
1254 | { | |||
1255 | switch (format) | |||
1256 | { case SF_FORMAT_PCM_U8 : | |||
1257 | case SF_FORMAT_PCM_S8 : | |||
1258 | return 1 ; | |||
1259 | case SF_FORMAT_PCM_16 : | |||
1260 | return 2 ; | |||
1261 | case SF_FORMAT_PCM_24 : | |||
1262 | return 3 ; | |||
1263 | case SF_FORMAT_PCM_32 : | |||
1264 | case SF_FORMAT_FLOAT : | |||
1265 | return 4 ; | |||
1266 | case SF_FORMAT_DOUBLE : | |||
1267 | return 8 ; | |||
1268 | } ; | |||
1269 | ||||
1270 | return 0 ; | |||
1271 | } /* subformat_to_bytewidth */ | |||
1272 | ||||
1273 | int | |||
1274 | s_bitwidth_to_subformat (int bits) | |||
1275 | { static int array [] = | |||
1276 | { SF_FORMAT_PCM_S8, SF_FORMAT_PCM_16, SF_FORMAT_PCM_24, SF_FORMAT_PCM_32 | |||
1277 | } ; | |||
1278 | ||||
1279 | if (bits < 8 || bits > 32) | |||
1280 | return 0 ; | |||
1281 | ||||
1282 | return array [((bits + 7) / 8) - 1] ; | |||
1283 | } /* bitwidth_to_subformat */ | |||
1284 | ||||
1285 | int | |||
1286 | u_bitwidth_to_subformat (int bits) | |||
1287 | { static int array [] = | |||
1288 | { SF_FORMAT_PCM_U8, SF_FORMAT_PCM_16, SF_FORMAT_PCM_24, SF_FORMAT_PCM_32 | |||
1289 | } ; | |||
1290 | ||||
1291 | if (bits < 8 || bits > 32) | |||
1292 | return 0 ; | |||
1293 | ||||
1294 | return array [((bits + 7) / 8) - 1] ; | |||
1295 | } /* bitwidth_to_subformat */ | |||
1296 | ||||
1297 | /* | |||
1298 | ** psf_rand_int32 : Not crypto quality, but more than adequate for things | |||
1299 | ** like stream serial numbers in Ogg files or the unique_id field of the | |||
1300 | ** SF_PRIVATE struct. | |||
1301 | */ | |||
1302 | ||||
1303 | int32_t | |||
1304 | psf_rand_int32 (void) | |||
1305 | { static int32_t value = -1 ; | |||
1306 | int k, count ; | |||
1307 | ||||
1308 | if (value == -1) | |||
1309 | { | |||
1310 | #if HAVE_GETTIMEOFDAY1 | |||
1311 | struct timeval tv ; | |||
1312 | gettimeofday (&tv, NULL((void*)0)) ; | |||
1313 | value = tv.tv_sec + tv.tv_usec ; | |||
1314 | #else | |||
1315 | value = time (NULL((void*)0)) ; | |||
1316 | #endif | |||
1317 | } ; | |||
1318 | ||||
1319 | count = 4 + (value & 7) ; | |||
1320 | for (k = 0 ; k < count ; k++) | |||
1321 | value = 11117 * value + 211231 ; | |||
1322 | ||||
1323 | return value ; | |||
1324 | } /* psf_rand_int32 */ | |||
1325 | ||||
1326 | void | |||
1327 | append_snprintf (char * dest, size_t maxlen, const char * fmt, ...) | |||
1328 | { size_t len = strlen (dest) ; | |||
1329 | ||||
1330 | if (len < maxlen) | |||
1331 | { va_list ap ; | |||
1332 | ||||
1333 | va_start (ap, fmt)__builtin_va_start(ap, fmt) ; | |||
1334 | vsnprintf (dest + len, maxlen - len, fmt, ap) ; | |||
1335 | va_end (ap)__builtin_va_end(ap) ; | |||
1336 | } ; | |||
1337 | ||||
1338 | return ; | |||
1339 | } /* append_snprintf */ | |||
1340 | ||||
1341 | ||||
1342 | void | |||
1343 | psf_strlcpy_crlf (char *dest, const char *src, size_t destmax, size_t srcmax) | |||
1344 | { /* Must be minus 2 so it can still expand a single trailing '\n' or '\r'. */ | |||
1345 | char * destend = dest + destmax - 2 ; | |||
1346 | const char * srcend = src + srcmax ; | |||
1347 | ||||
1348 | while (dest < destend && src < srcend) | |||
1349 | { if ((src [0] == '\r' && src [1] == '\n') || (src [0] == '\n' && src [1] == '\r')) | |||
1350 | { *dest++ = '\r' ; | |||
1351 | *dest++ = '\n' ; | |||
1352 | src += 2 ; | |||
1353 | continue ; | |||
1354 | } ; | |||
1355 | ||||
1356 | if (src [0] == '\r') | |||
1357 | { *dest++ = '\r' ; | |||
1358 | *dest++ = '\n' ; | |||
1359 | src += 1 ; | |||
1360 | continue ; | |||
1361 | } ; | |||
1362 | ||||
1363 | if (src [0] == '\n') | |||
1364 | { *dest++ = '\r' ; | |||
1365 | *dest++ = '\n' ; | |||
1366 | src += 1 ; | |||
1367 | continue ; | |||
1368 | } ; | |||
1369 | ||||
1370 | *dest++ = *src++ ; | |||
1371 | } ; | |||
1372 | ||||
1373 | /* Make sure dest is terminated. */ | |||
1374 | *dest = 0 ; | |||
1375 | } /* psf_strlcpy_crlf */ | |||
1376 | ||||
1377 | sf_count_t | |||
1378 | psf_decode_frame_count (SF_PRIVATE *psf) | |||
1379 | { sf_count_t count, readlen, total = 0 ; | |||
1380 | BUF_UNION ubuf ; | |||
1381 | ||||
1382 | /* If we're reading from a pipe or the file is too long, just return SF_COUNT_MAX. */ | |||
1383 | if (psf_is_pipe (psf) || psf->datalength > 0x1000000) | |||
1384 | return SF_COUNT_MAX0x7FFFFFFFFFFFFFFFLL ; | |||
1385 | ||||
1386 | psf_fseek (psf, psf->dataoffset, SEEK_SET0) ; | |||
1387 | ||||
1388 | readlen = ARRAY_LEN (ubuf.ibuf)((int) (sizeof (ubuf.ibuf) / sizeof ((ubuf.ibuf) [0]))) / psf->sf.channels ; | |||
1389 | readlen *= psf->sf.channels ; | |||
1390 | ||||
1391 | while ((count = psf->read_int (psf, ubuf.ibuf, readlen)) > 0) | |||
1392 | total += count ; | |||
1393 | ||||
1394 | psf_fseek (psf, psf->dataoffset, SEEK_SET0) ; | |||
1395 | ||||
1396 | return total / psf->sf.channels ; | |||
1397 | } /* psf_decode_frame_count */ | |||
1398 | ||||
1399 | /*============================================================================== | |||
1400 | */ | |||
1401 | ||||
1402 | #define CASE_NAME(x)case x : return "x" ; break ; case x : return #x ; break ; | |||
1403 | ||||
1404 | const char * | |||
1405 | str_of_major_format (int format) | |||
1406 | { switch (SF_CONTAINER (format)((format) & SF_FORMAT_TYPEMASK)) | |||
1407 | { CASE_NAME (SF_FORMAT_WAV)case SF_FORMAT_WAV : return "SF_FORMAT_WAV" ; break ; ; | |||
1408 | CASE_NAME (SF_FORMAT_AIFF)case SF_FORMAT_AIFF : return "SF_FORMAT_AIFF" ; break ; ; | |||
1409 | CASE_NAME (SF_FORMAT_AU)case SF_FORMAT_AU : return "SF_FORMAT_AU" ; break ; ; | |||
1410 | CASE_NAME (SF_FORMAT_RAW)case SF_FORMAT_RAW : return "SF_FORMAT_RAW" ; break ; ; | |||
1411 | CASE_NAME (SF_FORMAT_PAF)case SF_FORMAT_PAF : return "SF_FORMAT_PAF" ; break ; ; | |||
1412 | CASE_NAME (SF_FORMAT_SVX)case SF_FORMAT_SVX : return "SF_FORMAT_SVX" ; break ; ; | |||
1413 | CASE_NAME (SF_FORMAT_NIST)case SF_FORMAT_NIST : return "SF_FORMAT_NIST" ; break ; ; | |||
1414 | CASE_NAME (SF_FORMAT_VOC)case SF_FORMAT_VOC : return "SF_FORMAT_VOC" ; break ; ; | |||
1415 | CASE_NAME (SF_FORMAT_IRCAM)case SF_FORMAT_IRCAM : return "SF_FORMAT_IRCAM" ; break ; ; | |||
1416 | CASE_NAME (SF_FORMAT_W64)case SF_FORMAT_W64 : return "SF_FORMAT_W64" ; break ; ; | |||
1417 | CASE_NAME (SF_FORMAT_MAT4)case SF_FORMAT_MAT4 : return "SF_FORMAT_MAT4" ; break ; ; | |||
1418 | CASE_NAME (SF_FORMAT_MAT5)case SF_FORMAT_MAT5 : return "SF_FORMAT_MAT5" ; break ; ; | |||
1419 | CASE_NAME (SF_FORMAT_PVF)case SF_FORMAT_PVF : return "SF_FORMAT_PVF" ; break ; ; | |||
1420 | CASE_NAME (SF_FORMAT_XI)case SF_FORMAT_XI : return "SF_FORMAT_XI" ; break ; ; | |||
1421 | CASE_NAME (SF_FORMAT_HTK)case SF_FORMAT_HTK : return "SF_FORMAT_HTK" ; break ; ; | |||
1422 | CASE_NAME (SF_FORMAT_SDS)case SF_FORMAT_SDS : return "SF_FORMAT_SDS" ; break ; ; | |||
1423 | CASE_NAME (SF_FORMAT_AVR)case SF_FORMAT_AVR : return "SF_FORMAT_AVR" ; break ; ; | |||
1424 | CASE_NAME (SF_FORMAT_WAVEX)case SF_FORMAT_WAVEX : return "SF_FORMAT_WAVEX" ; break ; ; | |||
1425 | CASE_NAME (SF_FORMAT_SD2)case SF_FORMAT_SD2 : return "SF_FORMAT_SD2" ; break ; ; | |||
1426 | CASE_NAME (SF_FORMAT_FLAC)case SF_FORMAT_FLAC : return "SF_FORMAT_FLAC" ; break ; ; | |||
1427 | CASE_NAME (SF_FORMAT_CAF)case SF_FORMAT_CAF : return "SF_FORMAT_CAF" ; break ; ; | |||
1428 | CASE_NAME (SF_FORMAT_WVE)case SF_FORMAT_WVE : return "SF_FORMAT_WVE" ; break ; ; | |||
1429 | CASE_NAME (SF_FORMAT_OGG)case SF_FORMAT_OGG : return "SF_FORMAT_OGG" ; break ; ; | |||
1430 | default : | |||
1431 | break ; | |||
1432 | } ; | |||
1433 | ||||
1434 | return "BAD_MAJOR_FORMAT" ; | |||
1435 | } /* str_of_major_format */ | |||
1436 | ||||
1437 | const char * | |||
1438 | str_of_minor_format (int format) | |||
1439 | { switch (SF_CODEC (format)((format) & SF_FORMAT_SUBMASK)) | |||
1440 | { CASE_NAME (SF_FORMAT_PCM_S8)case SF_FORMAT_PCM_S8 : return "SF_FORMAT_PCM_S8" ; break ; ; | |||
1441 | CASE_NAME (SF_FORMAT_PCM_16)case SF_FORMAT_PCM_16 : return "SF_FORMAT_PCM_16" ; break ; ; | |||
1442 | CASE_NAME (SF_FORMAT_PCM_24)case SF_FORMAT_PCM_24 : return "SF_FORMAT_PCM_24" ; break ; ; | |||
1443 | CASE_NAME (SF_FORMAT_PCM_32)case SF_FORMAT_PCM_32 : return "SF_FORMAT_PCM_32" ; break ; ; | |||
1444 | CASE_NAME (SF_FORMAT_PCM_U8)case SF_FORMAT_PCM_U8 : return "SF_FORMAT_PCM_U8" ; break ; ; | |||
1445 | CASE_NAME (SF_FORMAT_FLOAT)case SF_FORMAT_FLOAT : return "SF_FORMAT_FLOAT" ; break ; ; | |||
1446 | CASE_NAME (SF_FORMAT_DOUBLE)case SF_FORMAT_DOUBLE : return "SF_FORMAT_DOUBLE" ; break ; ; | |||
1447 | CASE_NAME (SF_FORMAT_ULAW)case SF_FORMAT_ULAW : return "SF_FORMAT_ULAW" ; break ; ; | |||
1448 | CASE_NAME (SF_FORMAT_ALAW)case SF_FORMAT_ALAW : return "SF_FORMAT_ALAW" ; break ; ; | |||
1449 | CASE_NAME (SF_FORMAT_IMA_ADPCM)case SF_FORMAT_IMA_ADPCM : return "SF_FORMAT_IMA_ADPCM" ; break ; ; | |||
1450 | CASE_NAME (SF_FORMAT_MS_ADPCM)case SF_FORMAT_MS_ADPCM : return "SF_FORMAT_MS_ADPCM" ; break ; ; | |||
1451 | CASE_NAME (SF_FORMAT_GSM610)case SF_FORMAT_GSM610 : return "SF_FORMAT_GSM610" ; break ; ; | |||
1452 | CASE_NAME (SF_FORMAT_VOX_ADPCM)case SF_FORMAT_VOX_ADPCM : return "SF_FORMAT_VOX_ADPCM" ; break ; ; | |||
1453 | CASE_NAME (SF_FORMAT_G721_32)case SF_FORMAT_G721_32 : return "SF_FORMAT_G721_32" ; break ; ; | |||
1454 | CASE_NAME (SF_FORMAT_G723_24)case SF_FORMAT_G723_24 : return "SF_FORMAT_G723_24" ; break ; ; | |||
1455 | CASE_NAME (SF_FORMAT_G723_40)case SF_FORMAT_G723_40 : return "SF_FORMAT_G723_40" ; break ; ; | |||
1456 | CASE_NAME (SF_FORMAT_DWVW_12)case SF_FORMAT_DWVW_12 : return "SF_FORMAT_DWVW_12" ; break ; ; | |||
1457 | CASE_NAME (SF_FORMAT_DWVW_16)case SF_FORMAT_DWVW_16 : return "SF_FORMAT_DWVW_16" ; break ; ; | |||
1458 | CASE_NAME (SF_FORMAT_DWVW_24)case SF_FORMAT_DWVW_24 : return "SF_FORMAT_DWVW_24" ; break ; ; | |||
1459 | CASE_NAME (SF_FORMAT_DWVW_N)case SF_FORMAT_DWVW_N : return "SF_FORMAT_DWVW_N" ; break ; ; | |||
1460 | CASE_NAME (SF_FORMAT_DPCM_8)case SF_FORMAT_DPCM_8 : return "SF_FORMAT_DPCM_8" ; break ; ; | |||
1461 | CASE_NAME (SF_FORMAT_DPCM_16)case SF_FORMAT_DPCM_16 : return "SF_FORMAT_DPCM_16" ; break ; ; | |||
1462 | CASE_NAME (SF_FORMAT_VORBIS)case SF_FORMAT_VORBIS : return "SF_FORMAT_VORBIS" ; break ; ; | |||
1463 | default : | |||
1464 | break ; | |||
1465 | } ; | |||
1466 | ||||
1467 | return "BAD_MINOR_FORMAT" ; | |||
1468 | } /* str_of_minor_format */ | |||
1469 | ||||
1470 | const char * | |||
1471 | str_of_open_mode (int mode) | |||
1472 | { switch (mode) | |||
1473 | { CASE_NAME (SFM_READ)case SFM_READ : return "SFM_READ" ; break ; ; | |||
1474 | CASE_NAME (SFM_WRITE)case SFM_WRITE : return "SFM_WRITE" ; break ; ; | |||
1475 | CASE_NAME (SFM_RDWR)case SFM_RDWR : return "SFM_RDWR" ; break ; ; | |||
1476 | ||||
1477 | default : | |||
1478 | break ; | |||
1479 | } ; | |||
1480 | ||||
1481 | return "BAD_MODE" ; | |||
1482 | } /* str_of_open_mode */ | |||
1483 | ||||
1484 | const char * | |||
1485 | str_of_endianness (int end) | |||
1486 | { switch (end) | |||
1487 | { CASE_NAME (SF_ENDIAN_BIG)case SF_ENDIAN_BIG : return "SF_ENDIAN_BIG" ; break ; ; | |||
1488 | CASE_NAME (SF_ENDIAN_LITTLE)case SF_ENDIAN_LITTLE : return "SF_ENDIAN_LITTLE" ; break ; ; | |||
1489 | CASE_NAME (SF_ENDIAN_CPU)case SF_ENDIAN_CPU : return "SF_ENDIAN_CPU" ; break ; ; | |||
1490 | default : | |||
1491 | break ; | |||
1492 | } ; | |||
1493 | ||||
1494 | /* Zero length string for SF_ENDIAN_FILE. */ | |||
1495 | return "" ; | |||
1496 | } /* str_of_endianness */ | |||
1497 | ||||
1498 | /*============================================================================== | |||
1499 | */ | |||
1500 | ||||
1501 | void | |||
1502 | psf_f2s_array (const float *src, short *dest, int count, int normalize) | |||
1503 | { float normfact ; | |||
1504 | ||||
1505 | normfact = normalize ? (1.0 * 0x7FFF) : 1.0 ; | |||
1506 | while (--count >= 0) | |||
1507 | dest [count] = lrintf (src [count] * normfact) ; | |||
1508 | ||||
1509 | return ; | |||
1510 | } /* psf_f2s_array */ | |||
1511 | ||||
1512 | void | |||
1513 | psf_f2s_clip_array (const float *src, short *dest, int count, int normalize) | |||
1514 | { float normfact, scaled_value ; | |||
1515 | ||||
1516 | normfact = normalize ? (1.0 * 0x8000) : 1.0 ; | |||
1517 | ||||
1518 | while (--count >= 0) | |||
1519 | { scaled_value = src [count] * normfact ; | |||
1520 | if (CPU_CLIPS_POSITIVE0 == 0 && scaled_value >= (1.0 * 0x7FFF)) | |||
1521 | { dest [count] = 0x7FFF ; | |||
1522 | continue ; | |||
1523 | } ; | |||
1524 | if (CPU_CLIPS_NEGATIVE0 == 0 && scaled_value <= (-8.0 * 0x1000)) | |||
1525 | { dest [count] = 0x8000 ; | |||
1526 | continue ; | |||
1527 | } ; | |||
1528 | ||||
1529 | dest [count] = lrintf (scaled_value) ; | |||
1530 | } ; | |||
1531 | ||||
1532 | return ; | |||
1533 | } /* psf_f2s_clip_array */ | |||
1534 | ||||
1535 | void | |||
1536 | psf_d2s_array (const double *src, short *dest, int count, int normalize) | |||
1537 | { double normfact ; | |||
1538 | ||||
1539 | normfact = normalize ? (1.0 * 0x7FFF) : 1.0 ; | |||
1540 | while (--count >= 0) | |||
1541 | dest [count] = lrint (src [count] * normfact) ; | |||
1542 | ||||
1543 | return ; | |||
1544 | } /* psf_f2s_array */ | |||
1545 | ||||
1546 | void | |||
1547 | psf_d2s_clip_array (const double *src, short *dest, int count, int normalize) | |||
1548 | { double normfact, scaled_value ; | |||
1549 | ||||
1550 | normfact = normalize ? (1.0 * 0x8000) : 1.0 ; | |||
1551 | ||||
1552 | while (--count >= 0) | |||
1553 | { scaled_value = src [count] * normfact ; | |||
1554 | if (CPU_CLIPS_POSITIVE0 == 0 && scaled_value >= (1.0 * 0x7FFF)) | |||
1555 | { dest [count] = 0x7FFF ; | |||
1556 | continue ; | |||
1557 | } ; | |||
1558 | if (CPU_CLIPS_NEGATIVE0 == 0 && scaled_value <= (-8.0 * 0x1000)) | |||
1559 | { dest [count] = 0x8000 ; | |||
1560 | continue ; | |||
1561 | } ; | |||
1562 | ||||
1563 | dest [count] = lrint (scaled_value) ; | |||
1564 | } ; | |||
1565 | ||||
1566 | return ; | |||
1567 | } /* psf_d2s_clip_array */ | |||
1568 | ||||
1569 | ||||
1570 | void | |||
1571 | psf_f2i_array (const float *src, int *dest, int count, int normalize) | |||
1572 | { float normfact ; | |||
1573 | ||||
1574 | normfact = normalize ? (1.0 * 0x7FFFFFFF) : 1.0 ; | |||
1575 | while (--count >= 0) | |||
1576 | dest [count] = lrintf (src [count] * normfact) ; | |||
1577 | ||||
1578 | return ; | |||
1579 | } /* psf_f2i_array */ | |||
1580 | ||||
1581 | void | |||
1582 | psf_f2i_clip_array (const float *src, int *dest, int count, int normalize) | |||
1583 | { float normfact, scaled_value ; | |||
1584 | ||||
1585 | normfact = normalize ? (8.0 * 0x10000000) : 1.0 ; | |||
1586 | ||||
1587 | while (--count >= 0) | |||
1588 | { scaled_value = src [count] * normfact ; | |||
1589 | if (CPU_CLIPS_POSITIVE0 == 0 && scaled_value >= (1.0 * 0x7FFFFFFF)) | |||
1590 | { dest [count] = 0x7FFFFFFF ; | |||
1591 | continue ; | |||
1592 | } ; | |||
1593 | if (CPU_CLIPS_NEGATIVE0 == 0 && scaled_value <= (-8.0 * 0x10000000)) | |||
1594 | { dest [count] = 0x80000000 ; | |||
1595 | continue ; | |||
1596 | } ; | |||
1597 | ||||
1598 | dest [count] = lrintf (scaled_value) ; | |||
1599 | } ; | |||
1600 | ||||
1601 | return ; | |||
1602 | } /* psf_f2i_clip_array */ | |||
1603 | ||||
1604 | void | |||
1605 | psf_d2i_array (const double *src, int *dest, int count, int normalize) | |||
1606 | { double normfact ; | |||
1607 | ||||
1608 | normfact = normalize ? (1.0 * 0x7FFFFFFF) : 1.0 ; | |||
1609 | while (--count >= 0) | |||
1610 | dest [count] = lrint (src [count] * normfact) ; | |||
1611 | ||||
1612 | return ; | |||
1613 | } /* psf_f2i_array */ | |||
1614 | ||||
1615 | void | |||
1616 | psf_d2i_clip_array (const double *src, int *dest, int count, int normalize) | |||
1617 | { double normfact, scaled_value ; | |||
1618 | ||||
1619 | normfact = normalize ? (8.0 * 0x10000000) : 1.0 ; | |||
1620 | ||||
1621 | while (--count >= 0) | |||
1622 | { scaled_value = src [count] * normfact ; | |||
1623 | if (CPU_CLIPS_POSITIVE0 == 0 && scaled_value >= (1.0 * 0x7FFFFFFF)) | |||
1624 | { dest [count] = 0x7FFFFFFF ; | |||
1625 | continue ; | |||
1626 | } ; | |||
1627 | if (CPU_CLIPS_NEGATIVE0 == 0 && scaled_value <= (-8.0 * 0x10000000)) | |||
1628 | { dest [count] = 0x80000000 ; | |||
1629 | continue ; | |||
1630 | } ; | |||
1631 | ||||
1632 | dest [count] = lrint (scaled_value) ; | |||
1633 | } ; | |||
1634 | ||||
1635 | return ; | |||
1636 | } /* psf_d2i_clip_array */ | |||
1637 | ||||
1638 | FILE * | |||
1639 | psf_open_tmpfile (char * fname, size_t fnamelen) | |||
1640 | { const char * tmpdir ; | |||
1641 | FILE * file ; | |||
1642 | ||||
1643 | if (OS_IS_WIN320) | |||
1644 | tmpdir = getenv ("TEMP") ; | |||
1645 | else | |||
1646 | { tmpdir = getenv ("TMPDIR") ; | |||
1647 | tmpdir = tmpdir == NULL((void*)0) ? "/tmp" : tmpdir ; | |||
1648 | } ; | |||
1649 | ||||
1650 | // if (tmpdir && access (tmpdir, R_OK | W_OK | X_OK) == 0) | |||
1651 | { snprintf (fname, fnamelen, "%s/%x%x-alac.tmp", tmpdir, psf_rand_int32 (), psf_rand_int32 ())__builtin___snprintf_chk (fname, fnamelen, 2 - 1, __builtin_object_size (fname, 2 > 1), "%s/%x%x-alac.tmp", tmpdir, psf_rand_int32 (), psf_rand_int32 ()) ; | |||
1652 | if ((file = fopen (fname, "wb+")) != NULL((void*)0)) | |||
1653 | return file ; | |||
1654 | } ; | |||
1655 | ||||
1656 | snprintf (fname, fnamelen, "%x%x-alac.tmp", psf_rand_int32 (), psf_rand_int32 ())__builtin___snprintf_chk (fname, fnamelen, 2 - 1, __builtin_object_size (fname, 2 > 1), "%x%x-alac.tmp", psf_rand_int32 (), psf_rand_int32 ()) ; | |||
1657 | if ((file = fopen (fname, "wb+")) != NULL((void*)0)) | |||
1658 | return file ; | |||
1659 | ||||
1660 | memset (fname, 0, fnamelen) ; | |||
1661 | return NULL((void*)0) ; | |||
1662 | } /* psf_open_tmpfile */ |