You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
1.4 KiB
62 lines
1.4 KiB
// 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]) |
|
}
|
|
|