| 381 | | /***************************************************************************** |
|---|
| 382 | | * scandir: scan a directory alpha-sorted |
|---|
| 383 | | *****************************************************************************/ |
|---|
| 384 | | #if !defined( HAVE_SCANDIR ) |
|---|
| 385 | | /* FIXME: I suspect this is dead code -> utf8_scandir */ |
|---|
| 386 | | #ifdef WIN32 |
|---|
| 387 | | # undef opendir |
|---|
| 388 | | # undef readdir |
|---|
| 389 | | # undef closedir |
|---|
| 390 | | #endif |
|---|
| 391 | | int vlc_alphasort( const struct dirent **a, const struct dirent **b ) |
|---|
| 392 | | { |
|---|
| 393 | | return strcoll( (*a)->d_name, (*b)->d_name ); |
|---|
| 394 | | } |
|---|
| 395 | | |
|---|
| 396 | | int vlc_scandir( const char *name, struct dirent ***namelist, |
|---|
| 397 | | int (*filter) ( const struct dirent * ), |
|---|
| 398 | | int (*compar) ( const struct dirent **, |
|---|
| 399 | | const struct dirent ** ) ) |
|---|
| 400 | | { |
|---|
| 401 | | DIR * p_dir; |
|---|
| 402 | | struct dirent * p_content; |
|---|
| 403 | | struct dirent ** pp_list; |
|---|
| 404 | | int ret, size; |
|---|
| 405 | | |
|---|
| 406 | | if( !namelist || !( p_dir = opendir( name ) ) ) return -1; |
|---|
| 407 | | |
|---|
| 408 | | ret = 0; |
|---|
| 409 | | pp_list = NULL; |
|---|
| 410 | | while( ( p_content = readdir( p_dir ) ) ) |
|---|
| 411 | | { |
|---|
| 412 | | if( filter && !filter( p_content ) ) |
|---|
| 413 | | { |
|---|
| 414 | | continue; |
|---|
| 415 | | } |
|---|
| 416 | | pp_list = realloc( pp_list, ( ret + 1 ) * sizeof( struct dirent * ) ); |
|---|
| 417 | | size = sizeof( struct dirent ) + strlen( p_content->d_name ) + 1; |
|---|
| 418 | | pp_list[ret] = malloc( size ); |
|---|
| 419 | | if( pp_list[ret] ) |
|---|
| 420 | | { |
|---|
| 421 | | memcpy( pp_list[ret], p_content, size ); |
|---|
| 422 | | ret++; |
|---|
| 423 | | } |
|---|
| 424 | | else |
|---|
| 425 | | { |
|---|
| 426 | | /* Continuing is useless when no more memory can be allocted, |
|---|
| 427 | | * so better return what we have found. |
|---|
| 428 | | */ |
|---|
| 429 | | ret = -1; |
|---|
| 430 | | break; |
|---|
| 431 | | } |
|---|
| 432 | | } |
|---|
| 433 | | |
|---|
| 434 | | closedir( p_dir ); |
|---|
| 435 | | |
|---|
| 436 | | if( compar ) |
|---|
| 437 | | { |
|---|
| 438 | | qsort( pp_list, ret, sizeof( struct dirent * ), |
|---|
| 439 | | (int (*)(const void *, const void *)) compar ); |
|---|
| 440 | | } |
|---|
| 441 | | |
|---|
| 442 | | *namelist = pp_list; |
|---|
| 443 | | return ret; |
|---|
| 444 | | } |
|---|
| 445 | | #endif |
|---|
| 446 | | |
|---|