/*****************************************************************************
* libc.c: Extra libc function for some systems.
*****************************************************************************
- * Copyright (C) 2002 VideoLAN (Centrale Réseaux) and its contributors
+ * Copyright (C) 2002 the VideoLAN team
* $Id$
*
* Authors: Jon Lech Johansen <jon-vl@nanocrew.net>
* Samuel Hocevar <sam@zoy.org>
* Gildas Bazin <gbazin@videolan.org>
+ * Derk-Jan Hartman <hartman at videolan dot org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
}
#endif
+/*****************************************************************************
+ * scandir: scan a directory alpha-sorted
+ *****************************************************************************/
+#if !defined( HAVE_SCANDIR )
+int vlc_alphasort( const struct dirent **a, const struct dirent **b )
+{
+ return strcoll( (*a)->d_name, (*b)->d_name );
+}
+
+int vlc_scandir( const char *name, struct dirent ***namelist,
+ int (*filter) ( const struct dirent * ),
+ int (*compar) ( const struct dirent **,
+ const struct dirent ** ) )
+{
+ DIR * p_dir;
+ struct dirent * p_content;
+ struct dirent ** pp_list;
+ int ret, size;
+
+ if( !namelist || !( p_dir = opendir( name ) ) ) return -1;
+
+ ret = 0;
+ pp_list = NULL;
+ while( ( p_content = readdir( p_dir ) ) )
+ {
+ if( filter && !filter( p_content ) )
+ {
+ continue;
+ }
+ pp_list = realloc( pp_list, ( ret + 1 ) * sizeof( struct dirent * ) );
+ size = sizeof( struct dirent ) + strlen( p_content->d_name ) + 1;
+ pp_list[ret] = malloc( size );
+ memcpy( pp_list[ret], p_content, size );
+ ret++;
+ }
+
+ closedir( p_dir );
+
+ if( compar )
+ {
+ qsort( pp_list, ret, sizeof( struct dirent * ),
+ (int (*)(const void *, const void *)) compar );
+ }
+
+ *namelist = pp_list;
+ return ret;
+}
+#endif
+
/*****************************************************************************
* dgettext: gettext for plugins.
*****************************************************************************/
* reduce a fraction
* (adapted from libavcodec, author Michael Niedermayer <michaelni@gmx.at>)
*****************************************************************************/
-vlc_bool_t vlc_reduce( int *pi_dst_nom, int *pi_dst_den,
- int64_t i_nom, int64_t i_den, int64_t i_max )
+vlc_bool_t vlc_ureduce( unsigned *pi_dst_nom, unsigned *pi_dst_den,
+ uint64_t i_nom, uint64_t i_den, uint64_t i_max )
{
- vlc_bool_t b_exact = 1, b_sign = 0;
- int64_t i_gcd;
+ vlc_bool_t b_exact = 1;
+ uint64_t i_gcd;
if( i_den == 0 )
{
return 1;
}
- if( i_den < 0 )
- {
- i_den = - i_den;
- i_nom = - i_nom;
- }
-
- if( i_nom < 0 )
- {
- i_nom = - i_nom;
- b_sign = 1;
- }
-
i_gcd = GCD( i_nom, i_den );
i_nom /= i_gcd;
i_den /= i_gcd;
if( i_nom > i_max || i_den > i_max )
{
- int i_a0_num = 0, i_a0_den = 1, i_a1_num = 1, i_a1_den = 0;
+ uint64_t i_a0_num = 0, i_a0_den = 1, i_a1_num = 1, i_a1_den = 0;
b_exact = 0;
for( ; ; )
{
- int64_t i_x = i_nom / i_den;
- int64_t i_a2n = i_x * i_a1_num + i_a0_num;
- int64_t i_a2d = i_x * i_a1_den + i_a0_den;
+ uint64_t i_x = i_nom / i_den;
+ uint64_t i_a2n = i_x * i_a1_num + i_a0_num;
+ uint64_t i_a2d = i_x * i_a1_den + i_a0_den;
if( i_a2n > i_max || i_a2d > i_max ) break;
i_den = i_a1_den;
}
- if( b_sign ) i_nom = - i_nom;
-
*pi_dst_nom = i_nom;
*pi_dst_den = i_den;