| author | wenzelm | 
| Sun, 02 Sep 2012 19:26:05 +0200 | |
| changeset 49065 | 8ead9e8b15fb | 
| parent 48923 | a2df77fcf1eb | 
| child 49334 | dbc169ddd404 | 
| permissions | -rw-r--r-- | 
| 30175 | 1  | 
/* Title: Pure/System/isabelle_system.scala  | 
| 27919 | 2  | 
Author: Makarius  | 
3  | 
||
| 
43695
 
5130dfe1b7be
simplified Symbol based on lazy Symbol.Interpretation -- reduced odd "functorial style";
 
wenzelm 
parents: 
43670 
diff
changeset
 | 
4  | 
Fundamental Isabelle system environment: quasi-static module with  | 
| 
 
5130dfe1b7be
simplified Symbol based on lazy Symbol.Interpretation -- reduced odd "functorial style";
 
wenzelm 
parents: 
43670 
diff
changeset
 | 
5  | 
optional init operation.  | 
| 27919 | 6  | 
*/  | 
7  | 
||
8  | 
package isabelle  | 
|
9  | 
||
| 
43520
 
cec9b95fa35d
explicit import java.lang.System to prevent odd scope problems;
 
wenzelm 
parents: 
43514 
diff
changeset
 | 
10  | 
import java.lang.System  | 
| 
31520
 
0a99c8716312
simplified IsabelleSystem.platform_path for cygwin;
 
wenzelm 
parents: 
31500 
diff
changeset
 | 
11  | 
import java.util.regex.Pattern  | 
| 31820 | 12  | 
import java.util.Locale  | 
| 48409 | 13  | 
import java.io.{InputStream, OutputStream, File => JFile, BufferedReader, InputStreamReader,
 | 
| 
45027
 
f459e93a038e
more abstract wrapping of fifos as System_Channel;
 
wenzelm 
parents: 
44184 
diff
changeset
 | 
14  | 
BufferedWriter, OutputStreamWriter, IOException}  | 
| 34024 | 15  | 
import java.awt.{GraphicsEnvironment, Font}
 | 
| 37367 | 16  | 
import java.awt.font.TextAttribute  | 
| 28063 | 17  | 
|
18  | 
import scala.io.Source  | 
|
| 
31520
 
0a99c8716312
simplified IsabelleSystem.platform_path for cygwin;
 
wenzelm 
parents: 
31500 
diff
changeset
 | 
19  | 
import scala.util.matching.Regex  | 
| 34163 | 20  | 
import scala.collection.mutable  | 
| 27936 | 21  | 
|
| 27919 | 22  | 
|
| 
43514
 
45cf8d5e109a
lazy Isabelle_System.default supports implicit boot;
 
wenzelm 
parents: 
43484 
diff
changeset
 | 
23  | 
object Isabelle_System  | 
| 
 
45cf8d5e109a
lazy Isabelle_System.default supports implicit boot;
 
wenzelm 
parents: 
43484 
diff
changeset
 | 
