1 structure Util
:> UTIL
=
4 datatype 'a flat_element
=
8 type 'a flat_tree
= 'a flat_element list
11 Web
.print (if n
< 0 then
12 "-" ^
Int.toString (~n
)
17 Web
.print (if n
< 0.0 then
18 "-" ^
Real.fmt (StringCvt.FIX (SOME
2)) (~n
)
20 Real.fmt (StringCvt.FIX (SOME
2)) n
)
27 |
[usr
] => "(" ^ f usr ^
")"
28 | usr
::rest
=> foldl (fn (usr
, s
) => s ^
", " ^ f usr
) ("(" ^ f usr
) rest ^
")"
30 fun neg (r
: real) = ~r
31 fun add (r1
: real, r2
) = r1
+ r2
32 fun sub (r1
: real, r2
) = r1
- r2
33 fun mult (r1
, r2
) = real r1
* r2
35 fun lt (r1
: real, r2
) = r1
< r2
36 fun ge (r1
: real, r2
) = r1
>= r2
38 fun isIdent ch
= Char.isLower ch
orelse Char.isDigit ch
orelse ch
= #
"-"
41 size s
> 0 andalso size s
< 40 andalso List.all
isIdent (String.explode s
)
44 size s
> 0 andalso size s
< 100 andalso List.all
validHost (String.fields (fn ch
=> ch
= #
".") s
)
47 size s
> 0 andalso size s
< 50 andalso List.all
48 (fn ch
=> isIdent ch
orelse ch
= #
"." orelse ch
= #
"_" orelse ch
= #
"-" orelse ch
= #
"+")
51 fun validEmailUser s
=
52 size s
> 0 andalso size s
< 50 andalso List.all
53 (fn ch
=> Char.isAlphaNum ch
orelse ch
= #
"." orelse ch
= #
"_" orelse ch
= #
"-" orelse ch
= #
"+")
57 (case String.fields (fn ch
=> ch
= #
"@") s
of
58 [user
, host
] => validEmailUser user
andalso validDomain host
61 fun whoisUrl dom
= String.concat
["http://reports.internic.net/cgi/whois?whois_nic=", dom
, "&type=domain"]
63 val rnd
= ref (Random
.rand (0, 0))
65 fun init () = rnd
:= Random
.rand (SysWord
.toInt (Posix
.Process
.pidToWord (Posix
.ProcEnv
.getpid ())),
66 SysWord
.toInt (Posix
.Process
.pidToWord (Posix
.ProcEnv
.getpid ())))
68 fun randomPassword () = Int.toString (Int.abs (Random
.randInt (!rnd
)))
71 String.concatWith
"/" ("/afs/hcoop.net/common/etc/domtool/nodes/deleuze" :: List.rev (String.fields (fn ch
=> ch
= #
".") dom
))
75 val inf
= TextIO.openIn fname
78 case TextIO.inputLine inf
of
79 NONE
=> String.concat (List.rev lines
)
80 | SOME line
=> readLines (line
:: lines
)
83 before TextIO.closeIn inf
86 fun mem (x
, ls
) = List.exists (fn y
=> y
= x
) ls
88 val allLower
= CharVector
.map
Char.toLower
90 fun normEmail s
= case String.tokens
Char.isSpace (allLower s
) of
94 val s_cutoff
= LargeInt
.fromInt
60
95 val m_cutoff
= LargeInt
.fromInt (60 * 60)
96 val h_cutoff
= LargeInt
.fromInt (60 * 60 * 24)
100 val secs
= Time
.toSeconds (Time
.- (Time
.now (), t
))
102 if LargeInt
.< (secs
, s_cutoff
) then
103 LargeInt
.toString secs ^
" seconds"
104 else if LargeInt
.< (secs
, m_cutoff
) then
105 LargeInt
.toString (LargeInt
.div (secs
, s_cutoff
)) ^
" minutes"
106 else if LargeInt
.< (secs
, h_cutoff
) then
107 LargeInt
.toString (LargeInt
.div (secs
, m_cutoff
)) ^
" hours"
109 LargeInt
.toString (LargeInt
.div (secs
, h_cutoff
)) ^
" days"