From a898104f8a67aa3253c56ce09887000ff377ee35 Mon Sep 17 00:00:00 2001 From: Nathan Braswell Date: Mon, 15 Feb 2016 23:12:56 -0500 Subject: [PATCH] Fix multiline strings with single quotes in Cephelapod and implement both types in Kalypso, one new test should pass for both --- src/CGenerator.cpp | 9 ++++++--- stdlib/c_generator.krak | 20 +++++++++++++++++++- stdlib/string.krak | 3 +++ 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/CGenerator.cpp b/src/CGenerator.cpp index 174436b..928f6f4 100644 --- a/src/CGenerator.cpp +++ b/src/CGenerator.cpp @@ -1066,13 +1066,16 @@ CCodeTriple CGenerator::generate(NodeTree* from, NodeTree* enc case value: { // ok, we now check for it being a multiline string and escape all returns if it is (so that multiline strings work) - if (data.symbol.getName()[0] == '"' && strSlice(data.symbol.getName(), 0, 3) == "\"\"\"") { - std::string innerString = strSlice(data.symbol.getName(), 3, -4); + if (data.symbol.getName()[0] == '"') { + std::string innerString = strSlice(data.symbol.getName(), 1, -2); + bool triple = strSlice(data.symbol.getName(), 0, 3) == "\"\"\""; + if (triple) + innerString = strSlice(data.symbol.getName(), 3, -4); std::string newStr; for (auto character: innerString) if (character == '\n') newStr += "\\n"; - else if (character == '"') + else if (triple && character == '"') newStr += "\\\""; else newStr += character; diff --git a/stdlib/c_generator.krak b/stdlib/c_generator.krak index 7dae2b4..c97554a 100644 --- a/stdlib/c_generator.krak +++ b/stdlib/c_generator.krak @@ -306,7 +306,25 @@ obj c_generator (Object) { defer_stack->top().second.push(node->defer_statement.statement) return code_triple("/*defer wanna know what*/") } - fun generate_value(node: *ast_node): code_triple return code_triple(node->value.string_value); + fun generate_value(node: *ast_node): code_triple { + var value = node->value.string_value + if (value[0] != '"') + return code_triple(value); + var to_ret = string("\"") + if (value.slice(0,3) == "\"\"\"") + value = value.slice(3,-4) + else + value = value.slice(1,-2) + value.for_each(fun(c: char) { + if (c == '\n') + to_ret += "\\n" + else if (c == '"') + to_ret += "\\\"" + else + to_ret += c + }) + return code_triple(to_ret + "\"") + } fun generate_code_block(node: *ast_node, enclosing_object: *ast_node, defer_stack: *stack>>): code_triple { var to_ret = code_triple("{\n") // stick another stack on diff --git a/stdlib/string.krak b/stdlib/string.krak index b9ae803..eae4a64 100644 --- a/stdlib/string.krak +++ b/stdlib/string.krak @@ -181,5 +181,8 @@ obj string (Object, Serializable) { out.add(current) return out } + fun for_each(func: fun(char):void) { + data.for_each(func) + } };