diff subreader.c @ 24851:e36efda34616

Our enca code uses strdup() on the input encoding name, as we don't modify it we can use the original constant string. Uses less memory, code is simpler and faster. Fixes memory leak (noticed by ulion).
author iive
date Sun, 28 Oct 2007 14:26:05 +0000
parents 402b68e1a3bb
children 35902b734951
line wrap: on
line diff
--- a/subreader.c	Sat Oct 27 20:14:22 2007 +0000
+++ b/subreader.c	Sun Oct 28 14:26:05 2007 +0000
@@ -1083,15 +1083,13 @@
 	char *tocp = "UTF-8";
 
 	if (sub_cp){
-		char *cp_tmp = sub_cp;
+		const char *cp_tmp = sub_cp;
 #ifdef HAVE_ENCA
 		char enca_lang[3], enca_fallback[100];
-		int free_cp_tmp = 0;
 		if (sscanf(sub_cp, "enca:%2s:%99s", enca_lang, enca_fallback) == 2
 		     || sscanf(sub_cp, "ENCA:%2s:%99s", enca_lang, enca_fallback) == 2) {
 		  if (st && st->flags & STREAM_SEEK ) {
 		    cp_tmp = guess_cp(st, enca_lang, enca_fallback);
-		    free_cp_tmp = 1;
 		  } else {
 		    cp_tmp = enca_fallback;
 		    if (st)
@@ -1104,9 +1102,6 @@
 			sub_utf8 = 2;
 		} else
 			mp_msg(MSGT_SUBREADER,MSGL_ERR,"SUB: error opening iconv descriptor.\n");
-#ifdef HAVE_ENCA
-		if (free_cp_tmp && cp_tmp) free(cp_tmp);
-#endif
 	}
 }
 
@@ -1275,13 +1270,13 @@
 };
 
 #ifdef HAVE_ENCA
-void* guess_buffer_cp(unsigned char* buffer, int buflen, char *preferred_language, char *fallback)
+const char* guess_buffer_cp(unsigned char* buffer, int buflen,  char *preferred_language, const char *fallback)
 {
     const char **languages;
     size_t langcnt;
     EncaAnalyser analyser;
     EncaEncoding encoding;
-    char *detected_sub_cp = NULL;
+    const char *detected_sub_cp = NULL;
     int i;
 
     languages = enca_get_languages(&langcnt);
@@ -1299,7 +1294,7 @@
 	encoding = enca_analyse_const(analyser, buffer, buflen);
 	tmp = enca_charset_name(encoding.charset, ENCA_NAME_STYLE_ICONV);
 	if (tmp && encoding.charset != ENCA_CS_UNKNOWN) {
-	    detected_sub_cp = strdup(tmp);
+	    detected_sub_cp = tmp;
 	    mp_msg(MSGT_SUBREADER, MSGL_INFO, "ENCA detected charset: %s\n", tmp);
 	}
 	enca_analyser_free(analyser);
@@ -1308,7 +1303,7 @@
     free(languages);
 
     if (!detected_sub_cp) {
-	detected_sub_cp = strdup(fallback);
+	detected_sub_cp = fallback;
 	mp_msg(MSGT_SUBREADER, MSGL_INFO, "ENCA detection failed: fallback to %s\n", fallback);
     }
 
@@ -1316,11 +1311,11 @@
 }
 
 #define MAX_GUESS_BUFFER_SIZE (256*1024)
-void* guess_cp(stream_t *st, char *preferred_language, char *fallback)
+const char* guess_cp(stream_t *st, char *preferred_language, const char *fallback)
 {
     size_t buflen;
     unsigned char *buffer;
-    char *detected_sub_cp = NULL;
+    const char *detected_sub_cp = NULL;
 
     buffer = malloc(MAX_GUESS_BUFFER_SIZE);
     buflen = stream_read(st,buffer, MAX_GUESS_BUFFER_SIZE);