62 lines
1.3 KiB
Go
62 lines
1.3 KiB
Go
package util
|
|
|
|
import "C"
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"log"
|
|
"strings"
|
|
"unsafe"
|
|
|
|
"golang.org/x/text/encoding/charmap"
|
|
)
|
|
|
|
// ErrFileNotFound Windows error
|
|
var ErrFileNotFound = errors.New("file not found")
|
|
|
|
// ErrInvalidHandle Windows error
|
|
var ErrInvalidHandle = errors.New("invalid handle")
|
|
|
|
// UnknownError unhandled Windows error
|
|
type UnknownError struct {
|
|
Code uint64
|
|
}
|
|
|
|
func (e UnknownError) Error() string {
|
|
return fmt.Sprintf("unknown error code: %d", e.Code)
|
|
}
|
|
|
|
// HandleLastError converts C.GetLastError() to golang error
|
|
func HandleLastError(code uint64) error {
|
|
switch code {
|
|
case 2: // ERROR_FILE_NOT_FOUND
|
|
return ErrFileNotFound
|
|
case 6: // ERROR_INVALID_HANDLE
|
|
return ErrInvalidHandle
|
|
default:
|
|
return UnknownError{Code: code}
|
|
}
|
|
}
|
|
|
|
func goStringFromPtr(ptr unsafe.Pointer, len int) string {
|
|
s := C.GoStringN((*C.char)(ptr), C.int(len))
|
|
return s[:strings.IndexByte(s, 0)]
|
|
}
|
|
|
|
// DecodeCharPtr decodes ISO8859_1 string to UTF-8
|
|
func DecodeCharPtr(ptr unsafe.Pointer, len int) string {
|
|
s := goStringFromPtr(ptr, len)
|
|
ds, err := decodeISO8859_1(s)
|
|
if err != nil {
|
|
log.Fatalf("TODO: failed to decode: %v", err)
|
|
}
|
|
return ds
|
|
}
|
|
|
|
var isodecoder = charmap.ISO8859_1.NewDecoder()
|
|
|
|
func decodeISO8859_1(in string) (string, error) {
|
|
return isodecoder.String(in)
|
|
}
|