]> git.sesse.net Git - vlc/commitdiff
* src/input/subtitles.c: corrected bug in subtitle detection
authorYoann Peronneau <yoann@videolan.org>
Fri, 23 Apr 2004 11:56:21 +0000 (11:56 +0000)
committerYoann Peronneau <yoann@videolan.org>
Fri, 23 Apr 2004 11:56:21 +0000 (11:56 +0000)
* src/libvlc.h: modified subtitle paths for Windows

src/input/subtitles.c
src/libvlc.h

index 9ef07f12bd96f4b80d91e0699ca51608d7f66c47..e821f43c015b45dd3489e1a91f0781b38ad55774 100644 (file)
@@ -151,54 +151,28 @@ static int compare_sub_priority( const void *a, const void *b )
 }
 
 /**
- * Detect subtitle files.
- *
- * When called this function will split up the psz_fname string into a
- * directory, filename and extension. It then opens the directory
- * in which the file resides and tries to find possible matches of
- * subtitles files.
- *
- * \ingroup Demux
- * \param p_this the calling \ref input_thread_t
- * \param psz_path a list of subdirectories (separated by a ',') to look in.
- * \param psz_fname the complete filename to base the search on.
- * \return a NULL terminated array of filenames with detected possible subtitles.
- * The array contains max MAX_SUBTITLE_FILES items and you need to free it after use.
+ * Convert a list of paths separated by ',' to a char**
  */
-char **subtitles_Detect( input_thread_t *p_this, char *psz_path,
-                         char *psz_fname )
+static char **paths_to_list( char *psz_dir, char *psz_path )
 {
-    /* variables to be used for derivatives of psz_fname */
-    char *f_dir, *f_fname, *f_fname_noext, *f_fname_trim, *tmp;
-    /* variables to be used for derivatives FILE *f */
-    char *tmp_fname_noext, *tmp_fname_trim, *tmp_fname_ext, *tmpresult;
-
-    vlc_value_t fuzzy;
-    int len, i, j, i_sub_count, i_nb_subdirs;
-    unsigned int k, i_max_sub_len;
-    subfn *result; /* unsorted results */
-    char **result2; /* sorted results */
+    unsigned int i, k, i_nb_subdirs;
     char **subdirs; /* list of subdirectories to look in */
-
-    FILE *f;
-    DIR *d;
-    struct dirent *de;
-
+    
     i_nb_subdirs = 1;
     for( k = 0; k < strlen( psz_path ); k++ )
     {
-        if( psz_path[k] == ',' ) 
+        if( psz_path[k] == ',' )
         {
             i_nb_subdirs++;
         }
     }
-
-    i_max_sub_len = 0;
+                                                                                                                            
     if( i_nb_subdirs > 0 )
     {
-        char *psz_parser;
-
-        subdirs = (char**)malloc( sizeof(char*) * i_nb_subdirs );
+        char *psz_parser, *psz_temp;
+                                                                                                                            
+        subdirs = (char**)malloc( sizeof(char*) * ( i_nb_subdirs + 1 ) );
+        memset( subdirs, 0, sizeof(char*) * ( i_nb_subdirs + 1 ) );
         i = 0;
         psz_parser = psz_path;
         while( psz_parser && *psz_parser )
@@ -215,23 +189,66 @@ char **subtitles_Detect( input_thread_t *p_this, char *psz_path,
                     psz_parser++;
                 }
             }
-            subdirs[i] = strdup( psz_subdir );
-            i++;
-            if( strlen( psz_subdir ) > i_max_sub_len )
+            if( strlen( psz_subdir ) > 0 )
             {
-                i_max_sub_len = strlen( psz_subdir );
+                psz_temp = (char *)malloc( strlen(psz_dir)
+                                           + strlen(psz_subdir) + 2 );
+                if( psz_temp )
+                {
+                    sprintf( psz_temp, "%s%s%c", 
+                             psz_subdir[0] == '.' ? psz_dir : "", 
+                             psz_subdir,
+                             psz_subdir[strlen(psz_subdir) - 1] == 
+                              DIRECTORY_SEPARATOR ? '\0' : DIRECTORY_SEPARATOR );
+                    subdirs[i] = psz_temp;
+                    i++;
+                }
             }
         }
-    } 
-    else 
+        subdirs[i] = NULL;
+    }
+    else
     {
-        i_nb_subdirs = -1;
         subdirs = NULL;
     }
