Mercurial > projects > ldc
comparison tango/tango/util/log/Trace.d @ 132:1700239cab2e trunk
[svn r136] MAJOR UNSTABLE UPDATE!!!
Initial commit after moving to Tango instead of Phobos.
Lots of bugfixes...
This build is not suitable for most things.
author | lindquist |
---|---|
date | Fri, 11 Jan 2008 17:57:40 +0100 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
131:5825d48b27d1 | 132:1700239cab2e |
---|---|
1 /******************************************************************************* | |
2 | |
3 copyright: Copyright (c) 2007 Kris Bell. All rights reserved | |
4 | |
5 license: BSD style: $(LICENSE) | |
6 | |
7 version: Oct 2007: Initial release | |
8 | |
9 author: Kris | |
10 | |
11 Synchronized, formatted console output. This can be used in lieu | |
12 of true logging where appropriate. | |
13 | |
14 Trace exposes this style of usage: | |
15 --- | |
16 Trace.format ("abc {}", 1); => abc 1 | |
17 Trace.format ("abc {}:{}", 1, 2); => abc 1:2 | |
18 Trace.format ("abc {1}:{0}", 1, 2); => abc 2:1 | |
19 --- | |
20 | |
21 Special character sequences, such as "\n", are written directly to | |
22 the output without any translation (though an output-filter could | |
23 be inserted to perform translation as required). Platform-specific | |
24 newlines are generated instead via the formatln() method, which also | |
25 flushes the output when configured to do so: | |
26 --- | |
27 Trace.formatln ("hello {}", "world"); | |
28 --- | |
29 | |
30 Explicitly flushing the output is achieved via a flush() method | |
31 --- | |
32 Trace.format ("hello {}", "world").flush; | |
33 --- | |
34 | |
35 *******************************************************************************/ | |
36 | |
37 module tango.util.log.Trace; | |
38 | |
39 private import tango.io.Console; | |
40 | |
41 private import tango.io.model.IConduit; | |
42 | |
43 private import tango.text.convert.Layout; | |
44 | |
45 /******************************************************************************* | |
46 | |
47 Construct Trace when this module is loaded | |
48 | |
49 *******************************************************************************/ | |
50 | |
51 /// global trace instance | |
52 public static SyncPrint Trace; | |
53 | |
54 static this() | |
55 { | |
56 Trace = new SyncPrint (Cerr.stream, Cerr, !Cerr.redirected); | |
57 } | |
58 | |
59 /******************************************************************************* | |
60 | |
61 Intended for internal use only | |
62 | |
63 *******************************************************************************/ | |
64 | |
65 private class SyncPrint | |
66 { | |
67 private Object mutex; | |
68 private OutputStream output; | |
69 private Layout!(char) convert; | |
70 private bool flushLines; | |
71 | |
72 version (Win32) | |
73 private const char[] Eol = "\r\n"; | |
74 else | |
75 private const char[] Eol = "\n"; | |
76 | |
77 /********************************************************************** | |
78 | |
79 Construct a Print instance, tying the provided stream | |
80 to a layout formatter | |
81 | |
82 **********************************************************************/ | |
83 | |
84 this (OutputStream output, Object mutex, bool flush=false) | |
85 { | |
86 this.mutex = mutex; | |
87 this.output = output; | |
88 this.flushLines = flush; | |
89 this.convert = new Layout!(char); | |
90 } | |
91 | |
92 /********************************************************************** | |
93 | |
94 Layout using the provided formatting specification | |
95 | |
96 **********************************************************************/ | |
97 | |
98 final SyncPrint format (char[] fmt, ...) | |
99 { | |
100 synchronized (mutex) | |
101 convert (&sink, _arguments, _argptr, fmt); | |
102 return this; | |
103 } | |
104 | |
105 /********************************************************************** | |
106 | |
107 Layout using the provided formatting specification | |
108 | |
109 **********************************************************************/ | |
110 | |
111 final SyncPrint formatln (char[] fmt, ...) | |
112 { | |
113 synchronized (mutex) | |
114 { | |
115 convert (&sink, _arguments, _argptr, fmt); | |
116 output.write (Eol); | |
117 if (flushLines) | |
118 output.flush; | |
119 } | |
120 return this; | |
121 } | |
122 | |
123 /********************************************************************** | |
124 | |
125 Flush the output stream | |
126 | |
127 **********************************************************************/ | |
128 | |
129 final void flush () | |
130 { | |
131 synchronized (mutex) | |
132 output.flush; | |
133 } | |
134 | |
135 /********************************************************************** | |
136 | |
137 Sink for passing to the formatter | |
138 | |
139 **********************************************************************/ | |
140 | |
141 private final uint sink (char[] s) | |
142 { | |
143 return output.write (s); | |
144 } | |
145 } |