about summary refs log tree commit diff
path: root/src/libsyntax
diff options
context:
space:
mode:
authorGraydon Hoare <graydon@mozilla.com>2012-05-31 15:31:13 -0700
committerGraydon Hoare <graydon@mozilla.com>2012-05-31 15:32:29 -0700
commit57f399bd638c211005e8565609e928db33ebf864 (patch)
tree05d9289af9058f1509f976c1c73e722ab87cec1b /src/libsyntax
parentc2ce2741a773b94d3a8f7293cb598322bc61f89d (diff)
downloadrust-57f399bd638c211005e8565609e928db33ebf864.tar.gz
rust-57f399bd638c211005e8565609e928db33ebf864.zip
Implement 2 kinds of char / str escaping. Use in rustc. Close #2306.
Diffstat (limited to 'src/libsyntax')
-rw-r--r--src/libsyntax/parse/lexer.rs1
-rw-r--r--src/libsyntax/parse/token.rs13
-rw-r--r--src/libsyntax/print/pprust.rs26
3 files changed, 8 insertions, 32 deletions
diff --git a/src/libsyntax/parse/lexer.rs b/src/libsyntax/parse/lexer.rs
index 63dc85e865d..bef5f6d1fd8 100644
--- a/src/libsyntax/parse/lexer.rs
+++ b/src/libsyntax/parse/lexer.rs
@@ -434,6 +434,7 @@ fn next_token_inner(rdr: reader) -> token::token {
               't' { c2 = '\t'; }
               '\\' { c2 = '\\'; }
               '\'' { c2 = '\''; }
+              '"' { c2 = '"'; }
               'x' { c2 = scan_numeric_escape(rdr, 2u); }
               'u' { c2 = scan_numeric_escape(rdr, 4u); }
               'U' { c2 = scan_numeric_escape(rdr, 8u); }
diff --git a/src/libsyntax/parse/token.rs b/src/libsyntax/parse/token.rs
index 1c6f240cf82..044509a5144 100644
--- a/src/libsyntax/parse/token.rs
+++ b/src/libsyntax/parse/token.rs
@@ -122,11 +122,7 @@ fn to_str(in: interner<str>, t: token) -> str {
 
       /* Literals */
       LIT_INT(c, ast::ty_char) {
-        // FIXME: escape.
-        let mut tmp = "'";
-        str::push_char(tmp, c as char);
-        str::push_char(tmp, '\'');
-        ret tmp;
+        ret "'" + char::escape_default(c as char) + "'";
       }
       LIT_INT(i, t) {
         ret int::to_str(i as int, 10u) + ast_util::int_ty_to_str(t);
@@ -138,10 +134,11 @@ fn to_str(in: interner<str>, t: token) -> str {
         ret interner::get::<str>(in, s) +
             ast_util::float_ty_to_str(t);
       }
-      LIT_STR(s) { // FIXME: escape.
-        ret "\"" + interner::get::<str>(in, s) + "\"";
+      LIT_STR(s) {
+        ret "\""
+            + str::escape_default(interner::get::<str>(in, s))
+            + "\"";
       }
-
       /* Name components */
       IDENT(s, _) {
         ret interner::get::<str>(in, s);
diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs
index 8206bfd2a4a..dd935533b7f 100644
--- a/src/libsyntax/print/pprust.rs
+++ b/src/libsyntax/print/pprust.rs
@@ -1609,7 +1609,7 @@ fn print_literal(s: ps, &&lit: @ast::lit) {
     alt lit.node {
       ast::lit_str(st) { print_string(s, st); }
       ast::lit_int(ch, ast::ty_char) {
-        word(s.s, "'" + escape_str(str::from_char(ch as char), '\'') + "'");
+        word(s.s, "'" + char::escape_default(ch as char) + "'");
       }
       ast::lit_int(i, t) {
         if i < 0_i64 {
@@ -1714,32 +1714,10 @@ fn print_comment(s: ps, cmnt: comments::cmnt) {
 
 fn print_string(s: ps, st: str) {
     word(s.s, "\"");
-    word(s.s, escape_str(st, '"'));
+    word(s.s, str::escape_default(st));
     word(s.s, "\"");
 }
 
-fn escape_str(st: str, to_escape: char) -> str {
-    let mut out: str = "";
-    let len = str::len(st);
-    let mut i = 0u;
-    while i < len {
-        alt st[i] as char {
-          '\n' { out += "\\n"; }
-          '\t' { out += "\\t"; }
-          '\r' { out += "\\r"; }
-          '\\' { out += "\\\\"; }
-          cur {
-            if cur == to_escape { out += "\\"; }
-            // FIXME some (or all?) non-ascii things should be escaped
-            // (See #2306)
-            str::push_char(out, cur);
-          }
-        }
-        i += 1u;
-    }
-    ret out;
-}
-
 fn to_str<T>(t: T, f: fn@(ps, T)) -> str {
     let buffer = io::mem_buffer();
     let s = rust_printer(io::mem_buffer_writer(buffer));