| // 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 |
| // +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]) |
| } |