# HG changeset patch # User wenzelm # Date 1210755911 -7200 # Node ID ae6ae88f924038007f29a23044c20134781f6ccf # Parent 9e824d8f4512310a361d9a78c1d71b050c96c069 use_text/file: proper position output; diff -r 9e824d8f4512 -r ae6ae88f9240 src/Pure/General/secure.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 *) diff -r 9e824d8f4512 -r ae6ae88f9240 src/Pure/ML-Systems/polyml.ML --- 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; +