func (cd Iconv) Do(inbuf []byte, in int, outbuf []byte) (out, inleft int, err error) { if in == 0 { return } inbytes := C.size_t(in) inptr := &inbuf[0] outbytes := C.size_t(len(outbuf)) outptr := &outbuf[0] _, err = C.bridge_iconv(cd.Handle, (*C.char)(unsafe.Pointer(inptr)), &inbytes, (*C.char)(unsafe.Pointer(outptr)), &outbytes) out = len(outbuf) - int(outbytes) inleft = int(inbytes) return }
func (cd Iconv) DoWrite(w io.Writer, inbuf []byte, in int, outbuf []byte) (inleft int, err error) { if in == 0 { return } inbytes := C.size_t(in) inptr := &inbuf[0] for inbytes > 0 { outbytes := C.size_t(len(outbuf)) outptr := &outbuf[0] _, err = C.bridge_iconv(cd.Handle, (*C.char)(unsafe.Pointer(inptr)), &inbytes, (*C.char)(unsafe.Pointer(outptr)), &outbytes) w.Write(outbuf[:len(outbuf)-int(outbytes)]) if err != nil && err != E2BIG { return int(inbytes), err } } return 0, nil }