@[Link(ldflags: "`command -v pkg-config > /dev/null && pkg-config --libs icu-uc icu-i18n icu-io 2> /dev/null|| printf %s '-licuio -licui18n -licuuc -licudata'`")]
lib LibICU
  {% begin %}
  alias WcharT = LibC::Int
  fun memcasecmp = u_memcasecmp{{SYMS_SUFFIX.id}}(s1 : UChar*, s2 : UChar*, length : Int32T, options : Uint32T) : Int32T
  fun memchr32 = u_memchr32{{SYMS_SUFFIX.id}}(s : UChar*, c : UChar32, count : Int32T) : UChar*
  fun memchr = u_memchr{{SYMS_SUFFIX.id}}(s : UChar*, c : UChar, count : Int32T) : UChar*
  fun memcmp = u_memcmp{{SYMS_SUFFIX.id}}(buf1 : UChar*, buf2 : UChar*, count : Int32T) : Int32T
  fun memcmp_code_point_order = u_memcmpCodePointOrder{{SYMS_SUFFIX.id}}(s1 : UChar*, s2 : UChar*, count : Int32T) : Int32T
  fun memcpy = u_memcpy{{SYMS_SUFFIX.id}}(dest : UChar*, src : UChar*, count : Int32T) : UChar*
  fun memmove = u_memmove{{SYMS_SUFFIX.id}}(dest : UChar*, src : UChar*, count : Int32T) : UChar*
  fun memrchr32 = u_memrchr32{{SYMS_SUFFIX.id}}(s : UChar*, c : UChar32, count : Int32T) : UChar*
  fun memrchr = u_memrchr{{SYMS_SUFFIX.id}}(s : UChar*, c : UChar, count : Int32T) : UChar*
  fun memset = u_memset{{SYMS_SUFFIX.id}}(dest : UChar*, c : UChar, count : Int32T) : UChar*
  fun str_case_compare = u_strCaseCompare{{SYMS_SUFFIX.id}}(s1 : UChar*, length1 : Int32T, s2 : UChar*, length2 : Int32T, options : Uint32T, p_error_code : UErrorCode*) : Int32T
  fun str_compare = u_strCompare{{SYMS_SUFFIX.id}}(s1 : UChar*, length1 : Int32T, s2 : UChar*, length2 : Int32T, code_point_order : UBool) : Int32T
  fun str_compare_iter = u_strCompareIter{{SYMS_SUFFIX.id}}(iter1 : UCharIterator*, iter2 : UCharIterator*, code_point_order : UBool) : Int32T
  fun str_find_first = u_strFindFirst{{SYMS_SUFFIX.id}}(s : UChar*, length : Int32T, substring : UChar*, sub_length : Int32T) : UChar*
  fun str_find_last = u_strFindLast{{SYMS_SUFFIX.id}}(s : UChar*, length : Int32T, substring : UChar*, sub_length : Int32T) : UChar*
  fun str_fold_case = u_strFoldCase{{SYMS_SUFFIX.id}}(dest : UChar*, dest_capacity : Int32T, src : UChar*, src_length : Int32T, options : Uint32T, p_error_code : UErrorCode*) : Int32T
  fun str_from_java_modified_utf8_with_sub = u_strFromJavaModifiedUTF8WithSub{{SYMS_SUFFIX.id}}(dest : UChar*, dest_capacity : Int32T, p_dest_length : Int32T*, src : LibC::Char*, src_length : Int32T, subchar : UChar32, p_num_substitutions : Int32T*, p_error_code : UErrorCode*) : UChar*
  fun str_from_utf32 = u_strFromUTF32{{SYMS_SUFFIX.id}}(dest : UChar*, dest_capacity : Int32T, p_dest_length : Int32T*, src : UChar32*, src_length : Int32T, p_error_code : UErrorCode*) : UChar*
  fun str_from_utf32_with_sub = u_strFromUTF32WithSub{{SYMS_SUFFIX.id}}(dest : UChar*, dest_capacity : Int32T, p_dest_length : Int32T*, src : UChar32*, src_length : Int32T, subchar : UChar32, p_num_substitutions : Int32T*, p_error_code : UErrorCode*) : UChar*
  fun str_from_utf8 = u_strFromUTF8{{SYMS_SUFFIX.id}}(dest : UChar*, dest_capacity : Int32T, p_dest_length : Int32T*, src : LibC::Char*, src_length : Int32T, p_error_code : UErrorCode*) : UChar*
  fun str_from_utf8_lenient = u_strFromUTF8Lenient{{SYMS_SUFFIX.id}}(dest : UChar*, dest_capacity : Int32T, p_dest_length : Int32T*, src : LibC::Char*, src_length : Int32T, p_error_code : UErrorCode*) : UChar*
  fun str_from_utf8_with_sub = u_strFromUTF8WithSub{{SYMS_SUFFIX.id}}(dest : UChar*, dest_capacity : Int32T, p_dest_length : Int32T*, src : LibC::Char*, src_length : Int32T, subchar : UChar32, p_num_substitutions : Int32T*, p_error_code : UErrorCode*) : UChar*
  fun str_from_wcs = u_strFromWCS{{SYMS_SUFFIX.id}}(dest : UChar*, dest_capacity : Int32T, p_dest_length : Int32T*, src : WcharT*, src_length : Int32T, p_error_code : UErrorCode*) : UChar*
  fun str_has_more_char32_than = u_strHasMoreChar32Than{{SYMS_SUFFIX.id}}(s : UChar*, length : Int32T, number : Int32T) : UBool
  fun str_to_java_modified_utf8 = u_strToJavaModifiedUTF8{{SYMS_SUFFIX.id}}(dest : LibC::Char*, dest_capacity : Int32T, p_dest_length : Int32T*, src : UChar*, src_length : Int32T, p_error_code : UErrorCode*) : LibC::Char*
  fun str_to_lower = u_strToLower{{SYMS_SUFFIX.id}}(dest : UChar*, dest_capacity : Int32T, src : UChar*, src_length : Int32T, locale : LibC::Char*, p_error_code : UErrorCode*) : Int32T
  fun str_to_title = u_strToTitle{{SYMS_SUFFIX.id}}(dest : UChar*, dest_capacity : Int32T, src : UChar*, src_length : Int32T, title_iter : UBreakIterator, locale : LibC::Char*, p_error_code : UErrorCode*) : Int32T
  fun str_to_upper = u_strToUpper{{SYMS_SUFFIX.id}}(dest : UChar*, dest_capacity : Int32T, src : UChar*, src_length : Int32T, locale : LibC::Char*, p_error_code : UErrorCode*) : Int32T
  fun str_to_utf32 = u_strToUTF32{{SYMS_SUFFIX.id}}(dest : UChar32*, dest_capacity : Int32T, p_dest_length : Int32T*, src : UChar*, src_length : Int32T, p_error_code : UErrorCode*) : UChar32*
  fun str_to_utf32_with_sub = u_strToUTF32WithSub{{SYMS_SUFFIX.id}}(dest : UChar32*, dest_capacity : Int32T, p_dest_length : Int32T*, src : UChar*, src_length : Int32T, subchar : UChar32, p_num_substitutions : Int32T*, p_error_code : UErrorCode*) : UChar32*
  fun str_to_utf8 = u_strToUTF8{{SYMS_SUFFIX.id}}(dest : LibC::Char*, dest_capacity : Int32T, p_dest_length : Int32T*, src : UChar*, src_length : Int32T, p_error_code : UErrorCode*) : LibC::Char*
  fun str_to_utf8_with_sub = u_strToUTF8WithSub{{SYMS_SUFFIX.id}}(dest : LibC::Char*, dest_capacity : Int32T, p_dest_length : Int32T*, src : UChar*, src_length : Int32T, subchar : UChar32, p_num_substitutions : Int32T*, p_error_code : UErrorCode*) : LibC::Char*
  fun str_to_wcs = u_strToWCS{{SYMS_SUFFIX.id}}(dest : WcharT*, dest_capacity : Int32T, p_dest_length : Int32T*, src : UChar*, src_length : Int32T, p_error_code : UErrorCode*) : WcharT*
  fun strcasecmp = u_strcasecmp{{SYMS_SUFFIX.id}}(s1 : UChar*, s2 : UChar*, options : Uint32T) : Int32T
  fun strcat = u_strcat{{SYMS_SUFFIX.id}}(dst : UChar*, src : UChar*) : UChar*
  fun strchr32 = u_strchr32{{SYMS_SUFFIX.id}}(s : UChar*, c : UChar32) : UChar*
  fun strchr = u_strchr{{SYMS_SUFFIX.id}}(s : UChar*, c : UChar) : UChar*
  fun strcmp = u_strcmp{{SYMS_SUFFIX.id}}(s1 : UChar*, s2 : UChar*) : Int32T
  fun strcmp_code_point_order = u_strcmpCodePointOrder{{SYMS_SUFFIX.id}}(s1 : UChar*, s2 : UChar*) : Int32T
  fun strcpy = u_strcpy{{SYMS_SUFFIX.id}}(dst : UChar*, src : UChar*) : UChar*
  fun strcspn = u_strcspn{{SYMS_SUFFIX.id}}(string : UChar*, match_set : UChar*) : Int32T
  fun strlen = u_strlen{{SYMS_SUFFIX.id}}(s : UChar*) : Int32T
  fun strncasecmp = u_strncasecmp{{SYMS_SUFFIX.id}}(s1 : UChar*, s2 : UChar*, n : Int32T, options : Uint32T) : Int32T
  fun strncat = u_strncat{{SYMS_SUFFIX.id}}(dst : UChar*, src : UChar*, n : Int32T) : UChar*
  fun strncmp = u_strncmp{{SYMS_SUFFIX.id}}(ucs1 : UChar*, ucs2 : UChar*, n : Int32T) : Int32T
  fun strncmp_code_point_order = u_strncmpCodePointOrder{{SYMS_SUFFIX.id}}(s1 : UChar*, s2 : UChar*, n : Int32T) : Int32T
  fun strncpy = u_strncpy{{SYMS_SUFFIX.id}}(dst : UChar*, src : UChar*, n : Int32T) : UChar*
  fun strpbrk = u_strpbrk{{SYMS_SUFFIX.id}}(string : UChar*, match_set : UChar*) : UChar*
  fun strrchr32 = u_strrchr32{{SYMS_SUFFIX.id}}(s : UChar*, c : UChar32) : UChar*
  fun strrchr = u_strrchr{{SYMS_SUFFIX.id}}(s : UChar*, c : UChar) : UChar*
  fun strrstr = u_strrstr{{SYMS_SUFFIX.id}}(s : UChar*, substring : UChar*) : UChar*
  fun strspn = u_strspn{{SYMS_SUFFIX.id}}(string : UChar*, match_set : UChar*) : Int32T
  fun strstr = u_strstr{{SYMS_SUFFIX.id}}(s : UChar*, substring : UChar*) : UChar*
  fun strtok_r = u_strtok_r{{SYMS_SUFFIX.id}}(src : UChar*, delim : UChar*, save_state : UChar**) : UChar*
  {% end %}
end
