Admin/isatest/annomaly.ML
author gagern
Wed, 21 May 2008 22:04:58 +0200
changeset 26965 003b5781b845
parent 26886 d43264d547f8
child 28284 2161665a0a5d
permissions -rw-r--r--
use_file: added str_of_pos argument (ignored);
     1 (*  Title:      Admin/isatest/annomaly.ML
     2     ID:         $Id$
     3     Author:     Martin von Gagern <martin@von-gagern.net>
     4 *)
     5 
     6 use "ML-Systems/smlnj.ML";
     7 
     8 local
     9 
    10   val smlnj_use_text = use_text
    11 
    12   val smlnj_use_file = use_file
    13 
    14   val smlnj_forget_structure = forget_structure
    15 
    16   fun mkAbsolute path =
    17       OS.Path.mkAbsolute { path = path, relativeTo = OS.FileSys.getDir () }
    18 
    19   fun toArcs path = #arcs (OS.Path.fromString path)
    20 
    21   val isabelleHome =
    22       case OS.Process.getEnv "ISABELLE_HOME"
    23        of  NONE => OS.FileSys.getDir ()
    24 	 | SOME home => mkAbsolute home
    25 
    26   fun noparent [] = []
    27     | noparent (n :: ns) =
    28       if n = OS.Path.parentArc then noparent ns else n :: noparent ns
    29 
    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
    34 
    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)
    44 
    45 in
    46 
    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 ]
    53 	*)
    54 	val arcs = if t = "structure Isabelle =\nstruct\nend;"
    55 		      andalso name = "ML"
    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;
    59 
    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;
    64 
    65   fun forget_structure name =
    66       let val arcs = [ "forget_structure", name ]
    67           val _    = AnnoMaLy.nameNextStream arcs
    68       in  smlnj_forget_structure name  end;
    69 
    70 end;