header_test.tpl
上传用户:shw771010
上传日期:2022-01-05
资源大小:991k
文件大小:17k
源码类别:

Audio

开发平台:

Unix_Linux

  1. [+ AutoGen5 template c +]
  2. /*
  3. ** Copyright (C) 2001-2009 Erik de Castro Lopo <erikd@mega-nerd.com>
  4. **
  5. ** This program is free software ; you can redistribute it and/or modify
  6. ** it under the terms of the GNU General Public License as published by
  7. ** the Free Software Foundation ; either version 2 of the License, or
  8. ** (at your option) any later version.
  9. **
  10. ** This program is distributed in the hope that it will be useful,
  11. ** but WITHOUT ANY WARRANTY ; without even the implied warranty of
  12. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. ** GNU General Public License for more details.
  14. **
  15. ** You should have received a copy of the GNU General Public License
  16. ** along with this program ; if not, write to the Free Software
  17. ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  18. */
  19. #include "sfconfig.h"
  20. #include <stdio.h>
  21. #include <stdlib.h>
  22. #include <string.h>
  23. #include <sys/stat.h>
  24. #include <math.h>
  25. #if HAVE_UNISTD_H
  26. #include <unistd.h>
  27. #endif
  28. #if (HAVE_DECL_S_IRGRP == 0)
  29. #include <sf_unistd.h>
  30. #endif
  31. #if (defined (WIN32) || defined (_WIN32))
  32. #include <io.h>
  33. #include <direct.h>
  34. #endif
  35. #include <sndfile.h>
  36. #include "utils.h"
  37. #define BUFFER_LEN (1<<10)
  38. #define LOG_BUFFER_SIZE 1024
  39. static void update_header_test (const char *filename, int typemajor) ;
  40. [+ FOR data_type
  41. +]static void update_seek_[+ (get "name") +]_test (const char *filename, int filetype) ;
  42. [+ ENDFOR data_type
  43. +]
  44. static void extra_header_test (const char *filename, int filetype) ;
  45. static void header_shrink_test (const char *filename, int filetype) ;
  46. /* Force the start of this buffer to be double aligned. Sparc-solaris will
  47. ** choke if its not.
  48. */
  49. static int data_out [BUFFER_LEN] ;
  50. static int data_in [BUFFER_LEN] ;
  51. int
  52. main (int argc, char *argv [])
  53. { int do_all = 0 ;
  54. int test_count = 0 ;
  55. if (argc != 2)
  56. { printf ("Usage : %s <test>n", argv [0]) ;
  57. printf ("    Where <test> is one of the following:n") ;
  58. printf ("           wav  - test WAV file peak chunkn") ;
  59. printf ("           aiff - test AIFF file PEAK chunkn") ;
  60. printf ("           all  - perform all testsn") ;
  61. exit (1) ;
  62. } ;
  63. do_all=!strcmp (argv [1], "all") ;
  64. if (do_all || ! strcmp (argv [1], "wav"))
  65. { update_header_test ("header.wav", SF_FORMAT_WAV) ;
  66. update_seek_short_test ("header_short.wav", SF_FORMAT_WAV) ;
  67. update_seek_int_test ("header_int.wav", SF_FORMAT_WAV) ;
  68. update_seek_float_test ("header_float.wav", SF_FORMAT_WAV) ;
  69. update_seek_double_test ("header_double.wav", SF_FORMAT_WAV) ;
  70. header_shrink_test ("header_shrink.wav", SF_FORMAT_WAV) ;
  71. extra_header_test ("extra.wav", SF_FORMAT_WAV) ;
  72. update_header_test ("header.wavex", SF_FORMAT_WAVEX) ;
  73. update_seek_short_test ("header_short.wavex", SF_FORMAT_WAVEX) ;
  74. update_seek_int_test ("header_int.wavex", SF_FORMAT_WAVEX) ;
  75. update_seek_float_test ("header_float.wavex", SF_FORMAT_WAVEX) ;
  76. update_seek_double_test ("header_double.wavex", SF_FORMAT_WAVEX) ;
  77. header_shrink_test ("header_shrink.wavex", SF_FORMAT_WAVEX) ;
  78. extra_header_test ("extra.wavex", SF_FORMAT_WAVEX) ;
  79. test_count++ ;
  80. } ;
  81. if (do_all || ! strcmp (argv [1], "aiff"))
  82. { update_header_test ("header.aiff", SF_FORMAT_AIFF) ;
  83. update_seek_short_test ("header_short.aiff", SF_FORMAT_AIFF) ;
  84. update_seek_int_test ("header_int.aiff", SF_FORMAT_AIFF) ;
  85. update_seek_float_test ("header_float.aiff", SF_FORMAT_AIFF) ;
  86. update_seek_double_test ("header_double.aiff", SF_FORMAT_AIFF) ;
  87. header_shrink_test ("header_shrink.wav", SF_FORMAT_AIFF) ;
  88. extra_header_test ("extra.aiff", SF_FORMAT_AIFF) ;
  89. test_count++ ;
  90. } ;
  91. if (do_all || ! strcmp (argv [1], "au"))
  92. { update_header_test ("header.au", SF_FORMAT_AU) ;
  93. update_seek_short_test ("header_short.au", SF_FORMAT_AU) ;
  94. update_seek_int_test ("header_int.au", SF_FORMAT_AU) ;
  95. update_seek_float_test ("header_float.au", SF_FORMAT_AU) ;
  96. update_seek_double_test ("header_double.au", SF_FORMAT_AU) ;
  97. test_count++ ;
  98. } ;
  99. if (do_all || ! strcmp (argv [1], "caf"))
  100. { update_header_test ("header.caf", SF_FORMAT_CAF) ;
  101. update_seek_short_test ("header_short.caf", SF_FORMAT_CAF) ;
  102. update_seek_int_test ("header_int.caf", SF_FORMAT_CAF) ;
  103. update_seek_float_test ("header_float.caf", SF_FORMAT_CAF) ;
  104. update_seek_double_test ("header_double.caf", SF_FORMAT_CAF) ;
  105. /* extra_header_test ("extra.caf", SF_FORMAT_CAF) ; */
  106. test_count++ ;
  107. } ;
  108. if (do_all || ! strcmp (argv [1], "nist"))
  109. { update_header_test ("header.nist", SF_FORMAT_NIST) ;
  110. update_seek_short_test ("header_short.nist", SF_FORMAT_NIST) ;
  111. update_seek_int_test ("header_int.nist", SF_FORMAT_NIST) ;
  112. test_count++ ;
  113. } ;
  114. if (do_all || ! strcmp (argv [1], "paf"))
  115. { update_header_test ("header.paf", SF_FORMAT_PAF) ;
  116. update_seek_short_test ("header_short.paf", SF_FORMAT_PAF) ;
  117. test_count++ ;
  118. } ;
  119. if (do_all || ! strcmp (argv [1], "ircam"))
  120. { update_header_test ("header.ircam", SF_FORMAT_IRCAM) ;
  121. update_seek_short_test ("header_short.ircam", SF_FORMAT_IRCAM) ;
  122. test_count++ ;
  123. } ;
  124. if (do_all || ! strcmp (argv [1], "w64"))
  125. { update_header_test ("header.w64", SF_FORMAT_W64) ;
  126. update_seek_short_test ("header_short.w64", SF_FORMAT_W64) ;
  127. update_seek_int_test ("header_int.w64", SF_FORMAT_W64) ;
  128. update_seek_float_test ("header_float.w64", SF_FORMAT_W64) ;
  129. update_seek_double_test ("header_double.w64", SF_FORMAT_W64) ;
  130. test_count++ ;
  131. } ;
  132. if (do_all || ! strcmp (argv [1], "rf64"))
  133. { update_header_test ("header.rf64", SF_FORMAT_RF64) ;
  134. update_seek_short_test ("header_short.rf64", SF_FORMAT_RF64) ;
  135. update_seek_int_test ("header_int.rf64", SF_FORMAT_RF64) ;
  136. update_seek_float_test ("header_float.rf64", SF_FORMAT_RF64) ;
  137. update_seek_double_test ("header_double.rf64", SF_FORMAT_RF64) ;
  138. test_count++ ;
  139. } ;
  140. if (do_all || ! strcmp (argv [1], "mat4"))
  141. { update_header_test ("header.mat4", SF_FORMAT_MAT4) ;
  142. update_seek_short_test ("header_short.mat4", SF_FORMAT_MAT4) ;
  143. update_seek_int_test ("header_int.mat4", SF_FORMAT_MAT4) ;
  144. update_seek_float_test ("header_float.mat4", SF_FORMAT_MAT4) ;
  145. update_seek_double_test ("header_double.mat4", SF_FORMAT_MAT4) ;
  146. test_count++ ;
  147. } ;
  148. if (do_all || ! strcmp (argv [1], "mat5"))
  149. { update_header_test ("header.mat5", SF_FORMAT_MAT5) ;
  150. update_seek_short_test ("header_short.mat5", SF_FORMAT_MAT5) ;
  151. update_seek_int_test ("header_int.mat5", SF_FORMAT_MAT5) ;
  152. update_seek_float_test ("header_float.mat5", SF_FORMAT_MAT5) ;
  153. update_seek_double_test ("header_double.mat5", SF_FORMAT_MAT5) ;
  154. test_count++ ;
  155. } ;
  156. if (do_all || ! strcmp (argv [1], "pvf"))
  157. { update_header_test ("header.pvf", SF_FORMAT_PVF) ;
  158. update_seek_short_test ("header_short.pvf", SF_FORMAT_PVF) ;
  159. test_count++ ;
  160. } ;
  161. if (do_all || ! strcmp (argv [1], "avr"))
  162. { update_header_test ("header.avr", SF_FORMAT_AVR) ;
  163. update_seek_short_test ("header_short.avr", SF_FORMAT_AVR) ;
  164. test_count++ ;
  165. } ;
  166. if (do_all || ! strcmp (argv [1], "htk"))
  167. { update_header_test ("header.htk", SF_FORMAT_HTK) ;
  168. update_seek_short_test ("header_short.htk", SF_FORMAT_HTK) ;
  169. test_count++ ;
  170. } ;
  171. if (do_all || ! strcmp (argv [1], "svx"))
  172. { update_header_test ("header.svx", SF_FORMAT_SVX) ;
  173. update_seek_short_test ("header_short.svx", SF_FORMAT_SVX) ;
  174. test_count++ ;
  175. } ;
  176. if (do_all || ! strcmp (argv [1], "voc"))
  177. { update_header_test ("header.voc", SF_FORMAT_VOC) ;
  178. /*-update_seek_short_test ("header_short.voc", SF_FORMAT_VOC) ;-*/
  179. test_count++ ;
  180. } ;
  181. if (do_all || ! strcmp (argv [1], "sds"))
  182. { update_header_test ("header.sds", SF_FORMAT_SDS) ;
  183. /*-update_seek_short_test ("header_short.sds", SF_FORMAT_SDS) ;-*/
  184. test_count++ ;
  185. } ;
  186. if (do_all || ! strcmp (argv [1], "mpc2k"))
  187. { update_header_test ("header.mpc", SF_FORMAT_MPC2K) ;
  188. update_seek_short_test ("header_short.mpc", SF_FORMAT_MPC2K) ;
  189. test_count++ ;
  190. } ;
  191. if (test_count == 0)
  192. { printf ("Mono : ************************************n") ;
  193. printf ("Mono : *  No '%s' test defined.n", argv [1]) ;
  194. printf ("Mono : ************************************n") ;
  195. return 1 ;
  196. } ;
  197. return 0 ;
  198. } /* main */
  199. /*============================================================================================
  200. ** Here are the test functions.
  201. */
  202. static void
  203. update_header_sub (const char *filename, int typemajor, int write_mode)
  204. { SNDFILE *outfile, *infile ;
  205. SF_INFO sfinfo ;
  206. int k, frames ;
  207. sfinfo.samplerate = 44100 ;
  208. sfinfo.format = (typemajor | SF_FORMAT_PCM_16) ;
  209. sfinfo.channels = 1 ;
  210. sfinfo.frames = 0 ;
  211. frames = BUFFER_LEN / sfinfo.channels ;
  212. outfile = test_open_file_or_die (filename, write_mode, &sfinfo, SF_TRUE, __LINE__) ;
  213. for (k = 0 ; k < BUFFER_LEN ; k++)
  214. data_out [k] = k + 1 ;
  215. test_write_int_or_die (outfile, 0, data_out, BUFFER_LEN, __LINE__) ;
  216. if (typemajor != SF_FORMAT_HTK)
  217. { /* The HTK header is not correct when the file is first written. */
  218. infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
  219. sf_close (infile) ;
  220. } ;
  221. sf_command (outfile, SFC_UPDATE_HEADER_NOW, NULL, 0) ;
  222. /*
  223. ** Open file and check log buffer for an error. If header update failed
  224. ** the the log buffer will contain errors.
  225. */
  226. infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
  227. check_log_buffer_or_die (infile, __LINE__) ;
  228. if (sfinfo.frames < BUFFER_LEN || sfinfo.frames > BUFFER_LEN + 50)
  229. { printf ("nnLine %d : Incorrect sample count (%ld should be %d)n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), BUFFER_LEN) ;
  230. dump_log_buffer (infile) ;
  231. exit (1) ;
  232. } ;
  233. test_read_int_or_die (infile, 0, data_in, BUFFER_LEN, __LINE__) ;
  234. for (k = 0 ; k < BUFFER_LEN ; k++)
  235. if (data_out [k] != k + 1)
  236. printf ("Error : line %dn", __LINE__) ;
  237. sf_close (infile) ;
  238. /* Set auto update on. */
  239. sf_command (outfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) ;
  240. /* Write more data_out. */
  241. for (k = 0 ; k < BUFFER_LEN ; k++)
  242. data_out [k] = k + 2 ;
  243. test_write_int_or_die (outfile, 0, data_out, BUFFER_LEN, __LINE__) ;
  244. /* Open file again and make sure no errors in log buffer. */
  245. infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
  246. check_log_buffer_or_die (infile, __LINE__) ;
  247. if (sfinfo.frames < 2 * BUFFER_LEN || sfinfo.frames > 2 * BUFFER_LEN + 50)
  248. { printf ("nnLine %d : Incorrect sample count (%ld should be %d)n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), 2 * BUFFER_LEN) ;
  249. dump_log_buffer (infile) ;
  250. exit (1) ;
  251. } ;
  252. sf_close (infile) ;
  253. sf_close (outfile) ;
  254. unlink (filename) ;
  255. } /* update_header_sub */
  256. static void
  257. update_header_test (const char *filename, int typemajor)
  258. {
  259. print_test_name ("update_header_test", filename) ;
  260. update_header_sub (filename, typemajor, SFM_WRITE) ;
  261. update_header_sub (filename, typemajor, SFM_RDWR) ;
  262. unlink (filename) ;
  263. puts ("ok") ;
  264. } /* update_header_test */
  265. /*==============================================================================
  266. */
  267. [+ FOR data_type
  268. +]static void
  269. update_seek_[+ (get "name") +]_test (const char *filename, int filetype)
  270. { SNDFILE *outfile, *infile ;
  271. SF_INFO sfinfo ;
  272.     sf_count_t frames ;
  273.     [+ (get "name") +] buffer [8] ;
  274. int k ;
  275. print_test_name ("update_seek_[+ (get "name") +]_test", filename) ;
  276. memset (buffer, 0, sizeof (buffer)) ;
  277. /* Create sound outfile with no data. */
  278. sfinfo.format = filetype | [+ (get "format") +] ;
  279. sfinfo.samplerate = 48000 ;
  280. sfinfo.channels = 2 ;
  281. if (sf_format_check (&sfinfo) == SF_FALSE)
  282. sfinfo.channels = 1 ;
  283. outfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
  284. sf_close (outfile) ;
  285. /* Open again for read/write. */
  286. outfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_TRUE, __LINE__) ;
  287. /*
  288. ** In auto header update mode, seeking to the end of the file with
  289.     ** SEEK_SET will fail from the 2nd seek on.  seeking to 0, SEEK_END
  290. ** will seek to 0 anyway
  291. */
  292. if (sf_command (outfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) == 0)
  293.     { printf ("nnError : sf_command (SFC_SET_UPDATE_HEADER_AUTO) return error : %snn", sf_strerror (outfile)) ;
  294. exit (1) ;
  295. } ;
  296. /* Now write some frames. */
  297. frames = ARRAY_LEN (buffer) / sfinfo.channels ;
  298. for (k = 0 ; k < 6 ; k++)
  299. { test_seek_or_die (outfile, k * frames, SEEK_SET, k * frames, sfinfo.channels, __LINE__) ;
  300. test_seek_or_die (outfile, 0, SEEK_END, k * frames, sfinfo.channels, __LINE__) ;
  301. /* Open file again and make sure no errors in log buffer. */
  302. infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
  303. check_log_buffer_or_die (infile, __LINE__) ;
  304. sf_close (infile) ;
  305. if (sfinfo.frames != k * frames)
  306. { printf ("nnLine %d : Incorrect sample count (%ld should be %ld)n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), SF_COUNT_TO_LONG (k + frames)) ;
  307. dump_log_buffer (infile) ;
  308. exit (1) ;
  309. } ;
  310. if ((k & 1) == 0)
  311. test_write_[+ (get "name") +]_or_die (outfile, k, buffer, sfinfo.channels * frames, __LINE__) ;
  312. else
  313. test_writef_[+ (get "name") +]_or_die (outfile, k, buffer, frames, __LINE__) ;
  314. } ;
  315. sf_close (outfile) ;
  316. unlink (filename) ;
  317. puts ("ok") ;
  318. return ;
  319. } /* update_seek_[+ (get "name") +]_test */
  320. [+ ENDFOR data_type
  321. +]
  322. static void
  323. header_shrink_test (const char *filename, int filetype)
  324. { SNDFILE *outfile, *infile ;
  325. SF_INFO sfinfo ;
  326. sf_count_t frames ;
  327. float buffer [8], bufferin [8] ;
  328. print_test_name ("header_shrink_test", filename) ;
  329. memset (&sfinfo, 0, sizeof (sfinfo)) ;
  330. sfinfo.samplerate = 44100 ;
  331. sfinfo.format = filetype | SF_FORMAT_FLOAT ;
  332. sfinfo.channels = 1 ;
  333. memset (buffer, 0xA0, sizeof (buffer)) ;
  334. /* Now write some frames. */
  335. frames = ARRAY_LEN (buffer) / sfinfo.channels ;
  336. /* Test the file with extra header data. */
  337. outfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ;
  338. sf_command (outfile, SFC_SET_ADD_PEAK_CHUNK, NULL, SF_TRUE) ;
  339. sf_command (outfile, SFC_UPDATE_HEADER_NOW, NULL, SF_FALSE) ;
  340. sf_command (outfile, SFC_SET_ADD_PEAK_CHUNK, NULL, SF_FALSE) ;
  341. test_writef_float_or_die (outfile, 0, buffer, frames, __LINE__) ;
  342. sf_close (outfile) ;
  343. /* Open again for read. */
  344. infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ;
  345. test_readf_float_or_die (infile, 0, bufferin, frames, __LINE__) ;
  346. sf_close (infile) ;
  347. compare_float_or_die (buffer, bufferin, frames, __LINE__) ;
  348. unlink (filename) ;
  349. puts ("ok") ;
  350. return ;
  351. } /* header_shrink_test */
  352. static void
  353. extra_header_test (const char *filename, int filetype)
  354. { SNDFILE *outfile, *infile ;
  355. SF_INFO sfinfo ;
  356.     sf_count_t frames ;
  357.     short buffer [8] ;
  358. int k = 0 ;
  359. print_test_name ("extra_header_test", filename) ;
  360. sfinfo.samplerate = 44100 ;
  361. sfinfo.format = (filetype | SF_FORMAT_PCM_16) ;
  362. sfinfo.channels = 1 ;
  363. memset (buffer, 0xA0, sizeof (buffer)) ;
  364. /* Now write some frames. */
  365. frames = ARRAY_LEN (buffer) / sfinfo.channels ;
  366. /* Test the file with extra header data. */
  367. outfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, [+ (tpl-file-line "%2$d") +]) ;
  368. sf_set_string (outfile, SF_STR_TITLE, filename) ;
  369. test_writef_short_or_die (outfile, k, buffer, frames, [+ (tpl-file-line "%2$d") +]) ;
  370. sf_set_string (outfile, SF_STR_COPYRIGHT, "(c) 1980 Erik") ;
  371. sf_close (outfile) ;
  372. #if 1
  373. /*
  374. **  Erik de Castro Lopo <erikd@mega-nerd.com> May 23 2004.
  375. **
  376. ** This file has extra string data in the header and therefore cannot
  377. ** currently be opened in SFM_RDWR mode. This is fixable, but its in
  378. ** a part of the code I don't want to fiddle with until the Ogg/Vorbis
  379. ** integration is done.
  380. */
  381. if ((infile = sf_open (filename, SFM_RDWR, &sfinfo)) != NULL)
  382. { printf ("nnError : should not be able to open this file in SFM_RDWR.nn") ;
  383. exit (1) ;
  384. } ;
  385. unlink (filename) ;
  386. puts ("ok") ;
  387. return ;
  388. #else
  389. hexdump_file (filename, 0, 100000) ;
  390. /* Open again for read/write. */
  391. outfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, [+ (tpl-file-line "%2$d") +]) ;
  392. /*
  393. ** In auto header update mode, seeking to the end of the file with
  394.     ** SEEK_SET will fail from the 2nd seek on.  seeking to 0, SEEK_END
  395. ** will seek to 0 anyway
  396. */
  397. if (sf_command (outfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) == 0)
  398.     { printf ("nnError : sf_command (SFC_SET_UPDATE_HEADER_AUTO) return error : %snn", sf_strerror (outfile)) ;
  399. exit (1) ;
  400. } ;
  401. /* Now write some frames. */
  402. frames = ARRAY_LEN (buffer) / sfinfo.channels ;
  403. for (k = 1 ; k < 6 ; k++)
  404. {
  405. printf ("n*** pass %dn", k) ;
  406. memset (buffer, 0xA0 + k, sizeof (buffer)) ;
  407. test_seek_or_die (outfile, k * frames, SEEK_SET, k * frames, sfinfo.channels, [+ (tpl-file-line "%2$d") +]) ;
  408. test_seek_or_die (outfile, 0, SEEK_END, k * frames, sfinfo.channels, [+ (tpl-file-line "%2$d") +]) ;
  409. /* Open file again and make sure no errors in log buffer. */
  410. if (0)
  411. { infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, [+ (tpl-file-line "%2$d") +]) ;
  412. check_log_buffer_or_die (infile, [+ (tpl-file-line "%2$d") +]) ;
  413. sf_close (infile) ;
  414. } ;
  415. if (sfinfo.frames != k * frames)
  416. { printf ("nnLine %d : Incorrect sample count (%ld should be %ld)n", [+ (tpl-file-line "%2$d") +], SF_COUNT_TO_LONG (sfinfo.frames), SF_COUNT_TO_LONG (k + frames)) ;
  417. dump_log_buffer (infile) ;
  418. exit (1) ;
  419. } ;
  420. if ((k & 1) == 0)
  421. test_write_short_or_die (outfile, k, buffer, sfinfo.channels * frames, [+ (tpl-file-line "%2$d") +]) ;
  422. else
  423. test_writef_short_or_die (outfile, k, buffer, frames, [+ (tpl-file-line "%2$d") +]) ;
  424. hexdump_file (filename, 0, 100000) ;
  425. } ;
  426. sf_close (outfile) ;
  427. unlink (filename) ;
  428. puts ("ok") ;
  429. return ;
  430. #endif
  431. } /* extra_header_test */