24  | 
{
 | 
| 
43661
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
25  | 
/** implicit state **/  | 
| 
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
26  | 
|
| 
43695
 
5130dfe1b7be
simplified Symbol based on lazy Symbol.Interpretation -- reduced odd "functorial style";
 
wenzelm 
parents: 
43670 
diff
changeset
 | 
27  | 
private case class State(standard_system: Standard_System, settings: Map[String, String])  | 
| 
43661
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
28  | 
|
| 
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
29  | 
@volatile private var _state: Option[State] = None  | 
| 
43514
 
45cf8d5e109a
lazy Isabelle_System.default supports implicit boot;
 
wenzelm 
parents: 
43484 
diff
changeset
 | 
30  | 
|
| 
43661
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
31  | 
private def check_state(): State =  | 
| 
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
32  | 
  {
 | 
| 
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
33  | 
if (_state.isEmpty) init() // unsynchronized check  | 
| 
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
34  | 
_state.get  | 
| 
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
35  | 
}  | 
| 
37013
 
641923374eba
Isabelle_System: allow explicit isabelle_home argument;
 
wenzelm 
parents: 
36991 
diff
changeset
 | 
36  | 
|
| 
43661
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
37  | 
def standard_system: Standard_System = check_state().standard_system  | 
| 
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
38  | 
def settings: Map[String, String] = check_state().settings  | 
| 31796 | 39  | 
|
| 
37013
 
641923374eba
Isabelle_System: allow explicit isabelle_home argument;
 
wenzelm 
parents: 
36991 
diff
changeset
 | 
40  | 
/*  | 
| 
 
641923374eba
Isabelle_System: allow explicit isabelle_home argument;
 
wenzelm 
parents: 
36991 
diff
changeset
 | 
41  | 
isabelle_home precedence:  | 
| 
 
641923374eba
Isabelle_System: allow explicit isabelle_home argument;
 
wenzelm 
parents: 
36991 
diff
changeset
 | 
42  | 
(1) this_isabelle_home as explicit argument  | 
| 
 
641923374eba
Isabelle_System: allow explicit isabelle_home argument;
 
wenzelm 
parents: 
36991 
diff
changeset
 | 
43  | 
(2) ISABELLE_HOME process environment variable (e.g. inherited from running isabelle tool)  | 
| 
 
641923374eba
Isabelle_System: allow explicit isabelle_home argument;
 
wenzelm 
parents: 
36991 
diff
changeset
 | 
44  | 
(3) isabelle.home system property (e.g. via JVM application boot process)  | 
| 
 
641923374eba
Isabelle_System: allow explicit isabelle_home argument;
 
wenzelm 
parents: 
36991 
diff
changeset
 | 
45  | 
*/  | 
| 
43661
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
46  | 
  def init(this_isabelle_home: String = null) = synchronized {
 | 
| 
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
47  | 
    if (_state.isEmpty) {
 | 
| 
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
48  | 
import scala.collection.JavaConversions._  | 
| 
37013
 
641923374eba
Isabelle_System: allow explicit isabelle_home argument;
 
wenzelm 
parents: 
36991 
diff
changeset
 | 
49  | 
|
| 
43661
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
50  | 
val standard_system = new Standard_System  | 
| 
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
51  | 
val settings =  | 
| 
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
52  | 
      {
 | 
| 48193 | 53  | 
        val env0 = sys.env + ("ISABELLE_JDK_HOME" -> standard_system.this_jdk_home())
 | 
| 27919 | 54  | 
|
| 
47725
 
447b635bcea5
cold-start HOME is user.home, in accordance with Cygwin-Terminal.bat;
 
wenzelm 
parents: 
47674 
diff
changeset
 | 
55  | 
        val user_home = System.getProperty("user.home")
 | 
| 
 
447b635bcea5
cold-start HOME is user.home, in accordance with Cygwin-Terminal.bat;
 
wenzelm 
parents: 
47674 
diff
changeset
 | 
56  | 
val env =  | 
| 
 
447b635bcea5
cold-start HOME is user.home, in accordance with Cygwin-Terminal.bat;
 
wenzelm 
parents: 
47674 
diff
changeset
 | 
57  | 
          if (user_home == null || env0.isDefinedAt("HOME")) env0
 | 
| 
 
447b635bcea5
cold-start HOME is user.home, in accordance with Cygwin-Terminal.bat;
 
wenzelm 
parents: 
47674 
diff
changeset
 | 
58  | 
          else env0 + ("HOME" -> user_home)
 | 
| 
 
447b635bcea5
cold-start HOME is user.home, in accordance with Cygwin-Terminal.bat;
 
wenzelm 
parents: 
47674 
diff
changeset
 | 
59  | 
|
| 
43661
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
60  | 
val isabelle_home =  | 
| 
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
61  | 
if (this_isabelle_home != null) this_isabelle_home  | 
| 
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
62  | 
else  | 
| 
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
63  | 
            env.get("ISABELLE_HOME") match {
 | 
| 
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
64  | 
              case None | Some("") =>
 | 
| 
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
65  | 
                val path = System.getProperty("isabelle.home")
 | 
| 
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
66  | 
                if (path == null || path == "") error("Unknown Isabelle home directory")
 | 
| 
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
67  | 
else path  | 
| 
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
68  | 
case Some(path) => path  | 
| 
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
69  | 
}  | 
| 29177 | 70  | 
|
| 
48411
 
5b3440850d36
more abstract file system operations in Scala, corresponding to ML version;
 
wenzelm 
parents: 
48409 
diff
changeset
 | 
71  | 
          File.with_tmp_file("settings") { dump =>
 | 
| 
43661
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
72  | 
val shell_prefix =  | 
| 
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
73  | 
if (Platform.is_windows) List(standard_system.platform_root + "\\bin\\bash", "-l")  | 
| 
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
74  | 
else Nil  | 
| 
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
75  | 
val cmdline =  | 
| 
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
76  | 
shell_prefix ::: List(isabelle_home + "/bin/isabelle", "getenv", "-d", dump.toString)  | 
| 
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
77  | 
val (output, rc) = Standard_System.raw_exec(null, env, true, cmdline: _*)  | 
| 
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
78  | 
if (rc != 0) error(output)  | 
| 31498 | 79  | 
|
| 
43661
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
80  | 
val entries =  | 
| 
48411
 
5b3440850d36
more abstract file system operations in Scala, corresponding to ML version;
 
wenzelm 
parents: 
48409 
diff
changeset
 | 
81  | 
                (for (entry <- File.read(dump) split "\0" if entry != "") yield {
 | 
| 
43661
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
82  | 
                  val i = entry.indexOf('=')
 | 
| 
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
83  | 
if (i <= 0) (entry -> "")  | 
| 
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
84  | 
else (entry.substring(0, i) -> entry.substring(i + 1))  | 
| 
47674
 
cdf95042e09c
more robust handling of PATH vs PATH_JVM -- required for cold start of Cygwin from Windows (e.g. Isabelle.exe);
 
wenzelm 
parents: 
47661 
diff
changeset
 | 
85  | 
}).toMap  | 
| 
 
cdf95042e09c
more robust handling of PATH vs PATH_JVM -- required for cold start of Cygwin from Windows (e.g. Isabelle.exe);
 
wenzelm 
parents: 
47661 
diff
changeset
 | 
86  | 
              entries + ("PATH" -> entries("PATH_JVM")) - "PATH_JVM"
 | 
| 
43661
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
87  | 
}  | 
| 
34201
 
c95dcd12f48a
separate Standard_System (Cygwin/Posix compatibility) vs. Isabelle_System (settings environment etc.);
 
wenzelm 
parents: 
34200 
diff
changeset
 | 
88  | 
}  | 
| 
43695
 
5130dfe1b7be
simplified Symbol based on lazy Symbol.Interpretation -- reduced odd "functorial style";
 
wenzelm 
parents: 
43670 
diff
changeset
 | 
89  | 
_state = Some(State(standard_system, settings))  | 
| 
43661
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
90  | 
}  | 
| 27953 | 91  | 
}  | 
| 27919 | 92  | 
|
| 31796 | 93  | 
|
94  | 
/* getenv */  | 
|
95  | 
||
| 
47661
 
012a887997f3
USER_HOME settings variable points to cross-platform user home directory;
 
wenzelm 
parents: 
47113 
diff
changeset
 | 
96  | 
def getenv(name: String): String = settings.getOrElse(name, "")  | 
| 31498 | 97  | 
|
98  | 
def getenv_strict(name: String): String =  | 
|
99  | 
  {
 | 
|
| 
31234
 
6ce6801129de
getenv_strict needs to be based on getenv (accidentally broken in 0e88d33e8d19);
 
wenzelm 
parents: 
30175 
diff
changeset
 | 
100  | 
val value = getenv(name)  | 
| 
27993
 
6dd90ef9f927
simplified exceptions: use plain error function / RuntimeException;
 
wenzelm 
parents: 
27974 
diff
changeset
 | 
101  | 
    if (value != "") value else error("Undefined environment variable: " + name)
 | 
| 27919 | 102  | 
}  | 
103  | 
||
| 31796 | 104  | 
|
| 43606 | 105  | 
/** file-system operations **/  | 
| 31796 | 106  | 
|
| 43606 | 107  | 
/* path specifications */  | 
| 
36136
 
89b1a136edef
more precise treatment of UNC server prefix, e.g. //foo;
 
wenzelm 
parents: 
36012 
diff
changeset
 | 
108  | 
|
| 43664 | 109  | 
def standard_path(path: Path): String = path.expand.implode  | 
| 31796 | 110  | 
|
| 
43661
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
111  | 
def platform_path(path: Path): String = standard_system.jvm_path(standard_path(path))  | 
| 48409 | 112  | 
def platform_file(path: Path): JFile = new JFile(platform_path(path))  | 
| 29152 | 113  | 
|
| 45100 | 114  | 
def platform_file_url(raw_path: Path): String =  | 
115  | 
  {
 | 
|
116  | 
val path = raw_path.expand  | 
|
117  | 
require(path.is_absolute)  | 
|
| 
45101
 
6317e969fb30
proper platform_file_url for Windows UNC paths (server shares);
 
wenzelm 
parents: 
45100 
diff
changeset
 | 
118  | 
    val s = platform_path(path).replaceAll(" ", "%20")
 | 
| 
 
6317e969fb30
proper platform_file_url for Windows UNC paths (server shares);
 
wenzelm 
parents: 
45100 
diff
changeset
 | 
119  | 
if (!Platform.is_windows) "file://" + s  | 
| 
 
6317e969fb30
proper platform_file_url for Windows UNC paths (server shares);
 
wenzelm 
parents: 
45100 
diff
changeset
 | 
120  | 
    else if (s.startsWith("\\\\")) "file:" + s.replace('\\', '/')
 | 
| 
 
6317e969fb30
proper platform_file_url for Windows UNC paths (server shares);
 
wenzelm 
parents: 
45100 
diff
changeset
 | 
121  | 
    else "file:///" + s.replace('\\', '/')
 | 
| 45100 | 122  | 
}  | 
123  | 
||
| 
43661
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
124  | 
def posix_path(jvm_path: String): String = standard_system.posix_path(jvm_path)  | 
| 
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
125  | 
|
| 27953 | 126  | 
|
| 
48923
 
a2df77fcf1eb
prefer jEdit file name representation (potentially via VFS);
 
wenzelm 
parents: 
48550 
diff
changeset
 | 
127  | 
/* source files of Isabelle/ML bootstrap */  | 
| 31436 | 128  | 
|
| 
48923
 
a2df77fcf1eb
prefer jEdit file name representation (potentially via VFS);
 
wenzelm 
parents: 
48550 
diff
changeset
 | 
129  | 
def source_file(path: Path): Option[Path] =  | 
| 31498 | 130  | 
  {
 | 
| 
48923
 
a2df77fcf1eb
prefer jEdit file name representation (potentially via VFS);
 
wenzelm 
parents: 
48550 
diff
changeset
 | 
131  | 
def check(p: Path): Option[Path] = if (p.is_file) Some(p) else None  | 
| 
 
a2df77fcf1eb
prefer jEdit file name representation (potentially via VFS);
 
wenzelm 
parents: 
48550 
diff
changeset
 | 
132  | 
|
| 
 
a2df77fcf1eb
prefer jEdit file name representation (potentially via VFS);
 
wenzelm 
parents: 
48550 
diff
changeset
 | 
133  | 
if (path.is_absolute || path.is_current) check(path)  | 
| 31436 | 134  | 
    else {
 | 
| 
48923
 
a2df77fcf1eb
prefer jEdit file name representation (potentially via VFS);
 
wenzelm 
parents: 
48550 
diff
changeset
 | 
135  | 
      check(Path.explode("~~/src/Pure") + path) orElse
 | 
| 
 
a2df77fcf1eb
prefer jEdit file name representation (potentially via VFS);
 
wenzelm 
parents: 
48550 
diff
changeset
 | 
136  | 
        (if (getenv("ML_SOURCES") == "") None else check(Path.explode("$ML_SOURCES") + path))
 | 
| 31436 | 137  | 
}  | 
138  | 
}  | 
|
139  | 
||
140  | 
||
| 32450 | 141  | 
|
| 
39583
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
142  | 
/** external processes **/  | 
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
143  | 
|
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
144  | 
/* plain execute */  | 
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
145  | 
|
| 48409 | 146  | 
def execute_env(cwd: JFile, env: Map[String, String], redirect: Boolean, args: String*): Process =  | 
| 
39583
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
147  | 
  {
 | 
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
148  | 
val cmdline =  | 
| 
43661
 
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
 
wenzelm 
parents: 
43660 
diff
changeset
 | 
149  | 
if (Platform.is_windows) List(standard_system.platform_root + "\\bin\\env.exe") ++ args  | 
| 
39583
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
150  | 
else args  | 
| 
48353
 
bcce872202b3
support external processes with explicit environment;
 
wenzelm 
parents: 
48278 
diff
changeset
 | 
151  | 
val env1 = if (env == null) settings else settings ++ env  | 
| 
 
bcce872202b3
support external processes with explicit environment;
 
wenzelm 
parents: 
48278 
diff
changeset
 | 
152  | 
Standard_System.raw_execute(cwd, env1, redirect, cmdline: _*)  | 
| 
39583
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
153  | 
}  | 
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
154  | 
|
| 
48353
 
bcce872202b3
support external processes with explicit environment;
 
wenzelm 
parents: 
48278 
diff
changeset
 | 
155  | 
def execute(redirect: Boolean, args: String*): Process =  | 
| 
 
bcce872202b3
support external processes with explicit environment;
 
wenzelm 
parents: 
48278 
diff
changeset
 | 
156  | 
execute_env(null, null, redirect, args: _*)  | 
| 
 
bcce872202b3
support external processes with explicit environment;
 
wenzelm 
parents: 
48278 
diff
changeset
 | 
157  | 
|
| 
39583
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
158  | 
|
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
159  | 
/* managed process */  | 
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
160  | 
|
| 48409 | 161  | 
class Managed_Process(cwd: JFile, env: Map[String, String], redirect: Boolean, args: String*)  | 
| 
39583
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
162  | 
  {
 | 
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
163  | 
private val params =  | 
| 43606 | 164  | 
      List(standard_path(Path.explode("~~/lib/scripts/process")), "group", "-", "no_script")
 | 
| 
48353
 
bcce872202b3
support external processes with explicit environment;
 
wenzelm 
parents: 
48278 
diff
changeset
 | 
165  | 
private val proc = execute_env(cwd, env, redirect, (params ++ args):_*)  | 
| 
39583
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
166  | 
|
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
167  | 
|
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
168  | 
// channels  | 
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
169  | 
|
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
170  | 
val stdin: BufferedWriter =  | 
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
171  | 
new BufferedWriter(new OutputStreamWriter(proc.getOutputStream, Standard_System.charset))  | 
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
172  | 
|
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
173  | 
val stdout: BufferedReader =  | 
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
174  | 
new BufferedReader(new InputStreamReader(proc.getInputStream, Standard_System.charset))  | 
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
175  | 
|
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
176  | 
val stderr: BufferedReader =  | 
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
177  | 
new BufferedReader(new InputStreamReader(proc.getErrorStream, Standard_System.charset))  | 
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
178  | 
|
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
179  | 
|
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
180  | 
// signals  | 
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
181  | 
|
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
182  | 
private val pid = stdout.readLine  | 
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
183  | 
|
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
184  | 
private def kill(signal: String): Boolean =  | 
| 
39584
 
f2a10986e85a
more robust Managed_Process.kill: check after sending signal;
 
wenzelm 
parents: 
39583 
diff
changeset
 | 
185  | 
    {
 | 
| 
 
f2a10986e85a
more robust Managed_Process.kill: check after sending signal;
 
wenzelm 
parents: 
39583 
diff
changeset
 | 
186  | 
execute(true, "kill", "-" + signal, "-" + pid).waitFor  | 
| 
 
f2a10986e85a
more robust Managed_Process.kill: check after sending signal;
 
wenzelm 
parents: 
39583 
diff
changeset
 | 
187  | 
execute(true, "kill", "-0", "-" + pid).waitFor == 0  | 
| 
 
f2a10986e85a
more robust Managed_Process.kill: check after sending signal;
 
wenzelm 
parents: 
39583 
diff
changeset
 | 
188  | 
}  | 
| 
39583
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
189  | 
|
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
190  | 
private def multi_kill(signal: String): Boolean =  | 
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
191  | 
    {
 | 
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
192  | 
var running = true  | 
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
193  | 
var count = 10  | 
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
194  | 
      while (running && count > 0) {
 | 
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
195  | 
        if (kill(signal)) {
 | 
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
196  | 
Thread.sleep(100)  | 
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
197  | 
count -= 1  | 
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
198  | 
}  | 
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
199  | 
else running = false  | 
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
200  | 
}  | 
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
201  | 
running  | 
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
202  | 
}  | 
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
203  | 
|
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
204  | 
    def interrupt() { multi_kill("INT") }
 | 
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
205  | 
    def terminate() { multi_kill("INT") && multi_kill("TERM") && kill("KILL"); proc.destroy }
 | 
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
206  | 
|
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
207  | 
|
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
208  | 
// JVM shutdown hook  | 
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
209  | 
|
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
210  | 
    private val shutdown_hook = new Thread { override def run = terminate() }
 | 
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
211  | 
|
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
212  | 
    try { Runtime.getRuntime.addShutdownHook(shutdown_hook) }
 | 
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
213  | 
    catch { case _: IllegalStateException => }
 | 
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
214  | 
|
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
215  | 
private def cleanup() =  | 
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
216  | 
      try { Runtime.getRuntime.removeShutdownHook(shutdown_hook) }
 | 
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
217  | 
      catch { case _: IllegalStateException => }
 | 
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
218  | 
|
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
219  | 
|
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
220  | 
/* result */  | 
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
221  | 
|
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
222  | 
    def join: Int = { val rc = proc.waitFor; cleanup(); rc }
 | 
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
223  | 
}  | 
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
224  | 
|
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
225  | 
|
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
226  | 
/* bash */  | 
| 31796 | 227  | 
|
| 48409 | 228  | 
def bash_env(cwd: JFile, env: Map[String, String], script: String): (String, String, Int) =  | 
| 
34198
 
ff5486262cd6
moved Library.decode_permissive_utf8 to Isabelle_System;
 
wenzelm 
parents: 
34196 
diff
changeset
 | 
229  | 
  {
 | 
| 
48411
 
5b3440850d36
more abstract file system operations in Scala, corresponding to ML version;
 
wenzelm 
parents: 
48409 
diff
changeset
 | 
230  | 
    File.with_tmp_file("isabelle_script") { script_file =>
 | 
| 
 
5b3440850d36
more abstract file system operations in Scala, corresponding to ML version;
 
wenzelm 
parents: 
48409 
diff
changeset
 | 
231  | 
File.write(script_file, script)  | 
| 
48353
 
bcce872202b3
support external processes with explicit environment;
 
wenzelm 
parents: 
48278 
diff
changeset
 | 
232  | 
val proc = new Managed_Process(cwd, env, false, "bash", posix_path(script_file.getPath))  | 
| 
39581
 
430ff865089b
refined Isabelle_System.bash_output: pass pid via stdout, separate stdout/stderr;
 
wenzelm 
parents: 
39576 
diff
changeset
 | 
233  | 
|
| 
39583
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
234  | 
proc.stdin.close  | 
| 
48411
 
5b3440850d36
more abstract file system operations in Scala, corresponding to ML version;
 
wenzelm 
parents: 
48409 
diff
changeset
 | 
235  | 
      val (_, stdout) = Simple_Thread.future("bash_stdout") { File.read(proc.stdout) }
 | 
| 
 
5b3440850d36
more abstract file system operations in Scala, corresponding to ML version;
 
wenzelm 
parents: 
48409 
diff
changeset
 | 
236  | 
      val (_, stderr) = Simple_Thread.future("bash_stderr") { File.read(proc.stderr) }
 | 
| 
34198
 
ff5486262cd6
moved Library.decode_permissive_utf8 to Isabelle_System;
 
wenzelm 
parents: 
34196 
diff
changeset
 | 
237  | 
|
| 
39581
 
430ff865089b
refined Isabelle_System.bash_output: pass pid via stdout, separate stdout/stderr;
 
wenzelm 
parents: 
39576 
diff
changeset
 | 
238  | 
val rc =  | 
| 
39583
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
239  | 
        try { proc.join }
 | 
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
240  | 
        catch { case e: InterruptedException => Thread.interrupted; proc.terminate; 130 }
 | 
| 
39581
 
430ff865089b
refined Isabelle_System.bash_output: pass pid via stdout, separate stdout/stderr;
 
wenzelm 
parents: 
39576 
diff
changeset
 | 
241  | 
(stdout.join, stderr.join, rc)  | 
| 
34198
 
ff5486262cd6
moved Library.decode_permissive_utf8 to Isabelle_System;
 
wenzelm 
parents: 
34196 
diff
changeset
 | 
242  | 
}  | 
| 
 
ff5486262cd6
moved Library.decode_permissive_utf8 to Isabelle_System;
 
wenzelm 
parents: 
34196 
diff
changeset
 | 
243  | 
}  | 
| 
 
ff5486262cd6
moved Library.decode_permissive_utf8 to Isabelle_System;
 
wenzelm 
parents: 
34196 
diff
changeset
 | 
244  | 
|
| 
48353
 
bcce872202b3
support external processes with explicit environment;
 
wenzelm 
parents: 
48278 
diff
changeset
 | 
245  | 
def bash(script: String): (String, String, Int) = bash_env(null, null, script)  | 
| 
 
bcce872202b3
support external processes with explicit environment;
 
wenzelm 
parents: 
48278 
diff
changeset
 | 
246  | 
|
| 
39583
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
247  | 
|
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
248  | 
/* system tools */  | 
| 
 
c1e9c6dfeff8
more robust lib/scripts/process, with explicit script/no_script mode;
 
wenzelm 
parents: 
39581 
diff
changeset
 | 
249  | 
|
| 
31818
 
f698f76a3713
builtin isabelle_tool for ML and Scala -- avoids excessive shell script (especially important for Cygwin);
 
wenzelm 
parents: 
31803 
diff
changeset
 | 
250  | 
def isabelle_tool(name: String, args: String*): (String, Int) =  | 
| 31498 | 251  | 
  {
 | 
| 43669 | 252  | 
    Path.split(getenv_strict("ISABELLE_TOOLS")).find { dir =>
 | 
| 48373 | 253  | 
val file = (dir + Path.basic(name)).file  | 
| 42124 | 254  | 
      try {
 | 
255  | 
file.isFile && file.canRead && file.canExecute &&  | 
|
256  | 
          !name.endsWith("~") && !name.endsWith(".orig")
 | 
|
257  | 
}  | 
|
| 
31818
 
f698f76a3713
builtin isabelle_tool for ML and Scala -- avoids excessive shell script (especially important for Cygwin);
 
wenzelm 
parents: 
31803 
diff
changeset
 | 
258  | 
      catch { case _: SecurityException => false }
 | 
| 34200 | 259  | 
    } match {
 | 
| 
31818
 
f698f76a3713
builtin isabelle_tool for ML and Scala -- avoids excessive shell script (especially important for Cygwin);
 
wenzelm 
parents: 
31803 
diff
changeset
 | 
260  | 
case Some(dir) =>  | 
| 43669 | 261  | 
val file = standard_path(dir + Path.basic(name))  | 
| 43606 | 262  | 
Standard_System.process_output(execute(true, (List(file) ++ args): _*))  | 
| 
31818
 
f698f76a3713
builtin isabelle_tool for ML and Scala -- avoids excessive shell script (especially important for Cygwin);
 
wenzelm 
parents: 
31803 
diff
changeset
 | 
263  | 
      case None => ("Unknown Isabelle tool: " + name, 2)
 | 
| 
 
f698f76a3713
builtin isabelle_tool for ML and Scala -- avoids excessive shell script (especially important for Cygwin);
 
wenzelm 
parents: 
31803 
diff
changeset
 | 
264  | 
}  | 
| 28063 | 265  | 
}  | 
266  | 
||
267  | 
||
| 32450 | 268  | 
|
| 31796 | 269  | 
/** Isabelle resources **/  | 
270  | 
||
| 32328 | 271  | 
/* components */  | 
272  | 
||
| 43669 | 273  | 
def components(): List[Path] =  | 
274  | 
    Path.split(getenv_strict("ISABELLE_COMPONENTS"))
 | 
|
| 32328 | 275  | 
|
276  | 
||
| 29152 | 277  | 
/* find logics */  | 
278  | 
||
| 48503 | 279  | 
def find_logics_dirs(): List[Path] =  | 
| 31498 | 280  | 
  {
 | 
| 48503 | 281  | 
    val ml_ident = Path.explode("$ML_IDENTIFIER").expand
 | 
282  | 
    Path.split(getenv_strict("ISABELLE_PATH")).map(_ + ml_ident)
 | 
|
| 29152 | 283  | 
}  | 
| 29570 | 284  | 
|
| 48503 | 285  | 
def find_logics(): List[String] =  | 
286  | 
    (for {
 | 
|
287  | 
dir <- find_logics_dirs()  | 
|
288  | 
files = dir.file.listFiles() if files != null  | 
|
289  | 
file <- files.toList if file.isFile } yield file.getName).sorted  | 
|
290  | 
||
| 29570 | 291  | 
|
| 34024 | 292  | 
/* fonts */  | 
293  | 
||
| 43484 | 294  | 
def get_font(family: String = "IsabelleText", size: Int = 1, bold: Boolean = false): Font =  | 
295  | 
new Font(family, if (bold) Font.BOLD else Font.PLAIN, size)  | 
|
| 37367 | 296  | 
|
| 
34044
 
09afb1d49fe7
slightly more robust and less ambitious version of install_fonts;
 
wenzelm 
parents: 
34027 
diff
changeset
 | 
297  | 
def install_fonts()  | 
| 
 
09afb1d49fe7
slightly more robust and less ambitious version of install_fonts;
 
wenzelm 
parents: 
34027 
diff
changeset
 | 
298  | 
  {
 | 
| 37367 | 299  | 
val ge = GraphicsEnvironment.getLocalGraphicsEnvironment()  | 
| 43669 | 300  | 
    for (font <- Path.split(getenv_strict("ISABELLE_FONTS")))
 | 
| 48373 | 301  | 
ge.registerFont(Font.createFont(Font.TRUETYPE_FONT, font.file))  | 
| 34024 | 302  | 
}  | 
| 27919 | 303  | 
}  |