From 3845e177e4e0b231efb6fda0ac3cd3a2d8f34d4b Mon Sep 17 00:00:00 2001
From: Jonathan Bastien-Filiatrault <joe@x2a.org>
Date: Fri, 26 Oct 2007 18:09:06 -0400
Subject: Add commit->msg_encoding, allocate msg dynamicly.


diff --git a/cgit.h b/cgit.h
index 163f355..6c7a941 100644
--- a/cgit.h
+++ b/cgit.h
@@ -48,6 +48,11 @@
 #define TM_MONTH (TM_YEAR / 12.0)
 
 
+/*
+ * Default encoding
+ */
+#define PAGE_ENCODING "UTF-8"
+
 typedef void (*configfn)(const char *name, const char *value);
 typedef void (*filepair_fn)(struct diff_filepair *pair);
 typedef void (*linediff_fn)(char *line, int len);
@@ -90,6 +95,7 @@ struct commitinfo {
 	unsigned long committer_date;
 	char *subject;
 	char *msg;
+	char *msg_encoding;
 };
 
 struct taginfo {
diff --git a/parsing.c b/parsing.c
index 30e7648..0412a9c 100644
--- a/parsing.c
+++ b/parsing.c
@@ -199,6 +199,7 @@ struct commitinfo *cgit_parse_commit(struct commit *commit)
 	ret->committer_email = NULL;
 	ret->subject = NULL;
 	ret->msg = NULL;
+	ret->msg_encoding = NULL;
 
 	if (p == NULL)
 		return ret;
diff --git a/shared.c b/shared.c
index e06df91..a04c4dc 100644
--- a/shared.c
+++ b/shared.c
@@ -265,6 +265,8 @@ void *cgit_free_commitinfo(struct commitinfo *info)
 	free(info->committer);
 	free(info->committer_email);
 	free(info->subject);
+	free(info->msg);
+	free(info->msg_encoding);
 	free(info);
 	return NULL;
 }
diff --git a/ui-shared.c b/ui-shared.c
index 72a7b44..7c69f60 100644
--- a/ui-shared.c
+++ b/ui-shared.c
@@ -352,7 +352,7 @@ void cgit_print_age(time_t t, time_t max_relative, char *format)
 
 void cgit_print_docstart(char *title, struct cacheitem *item)
 {
-	html("Content-Type: text/html; charset=utf-8\n");
+	html("Content-Type: text/html; charset=" PAGE_ENCODING "\n");
 	htmlf("Last-Modified: %s\n", http_date(item->st.st_mtime));
 	htmlf("Expires: %s\n", http_date(item->st.st_mtime +
 					 ttl_seconds(item->ttl)));
-- 
cgit v0.10.1


From aa5cc328f4894ba6972842b4edbca3017f169050 Mon Sep 17 00:00:00 2001
From: Jonathan Bastien-Filiatrault <joe@x2a.org>
Date: Fri, 26 Oct 2007 18:10:26 -0400
Subject: Set msg_encoding according to the header.


diff --git a/parsing.c b/parsing.c
index 0412a9c..16b4db7 100644
--- a/parsing.c
+++ b/parsing.c
@@ -234,6 +234,14 @@ struct commitinfo *cgit_parse_commit(struct commit *commit)
 		p = strchr(t, '\n') + 1;
 	}
 
+	if (!strncmp(p, "encoding ", 9)) {
+		p += 9;
+		t = strchr(p, '\n') + 1;
+		ret->msg_encoding = substr(p, t);
+		p = t;
+	} else
+		ret->msg_encoding = xstrdup(PAGE_ENCODING);
+
 	while (*p && (*p != '\n'))
 		p = strchr(p, '\n') + 1; // skip unknown header fields
 
-- 
cgit v0.10.1


From af0819830445e39584a0137034562086a55deaf2 Mon Sep 17 00:00:00 2001
From: Jonathan Bastien-Filiatrault <joe@x2a.org>
Date: Fri, 26 Oct 2007 18:11:26 -0400
Subject: Add iconv_msg function.


diff --git a/parsing.c b/parsing.c
index 16b4db7..f156c12 100644
--- a/parsing.c
+++ b/parsing.c
@@ -6,6 +6,8 @@
  *   (see COPYING for full license text)
  */
 
+#include <iconv.h>
+
 #include "cgit.h"
 
 int next_char(FILE *f)
@@ -176,6 +178,62 @@ void cgit_parse_url(const char *url)
 	}
 }
 
