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

Audio

开发平台:

Unix_Linux

  1. /*
  2. ** Copyright (C) 2003-2009 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 General Public License as published by
  6. ** the Free Software Foundation; either version 2 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 General Public License for more details.
  13. **
  14. ** You should have received a copy of the GNU 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. #include "sfconfig.h"
  19. #include <stdio.h>
  20. #include <stdlib.h>
  21. #include <string.h>
  22. #include <math.h>
  23. #if HAVE_UNISTD_H
  24. #include <unistd.h>
  25. #endif
  26. #include <sndfile.h>
  27. #include "utils.h"
  28. #define BUFFER_LEN (1 << 10)
  29. #define LOG_BUFFER_SIZE 1024
  30. static void string_start_test (const char *filename, int typemajor) ;
  31. static void string_start_end_test (const char *filename, int typemajor) ;
  32. static void string_multi_set_test (const char *filename, int typemajor) ;
  33. static void string_rdwr_test (const char *filename, int typemajor) ;
  34. static void string_short_rdwr_test (const char *filename, int typemajor) ;
  35. static int str_count (const char * haystack, const char * needle) ;
  36. int
  37. main (int argc, char *argv [])
  38. { int do_all = 0 ;
  39. int test_count = 0 ;
  40. if (argc != 2)
  41. { printf ("Usage : %s <test>n", argv [0]) ;
  42. printf ("    Where <test> is one of the following:n") ;
  43. printf ("           wav  - test adding strings to WAV filesn") ;
  44. printf ("           aiff - test adding strings to AIFF filesn") ;
  45. printf ("           flac - test adding strings to FLAC filesn") ;
  46. printf ("           ogg  - test adding strings to OGG filesn") ;
  47. printf ("           all  - perform all testsn") ;
  48. exit (1) ;
  49. } ;
  50. do_all =! strcmp (argv [1], "all") ;
  51. if (do_all || ! strcmp (argv [1], "wav"))
  52. { string_start_end_test ("strings.wav", SF_FORMAT_WAV) ;
  53. string_multi_set_test ("multi.wav", SF_FORMAT_WAV) ;
  54. string_rdwr_test ("rdwr.wav", SF_FORMAT_WAV) ;
  55. string_short_rdwr_test ("short_rdwr.wav", SF_FORMAT_WAV) ;
  56. string_start_end_test ("strings.wavex", SF_FORMAT_WAVEX) ;
  57. string_multi_set_test ("multi.wavex", SF_FORMAT_WAVEX) ;
  58. string_rdwr_test ("rdwr.wavex", SF_FORMAT_WAVEX) ;
  59. string_short_rdwr_test ("short_rdwr.wavex", SF_FORMAT_WAVEX) ;
  60. string_start_end_test ("strings.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV) ;
  61. string_multi_set_test ("multi.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV) ;
  62. string_rdwr_test ("rdwr.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV) ;
  63. string_short_rdwr_test ("short_rdwr.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV) ;
  64. test_count++ ;
  65. } ;
  66. if (do_all || ! strcmp (argv [1], "aiff"))
  67. { string_start_end_test ("strings.aiff", SF_FORMAT_AIFF) ;
  68. /*
  69. string_multi_set_test ("multi.aiff", SF_FORMAT_AIFF) ;
  70. string_rdwr_test ("rdwr.aiff", SF_FORMAT_AIFF) ;
  71. string_short_rdwr_test ("short_rdwr.aiff", SF_FORMAT_AIFF) ;
  72. */
  73. test_count++ ;
  74. } ;
  75. if (do_all || ! strcmp (argv [1], "flac"))
  76. { if (HAVE_EXTERNAL_LIBS)
  77. string_start_test ("strings.flac", SF_FORMAT_FLAC) ;
  78. else
  79. puts ("    No FLAC tests because FLAC support was not compiled in.") ;
  80. test_count++ ;
  81. } ;
  82. if (do_all || ! strcmp (argv [1], "ogg"))
  83. { if (HAVE_EXTERNAL_LIBS)
  84. string_start_test ("vorbis.oga", SF_FORMAT_OGG) ;
  85. else
  86. puts ("    No Ogg/Vorbis tests because Ogg/Vorbis support was not compiled in.") ;
  87. test_count++ ;
  88. } ;
  89. if (do_all || ! strcmp (argv [1], "rf64"))
  90. { puts ("nn     **** String test not working yet for RF64 format. ****n") ;
  91. /*
  92. string_start_end_test ("strings.rf64", SF_FORMAT_RF64) ;
  93. string_multi_set_test ("multi.rf64", SF_FORMAT_RF64) ;
  94. string_rdwr_test ("rdwr.rf64", SF_FORMAT_RF64) ;
  95. string_short_rdwr_test ("short_rdwr.rf64", SF_FORMAT_RF64) ;
  96. */
  97. test_count++ ;
  98. } ;
  99. if (test_count == 0)
  100. { printf ("Mono : ************************************n") ;
  101. printf ("Mono : *  No '%s' test defined.n", argv [1]) ;
  102. printf ("Mono : ************************************n") ;
  103. return 1 ;
  104. } ;
  105. return 0 ;
  106. } /* main */
  107. /*============================================================================================
  108. ** Here are the test functions.
  109. */
  110. static const char
  111. software [] = "software (libsndfile-X.Y.Z)",
  112. artist [] = "The Artist",
  113. copyright [] = "Copyright (c) 2001 Artist",
  114. comment [] = "Comment goes here!!!",
  115. date [] = "2001/01/27",
  116. album [] = "The Album",
  117. license [] = "The license",
  118. title [] = "This is the title",
  119. long_title [] = "This is a very long and very boring title for this file",
  120. long_artist [] = "The artist who kept on changing its name" ;
  121. static short data_out [BUFFER_LEN] ;
  122. static void
  123. string_start_end_test (const char *filename, int typemajor)
  124. { const char *cptr ;
  125. SNDFILE *file ;
  126. SF_INFO sfinfo ;
  127. int frames, errors = 0 ;
  128. typemajor = typemajor ;
  129. print_test_name ("string_start_end_test", filename) ;
  130. sfinfo.samplerate = 44100 ;
  131. sfinfo.channels = 1 ;
  132. sfinfo.frames = 0 ;
  133. sfinfo.format = typemajor | SF_FORMAT_PCM_16 ;
  134. frames = BUFFER_LEN / sfinfo.channels ;
  135. file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
  136. /* Write stuff at start of file. */
  137. sf_set_string (file, SF_STR_TITLE, filename) ;
  138. sf_set_string (file, SF_STR_SOFTWARE, software) ;
  139. sf_set_string (file, SF_STR_ARTIST, artist) ;
  140. /* Write data to file. */
  141. test_write_short_or_die (file, 0, data_out, BUFFER_LEN, __LINE__) ;
  142. test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
  143. /* Write more stuff at end of file. */
  144. sf_set_string (file, SF_STR_COPYRIGHT, copyright) ;
  145. sf_set_string (file, SF_STR_COMMENT, comment) ;
  146. sf_set_string (file, SF_STR_DATE, date) ;
  147. sf_set_string (file, SF_STR_ALBUM, album) ;
  148. sf_set_string (file, SF_STR_LICENSE, license) ;
  149. sf_close (file) ;
  150. file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
  151. check_log_buffer_or_die (file, __LINE__) ;
  152. if (sfinfo.frames != BUFFER_LEN)
  153. { printf ("***** Bad frame count %d (should be %d)nn", (int) sfinfo.frames, BUFFER_LEN) ;
  154. errors ++ ;
  155. } ;
  156. cptr = sf_get_string (file, SF_STR_TITLE) ;
  157. if (cptr == NULL || strcmp (filename, cptr) != 0)
  158. { if (errors++ == 0)
  159. puts ("n") ;
  160. printf ("    Bad filename  : %sn", cptr) ;
  161. } ;
  162. cptr = sf_get_string (file, SF_STR_COPYRIGHT) ;
  163. if (cptr == NULL || strcmp (copyright, cptr) != 0)
  164. { if (errors++ == 0)
  165. puts ("n") ;
  166. printf ("    Bad copyright : %sn", cptr) ;
  167. } ;
  168. cptr = sf_get_string (file, SF_STR_SOFTWARE) ;
  169. if (cptr == NULL || strstr (cptr, software) != cptr)
  170. { if (errors++ == 0)
  171. puts ("n") ;
  172. printf ("    Bad software  : %sn", cptr) ;
  173. } ;
  174. if (str_count (cptr, "libsndfile") != 1)
  175. { if (errors++ == 0)
  176. puts ("n") ;
  177. printf ("    Bad software  : %sn", cptr) ;
  178. } ;
  179. cptr = sf_get_string (file, SF_STR_ARTIST) ;
  180. if (cptr == NULL || strcmp (artist, cptr) != 0)
  181. { if (errors++ == 0)
  182. puts ("n") ;
  183. printf ("    Bad artist    : %sn", cptr) ;
  184. } ;
  185. cptr = sf_get_string (file, SF_STR_COMMENT) ;
  186. if (cptr == NULL || strcmp (comment, cptr) != 0)
  187. { if (errors++ == 0)
  188. puts ("n") ;
  189. printf ("    Bad comment   : %sn", cptr) ;
  190. } ;
  191. if (typemajor != SF_FORMAT_AIFF)
  192. { cptr = sf_get_string (file, SF_STR_DATE) ;
  193. if (cptr == NULL || strcmp (date, cptr) != 0)
  194. { if (errors++ == 0)
  195. puts ("n") ;
  196. printf ("    Bad date      : %sn", cptr) ;
  197. } ;
  198. } ;
  199. switch (typemajor)
  200. { case SF_FORMAT_AIFF :
  201. case SF_FORMAT_WAV :
  202. case SF_FORMAT_WAVEX :
  203. case SF_ENDIAN_BIG | SF_FORMAT_WAV :
  204. break ;
  205. default :
  206. cptr = sf_get_string (file, SF_STR_ALBUM) ;
  207. if (cptr == NULL || strcmp (album, cptr) != 0)
  208. { if (errors++ == 0)
  209. puts ("n") ;
  210. printf ("    Bad album   : %sn", cptr) ;
  211. } ;
  212. cptr = sf_get_string (file, SF_STR_LICENSE) ;
  213. if (cptr == NULL || strcmp (license, cptr) != 0)
  214. { if (errors++ == 0)
  215. puts ("n") ;
  216. printf ("    Bad license : %sn", cptr) ;
  217. } ;
  218. break ;
  219. } ;
  220. if (errors > 0)
  221. { printf ("n*** Error count : %d ***nn", errors) ;
  222. dump_log_buffer (file) ;
  223. exit (1) ;
  224. } ;
  225. sf_close (file) ;
  226. unlink (filename) ;
  227. puts ("ok") ;
  228. } /* string_start_end_test */
  229. static void
  230. string_start_test (const char *filename, int typemajor)
  231. { const char *cptr ;
  232. SNDFILE *file ;
  233. SF_INFO sfinfo ;
  234. int frames, errors = 0 ;
  235. print_test_name ("string_start_test", filename) ;
  236. sfinfo.samplerate = 44100 ;
  237. sfinfo.channels = 1 ;
  238. sfinfo.frames = 0 ;
  239. switch (typemajor)
  240. { case SF_FORMAT_OGG :
  241. sfinfo.format = typemajor | SF_FORMAT_VORBIS ;
  242. break ;
  243. default :
  244. sfinfo.format = typemajor | SF_FORMAT_PCM_16 ;
  245. break ;
  246. } ;
  247. frames = BUFFER_LEN / sfinfo.channels ;
  248. file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
  249. /* Write stuff at start of file. */
  250. sf_set_string (file, SF_STR_TITLE, filename) ;
  251. sf_set_string (file, SF_STR_SOFTWARE, software) ;
  252. sf_set_string (file, SF_STR_ARTIST, artist) ;
  253. sf_set_string (file, SF_STR_COPYRIGHT, copyright) ;
  254. sf_set_string (file, SF_STR_COMMENT, comment) ;
  255. sf_set_string (file, SF_STR_DATE, date) ;
  256. sf_set_string (file, SF_STR_ALBUM, album) ;
  257. sf_set_string (file, SF_STR_LICENSE, license) ;
  258. /* Write data to file. */
  259. test_write_short_or_die (file, 0, data_out, BUFFER_LEN, __LINE__) ;
  260. sf_close (file) ;
  261. file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
  262. check_log_buffer_or_die (file, __LINE__) ;
  263. if (sfinfo.frames != BUFFER_LEN)
  264. { printf ("***** Bad frame count %d (should be %d)nn", (int) sfinfo.frames, BUFFER_LEN) ;
  265. errors ++ ;
  266. } ;
  267. cptr = sf_get_string (file, SF_STR_TITLE) ;
  268. if (cptr == NULL || strcmp (filename, cptr) != 0)
  269. { if (errors++ == 0)
  270. puts ("n") ;
  271. printf ("    Bad filename  : %sn", cptr) ;
  272. } ;
  273. cptr = sf_get_string (file, SF_STR_COPYRIGHT) ;
  274. if (cptr == NULL || strcmp (copyright, cptr) != 0)
  275. { if (errors++ == 0)
  276. puts ("n") ;
  277. printf ("    Bad copyright : %sn", cptr) ;
  278. } ;
  279. cptr = sf_get_string (file, SF_STR_SOFTWARE) ;
  280. if (cptr == NULL || strstr (cptr, software) != cptr)
  281. { if (errors++ == 0)
  282. puts ("n") ;
  283. printf ("    Bad software  : %sn", cptr) ;
  284. } ;
  285. if (str_count (cptr, "libsndfile") != 1)
  286. { if (errors++ == 0)
  287. puts ("n") ;
  288. printf ("    Bad software  : %sn", cptr) ;
  289. } ;
  290. cptr = sf_get_string (file, SF_STR_ARTIST) ;
  291. if (cptr == NULL || strcmp (artist, cptr) != 0)
  292. { if (errors++ == 0)
  293. puts ("n") ;
  294. printf ("    Bad artist    : %sn", cptr) ;
  295. } ;
  296. cptr = sf_get_string (file, SF_STR_COMMENT) ;
  297. if (cptr == NULL || strcmp (comment, cptr) != 0)
  298. { if (errors++ == 0)
  299. puts ("n") ;
  300. printf ("    Bad comment   : %sn", cptr) ;
  301. } ;
  302. if (typemajor != SF_FORMAT_AIFF)
  303. { cptr = sf_get_string (file, SF_STR_DATE) ;
  304. if (cptr == NULL || strcmp (date, cptr) != 0)
  305. { if (errors++ == 0)
  306. puts ("n") ;
  307. printf ("    Bad date      : %sn", cptr) ;
  308. } ;
  309. } ;
  310. if (typemajor != SF_FORMAT_WAV && typemajor != SF_FORMAT_AIFF)
  311. { cptr = sf_get_string (file, SF_STR_ALBUM) ;
  312. if (cptr == NULL || strcmp (album, cptr) != 0)
  313. { if (errors++ == 0)
  314. puts ("n") ;
  315. printf ("    Bad album     : %sn", cptr) ;
  316. } ;
  317. } ;
  318. if (typemajor != SF_FORMAT_WAV && typemajor != SF_FORMAT_AIFF)
  319. { cptr = sf_get_string (file, SF_STR_LICENSE) ;
  320. if (cptr == NULL || strcmp (license, cptr) != 0)
  321. { if (errors++ == 0)
  322. puts ("n") ;
  323. printf ("    Bad license   : %sn", cptr) ;
  324. } ;
  325. } ;
  326. if (errors > 0)
  327. { printf ("n*** Error count : %d ***nn", errors) ;
  328. dump_log_buffer (file) ;
  329. exit (1) ;
  330. } ;
  331. sf_close (file) ;
  332. unlink (filename) ;
  333. puts ("ok") ;
  334. } /* string_start_test */
  335. static void
  336. string_multi_set_test (const char *filename, int typemajor)
  337. { static const char
  338. new_software [] = "new software (libsndfile-X.Y.Z)",
  339. new_copyright [] = "Copyright (c) 2001 New Artist",
  340. new_artist [] = "The New Artist",
  341. new_title [] = "This is the new title" ;
  342. static char buffer [2048] ;
  343. SNDFILE *file ;
  344. SF_INFO sfinfo ;
  345. int count ;
  346. print_test_name (__func__, filename) ;
  347. sfinfo.format = typemajor | SF_FORMAT_PCM_16 ;
  348. sfinfo.samplerate = 44100 ;
  349. sfinfo.channels = 1 ;
  350. sfinfo.frames = 0 ;
  351. file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
  352. /* Write stuff at start of file. */
  353. sf_set_string (file, SF_STR_TITLE, title) ;
  354. sf_set_string (file, SF_STR_SOFTWARE, software) ;
  355. sf_set_string (file, SF_STR_ARTIST, artist) ;
  356. /* Write data to file. */
  357. test_write_short_or_die (file, 0, data_out, BUFFER_LEN, __LINE__) ;
  358. /* Write it all again. */
  359. sf_set_string (file, SF_STR_TITLE, new_title) ;
  360. sf_set_string (file, SF_STR_SOFTWARE, new_software) ;
  361. sf_set_string (file, SF_STR_ARTIST, new_artist) ;
  362. sf_set_string (file, SF_STR_COPYRIGHT, copyright) ;
  363. sf_set_string (file, SF_STR_COMMENT, comment) ;
  364. sf_set_string (file, SF_STR_DATE, date) ;
  365. sf_set_string (file, SF_STR_ALBUM, album) ;
  366. sf_set_string (file, SF_STR_LICENSE, license) ;
  367. sf_set_string (file, SF_STR_COPYRIGHT, new_copyright) ;
  368. sf_set_string (file, SF_STR_COMMENT, comment) ;
  369. sf_set_string (file, SF_STR_DATE, date) ;
  370. sf_set_string (file, SF_STR_ALBUM, album) ;
  371. sf_set_string (file, SF_STR_LICENSE, license) ;
  372. sf_close (file) ;
  373. file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
  374. sf_command (file, SFC_GET_LOG_INFO, buffer, sizeof (buffer)) ;
  375. sf_close (file) ;
  376. count = str_count (buffer, new_title) ;
  377. exit_if_true (count < 1, "nnLine %d : Could not find new_title in :n%sn", __LINE__, buffer) ;
  378. exit_if_true (count > 1, "nnLine %d : new_title appears %d times in :nn%sn", __LINE__, count, buffer) ;
  379. count = str_count (buffer, software) ;
  380. exit_if_true (count < 1, "nnLine %d : Could not find new_software in :n%sn", __LINE__, buffer) ;
  381. exit_if_true (count > 1, "nnLine %d : new_software appears %d times in :nn%sn", __LINE__, count, buffer) ;
  382. count = str_count (buffer, new_artist) ;
  383. exit_if_true (count < 1, "nnLine %d : Could not find new_artist in :n%sn", __LINE__, buffer) ;
  384. exit_if_true (count > 1, "nnLine %d : new_artist appears %d times in :nn%sn", __LINE__, count, buffer) ;
  385. count = str_count (buffer, new_copyright) ;
  386. exit_if_true (count < 1, "nnLine %d : Could not find new_copyright in :n%sn", __LINE__, buffer) ;
  387. exit_if_true (count > 1, "nnLine %d : new_copyright appears %d times in :nn%sn", __LINE__, count, buffer) ;
  388. unlink (filename) ;
  389. puts ("ok") ;
  390. } /* string_multi_set_test */
  391. static void
  392. string_rdwr_test (const char *filename, int typemajor)
  393. { SNDFILE *file ;
  394. SF_INFO sfinfo ;
  395. sf_count_t frames ;
  396. const char * str ;
  397. print_test_name (__func__, filename) ;
  398. create_short_sndfile (filename, typemajor | SF_FORMAT_PCM_16, 2) ;
  399. memset (&sfinfo, 0, sizeof (sfinfo)) ;
  400. file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_FALSE, __LINE__) ;
  401. frames = sfinfo.frames ;
  402. sf_set_string (file, SF_STR_TITLE, title) ;
  403. sf_close (file) ;
  404. file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ;
  405. exit_if_true (frames != sfinfo.frames, "nnLine %d : Frame count %lld should be %lld.n", __LINE__, sfinfo.frames, frames) ;
  406. str = sf_get_string (file, SF_STR_TITLE) ;
  407. exit_if_true (str == NULL, "nnLine %d : SF_STR_TITLE string is NULL.n", __LINE__) ;
  408. exit_if_true (strcmp (str, title) != 0, "nnLine %d : SF_STR_TITLE doesn't match what was written.n", __LINE__) ;
  409. sf_close (file) ;
  410. file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_FALSE, __LINE__) ;
  411. frames = sfinfo.frames ;
  412. sf_set_string (file, SF_STR_TITLE, title) ;
  413. sf_close (file) ;
  414. file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_FALSE, __LINE__) ;
  415. str = sf_get_string (file, SF_STR_TITLE) ;
  416. exit_if_true (str == NULL, "nnLine %d : SF_STR_TITLE string is NULL.n", __LINE__) ;
  417. sf_set_string (file, SF_STR_ARTIST, artist) ;
  418. sf_close (file) ;
  419. file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ;
  420. str = sf_get_string (file, SF_STR_ARTIST) ;
  421. exit_if_true (str == NULL, "nnLine %d : SF_STR_ARTIST string is NULL.n", __LINE__) ;
  422. exit_if_true (strcmp (str, artist) != 0, "nnLine %d : SF_STR_ARTIST doesn't match what was written.n", __LINE__) ;
  423. str = sf_get_string (file, SF_STR_TITLE) ;
  424. exit_if_true (str == NULL, "nnLine %d : SF_STR_TITLE string is NULL.n", __LINE__) ;
  425. exit_if_true (strcmp (str, title) != 0, "nnLine %d : SF_STR_TITLE doesn't match what was written.n", __LINE__) ;
  426. exit_if_true (frames != sfinfo.frames, "nnLine %d : Frame count %lld should be %lld.n", __LINE__, sfinfo.frames, frames) ;
  427. sf_close (file) ;
  428. unlink (filename) ;
  429. puts ("ok") ;
  430. } /* string_rdwr_test */
  431. static void
  432. string_short_rdwr_test (const char *filename, int typemajor)
  433. { SNDFILE *file ;
  434. SF_INFO sfinfo ;
  435. sf_count_t frames = BUFFER_LEN ;
  436. const char * str ;
  437. print_test_name (__func__, filename) ;
  438. memset (&sfinfo, 0, sizeof (sfinfo)) ;
  439. sfinfo.format = typemajor | SF_FORMAT_PCM_16 ;
  440. sfinfo.samplerate = 44100 ;
  441. sfinfo.channels = 1 ;
  442. sfinfo.frames = 0 ;
  443. file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ;
  444. /* Write data to file. */
  445. test_write_short_or_die (file, 0, data_out, BUFFER_LEN, __LINE__) ;
  446. sf_set_string (file, SF_STR_TITLE, long_title) ;
  447. sf_set_string (file, SF_STR_ARTIST, long_artist) ;
  448. sf_close (file) ;
  449. /* Open the file RDWR. */
  450. file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_FALSE, __LINE__) ;
  451. exit_if_true (frames != sfinfo.frames, "nnLine %d : Frame count %lld should be %lld.n", __LINE__, sfinfo.frames, frames) ;
  452. str = sf_get_string (file, SF_STR_TITLE) ;
  453. exit_if_true (str == NULL, "nnLine %d : SF_STR_TITLE string is NULL.n", __LINE__) ;
  454. exit_if_true (strcmp (str, long_title) != 0, "nnLine %d : SF_STR_TITLE doesn't match what was written.n", __LINE__) ;
  455. str = sf_get_string (file, SF_STR_ARTIST) ;
  456. exit_if_true (str == NULL, "nnLine %d : SF_STR_TITLE string is NULL.n", __LINE__) ;
  457. exit_if_true (strcmp (str, long_artist) != 0, "nnLine %d : SF_STR_ARTIST doesn't match what was written.n", __LINE__) ;
  458. /* Change title and artist. */
  459. sf_set_string (file, SF_STR_TITLE, title) ;
  460. sf_set_string (file, SF_STR_ARTIST, artist) ;
  461. sf_close (file) ;
  462. file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ;
  463. check_log_buffer_or_die (file, __LINE__) ;
  464. str = sf_get_string (file, SF_STR_TITLE) ;
  465. exit_if_true (str == NULL, "nnLine %d : SF_STR_TITLE string is NULL.n", __LINE__) ;
  466. exit_if_true (strcmp (str, title) != 0, "nnLine %d : SF_STR_TITLE doesn't match what was written.n", __LINE__) ;
  467. str = sf_get_string (file, SF_STR_ARTIST) ;
  468. exit_if_true (str == NULL, "nnLine %d : SF_STR_ARTIST string is NULL.n", __LINE__) ;
  469. exit_if_true (strcmp (str, artist) != 0, "nnLine %d : SF_STR_ARTIST doesn't match what was written.n", __LINE__) ;
  470. sf_close (file) ;
  471. unlink (filename) ;
  472. puts ("ok") ;
  473. } /* string_short_rdwr_test */
  474. static int
  475. str_count (const char * haystack, const char * needle)
  476. { int count = 0 ;
  477. while ((haystack = strstr (haystack, needle)) != NULL)
  478. { count ++ ;
  479. haystack ++ ;
  480. } ;
  481. return count ;
  482. } /* str_count */