From 79f1052b19cb43aad5f47a4e1110206a7c0143f6 Mon Sep 17 00:00:00 2001 From: Do Nhat Minh Date: Sun, 28 Jul 2013 11:21:39 +0800 Subject: [PATCH] Added %p directive to fmt!, which expects *T as argument --- src/libstd/unstable/extfmt.rs | 7 +++++++ src/libsyntax/ext/fmt.rs | 2 ++ src/test/run-pass/syntax-extension-fmt.rs | 11 +++++++++++ 3 files changed, 20 insertions(+) diff --git a/src/libstd/unstable/extfmt.rs b/src/libstd/unstable/extfmt.rs index 64ac76756d5..1a136bbaa37 100644 --- a/src/libstd/unstable/extfmt.rs +++ b/src/libstd/unstable/extfmt.rs @@ -114,6 +114,7 @@ pub mod ct { TyHex(Caseness), TyOctal, TyFloat, + TyPointer, TyPoly, } @@ -325,6 +326,7 @@ pub mod ct { 't' => TyBits, 'o' => TyOctal, 'f' => TyFloat, + 'p' => TyPointer, '?' => TyPoly, _ => err(fmt!("unknown type in conversion: %c", s.char_at(i))) }; @@ -434,6 +436,7 @@ pub mod ct { assert!(test("t", TyBits)); assert!(test("x", TyHex(CaseLower))); assert!(test("X", TyHex(CaseUpper))); + assert!(test("p", TyPointer)); assert!(test("?", TyPoly)); } @@ -573,6 +576,10 @@ pub mod rt { } else { None }; pad(cv, s, head, PadFloat, buf); } + pub fn conv_pointer(cv: Conv, ptr: *T, buf: &mut ~str) { + let s = ~"0x" + uint_to_str_prec(ptr as uint, 16, 1u); + pad(cv, s, None, PadNozero, buf); + } pub fn conv_poly(cv: Conv, v: &T, buf: &mut ~str) { let s = sys::log_str(v); conv_str(cv, s, buf); diff --git a/src/libsyntax/ext/fmt.rs b/src/libsyntax/ext/fmt.rs index 737127fcae7..855cf47111a 100644 --- a/src/libsyntax/ext/fmt.rs +++ b/src/libsyntax/ext/fmt.rs @@ -191,6 +191,7 @@ fn pieces_to_expr(cx: @ExtCtxt, sp: span, TyChar => ("char", arg), TyBits | TyOctal | TyHex(_) | TyInt(Unsigned) => ("uint", arg), TyFloat => ("float", arg), + TyPointer => ("pointer", arg), TyPoly => ("poly", cx.expr_addr_of(sp, arg)) }; return make_conv_call(cx, arg.span, name, cnv, actual_arg, @@ -242,6 +243,7 @@ fn pieces_to_expr(cx: @ExtCtxt, sp: span, }, TyOctal => debug!("type: octal"), TyFloat => debug!("type: float"), + TyPointer => debug!("type: pointer"), TyPoly => debug!("type: poly") } } diff --git a/src/test/run-pass/syntax-extension-fmt.rs b/src/test/run-pass/syntax-extension-fmt.rs index 4dd1dc61c0d..513bc078e7f 100644 --- a/src/test/run-pass/syntax-extension-fmt.rs +++ b/src/test/run-pass/syntax-extension-fmt.rs @@ -32,6 +32,7 @@ pub fn main() { part6(); percent(); more_floats(); + pointer(); } fn part1() { @@ -263,3 +264,13 @@ fn more_floats() { assert_eq!(~"7.0000", fmt!("%.4f", 6.999999999)); assert_eq!(~"3.141590000", fmt!("%.9f", 3.14159)); } + +fn pointer() { + for 10.times { + let x: uint = ::std::rand::random(); + assert_eq!(fmt!("%p", x as *uint), fmt!("0x%x", x)); + } + + let i = &1; + assert_eq!(fmt!("%p", i), fmt!("0x%x", i as *uint as uint)); +}