go-bsdiff/internal/native/cgo_read.go

44 lines
661 B
Go
Raw Normal View History

2017-02-21 07:26:46 +00:00
package native
/*
#include "bspatch.h"
*/
import "C"
import (
"io"
"log"
"unsafe"
)
//export cgo_read_buffer
func cgo_read_buffer(bufferIndex C.int,
bufPtr unsafe.Pointer, length C.int) C.int {
goLength := int(length)
if goLength == 0 {
return 0
}
sourceBuffer := readers.Get(int(bufferIndex))
targetBuffer := cPtrToSlice(bufPtr, goLength)
errCode := 0
offset := 0
for offset < goLength {
n, err := sourceBuffer.Read(targetBuffer)
if err == io.EOF {
break
} else if err != nil {
log.Println("cgo_read_buffer failed:", err)
errCode = 1
break
}
offset += n
targetBuffer = targetBuffer[n:]
}
return C.int(errCode)
}