use_text/file: proper position output;
authorwenzelm
Wed, 14 May 2008 11:05:11 +0200
changeset 26883 ae6ae88f9240
parent 26882 9e824d8f4512
child 26884 67c54c53da28
use_text/file: proper position output;
src/Pure/General/secure.ML
src/Pure/ML-Systems/polyml.ML
--- a/src/Pure/General/secure.ML	Wed May 14 11:05:10 2008 +0200
+++ b/src/Pure/General/secure.ML	Wed May 14 11:05:11 2008 +0200
@@ -38,19 +38,19 @@
 
 fun secure_mltext () = deny_secure "Cannot evaluate ML source in secure mode";
 
-fun orig_use_text x = use_text ML_Parse.fix_ints x;
-fun orig_use_file x = use_file ML_Parse.fix_ints x;
+fun raw_use_text x = use_text ML_Parse.fix_ints (Position.str_of oo Position.line_file) x;
+fun raw_use_file x = use_file ML_Parse.fix_ints (Position.str_of oo Position.line_file) x;
 
 fun use_text pos pr verbose txt =
-  (secure_mltext (); orig_use_text pos pr verbose txt);
+  (secure_mltext (); raw_use_text pos pr verbose txt);
 
 fun use_file pr verbose name =
-  (secure_mltext (); orig_use_file pr verbose name);
+  (secure_mltext (); raw_use_file pr verbose name);
 
 fun use name = use_file Output.ml_output true name;
 
 (*commit is dynamically bound!*)
-fun commit () = orig_use_text (0, "") Output.ml_output false "commit();";
+fun commit () = raw_use_text (0, "") Output.ml_output false "commit();";
 
 
 (* shell commands *)
--- a/src/Pure/ML-Systems/polyml.ML	Wed May 14 11:05:10 2008 +0200
+++ b/src/Pure/ML-Systems/polyml.ML	Wed May 14 11:05:11 2008 +0200
@@ -12,37 +12,47 @@
 
 (* runtime compilation *)
 
-fun use_text (tune: string -> string) (line, name) (print, err) verbose txt =
+local
+
+fun drop_newline s =
+  if String.isSuffix "\n" s then String.substring (s, 0, size s - 1)
+  else s;
+
+in
+
+fun use_text (tune: string -> string) str_of_pos (start_line, name) (print, err) verbose txt =
   let
+    val current_line = ref start_line;
     val in_buffer = ref (String.explode (tune txt));
     val out_buffer = ref ([]: string list);
-    fun output () = implode (rev (case ! out_buffer of "\n" :: cs => cs | cs => cs));
+    fun output () = drop_newline (implode (rev (! out_buffer)));
 
-    val current_line = ref line;
     fun get () =
       (case ! in_buffer of
         [] => NONE
       | c :: cs =>
           (in_buffer := cs; if c = #"\n" then current_line := ! current_line + 1 else (); SOME c));
     fun put s = out_buffer := s :: ! out_buffer;
+    fun message (msg, is_err, line) =
+      (if is_err then "Error: " else "Warning: ") ^ drop_newline msg ^ str_of_pos line name ^ "\n";
 
     val parameters =
      [PolyML.Compiler.CPOutStream put,
       PolyML.Compiler.CPLineNo (fn () => ! current_line),
-      PolyML.Compiler.CPFileName name];
+      PolyML.Compiler.CPErrorMessageProc (put o message)];
     val _ =
       (while not (List.null (! in_buffer)) do
         PolyML.compiler (get, parameters) ())
       handle exn =>
        (put ("Exception- " ^ General.exnMessage exn ^ " raised");
         err (output ()); raise exn);
-  in
-    if verbose then print (output ()) else ()
-  end;
+  in if verbose then print (output ()) else () end;
 
-fun use_file tune output verbose name =
+fun use_file tune str_of_pos output verbose name =
   let
     val instream = TextIO.openIn name;
     val txt = Exn.release (Exn.capture TextIO.inputAll instream before TextIO.closeIn instream);
-  in use_text tune (1, name) output verbose txt end;
+  in use_text tune str_of_pos (1, name) output verbose txt end;
 
+end;
+