+    return subdirs;
+}
+
+/**
+ * Detect subtitle files.
+ *
+ * When called this function will split up the psz_fname string into a
+ * directory, filename and extension. It then opens the directory
+ * in which the file resides and tries to find possible matches of
+ * subtitles files.
+ *
+ * \ingroup Demux
+ * \param p_this the calling \ref input_thread_t
+ * \param psz_path a list of subdirectories (separated by a ',') to look in.
+ * \param psz_fname the complete filename to base the search on.
+ * \return a NULL terminated array of filenames with detected possible subtitles.
+ * The array contains max MAX_SUBTITLE_FILES items and you need to free it after use.
+ */
+char **subtitles_Detect( input_thread_t *p_this, char *psz_path,
+                         char *psz_fname )
+{
+    /* variables to be used for derivatives of psz_fname */
+    char *f_dir, *f_fname, *f_fname_noext, *f_fname_trim, *tmp;
+    /* variables to be used for derivatives FILE *f */
+    char *tmp_fname_noext, *tmp_fname_trim, *tmp_fname_ext, *tmpresult;
+
+    vlc_value_t fuzzy;
+    int len, i, j, i_sub_count;
+    subfn *result; /* unsorted results */
+    char **result2; /* sorted results */
+    char **tmp_subdirs, **subdirs; /* list of subdirectories to look in */
+
+    FILE *f;
+    DIR *d;
+    struct dirent *de;
 
     i_sub_count = 0;
-    len = ( strlen( psz_fname ) > 256 ? strlen( psz_fname ) : 256 ) +
-        ( i_max_sub_len > 256 ? i_max_sub_len : 256 ) + 2;
+    len = strlen( psz_fname ) > 256 ? strlen( psz_fname ) : 256;
 
     f_dir = (char*)malloc(len);
     f_fname = (char*)malloc(len);
@@ -269,38 +286,18 @@ char **subtitles_Detect( input_thread_t *p_this, char *psz_path,
     strcpy_trim( f_fname_trim, f_fname_noext );
     var_Get( p_this, "sub-autodetect-fuzzy", &fuzzy );
 
+    tmp_subdirs = paths_to_list( f_dir, psz_path );
+    subdirs = tmp_subdirs;
 
-    for( j = -1; j < i_nb_subdirs; j++)
+    for( j = -1; j == -1 || ( j >= 0 && subdirs != NULL && *subdirs != NULL );
+         j++)
     {
-        if( j >= 0 )
-        {
-            if( subdirs[j] && subdirs[j][0] == '.' )
-            {
-                char* psz_dir;
-                psz_dir = (char *)malloc( len );
-                if( psz_dir ) 
-                {
-                    sprintf( psz_dir, "%s%s", f_dir, subdirs[j] );
-                    d = opendir( psz_dir );
-                    free( psz_dir );
-                }
-                else d = NULL;
-            }
-            else
-            {
-                d = opendir( subdirs[j] );
-            }
-        }
-        else
-        {
-            d = opendir( f_dir );
-        }
-
+        d = opendir( j < 0 ? f_dir : *subdirs );
         if( d )
         {
             int b_found;
             msg_Dbg( p_this, "looking for a subtitle file in %s", 
-                     j < 0 ? f_dir : subdirs[j] );
+                     j < 0 ? f_dir : *subdirs );
             while( ( de = readdir( d ) ) )
             {
                 /* retrieve various parts of the filename */
@@ -355,7 +352,7 @@ char **subtitles_Detect( input_thread_t *p_this, char *psz_path,
 
                     if( i_prio >= fuzzy.i_int )
                     {
-                        sprintf( tmpresult, "%s%s", j == 0 ? f_dir : psz_path,
+                        sprintf( tmpresult, "%s%s", j == -1 ? f_dir : *subdirs,
                                  de->d_name );
                         msg_Dbg( p_this, "autodetected subtitle: %s with "
                                  "priority %d", de->d_name, i_prio );
@@ -372,9 +369,10 @@ char **subtitles_Detect( input_thread_t *p_this, char *psz_path,
             }
             closedir( d );
         }
+        free( *subdirs++ );
     }
 
-    if( subdirs ) free( subdirs );
+    if( tmp_subdirs ) free( tmp_subdirs );
 
     free( f_dir );
     free( f_fname );
index eff7c7012f6bc2f1a647fd12cc7ea9c700b0970b..78bc4aa75f9efea71397cb6e7739589447129b33 100644 (file)
@@ -847,7 +847,7 @@ vlc_module_begin();
     add_integer( "sub-autodetect-fuzzy", 3, NULL,
                  SUB_FUZZY_TEXT, SUB_FUZZY_LONGTEXT, VLC_TRUE );
 #if defined( WIN32 )
-    add_string( "sub-autodetect-path", ".\\Subtitles, .\\subtitles", NULL,
+    add_string( "sub-autodetect-path", ".\\subtitles", NULL,
 #else
     add_string( "sub-autodetect-path", "./Subtitles, ./subtitles", NULL,
 #endif