annotate src/libsndfile-1.0.27/regtest/database.c @ 169:223a55898ab9 tip default

Add null config files
author Chris Cannam <cannam@all-day-breakfast.com>
date Mon, 02 Mar 2020 14:03:47 +0000
parents cd6cdf86811e
children
rev   line source
cannam@125 1 /*
cannam@125 2 ** Copyright (C) 2005-2011 Erik de Castro Lopo
cannam@125 3 **
cannam@125 4 ** This program is free software; you can redistribute it and/or modify
cannam@125 5 ** it under the terms of the GNU General Public License as published by
cannam@125 6 ** the Free Software Foundation; either version 2 of the License, or
cannam@125 7 ** (at your option) any later version.
cannam@125 8 **
cannam@125 9 ** This program is distributed in the hope that it will be useful,
cannam@125 10 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
cannam@125 11 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
cannam@125 12 ** GNU General Public License for more details.
cannam@125 13 **
cannam@125 14 ** You should have received a copy of the GNU General Public License
cannam@125 15 ** along with this program; if not, write to the Free Software
cannam@125 16 ** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
cannam@125 17 */
cannam@125 18
cannam@125 19 #include "config.h"
cannam@125 20
cannam@125 21 #include <stdio.h>
cannam@125 22 #include <stdlib.h>
cannam@125 23 #include <unistd.h>
cannam@125 24 #include <string.h>
cannam@125 25 #include <fcntl.h>
cannam@125 26 #include <sys/stat.h>
cannam@125 27
cannam@125 28 #include <sndfile.h>
cannam@125 29
cannam@125 30 #include "regtest.h"
cannam@125 31
cannam@125 32 #if HAVE_SQLITE3
cannam@125 33
cannam@125 34 #include <sqlite3.h>
cannam@125 35
cannam@125 36 typedef struct
cannam@125 37 { sqlite3 *sql ;
cannam@125 38
cannam@125 39 int count ;
cannam@125 40 int ekey_max ;
cannam@125 41
cannam@125 42 /* Filename and pathname for file. */
cannam@125 43 char filename [256] ;
cannam@125 44 char pathname [512] ;
cannam@125 45
cannam@125 46 /* Storage for createding SQL commands. Must be larger than logbuf below. */
cannam@125 47 char cmdbuf [1 << 15] ;
cannam@125 48
cannam@125 49 /* Storage for log buffer retrieved from SNDFILE* .*/
cannam@125 50 char logbuf [1 << 14] ;
cannam@125 51
cannam@125 52 } REGTEST_DB ;
cannam@125 53
cannam@125 54 /* In checksum.c */
cannam@125 55 int calc_checksum (SNDFILE * file, const SF_INFO * info) ;
cannam@125 56
cannam@125 57 static void get_filename_pathname (REGTEST_DB * db, const char *filepath) ;
cannam@125 58 static void single_quote_replace (char * buf) ;
cannam@125 59
cannam@125 60 static int get_ekey_from_filename (REGTEST_DB * db, const char *filepath) ;
cannam@125 61 static int get_filename_pathname_by_ekey (REGTEST_DB * db, int ekey) ;
cannam@125 62 static int check_file_by_ekey (REGTEST_DB * db, int ekey) ;
cannam@125 63
cannam@125 64 static int count_callback (REGTEST_DB * db, int argc, char **argv, char **colname) ;
cannam@125 65 static int ekey_max_callback (REGTEST_DB * db, int argc, char **argv, char **colname) ;
cannam@125 66 static int callback (void *unused, int argc, char **argv, char **colname) ;
cannam@125 67
cannam@125 68 REG_DB *
cannam@125 69 db_open (const char * db_name)
cannam@125 70 { REGTEST_DB * db ;
cannam@125 71 int err ;
cannam@125 72
cannam@125 73 if ((db = malloc (sizeof (REGTEST_DB))) == NULL)
cannam@125 74 { perror ("malloc") ;
cannam@125 75 exit (1) ;
cannam@125 76 } ;
cannam@125 77
cannam@125 78 if ((err = sqlite3_open (db_name, &(db->sql))) != 0)
cannam@125 79 { printf ("Can't open database: %s\n", sqlite3_errmsg (db->sql)) ;
cannam@125 80 sqlite3_close (db->sql) ;
cannam@125 81 free (db) ;
cannam@125 82 exit (1) ;
cannam@125 83 } ;
cannam@125 84
cannam@125 85 return (REG_DB *) db ;
cannam@125 86 } /* db_open */
cannam@125 87
cannam@125 88 int
cannam@125 89 db_create (const char * db_name)
cannam@125 90 { REGTEST_DB * db ;
cannam@125 91 const char *cmd ;
cannam@125 92 char * errmsg = NULL ;
cannam@125 93 int err ;
cannam@125 94
cannam@125 95 db = (REGTEST_DB *) db_open (db_name) ;
cannam@125 96
cannam@125 97 cmd = "create table sndfile (ekey INTEGER PRIMARY KEY,"
cannam@125 98 "fname VARCHAR(1),"
cannam@125 99 "fpath VARCHAR(1),"
cannam@125 100 "srate INTEGER,"
cannam@125 101 "frames VARCHAR(1),"
cannam@125 102 "channels INTEGER,"
cannam@125 103 "format VARCHAR(1),"
cannam@125 104 "checksum VARCHAR(1),"
cannam@125 105 "logbuf VARCHAR(1)"
cannam@125 106 ");" ;
cannam@125 107
cannam@125 108 err = sqlite3_exec (db->sql, cmd, callback, 0, &errmsg) ;
cannam@125 109 if (err != SQLITE_OK)
cannam@125 110 printf ("Line %d : SQL error: %s\n", __LINE__, errmsg) ;
cannam@125 111
cannam@125 112 sqlite3_close (db->sql) ;
cannam@125 113 free (db) ;
cannam@125 114
cannam@125 115 return 0 ;
cannam@125 116 } /* db_create */
cannam@125 117
cannam@125 118 int
cannam@125 119 db_close (REG_DB * db_handle)
cannam@125 120 { REGTEST_DB * db ;
cannam@125 121
cannam@125 122 db = (REGTEST_DB *) db_handle ;
cannam@125 123
cannam@125 124 sqlite3_close (db->sql) ;
cannam@125 125 free (db) ;
cannam@125 126
cannam@125 127 return 0 ;
cannam@125 128 } /* db_close */
cannam@125 129
cannam@125 130 /*==============================================================================
cannam@125 131 */
cannam@125 132
cannam@125 133 int
cannam@125 134 db_file_exists (REG_DB * db_handle, const char * filename)
cannam@125 135 { REGTEST_DB * db ;
cannam@125 136 const char * cptr ;
cannam@125 137 char * errmsg ;
cannam@125 138 int err ;
cannam@125 139
cannam@125 140 db = (REGTEST_DB *) db_handle ;
cannam@125 141
cannam@125 142 if ((cptr = strrchr (filename, '/')) != NULL)
cannam@125 143 filename = cptr + 1 ;
cannam@125 144
cannam@125 145 snprintf (db->cmdbuf, sizeof (db->cmdbuf), "select fname from sndfile where fname='%s'", filename) ;
cannam@125 146
cannam@125 147 db->count = 0 ;
cannam@125 148 err = sqlite3_exec (db->sql, db->cmdbuf, (sqlite3_callback) count_callback, db, &errmsg) ;
cannam@125 149 if (err == 0 && db->count == 1)
cannam@125 150 return 1 ;
cannam@125 151
cannam@125 152 return 0 ;
cannam@125 153 } /* db_file_exists */
cannam@125 154
cannam@125 155 int
cannam@125 156 db_add_file (REG_DB * db_handle, const char * filepath)
cannam@125 157 { REGTEST_DB * db ;
cannam@125 158 SNDFILE * sndfile ;
cannam@125 159 SF_INFO info ;
cannam@125 160 char * errmsg ;
cannam@125 161 int err, checksum ;
cannam@125 162
cannam@125 163 db = (REGTEST_DB *) db_handle ;
cannam@125 164
cannam@125 165 get_filename_pathname (db, filepath) ;
cannam@125 166
cannam@125 167 if (db_file_exists (db_handle, filepath))
cannam@125 168 { printf (" %s : already in database\n", db->filename) ;
cannam@125 169 return 0 ;
cannam@125 170 } ;
cannam@125 171
cannam@125 172 memset (&info, 0, sizeof (info)) ;
cannam@125 173 sndfile = sf_open (db->pathname, SFM_READ, &info) ;
cannam@125 174 sf_command (sndfile, SFC_GET_LOG_INFO, db->logbuf, sizeof (db->logbuf)) ;
cannam@125 175 checksum = (sndfile == NULL) ? 0 : calc_checksum (sndfile, &info) ;
cannam@125 176 sf_close (sndfile) ;
cannam@125 177
cannam@125 178 if (sndfile == NULL)
cannam@125 179 { printf (" %s : could not open : %s\n", db->filename, sf_strerror (NULL)) ;
cannam@125 180 puts (db->logbuf) ;
cannam@125 181 return 1 ;
cannam@125 182 } ;
cannam@125 183
cannam@125 184 single_quote_replace (db->logbuf) ;
cannam@125 185
cannam@125 186 snprintf (db->cmdbuf, sizeof (db->cmdbuf), "insert into sndfile "
cannam@125 187 "(fname, fpath, srate, frames, channels, format, checksum, logbuf) values"
cannam@125 188 "('%s','%s',%d,'%ld', %d, '0x%08x', '0x%08x', '%s');",
cannam@125 189 db->filename, db->pathname, info.samplerate, (long) info.frames, info.channels, info.format, checksum, db->logbuf) ;
cannam@125 190
cannam@125 191 if (strlen (db->cmdbuf) >= sizeof (db->cmdbuf) - 1)
cannam@125 192 { printf ("strlen (db->cmdbuf) too long.\n") ;
cannam@125 193 exit (1) ;
cannam@125 194 } ;
cannam@125 195
cannam@125 196 err = sqlite3_exec (db->sql, db->cmdbuf, callback, 0, &errmsg) ;
cannam@125 197 if (err != SQLITE_OK)
cannam@125 198 { printf ("Line %d : SQL error: %s\n", __LINE__, errmsg) ;
cannam@125 199 puts (db->cmdbuf) ;
cannam@125 200 } ;
cannam@125 201
cannam@125 202 return 0 ;
cannam@125 203 } /* db_add_file */
cannam@125 204
cannam@125 205 int
cannam@125 206 db_check_file (REG_DB * db_handle, const char * filepath)
cannam@125 207 { REGTEST_DB * db ;
cannam@125 208 int ekey ;
cannam@125 209
cannam@125 210 if (db_file_exists (db_handle, filepath) == 0)
cannam@125 211 { printf ("\nFile not in database.\n\n") ;
cannam@125 212 exit (0) ;
cannam@125 213 } ;
cannam@125 214
cannam@125 215 db = (REGTEST_DB *) db_handle ;
cannam@125 216
cannam@125 217 ekey = get_ekey_from_filename (db, filepath) ;
cannam@125 218
cannam@125 219 return check_file_by_ekey (db, ekey) ;
cannam@125 220 } /* db_check_file */
cannam@125 221
cannam@125 222 /*==============================================================================
cannam@125 223 */
cannam@125 224
cannam@125 225 int
cannam@125 226 db_check_all (REG_DB * db_handle)
cannam@125 227 { REGTEST_DB * db ;
cannam@125 228 char * errmsg ;
cannam@125 229 int err, ekey ;
cannam@125 230
cannam@125 231 db = (REGTEST_DB *) db_handle ;
cannam@125 232
cannam@125 233 db->ekey_max = 0 ;
cannam@125 234
cannam@125 235 snprintf (db->cmdbuf, sizeof (db->cmdbuf), "select ekey from sndfile") ;
cannam@125 236
cannam@125 237 err = sqlite3_exec (db->sql, db->cmdbuf, (sqlite3_callback) ekey_max_callback, db, &errmsg) ;
cannam@125 238 if (err != SQLITE_OK)
cannam@125 239 { printf ("Line %d : SQL error: %s\n", __LINE__, errmsg) ;
cannam@125 240 puts (db->cmdbuf) ;
cannam@125 241 } ;
cannam@125 242
cannam@125 243 for (ekey = 1 ; ekey <= db->ekey_max ; ekey++)
cannam@125 244 if (get_filename_pathname_by_ekey (db, ekey) != 0)
cannam@125 245 check_file_by_ekey (db, ekey) ;
cannam@125 246
cannam@125 247 return 0 ;
cannam@125 248 } /* db_check_all */
cannam@125 249
cannam@125 250
cannam@125 251 int
cannam@125 252 db_list_all (REG_DB * db_handle)
cannam@125 253 {
cannam@125 254 printf ("%s : %p\n", __func__, db_handle) ;
cannam@125 255 return 0 ;
cannam@125 256 } /* db_list_all */
cannam@125 257
cannam@125 258 int
cannam@125 259 db_del_entry (REG_DB * db_handle, const char * entry)
cannam@125 260 {
cannam@125 261 printf ("%s : %p %s\n", __func__, db_handle, entry) ;
cannam@125 262 return 0 ;
cannam@125 263 } /* db_del_entry */
cannam@125 264
cannam@125 265 /*==============================================================================
cannam@125 266 */
cannam@125 267
cannam@125 268 static int
cannam@125 269 get_ekey_from_filename (REGTEST_DB * db, const char *filepath)
cannam@125 270 { char * errmsg, **result ;
cannam@125 271 int err, ekey = 0, rows, cols ;
cannam@125 272
cannam@125 273 get_filename_pathname (db, filepath) ;
cannam@125 274
cannam@125 275 snprintf (db->cmdbuf, sizeof (db->cmdbuf), "select ekey from sndfile where fname='%s'", db->filename) ;
cannam@125 276
cannam@125 277 err = sqlite3_get_table (db->sql, db->cmdbuf, &result, &rows, &cols, &errmsg) ;
cannam@125 278 if (err != SQLITE_OK)
cannam@125 279 { printf ("Line %d : SQL error: %s\n", __LINE__, errmsg) ;
cannam@125 280 puts (db->cmdbuf) ;
cannam@125 281 } ;
cannam@125 282
cannam@125 283 if (cols != 1 || rows != 1)
cannam@125 284 { printf ("Bad juju!! rows = %d cols = %d\n", rows, cols) ;
cannam@125 285 exit (1) ;
cannam@125 286 } ;
cannam@125 287
cannam@125 288 ekey = strtol (result [1], NULL, 10) ;
cannam@125 289
cannam@125 290 sqlite3_free_table (result) ;
cannam@125 291
cannam@125 292 return ekey ;
cannam@125 293 } /* get_ekey_from_filename */
cannam@125 294
cannam@125 295 static int
cannam@125 296 get_filename_pathname_by_ekey (REGTEST_DB * db, int ekey)
cannam@125 297 { char *errmsg, **result ;
cannam@125 298 int err, rows, cols ;
cannam@125 299
cannam@125 300 snprintf (db->cmdbuf, sizeof (db->cmdbuf), "select fname,fpath from sndfile where ekey='%d'", ekey) ;
cannam@125 301
cannam@125 302 err = sqlite3_get_table (db->sql, db->cmdbuf, &result, &rows, &cols, &errmsg) ;
cannam@125 303 if (err != SQLITE_OK)
cannam@125 304 { printf ("Line %d : SQL error: %s\n", __LINE__, errmsg) ;
cannam@125 305 puts (db->cmdbuf) ;
cannam@125 306 return 0 ;
cannam@125 307 } ;
cannam@125 308
cannam@125 309 if (cols != 2 || rows != 1)
cannam@125 310 { printf ("\nError (%s %d) : rows = %d cols = %d\n", __func__, __LINE__, rows, cols) ;
cannam@125 311 exit (1) ;
cannam@125 312 } ;
cannam@125 313
cannam@125 314 snprintf (db->filename, sizeof (db->filename), "%s", result [2]) ;
cannam@125 315 snprintf (db->pathname, sizeof (db->pathname), "%s", result [3]) ;
cannam@125 316
cannam@125 317 sqlite3_free_table (result) ;
cannam@125 318
cannam@125 319 return 1 ;
cannam@125 320 } /* get_filename_pathname_by_ekey */
cannam@125 321
cannam@125 322 static int
cannam@125 323 check_file_by_ekey (REGTEST_DB * db, int ekey)
cannam@125 324 { SNDFILE * sndfile ;
cannam@125 325 SF_INFO info ;
cannam@125 326 char * errmsg, **result ;
cannam@125 327 int err, k, rows, cols, checksum ;
cannam@125 328
cannam@125 329 printf (" %s : ", db->filename) ;
cannam@125 330 fflush (stdout) ;
cannam@125 331
cannam@125 332 memset (&info, 0, sizeof (info)) ;
cannam@125 333 sndfile = sf_open (db->pathname, SFM_READ, &info) ;
cannam@125 334 sf_command (sndfile, SFC_GET_LOG_INFO, db->logbuf, sizeof (db->logbuf)) ;
cannam@125 335 checksum = (sndfile == NULL) ? 0 : calc_checksum (sndfile, &info) ;
cannam@125 336 sf_close (sndfile) ;
cannam@125 337
cannam@125 338 if (sndfile == NULL)
cannam@125 339 { printf ("\n\nError : Could not open '%s' : %s\n", db->pathname, sf_strerror (NULL)) ;
cannam@125 340 puts (db->logbuf) ;
cannam@125 341 exit (1) ;
cannam@125 342 } ;
cannam@125 343
cannam@125 344 single_quote_replace (db->logbuf) ;
cannam@125 345
cannam@125 346 snprintf (db->cmdbuf, sizeof (db->cmdbuf), "select fname,srate,frames,channels,format,"
cannam@125 347 "checksum,logbuf from sndfile where ekey='%d'", ekey) ;
cannam@125 348
cannam@125 349 err = sqlite3_get_table (db->sql, db->cmdbuf, &result, &rows, &cols, &errmsg) ;
cannam@125 350 if (err != SQLITE_OK)
cannam@125 351 { printf ("Line %d : SQL error: %s\n", __LINE__, errmsg) ;
cannam@125 352 puts (db->cmdbuf) ;
cannam@125 353 } ;
cannam@125 354
cannam@125 355 for (k = 0 ; k < cols ; k++)
cannam@125 356 { if (strcmp (result [k], "fname") == 0)
cannam@125 357 { if (strcmp (result [k + cols], db->filename) == 0)
cannam@125 358 continue ;
cannam@125 359 printf ("\n\nError : fname doesn't match : %s != %s\n", result [k + cols], db->filename) ;
cannam@125 360 } ;
cannam@125 361
cannam@125 362 if (strcmp (result [k], "srate") == 0)
cannam@125 363 { if (strtol (result [k + cols], NULL, 10) == info.samplerate)
cannam@125 364 continue ;
cannam@125 365 printf ("\n\nError : srate doesn't match : %s == %d\n", result [k + cols], info.samplerate) ;
cannam@125 366 } ;
cannam@125 367
cannam@125 368 if (strcmp (result [k], "frames") == 0)
cannam@125 369 { if (strtoll (result [k + cols], NULL, 10) == info.frames)
cannam@125 370 continue ;
cannam@125 371 printf ("\n\nError : frames doesn't match : %s == %ld\n", result [k + cols], (long) info.frames) ;
cannam@125 372 } ;
cannam@125 373
cannam@125 374 if (strcmp (result [k], "channels") == 0)
cannam@125 375 { if (strtol (result [k + cols], NULL, 10) == info.channels)
cannam@125 376 continue ;
cannam@125 377 printf ("\n\nError : channels doesn't match : %s == %d\n", result [k + cols], info.channels) ;
cannam@125 378 } ;
cannam@125 379
cannam@125 380 if (strcmp (result [k], "format") == 0)
cannam@125 381 { if (strtol (result [k + cols], NULL, 16) == info.format)
cannam@125 382 continue ;
cannam@125 383 printf ("\n\nError : format doesn't match : %s == 0x%08x\n", result [k + cols], info.format) ;
cannam@125 384 } ;
cannam@125 385
cannam@125 386 if (strcmp (result [k], "checksum") == 0)
cannam@125 387 { int db_val = (int) strtoll (result [k + cols], NULL, 16) ;
cannam@125 388
cannam@125 389 if (db_val == checksum)
cannam@125 390 continue ;
cannam@125 391 printf ("\n\nError : checksum doesn't match : 0x%08x == 0x%08x\n", db_val, checksum) ;
cannam@125 392 } ;
cannam@125 393
cannam@125 394 if (strcmp (result [k], "logbuf") == 0)
cannam@125 395 continue ;
cannam@125 396
cannam@125 397 printf ("\nHere is the old logubuffer :\n\n%s\n\nand the new :\n\n%s\n\n", result [2 * cols - 1], db->logbuf) ;
cannam@125 398 exit (1) ;
cannam@125 399 } ;
cannam@125 400
cannam@125 401 sqlite3_free_table (result) ;
cannam@125 402
cannam@125 403 puts ("ok") ;
cannam@125 404
cannam@125 405 return 0 ;
cannam@125 406 } /* check_file_by_ekey */
cannam@125 407
cannam@125 408 /*==============================================================================
cannam@125 409 */
cannam@125 410
cannam@125 411 static void
cannam@125 412 get_filename_pathname (REGTEST_DB * db, const char *filepath)
cannam@125 413 { const char * cptr ;
cannam@125 414 int slen ;
cannam@125 415
cannam@125 416 if (filepath [0] != '/')
cannam@125 417 { memset (db->pathname, 0, sizeof (db->pathname)) ;
cannam@125 418 if (getcwd (db->pathname, sizeof (db->pathname)) == NULL)
cannam@125 419 { perror ("\ngetcwd failed") ;
cannam@125 420 exit (1) ;
cannam@125 421 } ;
cannam@125 422
cannam@125 423 slen = strlen (db->pathname) ;
cannam@125 424 db->pathname [slen ++] = '/' ;
cannam@125 425 snprintf (db->pathname + slen, sizeof (db->pathname) - slen, "%s", filepath) ;
cannam@125 426 }
cannam@125 427 else
cannam@125 428 snprintf (db->pathname, sizeof (db->pathname), "%s", filepath) ;
cannam@125 429
cannam@125 430 if ((cptr = strrchr (db->pathname, '/')) == NULL)
cannam@125 431 { printf ("\nError : bad pathname %s\n", filepath) ;
cannam@125 432 exit (1) ;
cannam@125 433 } ;
cannam@125 434
cannam@125 435 snprintf (db->filename, sizeof (db->filename), "%s", cptr + 1) ;
cannam@125 436 } /* get filename_pathname */
cannam@125 437
cannam@125 438 static void
cannam@125 439 single_quote_replace (char * buf)
cannam@125 440 { while ((buf = strchr (buf, '\'')) != 0)
cannam@125 441 buf [0] = '"' ;
cannam@125 442 } /* single_quote_replace */
cannam@125 443
cannam@125 444 static int
cannam@125 445 count_callback (REGTEST_DB * db, int argc, char **argv, char **colname)
cannam@125 446 { db->count ++ ;
cannam@125 447
cannam@125 448 (void) argc ;
cannam@125 449 (void) argv ;
cannam@125 450 (void) colname ;
cannam@125 451 return 0 ;
cannam@125 452 } /* count_callback */
cannam@125 453
cannam@125 454 static int
cannam@125 455 ekey_max_callback (REGTEST_DB * db, int argc, char **argv, char **unused)
cannam@125 456 { int ekey ;
cannam@125 457
cannam@125 458 (void) argc ;
cannam@125 459 (void) unused ;
cannam@125 460
cannam@125 461 ekey = strtol (argv [0], NULL, 10) ;
cannam@125 462 if (ekey > db->ekey_max)
cannam@125 463 db->ekey_max = ekey ;
cannam@125 464
cannam@125 465 return 0 ;
cannam@125 466 } /* ekey_max_callback */
cannam@125 467
cannam@125 468 static int
cannam@125 469 callback (void *unused, int argc, char **argv, char **colname)
cannam@125 470 { int k ;
cannam@125 471
cannam@125 472 (void) unused ;
cannam@125 473
cannam@125 474 for (k = 0 ; k < argc ; k++)
cannam@125 475 printf ("%s = %s\n", colname [k], argv [k] ? argv [k] : "NULL") ;
cannam@125 476
cannam@125 477 printf ("\n") ;
cannam@125 478
cannam@125 479 return 0 ;
cannam@125 480 } /* callback */
cannam@125 481
cannam@125 482 #else
cannam@125 483
cannam@125 484 int dummy (void) ;
cannam@125 485
cannam@125 486 int
cannam@125 487 dummy (void)
cannam@125 488 { /*
cannam@125 489 ** Empty dummy fnction so tha compiler doesn't winge about an
cannam@125 490 ** empty file.
cannam@125 491 */
cannam@125 492 return 0 ;
cannam@125 493 } /* dummy */
cannam@125 494
cannam@125 495 #endif