[vala] Split large string literals into multiple lines



commit 20666769c446ece07ef1063188d3ac5879c9f84c
Author: Jürg Billeter <j bitron ch>
Date:   Sat Jan 23 00:03:06 2010 +0100

    Split large string literals into multiple lines
    
    Based on patch by Marc-André Lureau, fixes bug 606838.

 ccode/valaccodeconstant.vala     |   63 ++++++++++++++++++++++++++++++++++++--
 codegen/valaccodebasemodule.vala |    2 +-
 2 files changed, 61 insertions(+), 4 deletions(-)
---
diff --git a/ccode/valaccodeconstant.vala b/ccode/valaccodeconstant.vala
index ebf36e9..0ac49ec 100644
--- a/ccode/valaccodeconstant.vala
+++ b/ccode/valaccodeconstant.vala
@@ -1,6 +1,6 @@
 /* valaccodeconstant.vala
  *
- * Copyright (C) 2006  Jürg Billeter
+ * Copyright (C) 2006-2010  Jürg Billeter
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -30,11 +30,68 @@ public class Vala.CCodeConstant : CCodeExpression {
 	 * The name of this constant.
 	 */
 	public string name { get; set; }
-	
+
 	public CCodeConstant (string _name) {
 		name = _name;
 	}
-	
+
+	const int LINE_LENGTH = 70;
+
+	public CCodeConstant.string (string _name) {
+		assert (_name[0] == '\"');
+
+		if (_name.length <= LINE_LENGTH) {
+			name = _name;
+			return;
+		}
+
+		var builder = new StringBuilder ("\"");
+
+		char* p = _name;
+		char* end = p + _name.size ();
+
+		// remove quotes
+		p++;
+		end--;
+
+		int col = 0;
+		while (p < end) {
+			if (col >= LINE_LENGTH) {
+				builder.append ("\" \\\n\"");
+				col = 0;
+			}
+			if (*p == '\\') {
+				char* begin_of_char = p;
+
+				builder.append_c (p[0]);
+				builder.append_c (p[1]);
+				p += 2;
+				switch (p[-1]) {
+				case 'x':
+					// hexadecimal character
+					while (p < end && p->isxdigit ()) {
+						builder.append_c (*p);
+						p++;
+					}
+					break;
+				case 'n':
+					// break line at \n
+					col = LINE_LENGTH;
+					break;
+				}
+				col += (int) (p - begin_of_char);
+			} else {
+				builder.append_unichar (((string) p).get_char ());
+				p += ((char*) ((string) p).next_char () - p);
+				col++;
+			}
+		}
+
+		builder.append_c ('"');
+
+		this.name = builder.str;
+	}
+
 	public override void write (CCodeWriter writer) {
 		writer.write_string (name);
 	}
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index 428fdad..fe9d70e 100644
--- a/codegen/valaccodebasemodule.vala
+++ b/codegen/valaccodebasemodule.vala
@@ -3480,7 +3480,7 @@ internal class Vala.CCodeBaseModule : CCodeModule {
 	}
 
 	public override void visit_string_literal (StringLiteral expr) {
-		expr.ccodenode = new CCodeConstant (expr.value);
+		expr.ccodenode = new CCodeConstant.string (expr.value);
 	}
 
 	public override void visit_null_literal (NullLiteral expr) {



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]