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  }