diff options
Diffstat (limited to 'vendor/golang.org/x/text/cases/icu.go')
| -rw-r--r-- | vendor/golang.org/x/text/cases/icu.go | 61 | 
1 files changed, 61 insertions, 0 deletions
| diff --git a/vendor/golang.org/x/text/cases/icu.go b/vendor/golang.org/x/text/cases/icu.go new file mode 100644 index 0000000..db7c237 --- /dev/null +++ b/vendor/golang.org/x/text/cases/icu.go @@ -0,0 +1,61 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build icu + +package cases + +// Ideally these functions would be defined in a test file, but go test doesn't +// allow CGO in tests. The build tag should ensure either way that these +// functions will not end up in the package. + +// TODO: Ensure that the correct ICU version is set. + +/* +#cgo LDFLAGS: -licui18n.57 -licuuc.57 +#include <stdlib.h> +#include <unicode/ustring.h> +#include <unicode/utypes.h> +#include <unicode/localpointer.h> +#include <unicode/ucasemap.h> +*/ +import "C" + +import "unsafe" + +func doICU(tag, caser, input string) string { +	err := C.UErrorCode(0) +	loc := C.CString(tag) +	cm := C.ucasemap_open(loc, C.uint32_t(0), &err) + +	buf := make([]byte, len(input)*4) +	dst := (*C.char)(unsafe.Pointer(&buf[0])) +	src := C.CString(input) + +	cn := C.int32_t(0) + +	switch caser { +	case "fold": +		cn = C.ucasemap_utf8FoldCase(cm, +			dst, C.int32_t(len(buf)), +			src, C.int32_t(len(input)), +			&err) +	case "lower": +		cn = C.ucasemap_utf8ToLower(cm, +			dst, C.int32_t(len(buf)), +			src, C.int32_t(len(input)), +			&err) +	case "upper": +		cn = C.ucasemap_utf8ToUpper(cm, +			dst, C.int32_t(len(buf)), +			src, C.int32_t(len(input)), +			&err) +	case "title": +		cn = C.ucasemap_utf8ToTitle(cm, +			dst, C.int32_t(len(buf)), +			src, C.int32_t(len(input)), +			&err) +	} +	return string(buf[:cn]) +} | 
