SF.net SVN: geany: [804] trunk
ntrel at users.sourceforge.net
ntrel at xxxxx
Fri Sep 8 15:05:37 UTC 2006
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 at 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.
More information about the Commits
mailing list