9fans.net/go@v0.0.7/cmd/acme/internal/fileload/buff.go (about) 1 // #include <u.h> 2 // #include <libc.h> 3 // #include <draw.h> 4 // #include <thread.h> 5 // #include <cursor.h> 6 // #include <mouse.h> 7 // #include <keyboard.h> 8 // #include <frame.h> 9 // #include <fcall.h> 10 // #include <plumb.h> 11 // #include <libsec.h> 12 // #include "dat.h" 13 // #include "fns.h" 14 15 package fileload 16 17 import ( 18 "io" 19 "os" 20 "unicode/utf8" 21 22 "9fans.net/go/cmd/acme/internal/alog" 23 "9fans.net/go/cmd/acme/internal/bufs" 24 "9fans.net/go/cmd/acme/internal/runes" 25 "9fans.net/go/cmd/acme/internal/util" 26 "9fans.net/go/cmd/acme/internal/wind" 27 ) 28 29 func Loadfile(fd *os.File, q0 int, nulls *bool, f func(int, []rune) int, h io.Writer) int { 30 p := make([]byte, bufs.Len+utf8.UTFMax+1) 31 r := make([]rune, bufs.Len) 32 m := 0 33 n := 1 34 q1 := q0 35 /* 36 * At top of loop, may have m bytes left over from 37 * last pass, possibly representing a partial rune. 38 */ 39 for n > 0 { 40 var err error 41 n, err = fd.Read(p[m : m+bufs.Len]) 42 if err != nil && err != io.EOF { 43 alog.Printf("read error in Buffer.load: %v", err) 44 break 45 } 46 if h != nil { 47 h.Write(p[m : m+n]) 48 } 49 m += n 50 nb, nr, nulls1 := runes.Convert(p[:m], r, err == io.EOF) 51 if nulls1 { 52 *nulls = true 53 } 54 copy(p, p[nb:m]) 55 m -= nb 56 q1 += f(q1, r[:nr]) 57 } 58 return q1 - q0 59 } 60 61 func fileloader(f *wind.File) func(pos int, data []rune) int { 62 return func(pos int, data []rune) int { 63 f.Insert(pos, data) 64 return len(data) 65 } 66 } 67 68 func fileload1(f *wind.File, pos int, fd *os.File, nulls *bool, h io.Writer) int { 69 if pos > f.Len() { 70 util.Fatal("internal error: fileload1") 71 } 72 return Loadfile(fd, pos, nulls, fileloader(f), h) 73 }