1 (* Title: Admin/isatest/annomaly.ML
3 Author: Martin von Gagern <martin@von-gagern.net>
6 use "ML-Systems/smlnj.ML";
10 val smlnj_use_text = use_text
12 val smlnj_use_file = use_file
14 val smlnj_forget_structure = forget_structure
17 OS.Path.mkAbsolute { path = path, relativeTo = OS.FileSys.getDir () }
19 fun toArcs path = #arcs (OS.Path.fromString path)
22 case OS.Process.getEnv "ISABELLE_HOME"
23 of NONE => OS.FileSys.getDir ()
24 | SOME home => mkAbsolute home
27 | noparent (n :: ns) =
28 if n = OS.Path.parentArc then noparent ns else n :: noparent ns
30 fun isabellePath [] = []
31 | isabellePath ("src" :: name) = "Isabelle" :: name
32 | isabellePath (name as (n :: ns)) =
33 if n = OS.Path.parentArc then noparent ns else "Isabelle" :: name
35 fun rewrite defPrefix name =
36 let val abs = mkAbsolute name
37 val rel = OS.Path.mkRelative { path = abs, relativeTo = isabelleHome }
38 val exists = (OS.FileSys.access(abs, nil)
39 handle OS.SysErr _ => false)
40 in if exists andalso rel <> ""
41 then isabellePath (toArcs rel)
42 else defPrefix @ noparent (toArcs name)
43 end handle OS.Path.Path => defPrefix @ noparent (toArcs name)
47 fun use_text tune str_of_pos (line, name) p v t =
48 let val name = case name of "" => "unnamed" | name => name
49 val arcs = rewrite ["use_text"] name
50 (* should we have different files for different line numbers? *
51 val arcs = if line <= 1 then arcs
52 else arcs @ [ "l." ^ Int.toString line ]
54 val arcs = if t = "structure Isabelle =\nstruct\nend;"
56 then ["empty_Isabelle", "empty" ] else arcs
57 val _ = AnnoMaLy.nameNextStream arcs
58 in smlnj_use_text tune str_of_pos (line, name) p v t end;
60 fun use_file tune str_of_pos output verbose name =
61 let val arcs = rewrite ["use_file"] name
62 val _ = AnnoMaLy.nameNextStream arcs
63 in smlnj_use_file tune str_of_pos output verbose name end;
65 fun forget_structure name =
66 let val arcs = [ "forget_structure", name ]
67 val _ = AnnoMaLy.nameNextStream arcs
68 in smlnj_forget_structure name end;