1structure QUse :> QUse =
2struct
3
4fun use_reader fname (reader as {read = infn0, eof, reset}) =
5  let
6    val lineNo = ref 1
7    fun infn () =
8      case infn0 () of
9          NONE => NONE
10        | SOME (c as #"\n") => (lineNo := !lineNo + 1;
11                                SOME c)
12        | SOME c => SOME c
13    open PolyML
14  in
15    while not (eof()) do
16          compiler (infn, [Compiler.CPFileName fname,
17                           Compiler.CPLineNo (fn () => !lineNo)]) ()
18  end
19
20fun use fname = use_reader fname (QFRead.fileToReader fname)
21
22fun useScript fname =
23    let
24      val istream = TextIO.openIn fname
25      val reader = QFRead.streamToReader true istream
26      val _ = use_reader fname reader
27              handle e => (TextIO.closeIn istream; raise e)
28    in
29      TextIO.closeIn istream
30    end
31
32end
33