diff --git a/stdlib/ast_transformation.krak b/stdlib/ast_transformation.krak index 33810a0..8377d36 100644 --- a/stdlib/ast_transformation.krak +++ b/stdlib/ast_transformation.krak @@ -504,9 +504,33 @@ obj ast_transformation (Object) { fun transform_value(node: *tree, scope: *ast_node): *ast_node { var value_str = concat_symbol_tree(node) var value_type = null() - if (value_str[0] == '"') // " // Comment hack for emacs now + if (value_str[0] == '"') { // " // Comment hack for emacs now value_type = type_ptr(base_type::character(), 1) - else if (value_str[0] == '\'') //'// lol, comment hack for vim syntax highlighting (my fault, of course) + var start = 1 + var end = value_str.length() -1 + if (value_str.length() > 3 && value_str[1] == '"' && value_str[2] == '"') { + value_str = value_str.slice(3,-4) + } else { + var new_str.construct(end-start): string + var escaped = false + for (var i = 1; i < value_str.length()-1; i++;) { + if (escaped) { + escaped = false + if (value_str[i] == 'n') + new_str += '\n' + else if (value_str[i] == 't') + new_str += '\t' + else + new_str += value_str[i] + } else if (value_str[i] == '\\') { + escaped = true + } else { + new_str += value_str[i] + } + } + value_str = new_str + } + } else if (value_str[0] == '\'') //'// lol, comment hack for vim syntax highlighting (my fault, of course) value_type = type_ptr(base_type::character()) else if (value_str == "true" || value_str == "false") value_type = type_ptr(base_type::boolean()) diff --git a/stdlib/bytecode_generator.krak b/stdlib/bytecode_generator.krak index 7620d3d..d2acc3f 100644 --- a/stdlib/bytecode_generator.krak +++ b/stdlib/bytecode_generator.krak @@ -577,9 +577,6 @@ obj bytecode_generator (Object) { return generate(node->cast.value) } fun generate_value(node: *ast_node): int { - println("generating value " + node->value.string_value) - println(node->value.value_type->base == base_type::character()) - println(node->value.value_type->indirection == 1) if (node->value.value_type->is_bool()) return emit_imm((node->value.string_value == "true") cast long) else if (node->value.value_type->base == base_type::character() && node->value.value_type->indirection == 1) diff --git a/stdlib/c_generator.krak b/stdlib/c_generator.krak index fb07697..1388cdc 100644 --- a/stdlib/c_generator.krak +++ b/stdlib/c_generator.krak @@ -291,19 +291,16 @@ obj c_generator (Object) { } fun generate_value(node: *ast_node): string { var value = node->value.string_value - if (value[0] != '"') + if (node->value.value_type->base != base_type::character() || node->value.value_type->indirection != 1) return value - var to_ret = string("\"") - var triple_quoted = value.slice(0,3) == "\"\"\"" - if (triple_quoted) - value = value.slice(3,-4) - else - value = value.slice(1,-2) + var to_ret = string("\"") //" value.for_each(fun(c: char) { if (c == '\n') to_ret += "\\n" - else if (c == '"' && triple_quoted) + else if (c == '\\') + to_ret += "\\\\" + else if (c == '"') to_ret += "\\\"" else to_ret += c @@ -373,7 +370,7 @@ obj c_generator (Object) { return "sizeof(" + type_to_c(node->compiler_intrinsic.type_parameters[0]) + ")" } else if (node->compiler_intrinsic.intrinsic == "link") { node->compiler_intrinsic.parameters.for_each(fun(value: *ast_node) { - linker_string += string("-l") + value->value.string_value.slice(1,-2) + " " + linker_string += string("-l") + value->value.string_value + " " }) return string() } diff --git a/stdlib/string.krak b/stdlib/string.krak index 617098c..d357f45 100644 --- a/stdlib/string.krak +++ b/stdlib/string.krak @@ -108,6 +108,10 @@ obj string (Object, Serializable, Hashable) { data.construct(); return this; } + fun construct(ammt: int): *string { + data.construct(ammt); + return this; + } fun construct(str: *char): *string { var len = 0 while (str[len] != 0) len++