Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Diff of /sml/trunk/src/cml/src/IO/new-text-io-fn.sml
ViewVC logotype

Diff of /sml/trunk/src/cml/src/IO/new-text-io-fn.sml

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1380, Wed Sep 17 20:20:51 2003 UTC revision 1381, Wed Sep 17 21:28:41 2003 UTC
# Line 16  Line 16 
16        end        end
17          where type PrimIO.array = TextPrimIO.array          where type PrimIO.array = TextPrimIO.array
18          where type PrimIO.vector = TextPrimIO.vector          where type PrimIO.vector = TextPrimIO.vector
19            where type PrimIO.array_slice = TextPrimIO.array_slice
20            where type PrimIO.vector_slice = TextPrimIO.vector_slice
21          where type PrimIO.elem = TextPrimIO.elem          where type PrimIO.elem = TextPrimIO.elem
22          where type PrimIO.pos = TextPrimIO.pos          where type PrimIO.pos = TextPrimIO.pos
23          where type PrimIO.reader = TextPrimIO.reader          where type PrimIO.reader = TextPrimIO.reader
# Line 516  Line 518 
518              closed : bool ref,              closed : bool ref,
519              bufferMode : IO.buffer_mode ref,              bufferMode : IO.buffer_mode ref,
520              writer : writer,              writer : writer,
521              writeArr : {buf : A.array, i : int, sz : int option} -> unit,              writeArr : AS.slice -> unit,
522              writeVec : {buf : V.vector, i : int, sz : int option} -> unit,              writeVec : VS.slice -> unit,
523              cleanTag : CleanIO.tag              cleanTag : CleanIO.tag
524            }            }
525    
# Line 544  Line 546 
546                case !pos                case !pos
547                 of 0 => ()                 of 0 => ()
548                  | n => ((                  | n => ((
549                      writeArr {buf=buf, i=0, sz=SOME n}; pos := 0)                      writeArr (AS.slice (buf, 0, SOME n)); pos := 0)
550                        handle ex => (                        handle ex => (
551                          SV.mPut(strmMV, strm); outputExn (strm, mlOp, ex)))                          SV.mPut(strmMV, strm); outputExn (strm, mlOp, ex)))
552                (* end case *))                (* end case *))
# Line 578  Line 580 
580                fun release () = SV.mPut (strmMV, strm)                fun release () = SV.mPut (strmMV, strm)
581                val {buf, pos, bufferMode, ...} = os                val {buf, pos, bufferMode, ...} = os
582                fun flush () = flushBuffer (strmMV, strm, "output")                fun flush () = flushBuffer (strmMV, strm, "output")
583                fun flushAll () = (#writeArr os {buf=buf, i=0, sz=NONE}                fun flushAll () = (#writeArr os (AS.full buf)
584                      handle ex => (release(); outputExn (strm, "output", ex)))                      handle ex => (release(); outputExn (strm, "output", ex)))
585                fun writeDirect () = (                fun writeDirect () = (
586                      case !pos                      case !pos
587                       of 0 => ()                       of 0 => ()
588                        | n => (#writeArr os {buf=buf, i=0, sz=SOME n}; pos := 0)                        | n => (#writeArr os (AS.slice (buf, 0, SOME n)); pos := 0)
589                      (* end case *);                      (* end case *);
590                      #writeVec os {buf=v, i=0, sz=NONE})                      #writeVec os (VS.full v))
591                        handle ex => (release(); outputExn (strm, "output", ex))                        handle ex => (release(); outputExn (strm, "output", ex))
592                fun insert copyVec = let                fun insert copyVec = let
593                      val bufLen = A.length buf                      val bufLen = A.length buf
# Line 636  Line 638 
638                  case !bufferMode                  case !bufferMode
639                   of IO.NO_BUF => (                   of IO.NO_BUF => (
640                        arrUpdate (buf, 0, elem);                        arrUpdate (buf, 0, elem);
641                        writeArr {buf=buf, i=0, sz=SOME 1}                        writeArr (AS.slice (buf, 0, SOME 1))
642                          handle ex => (release(); outputExn (strm, "output1", ex)))                          handle ex => (release(); outputExn (strm, "output1", ex)))
643                    | IO.LINE_BUF => let val i = !pos val i' = i+1                    | IO.LINE_BUF => let val i = !pos val i' = i+1
644                        in                        in
# Line 678  Line 680 
680                end                end
681    
682          fun mkOutstream' (wr as PIO.WR{chunkSize, writeArr, writeVec, ...}, mode) =          fun mkOutstream' (wr as PIO.WR{chunkSize, writeArr, writeVec, ...}, mode) =
683                let                let fun iterate (f, size, subslice) = let
684                fun iterate f (buf, i, sz) = let                        fun lp sl =
685                      fun lp (_, 0) = ()                            if size sl = 0 then ()
686                        | lp (i, n) = let val n' = f{buf=buf, i=i, sz=SOME n}                            else let val n = f sl
                           in lp (i+n', n-n') end  
                     in  
                       lp (i, sz)  
                     end  
               fun writeArr' {buf, i, sz} = let  
                     val len = (case sz  
                            of NONE => A.length buf - i  
                             | (SOME n) => n  
                           (* end case *))  
687                      in                      in
688                        iterate writeArr (buf, i, len)                                     lp (subslice (sl, n, NONE))
689                      end                      end
               fun writeVec' {buf, i, sz} = let  
                     val len = (case sz  
                            of NONE => V.length buf - i  
                             | (SOME n) => n  
                           (* end case *))  
690                      in                      in
691                        iterate writeVec (buf, i, len)                        lp
692                      end                      end
693                  val writeArr' = iterate (writeArr, AS.length, AS.subslice)
694                  val writeVec' = iterate (writeVec, VS. length, VS.subslice)
695              (* install a dummy cleaner *)              (* install a dummy cleaner *)
696                val tag = CleanIO.addCleaner dummyCleaner                val tag = CleanIO.addCleaner dummyCleaner
697                val strm = SV.mVarInit (OSTRM{                val strm = SV.mVarInit (OSTRM{
# Line 798  Line 788 
788                val {buf, pos, bufferMode, ...} = os                val {buf, pos, bufferMode, ...} = os
789                val bufLen = A.length buf                val bufLen = A.length buf
790                fun flush () = flushBuffer (strmMV, strm, "outputSubstr")                fun flush () = flushBuffer (strmMV, strm, "outputSubstr")
791                fun flushAll () = (#writeArr os {buf=buf, i=0, sz=NONE}                fun flushAll () = (#writeArr os (AS.full buf)
792                      handle ex => (release(); outputExn (strm, "outputSubstr", ex)))                      handle ex => (release(); outputExn (strm, "outputSubstr", ex)))
793                fun writeDirect () = (                fun writeDirect () = (
794                      case !pos                      case !pos
795                       of 0 => ()                       of 0 => ()
796                        | n => (#writeArr os {buf=buf, i=0, sz=SOME n}; pos := 0)                        | n => (#writeArr os (AS.slice (buf, 0, SOME n)); pos := 0)
797                      (* end case *);                      (* end case *);
798                      #writeVec os {buf=v, i=dataStart, sz=SOME dataLen})                      #writeVec os (VS.slice (v, dataStart, SOME dataLen)))
799                        handle ex => (release(); outputExn (strm, "outputSubstr", ex))                        handle ex => (release(); outputExn (strm, "outputSubstr", ex))
800                fun insert copyVec = let                fun insert copyVec = let
801                      val bufLen = A.length buf                      val bufLen = A.length buf

Legend:
Removed from v.1380  
changed lines
  Added in v.1381

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0