Revision: 804 http://svn.sourceforge.net/geany/?rev=804&view=rev Author: ntrel Date: 2006-09-08 08:05:32 -0700 (Fri, 08 Sep 2006)
Log Message: ----------- Use handle_forced_encoding(), handle_encoding() and handle_bom() when opening files.
Modified Paths: -------------- trunk/ChangeLog trunk/src/document.c
Modified: trunk/ChangeLog =================================================================== --- trunk/ChangeLog 2006-09-08 13:40:30 UTC (rev 803) +++ trunk/ChangeLog 2006-09-08 15:05:32 UTC (rev 804) @@ -15,6 +15,9 @@ * src/build.c: Show messages window on build failure. Show build success message on status bar if messages window hidden. + * src/document.c: + Use handle_forced_encoding(), handle_encoding() and handle_bom() + when opening files.
2006-09-07 Enrico Tröger enrico.troeger@uvena.de
Modified: trunk/src/document.c =================================================================== --- trunk/src/document.c 2006-09-08 13:40:30 UTC (rev 803) +++ trunk/src/document.c 2006-09-08 15:05:32 UTC (rev 804) @@ -419,6 +419,114 @@ }
+// reload file with specified encoding +static gboolean +handle_forced_encoding(gchar **data, gsize *size, const gchar *forced_enc, gchar **enc, + gboolean *bom) +{ + if (utils_strcmp(forced_enc, "UTF-8")) + { + if (! g_utf8_validate(*data, *size, NULL)) + { + return FALSE; + } + else + { + *bom = utils_strcmp(utils_scan_unicode_bom(*data), "UTF-8"); + *enc = g_strdup(forced_enc); + } + } + else + { + gchar *converted_text = utils_convert_to_utf8_from_charset(*data, *size, forced_enc, FALSE); + if (converted_text == NULL) + { + return FALSE; + } + else + { + g_free(*data); + *data = (void*)converted_text; + *size = strlen(converted_text); + *bom = utils_strcmp(utils_scan_unicode_bom(*data), "UTF-8"); + *enc = g_strdup(forced_enc); + } + } + return TRUE; +} + + +static gboolean +handle_encoding(gchar **data, gsize *size, gchar **enc, gboolean *bom) +{ + if (*size > 0) + { // the usual way to detect encoding and convert to UTF-8 + if (*size >= 4) + { + *enc = utils_scan_unicode_bom(*data); + } + if (*enc != NULL) + { + *bom = TRUE; + if ((*enc)[4] != '8') // the BOM indicated something else than UTF-8 + { + gchar *converted_text = utils_convert_to_utf8_from_charset(*data, *size, *enc, FALSE); + if (converted_text == NULL) + { + g_free(*enc); + *enc = NULL; + *bom = FALSE; + } + else + { + g_free(*data); + *data = (void*)converted_text; + *size = strlen(converted_text); + } + } + } + // this if is important, else doesn't work because enc can be altered in the above block + if (*enc == NULL) + { + if (g_utf8_validate(*data, *size, NULL)) + { + *enc = g_strdup("UTF-8"); + } + else + { + gchar *converted_text = utils_convert_to_utf8(*data, *size, enc); + + if (converted_text == NULL) + { + return FALSE; + } + else + { + g_free(*data); + *data = (void*)converted_text; + *size = strlen(converted_text); + } + } + } + } + else + { + *enc = g_strdup("UTF-8"); + } + return TRUE; +} + + +static void +handle_bom(gchar **data) +{ + gchar *data_without_bom; + data_without_bom = g_strdup(*data + 3); + g_free(*data); + *data = data_without_bom; +} + + /* If idx is set to -1, it creates a new tab, opens the file from filename and * set the cursor to pos. * If idx is greater than -1, it reloads the file in the tab corresponding to @@ -499,121 +607,36 @@
/* Determine character encoding and convert to utf-8*/ if (reload && forced_enc != NULL) - { // reload file with specified encoding - if (utils_strcmp(forced_enc, "UTF-8")) + { + if (! handle_forced_encoding(&data, &size, forced_enc, &enc, &bom)) { - if (! g_utf8_validate(data, size, NULL)) - { - msgwin_status_add(_("The file "%s" is not valid %s."), utf8_filename, "UTF-8"); - utils_beep(); - g_free(data); - g_free(utf8_filename); - g_free(locale_filename); - return -1; - } - else - { - bom = utils_strcmp(utils_scan_unicode_bom(data), "UTF-8"); - enc = g_strdup(forced_enc); - } + msgwin_status_add(_("The file "%s" is not valid %s."), utf8_filename, forced_enc); + utils_beep(); + g_free(data); + g_free(utf8_filename); + g_free(locale_filename); + return -1; } - else - { - gchar *converted_text = utils_convert_to_utf8_from_charset(data, size, forced_enc, FALSE); - if (converted_text == NULL) - { - msgwin_status_add(_("The file "%s" is not valid %s."), utf8_filename, forced_enc); - utils_beep(); - g_free(data); - g_free(utf8_filename); - g_free(locale_filename); - return -1; - } - else - { - g_free(data); - data = (void*)converted_text; - size = strlen(converted_text); - bom = utils_strcmp(utils_scan_unicode_bom(data), "UTF-8"); - enc = g_strdup(forced_enc); - } - } } - else if (size > 0) - { // the usual way to detect encoding and convert to UTF-8 - if (size >= 4) - { - enc = utils_scan_unicode_bom(data); - } - if (enc != NULL) - { - bom = TRUE; - if (enc[4] != '8') // the BOM indicated something else than UTF-8 - { - gchar *converted_text = utils_convert_to_utf8_from_charset(data, size, enc, FALSE); - if (converted_text == NULL) - { - g_free(enc); - enc = NULL; - bom = FALSE; - } - else - { - g_free(data); - data = (void*)converted_text; - size = strlen(converted_text); - } - } - } - // this if is important, else doesn't work because enc can be altered in the above block - if (enc == NULL) - { - if (g_utf8_validate(data, size, NULL)) - { - enc = g_strdup("UTF-8"); - } - else - { - gchar *converted_text = utils_convert_to_utf8(data, size, &enc); - - if (converted_text == NULL) - { - msgwin_status_add( - _("The file "%s" does not look like a text file or the file encoding is not supported."), - utf8_filename); - utils_beep(); - g_free(data); - g_free(utf8_filename); - g_free(locale_filename); - return -1; - } - else - { - g_free(data); - data = (void*)converted_text; - size = strlen(converted_text); - } - } - } - } - else + else if (! handle_encoding(&data, &size, &enc, &bom)) { - enc = g_strdup("UTF-8"); - } - - if (bom) - { - gchar *data_without_bom; - data_without_bom = g_strdup(data + 3); + msgwin_status_add( + _("The file "%s" does not look like a text file or the file encoding is not supported."), + utf8_filename); + utils_beep(); g_free(data); - data = data_without_bom; + g_free(utf8_filename); + g_free(locale_filename); + return -1; }
+ if (bom) handle_bom(&data); + if (! reload) idx = document_create_new_sci(utf8_filename); if (idx == -1) return -1; // really should not happen
// set editor mode and add the text to the ScintillaObject - sci_set_text(doc_list[idx].sci, data); // NULL terminated data; avoids Unsaved + sci_set_text(doc_list[idx].sci, data); // NULL terminated data; avoids modifying sci editor_mode = utils_get_line_endings(data, size); sci_set_eol_mode(doc_list[idx].sci, editor_mode);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.