Mercurial > projects > ldc
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/log/Trace.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,145 @@ +/******************************************************************************* + + copyright: Copyright (c) 2007 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Oct 2007: Initial release + + author: Kris + + Synchronized, formatted console output. This can be used in lieu + of true logging where appropriate. + + Trace exposes this style of usage: + --- + Trace.format ("abc {}", 1); => abc 1 + Trace.format ("abc {}:{}", 1, 2); => abc 1:2 + Trace.format ("abc {1}:{0}", 1, 2); => abc 2:1 + --- + + Special character sequences, such as "\n", are written directly to + the output without any translation (though an output-filter could + be inserted to perform translation as required). Platform-specific + newlines are generated instead via the formatln() method, which also + flushes the output when configured to do so: + --- + Trace.formatln ("hello {}", "world"); + --- + + Explicitly flushing the output is achieved via a flush() method + --- + Trace.format ("hello {}", "world").flush; + --- + +*******************************************************************************/ + +module tango.util.log.Trace; + +private import tango.io.Console; + +private import tango.io.model.IConduit; + +private import tango.text.convert.Layout; + +/******************************************************************************* + + Construct Trace when this module is loaded + +*******************************************************************************/ + +/// global trace instance +public static SyncPrint Trace; + +static this() +{ + Trace = new SyncPrint (Cerr.stream, Cerr, !Cerr.redirected); +} + +/******************************************************************************* + + Intended for internal use only + +*******************************************************************************/ + +private class SyncPrint +{ + private Object mutex; + private OutputStream output; + private Layout!(char) convert; + private bool flushLines; + + version (Win32) + private const char[] Eol = "\r\n"; + else + private const char[] Eol = "\n"; + + /********************************************************************** + + Construct a Print instance, tying the provided stream + to a layout formatter + + **********************************************************************/ + + this (OutputStream output, Object mutex, bool flush=false) + { + this.mutex = mutex; + this.output = output; + this.flushLines = flush; + this.convert = new Layout!(char); + } + + /********************************************************************** + + Layout using the provided formatting specification + + **********************************************************************/ + + final SyncPrint format (char[] fmt, ...) + { + synchronized (mutex) + convert (&sink, _arguments, _argptr, fmt); + return this; + } + + /********************************************************************** + + Layout using the provided formatting specification + + **********************************************************************/ + + final SyncPrint formatln (char[] fmt, ...) + { + synchronized (mutex) + { + convert (&sink, _arguments, _argptr, fmt); + output.write (Eol); + if (flushLines) + output.flush; + } + return this; + } + + /********************************************************************** + + Flush the output stream + + **********************************************************************/ + + final void flush () + { + synchronized (mutex) + output.flush; + } + + /********************************************************************** + + Sink for passing to the formatter + + **********************************************************************/ + + private final uint sink (char[] s) + { + return output.write (s); + } +}