1// Copyright 2016 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5// +build icu
6
7package cases
8
9// Ideally these functions would be defined in a test file, but go test doesn't
10// allow CGO in tests. The build tag should ensure either way that these
11// functions will not end up in the package.
12
13// TODO: Ensure that the correct ICU version is set.
14
15/*
16#cgo LDFLAGS: -licui18n.57 -licuuc.57
17#include <stdlib.h>
18#include <unicode/ustring.h>
19#include <unicode/utypes.h>
20#include <unicode/localpointer.h>
21#include <unicode/ucasemap.h>
22*/
23import "C"
24
25import "unsafe"
26
27func doICU(tag, caser, input string) string {
28	err := C.UErrorCode(0)
29	loc := C.CString(tag)
30	cm := C.ucasemap_open(loc, C.uint32_t(0), &err)
31
32	buf := make([]byte, len(input)*4)
33	dst := (*C.char)(unsafe.Pointer(&buf[0]))
34	src := C.CString(input)
35
36	cn := C.int32_t(0)
37
38	switch caser {
39	case "fold":
40		cn = C.ucasemap_utf8FoldCase(cm,
41			dst, C.int32_t(len(buf)),
42			src, C.int32_t(len(input)),
43			&err)
44	case "lower":
45		cn = C.ucasemap_utf8ToLower(cm,
46			dst, C.int32_t(len(buf)),
47			src, C.int32_t(len(input)),
48			&err)
49	case "upper":
50		cn = C.ucasemap_utf8ToUpper(cm,
51			dst, C.int32_t(len(buf)),
52			src, C.int32_t(len(input)),
53			&err)
54	case "title":
55		cn = C.ucasemap_utf8ToTitle(cm,
56			dst, C.int32_t(len(buf)),
57			src, C.int32_t(len(input)),
58			&err)
59	}
60	return string(buf[:cn])
61}
62