3 # Do not import this module. It is used internally when instantiating the Main class.
5 static import std.c.stdlib
7 import stdio = std.stdio
8 import cstream = std.cstream
10 import dlt.log: LogManager, StreamAppender
11 import dlt.time: Clock
12 import dlt.io: FileSystem, format
14 import socket = std.socket
15 import std.string: split, atoi
16 import dlt.externals.fs: HostFS
17 import dlt.externals.net: HostNetwork
22 # TODO: this is a mess. It creates dependencies on all kinds of modules. The system
23 # get these from all over the place.
26 Printer? _stdout, _stderr
30 public Printer stdout():
32 _stdout = new Printer(cstream.dout)
33 return notnull(_stdout)
35 public Printer stderr():
37 _stderr = new Printer(cstream.derr)
38 return notnull(_stderr)
40 public FileSystem fs():
41 if not _fs: _fs = new HostFS()
44 public Clock systemClock():
47 public void SystemExit(dlt.core.SystemExit ex):
48 Printer err = stderr()
49 err.write(ex.toString())
52 std.c.stdlib.exit(ex.exitCode)
54 public LogManager logManager():
57 public ServerSocketFactory serverSocketFactory():
60 public ClientSocketFactory clientSocketFactory():
63 public Network network():
65 _network = new HostNetwork()
66 return notnull(_network)
68 class HostClock extends Clock:
71 d_time t = getUTCtime()
73 dt.year = YearFromTime(t)
74 dt.month = MonthFromTime(t) + 1
75 dt.day = DateFromTime(t) + 1
77 dt.hour = HourFromTime(t)
78 dt.minute = MinFromTime(t)
79 dt.second = SecFromTime(t)
82 dt.weekday = WeekDay(t)
83 dt.tzcorrection = LocalTZA + DaylightSavingTA(t)
87 override string toString():
89 return format("{:d4}-{:d2}-{:d2} {:d2}:{:d2}:{:d2},{:d3}",
98 void log_impl(int level, string src, string msg, ...):
99 logManager.log(level, src, msg, _arguments, _argptr)
101 # Unit-tests get run before main. Make sure logging is available so they don't crash.
103 logManager = new LogManager()
104 systemClock = new HostClock()
106 logManager.appenders ~= new StreamAppender(new Printer(cstream.derr), systemClock)