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/branches/primop-branch/src/system/Basis/Implementation/IO/text-io-fn.sml
ViewVC logotype

Diff of /sml/branches/primop-branch/src/system/Basis/Implementation/IO/text-io-fn.sml

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

revision 1470, Mon Mar 29 22:45:55 2004 UTC revision 1471, Mon Mar 29 22:45:55 2004 UTC
# Line 435  Line 435 
435              closed : bool ref,              closed : bool ref,
436              bufferMode : IO.buffer_mode ref,              bufferMode : IO.buffer_mode ref,
437              writer : writer,              writer : writer,
438              writeArr : {buf : A.array, i : int, sz : int option} -> unit,              writeArr : AS.slice -> unit,
439              writeVec : {buf : V.vector, i : int, sz : int option} -> unit,              writeVec : VS.slice -> unit,
440              cleanTag : CleanIO.tag              cleanTag : CleanIO.tag
441            }            }
442    
# Line 453  Line 453 
453          fun flushBuffer (strm as OSTRM{buf, pos, writeArr, ...}, mlOp) = (          fun flushBuffer (strm as OSTRM{buf, pos, writeArr, ...}, mlOp) = (
454                case !pos                case !pos
455                 of 0 => ()                 of 0 => ()
456                  | n => ((                  | n => ((writeArr (AS.slice (buf, 0, SOME n)); pos := 0)
                     writeArr {buf=buf, i=0, sz=SOME n}; pos := 0)  
457                        handle ex => outputExn (strm, mlOp, ex))                        handle ex => outputExn (strm, mlOp, ex))
458                (* end case *))                (* end case *))
459    
# Line 488  Line 487 
487                fun writeDirect () = (                fun writeDirect () = (
488                      case !pos                      case !pos
489                       of 0 => ()                       of 0 => ()
490                        | n => (#writeArr os {buf=buf, i=0, sz=SOME n}; pos := 0)                        | n => (#writeArr os (AS.slice (buf, 0, SOME n));
491                                  pos := 0)
492                      (* end case *);                      (* end case *);
493                      #writeVec os {buf=v, i=0, sz=NONE})                      #writeVec os (VS.full v))
494                        handle ex => outputExn (strm, "output", ex)                        handle ex => outputExn (strm, "output", ex)
495                fun insert copyVec = let                fun insert copyVec = let
496                      val bufLen = A.length buf                      val bufLen = A.length buf
# Line 507  Line 507 
507                                  val _ =                                  val _ =
508                                      AS.copyVec { src=VS.slice(v,0,SOME avail),                                      AS.copyVec { src=VS.slice(v,0,SOME avail),
509                                                   dst=buf, di=i }                                                   dst=buf, di=i }
510                                  val _ = #writeArr os {buf=buf, i=0, sz=NONE}                                  val _ = #writeArr os (AS.full buf)
511                                        handle ex => (                                        handle ex => (
512                                          pos := bufLen;                                          pos := bufLen;
513                                          outputExn (strm, "output", ex))                                          outputExn (strm, "output", ex))
# Line 539  Line 539 
539                case !bufferMode                case !bufferMode
540                 of IO.NO_BUF => (                 of IO.NO_BUF => (
541                      arrUpdate (buf, 0, elem);                      arrUpdate (buf, 0, elem);
542                      writeArr {buf=buf, i=0, sz=SOME 1}                      writeArr (AS.slice (buf, 0, SOME 1))
543                        handle ex => outputExn (strm, "output1", ex))                        handle ex => outputExn (strm, "output1", ex))
544                  | IO.LINE_BUF => let val i = !pos val i' = i+1                  | IO.LINE_BUF => let val i = !pos val i' = i+1
545                      in                      in
# Line 571  Line 571 
571    
572          fun mkOutstream (wr as PIO.WR{chunkSize, writeArr, writeVec, ...}, mode) =          fun mkOutstream (wr as PIO.WR{chunkSize, writeArr, writeVec, ...}, mode) =
573                let                let
574                fun iterate f (buf, i, sz) = let                    fun iterate (f, size, subslice) sl = let
575                      fun lp (_, 0) = ()                        fun lp sl =
576                        | lp (i, n) = let val n' = f{buf=buf, i=i, sz=SOME n}                            if size sl = 0 then ()
577                            in lp (i+n', n-n') end                            else let val n = f sl
578                      in                      in
579                        lp (i, sz)                                     lp (subslice (sl, n, NONE))
580                      end                      end
               val writeArr' = (case writeArr  
                      of NONE => (fn _ => raise IO.BlockingNotSupported)  
                       | (SOME f) => let  
                           fun write {buf, i, sz} = let  
                                 val len = (case sz  
                                        of NONE => A.length buf - i  
                                         | (SOME n) => n  
                                       (* end case *))  
581                                  in                                  in
582                                    iterate f (buf, i, len)                        lp sl
                                 end  
                           in  
                             write  
583                            end                            end
584                  val writeArr' = (case writeArr
585                         of NONE => (fn _ => raise IO.BlockingNotSupported)
586                          | (SOME f) => iterate (f, AS.length, AS.subslice)
587                      (* end case *))                      (* end case *))
588                val writeVec' = (case writeVec                val writeVec' = (case writeVec
589                       of NONE => (fn _ => raise IO.BlockingNotSupported)                       of NONE => (fn _ => raise IO.BlockingNotSupported)
590                        | (SOME f) => let                        | (SOME f) => iterate (f, VS.length, VS.subslice)
                           fun write {buf, i, sz} = let  
                                 val len = (case sz  
                                        of NONE => V.length buf - i  
                                         | (SOME n) => n  
                                       (* end case *))  
                                 in  
                                   iterate f (buf, i, len)  
                                 end  
                           in  
                             write  
                           end  
591                      (* end case *))                      (* end case *))
592              (* install a dummy cleaner *)              (* install a dummy cleaner *)
593                val tag = CleanIO.addCleaner {                val tag = CleanIO.addCleaner {
# Line 672  Line 653 
653                fun writeDirect () = (                fun writeDirect () = (
654                      case !pos                      case !pos
655                       of 0 => ()                       of 0 => ()
656                        | n => (#writeArr os {buf=buf, i=0, sz=SOME n}; pos := 0)                        | n => (#writeArr os (AS.slice (buf, 0, SOME n));
657                                  pos := 0)
658                      (* end case *);                      (* end case *);
659                      #writeVec os {buf=v, i=dataStart, sz=SOME dataLen})                      #writeVec os (VS.slice (v, dataStart, SOME dataLen)))
660                        handle ex => outputExn (strm, "outputSubstr", ex)                        handle ex => outputExn (strm, "outputSubstr", ex)
661                fun insert copyVec = let                fun insert copyVec = let
662                      val bufLen = A.length buf                      val bufLen = A.length buf
# Line 691  Line 673 
673                                      AS.copyVec { src = VS.slice                                      AS.copyVec { src = VS.slice
674                                                     (v,dataStart,SOME avail),                                                     (v,dataStart,SOME avail),
675                                                   dst = buf, di = i }                                                   dst = buf, di = i }
676                                  val _ = #writeArr os {buf=buf, i=0, sz=NONE}                                  val _ = #writeArr os (AS.full buf)
677                                        handle ex => (                                        handle ex => (
678                                          pos := bufLen;                                          pos := bufLen;
679                                          outputExn (strm, "outputSubstr", ex))                                          outputExn (strm, "outputSubstr", ex))

Legend:
Removed from v.1470  
changed lines
  Added in v.1471

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