8d347a33 |
1 | structure Util :> UTIL = |
2 | struct |
3 | |
51520441 |
4 | datatype 'a flat_element = |
5 | BEGIN |
6 | | END |
7 | | ITEM of 'a |
8 | type 'a flat_tree = 'a flat_element list |
9 | |
8d347a33 |
10 | fun printInt n = |
11 | Web.print (if n < 0 then |
12 | "-" ^ Int.toString (~n) |
13 | else |
14 | Int.toString n) |
15 | |
16 | fun printReal n = |
17 | Web.print (if n < 0.0 then |
18 | "-" ^ Real.fmt (StringCvt.FIX (SOME 2)) (~n) |
19 | else |
20 | Real.fmt (StringCvt.FIX (SOME 2)) n) |
21 | |
22 | fun id x = x |
23 | |
24 | fun makeSet f items = |
25 | case items of |
26 | [] => "()" |
27 | | [usr] => "(" ^ f usr ^ ")" |
28 | | usr::rest => foldl (fn (usr, s) => s ^ ", " ^ f usr) ("(" ^ f usr) rest ^ ")" |
29 | |
f1ea3762 |
30 | fun neg (r : real) = ~r |
f98251aa |
31 | fun add (r1 : real, r2) = r1 + r2 |
892e3ea1 |
32 | fun mult (r1, r2) = real r1 * r2 |
f1ea3762 |
33 | |
add44c00 |
34 | fun isIdent ch = Char.isLower ch orelse Char.isDigit ch orelse ch = #"-" |
ff2b7604 |
35 | |
36 | fun validHost s = |
65ba123d |
37 | size s > 0 andalso size s < 40 andalso List.all isIdent (String.explode s) |
ff2b7604 |
38 | |
39 | fun validDomain s = |
40 | size s > 0 andalso size s < 100 andalso List.all validHost (String.fields (fn ch => ch = #".") s) |
41 | |
78304862 |
42 | fun validUser s = |
43 | size s > 0 andalso size s < 50 andalso List.all |
44 | (fn ch => isIdent ch orelse ch = #"." orelse ch = #"_" orelse ch = #"-" orelse ch = #"+") |
45 | (String.explode s) |
46 | |
47 | fun validEmailUser s = |
48 | size s > 0 andalso size s < 50 andalso List.all |
49 | (fn ch => Char.isAlphaNum ch orelse ch = #"." orelse ch = #"_" orelse ch = #"-" orelse ch = #"+") |
50 | (String.explode s) |
51 | |
52 | fun validEmail s = |
53 | (case String.fields (fn ch => ch = #"@") s of |
54 | [user, host] => validEmailUser user andalso validDomain host |
55 | | _ => false) |
56 | |
ff2b7604 |
57 | fun whoisUrl dom = String.concat ["http://reports.internic.net/cgi/whois?whois_nic=", dom, "&type=domain"] |
58 | |
78304862 |
59 | val rnd = ref (Random.rand (0, 0)) |
60 | |
61 | fun init () = rnd := Random.rand (SysWord.toInt (Posix.Process.pidToWord (Posix.ProcEnv.getpid ())), |
62 | SysWord.toInt (Posix.Process.pidToWord (Posix.ProcEnv.getpid ()))) |
63 | |
64 | fun randomPassword () = Int.toString (Int.abs (Random.randInt (!rnd))) |
65 | |
f038f26c |
66 | fun domainDir dom = |
67 | String.concatWith "/" ("/etc/domains" :: String.fields (fn ch => ch = #".") dom) |
68 | |
ce7b516a |
69 | fun readFile fname = |
70 | let |
71 | val inf = TextIO.openIn fname |
72 | |
73 | fun readLines lines = |
74 | case TextIO.inputLine inf of |
75 | NONE => String.concat (List.rev lines) |
76 | | SOME line => readLines (line :: lines) |
77 | in |
78 | readLines [] |
79 | before TextIO.closeIn inf |
80 | end |
81 | |
3ad30cf6 |
82 | fun mem (x, ls) = List.exists (fn y => y = x) ls |
83 | |
f038f26c |
84 | end |