-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathutil.sml
102 lines (85 loc) · 3.39 KB
/
util.sml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
(* $Id$
*
* Copyright (c) 2008 Timothy Bourke (University of NSW and NICTA)
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the "BSD License" which is distributed with the
* software in the file LICENSE.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the BSD
* License for more details.
*)
structure Util :
sig
val warn : string list -> unit
val abort : string list -> 'a
val debug : (Settings.debug_priority * (unit -> string list)) -> unit
val debugAll : (unit -> string list) -> unit
val debugVeryDetailed : (unit -> string list) -> unit
val debugDetailed : (unit -> string list) -> unit
val debugOutline : (unit -> string list) -> unit
(* show borders *)
val debugSect : (Settings.debug_priority * (unit -> string list)) -> unit
val debugSubsect : (Settings.debug_priority * (unit -> string list)) -> unit
val debugIndent : (Settings.debug_priority * (unit -> string list)) -> unit
val debugOutdent : (Settings.debug_priority * (unit -> string list)) -> unit
end
=
let structure TIO = TextIO
in
struct
val indent = ref 0
val indentAmount = 3;
fun sect () = (StringCvt.padLeft #" " (!indent) "") ^
(StringCvt.padLeft #"*" 71 "\n")
fun subsect () = (StringCvt.padLeft #" " (!indent) "") ^
(StringCvt.padLeft #"-" 71 "\n")
fun warn msg = (TIO.output (TIO.stdErr,
String.concat (Settings.progName::":"::msg));
TIO.output (TIO.stdErr, "\n"))
fun abort msg = (TIO.output (TIO.stdErr,
String.concat (Settings.progName::":"::msg));
TIO.output (TIO.stdErr, "\n");
OS.Process.exit (OS.Process.failure))
local
val split = Substring.tokens (fn #"\n"=>true | _ => false)
fun pr ss = (TIO.output (TIO.stdErr, StringCvt.padLeft #" " (!indent) "");
TIO.output (TIO.stdErr, Substring.string ss);
TIO.output (TIO.stdErr, "\n"))
in
fun print (indent, lazystrs) = case lazystrs ()
of [] => ()
| strs => app pr ((split o Substring.full) (concat strs))
end (* local *)
fun debug (priority, lazystrs) =
if Settings.showDebug (priority)
then print (!indent, lazystrs) else ()
fun debugSect (priority, lazystrs) =
if Settings.showDebug (priority)
then (TIO.output (TIO.stdErr, sect ());
print (!indent, lazystrs))
else ()
fun debugSubsect (priority, lazystrs) =
if Settings.showDebug (priority)
then (TIO.output (TIO.stdErr, subsect ());
print (!indent, lazystrs))
else ()
fun debugIndent (priority, lazystrs) =
if Settings.showDebug (priority)
then (print (!indent, lazystrs);
indent := (!indent) + indentAmount)
else ()
fun debugOutdent (priority, lazystrs) =
if Settings.showDebug (priority)
then (indent := (!indent) - indentAmount;
print (!indent, lazystrs))
else ()
fun debugAll ls = debug (Settings.All, ls)
fun debugVeryDetailed ls = debug (Settings.VeryDetailed, ls)
fun debugDetailed ls = debug (Settings.Detailed, ls)
fun debugOutline ls = debug (Settings.Outline, ls)
end
end