20#include <unicode/uchar.h>
42 n = sscanf(version,
"%d.%d", &major, &minor);
47 return major * 100 + minor;
60 int pg_skipped_codepoints = 0;
61 int icu_skipped_codepoints = 0;
63 for (
char32_t code = 0; code <= 0x10ffff; code++)
66 uint8_t icu_category = u_charType(code);
78 bool icu_prop_alphabetic = u_hasBinaryProperty(code, UCHAR_ALPHABETIC);
79 bool icu_prop_lowercase = u_hasBinaryProperty(code, UCHAR_LOWERCASE);
80 bool icu_prop_uppercase = u_hasBinaryProperty(code, UCHAR_UPPERCASE);
81 bool icu_prop_cased = u_hasBinaryProperty(code, UCHAR_CASED);
82 bool icu_prop_case_ignorable = u_hasBinaryProperty(code, UCHAR_CASE_IGNORABLE);
83 bool icu_prop_white_space = u_hasBinaryProperty(code, UCHAR_WHITE_SPACE);
84 bool icu_prop_hex_digit = u_hasBinaryProperty(code, UCHAR_HEX_DIGIT);
85 bool icu_prop_join_control = u_hasBinaryProperty(code, UCHAR_JOIN_CONTROL);
112 bool icu_isalpha = u_isUAlphabetic(code);
113 bool icu_islower = u_isULowercase(code);
114 bool icu_isupper = u_isUUppercase(code);
115 bool icu_ispunct = u_ispunct(code);
116 bool icu_isdigit = u_isdigit(code);
117 bool icu_isxdigit = u_hasBinaryProperty(code,
119 bool icu_isalnum = u_hasBinaryProperty(code,
121 bool icu_isspace = u_isUWhiteSpace(code);
122 bool icu_isblank = u_isblank(code);
124 bool icu_isgraph = u_hasBinaryProperty(code,
126 bool icu_isprint = u_hasBinaryProperty(code,
139 pg_skipped_codepoints++;
147 icu_skipped_codepoints++;
151 if (pg_category != icu_category)
153 printf(
"category_test: FAILURE for codepoint 0x%06x\n", code);
154 printf(
"category_test: Postgres category: %02d %s %s\n", pg_category,
157 printf(
"category_test: ICU category: %02d %s %s\n", icu_category,
164 if (prop_alphabetic != icu_prop_alphabetic ||
165 prop_lowercase != icu_prop_lowercase ||
166 prop_uppercase != icu_prop_uppercase ||
167 prop_cased != icu_prop_cased ||
168 prop_case_ignorable != icu_prop_case_ignorable ||
169 prop_white_space != icu_prop_white_space ||
170 prop_hex_digit != icu_prop_hex_digit ||
171 prop_join_control != icu_prop_join_control)
173 printf(
"category_test: FAILURE for codepoint 0x%06x\n", code);
174 printf(
"category_test: Postgres property alphabetic/lowercase/uppercase/cased/case_ignorable/white_space/hex_digit/join_control: %d/%d/%d/%d/%d/%d/%d/%d\n",
175 prop_alphabetic, prop_lowercase, prop_uppercase,
176 prop_cased, prop_case_ignorable,
177 prop_white_space, prop_hex_digit, prop_join_control);
178 printf(
"category_test: ICU property alphabetic/lowercase/uppercase/cased/case_ignorable/white_space/hex_digit/join_control: %d/%d/%d/%d/%d/%d/%d/%d\n",
179 icu_prop_alphabetic, icu_prop_lowercase, icu_prop_uppercase,
180 icu_prop_cased, icu_prop_case_ignorable,
181 icu_prop_white_space, icu_prop_hex_digit, icu_prop_join_control);
186 if (isalpha != icu_isalpha ||
187 islower != icu_islower ||
188 isupper != icu_isupper ||
189 ispunct != icu_ispunct ||
190 isdigit != icu_isdigit ||
191 isxdigit != icu_isxdigit ||
192 isalnum != icu_isalnum ||
193 isspace != icu_isspace ||
194 isblank != icu_isblank ||
195 iscntrl != icu_iscntrl ||
196 isgraph != icu_isgraph ||
197 isprint != icu_isprint)
199 printf(
"category_test: FAILURE for codepoint 0x%06x\n", code);
200 printf(
"category_test: Postgres class alpha/lower/upper/punct/digit/xdigit/alnum/space/blank/cntrl/graph/print: %d/%d/%d/%d/%d/%d/%d/%d/%d/%d/%d/%d\n",
201 isalpha, islower, isupper, ispunct, isdigit, isxdigit, isalnum, isspace, isblank, iscntrl, isgraph, isprint);
202 printf(
"category_test: ICU class alpha/lower/upper/punct/digit/xdigit/alnum/space/blank/cntrl/graph/print: %d/%d/%d/%d/%d/%d/%d/%d/%d/%d/%d/%d\n",
203 icu_isalpha, icu_islower, icu_isupper, icu_ispunct, icu_isdigit, icu_isxdigit, icu_isalnum, icu_isspace, icu_isblank, icu_iscntrl, icu_isgraph, icu_isprint);
212 if (pg_skipped_codepoints > 0)
213 printf(
"category_test: skipped %d codepoints unassigned in Postgres due to Unicode version mismatch\n",
214 pg_skipped_codepoints);
215 if (icu_skipped_codepoints > 0)
216 printf(
"category_test: skipped %d codepoints unassigned in ICU due to Unicode version mismatch\n",
217 icu_skipped_codepoints);
219 printf(
"category_test: ICU test: %d codepoints successful\n", successful);
231 printf(
"category_test: ICU Unicode version:\t\t%s\n", U_UNICODE_VERSION);
235 printf(
"category_test: ICU not available; skipping\n");
#define PG_USED_FOR_ASSERTS_ONLY
static int pg_unicode_version
int main(int argc, char **argv)
static int parse_unicode_version(const char *version)
Assert(PointerIsAligned(start, uint64))
bool pg_u_isalnum(char32_t code, bool posix)
const char * unicode_category_string(pg_unicode_category category)
bool pg_u_prop_cased(char32_t code)
bool pg_u_prop_white_space(char32_t code)
bool pg_u_isprint(char32_t code)
bool pg_u_islower(char32_t code)
const char * unicode_category_abbrev(pg_unicode_category category)
bool pg_u_iscntrl(char32_t code)
pg_unicode_category unicode_category(char32_t code)
bool pg_u_prop_lowercase(char32_t code)
bool pg_u_prop_join_control(char32_t code)
bool pg_u_isdigit(char32_t code, bool posix)
bool pg_u_isalpha(char32_t code)
bool pg_u_prop_uppercase(char32_t code)
bool pg_u_isxdigit(char32_t code, bool posix)
bool pg_u_prop_case_ignorable(char32_t code)
bool pg_u_ispunct(char32_t code, bool posix)
bool pg_u_prop_hex_digit(char32_t code)
bool pg_u_isblank(char32_t code)
bool pg_u_isgraph(char32_t code)
bool pg_u_isspace(char32_t code)
bool pg_u_isupper(char32_t code)
bool pg_u_prop_alphabetic(char32_t code)
#define PG_UNICODE_VERSION
Datum icu_unicode_version(PG_FUNCTION_ARGS)