+static char *iconv_msg(char *msg, const char *encoding)
+{
+	iconv_t msg_conv = iconv_open(PAGE_ENCODING, encoding);
+	size_t inlen = strlen(msg);
+	char *in;
+	char *out;
+	size_t inleft;
+	size_t outleft;
+	char *buf;
+	char *ret;
+	size_t buf_sz;
+	int again, fail;
+
+	if(msg_conv == (iconv_t)-1)
+		return NULL;
+
+	buf_sz = inlen * 2;
+	buf = xmalloc(buf_sz+1);
+	do {
+		in = msg;
+		inleft = inlen;
+
+		out = buf;
+		outleft = buf_sz;
+		iconv(msg_conv, &in, &inleft, &out, &outleft);
+
+		if(inleft == 0) {
+			fail = 0;
+			again = 0;
+		} else if(inleft != 0 && errno == E2BIG) {
+			fail = 0;
+			again = 1;
+
+			buf_sz *= 2;
+			free(buf);
+			buf = xmalloc(buf_sz+1);
+		} else {
+			fail = 1;
+			again = 0;
+		}
+	} while(again && !fail);
+
+	if(fail) {
+		free(buf);
+		ret = NULL;
+	} else {
+		buf = xrealloc(buf, out - buf);
+		*out = 0;
+		ret = buf;
+	}
+
+	iconv_close(msg_conv);
+
+	return ret;
+}
+
 char *substr(const char *head, const char *tail)
 {
 	char *buf;
-- 
cgit v0.10.1


From 7858a309d7671109950ec940f893c2d112d36b99 Mon Sep 17 00:00:00 2001
From: Jonathan Bastien-Filiatrault <joe@x2a.org>
Date: Fri, 26 Oct 2007 18:13:41 -0400
Subject: Convert subject and message with iconv_msg.


diff --git a/parsing.c b/parsing.c
index f156c12..c731084 100644
--- a/parsing.c
+++ b/parsing.c
@@ -320,6 +320,20 @@ struct commitinfo *cgit_parse_commit(struct commit *commit)
 	} else
 		ret->subject = substr(p, p+strlen(p));
 
+	if(strcmp(ret->msg_encoding, PAGE_ENCODING)) {
+		t = iconv_msg(ret->subject, ret->msg_encoding);
+		if(t) {
+			free(ret->subject);
+			ret->subject = t;
+		}
+
+		t = iconv_msg(ret->msg, ret->msg_encoding);
+		if(t) {
+			free(ret->msg);
+			ret->msg = t;
+		}
+	}
+
 	return ret;
 }
 
-- 
cgit v0.10.1


From a2ebbd6948da96172108db5e9c02c141923ad05c Mon Sep 17 00:00:00 2001
From: Lars Hjemli <hjemli@gmail.com>
Date: Mon, 5 Nov 2007 22:27:43 +0100
Subject: Use utf8::reencode_string from git

This replaces the iconv-support in cgit with similar functions already
existing in git.

Signed-off-by: Lars Hjemli <hjemli@gmai.com>

diff --git a/cgit.h b/cgit.h
index 6c7a941..6291c58 100644
--- a/cgit.h
+++ b/cgit.h
@@ -16,6 +16,7 @@
 #include <log-tree.h>
 #include <archive.h>
 #include <xdiff/xdiff.h>
+#include <utf8.h>
 
 
 /*
diff --git a/parsing.c b/parsing.c
index c731084..e8c7ab9 100644
--- a/parsing.c
+++ b/parsing.c
@@ -6,8 +6,6 @@
  *   (see COPYING for full license text)
  */
 
-#include <iconv.h>
-
 #include "cgit.h"
 
 int next_char(FILE *f)
@@ -178,62 +176,6 @@ void cgit_parse_url(const char *url)
 	}
 }
 
-static char *iconv_msg(char *msg, const char *encoding)
-{
-	iconv_t msg_conv = iconv_open(PAGE_ENCODING, encoding);
-	size_t inlen = strlen(msg);
-	char *in;
-	char *out;
-	size_t inleft;
-	size_t outleft;
-	char *buf;
-	char *ret;
-	size_t buf_sz;
-	int again, fail;
-
-	if(msg_conv == (iconv_t)-1)
-		return NULL;
-
-	buf_sz = inlen * 2;
-	buf = xmalloc(buf_sz+1);
-	do {
-		in = msg;
-		inleft = inlen;
-
-		out = buf;
-		outleft = buf_sz;
-		iconv(msg_conv, &in, &inleft, &out, &outleft);
-
-		if(inleft == 0) {
-			fail = 0;
-			again = 0;
-		} else if(inleft != 0 && errno == E2BIG) {
-			fail = 0;
-			again = 1;
-
-			buf_sz *= 2;
-			free(buf);
-			buf = xmalloc(buf_sz+1);
-		} else {
-			fail = 1;
-			again = 0;
-		}
-	} while(again && !fail);
-
-	if(fail) {
-		free(buf);
-		ret = NULL;
-	} else {
-		buf = xrealloc(buf, out - buf);
-		*out = 0;
-		ret = buf;
-	}
-
-	iconv_close(msg_conv);
-
-	return ret;
-}
-
 char *substr(const char *head, const char *tail)
 {
 	char *buf;
@@ -321,13 +263,15 @@ struct commitinfo *cgit_parse_commit(struct commit *commit)
 		ret->subject = substr(p, p+strlen(p));
 
 	if(strcmp(ret->msg_encoding, PAGE_ENCODING)) {
-		t = iconv_msg(ret->subject, ret->msg_encoding);
+		t = reencode_string(ret->subject, PAGE_ENCODING,
+				    ret->msg_encoding);
 		if(t) {
 			free(ret->subject);
 			ret->subject = t;
 		}
 
-		t = iconv_msg(ret->msg, ret->msg_encoding);
+		t = reencode_string(ret->msg, PAGE_ENCODING,
+				    ret->msg_encoding);
 		if(t) {
 			free(ret->msg);
 			ret->msg = t;
-- 
cgit v0.10.1