cvsimport
[hcoop/zz_old/portal.git] / util.sml
index a5ae19e..ee6c872 100644 (file)
--- a/util.sml
+++ b/util.sml
@@ -28,11 +28,13 @@ fun makeSet f items =
       | usr::rest => foldl (fn (usr, s) => s ^ ", " ^ f usr) ("(" ^ f usr) rest ^ ")"
 
 fun neg (r : real) = ~r
+fun add (r1 : real, r2) = r1 + r2
+fun mult (r1, r2) = real r1 * r2
 
-fun isIdent ch = Char.isLower ch orelse Char.isDigit ch
+fun isIdent ch = Char.isLower ch orelse Char.isDigit ch orelse ch = #"-"
 
 fun validHost s =
-    size s > 0 andalso size s < 20 andalso List.all isIdent (String.explode s)
+    size s > 0 andalso size s < 40 andalso List.all isIdent (String.explode s)
                                                  
 fun validDomain s =
     size s > 0 andalso size s < 100 andalso List.all validHost (String.fields (fn ch => ch = #".") s)
@@ -61,4 +63,28 @@ fun init () = rnd := Random.rand (SysWord.toInt (Posix.Process.pidToWord (Posix.
 
 fun randomPassword () = Int.toString (Int.abs (Random.randInt (!rnd)))
 
-end
\ No newline at end of file
+fun domainDir dom =
+    String.concatWith "/" ("/afs/hcoop.net/common/etc/domtool/nodes/deleuze" :: List.rev (String.fields (fn ch => ch = #".") dom))
+
+fun readFile fname =
+    let
+       val inf = TextIO.openIn fname
+
+       fun readLines lines =
+           case TextIO.inputLine inf of
+               NONE => String.concat (List.rev lines)
+             | SOME line => readLines (line :: lines)
+    in
+       readLines []
+       before TextIO.closeIn inf
+    end
+
+fun mem (x, ls) = List.exists (fn y => y = x) ls
+
+val allLower = CharVector.map Char.toLower
+
+fun normEmail s = case String.tokens Char.isSpace (allLower s) of
+                     s :: _ => s
+                   | [] => ""
+
+end