[gitg] Add Gitg.Convert utility
- From: Jesse van den Kieboom <jessevdk src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gitg] Add Gitg.Convert utility
- Date: Tue, 22 Dec 2015 08:57:55 +0000 (UTC)
commit a4346312723cec01577a7b2e92e4487f44860fa6
Author: Jesse van den Kieboom <jessevdk gnome org>
Date: Tue Dec 22 09:56:47 2015 +0100
Add Gitg.Convert utility
gitg/Makefile.am | 1 +
gitg/gitg-convert.vala | 138 ++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 139 insertions(+), 0 deletions(-)
---
diff --git a/gitg/Makefile.am b/gitg/Makefile.am
index e241f93..44e2f41 100644
--- a/gitg/Makefile.am
+++ b/gitg/Makefile.am
@@ -65,6 +65,7 @@ gitg_gitg_VALASOURCES = \
gitg/gitg-commit-action-create-patch.vala \
gitg/gitg-commit-action-create-tag.vala \
gitg/gitg-commit-action-cherry-pick.vala \
+ gitg/gitg-convert.vala \
gitg/gitg-create-branch-dialog.vala \
gitg/gitg-create-tag-dialog.vala \
gitg/gitg-dash-view.vala \
diff --git a/gitg/gitg-convert.vala b/gitg/gitg-convert.vala
new file mode 100644
index 0000000..fad75d3
--- /dev/null
+++ b/gitg/gitg-convert.vala
@@ -0,0 +1,138 @@
+/*
+ * This file is part of gitg
+ *
+ * Copyright (C) 2015 - Jesse van den Kieboom
+ *
+ * gitg is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * gitg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with gitg. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+namespace Gitg.Convert
+{
+ private void utf8_validate_fallback(ref string text, ssize_t size)
+ {
+ char *end;
+
+ while (!text.validate(size, out end))
+ {
+ *end = '?';
+ }
+ }
+
+ private string convert_fallback(string text, ssize_t size, string fallback)
+ {
+ string res = "";
+ size_t read;
+
+ var str = new StringBuilder();
+
+ while (true)
+ {
+ try
+ {
+ res = GLib.convert(text, size, "UTF-8", "ASCII", out read);
+ break;
+ }
+ catch
+ {
+ try
+ {
+ str.append(GLib.convert(text, (ssize_t)read, "UTF-8", "ASCII"));
+ } catch {}
+
+ str.append(fallback);
+
+ text = (string)((uint8[])text)[(read + 1):size];
+ size -= (ssize_t)read;
+ }
+ }
+
+ str.append(res);
+
+ var retval = str.str;
+ Convert.utf8_validate_fallback(ref retval, str.len);
+
+ return retval;
+ }
+
+ private bool convert_and_check(string text, ssize_t size, string from_charset, out string? ret)
+ {
+ size_t read, written;
+
+ ret = null;
+
+ try
+ {
+ ret = GLib.convert(text, size, "UTF-8", from_charset, out read, out written);
+
+ if (read == size)
+ {
+ Convert.utf8_validate_fallback(ref ret, (ssize_t)written);
+ return true;
+ }
+ }
+ catch {}
+
+ return false;
+ }
+
+
+ public string utf8(string str, ssize_t size = -1, string? from_charset = null)
+ {
+ if (size == -1)
+ {
+ size = str.length;
+ }
+
+ if (from_charset == null)
+ {
+ if (str.validate(size))
+ {
+ return str[0:size];
+ }
+ }
+ else
+ {
+ string ret;
+
+ if (from_charset.ascii_casecmp("UTF-8") == 0)
+ {
+ ret = str[0:size];
+ Convert.utf8_validate_fallback(ref ret, size);
+
+ return ret;
+ }
+
+ if (Convert.convert_and_check(str, size, from_charset, out ret))
+ {
+ return ret;
+ }
+ }
+
+ string locale_charset;
+
+ if (!GLib.get_charset(out locale_charset))
+ {
+ string ret;
+
+ if (Convert.convert_and_check(str, size, locale_charset, out ret))
+ {
+ return ret;
+ }
+ }
+
+ return Convert.convert_fallback(str, size, "?");
+ }
+}
+
+/* ex:set ts=4 noet: */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]