mirror of
https://github.com/postgres/postgres.git
synced 2026-04-09 19:16:17 -04:00
It previously only supported NFKC, for use by SASLprep. This expands the API to offer the choice of all four normalization forms. Right now, there are no internal users of the forms other than NFKC. Reviewed-by: Daniel Verite <daniel@manitou-mail.org> Reviewed-by: Andreas Karlsson <andreas@proxel.se> Discussion: https://www.postgresql.org/message-id/flat/c1909f27-c269-2ed9-12f8-3ab72c8caf7a@2ndquadrant.com
86 lines
1.6 KiB
C
86 lines
1.6 KiB
C
/*-------------------------------------------------------------------------
|
|
* norm_test.c
|
|
* Program to test Unicode normalization functions.
|
|
*
|
|
* Portions Copyright (c) 2017-2020, PostgreSQL Global Development Group
|
|
*
|
|
* IDENTIFICATION
|
|
* src/common/unicode/norm_test.c
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
#include "postgres_fe.h"
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#include "common/unicode_norm.h"
|
|
|
|
#include "norm_test_table.h"
|
|
|
|
static char *
|
|
print_wchar_str(const pg_wchar *s)
|
|
{
|
|
#define BUF_DIGITS 50
|
|
static char buf[BUF_DIGITS * 11 + 1];
|
|
int i;
|
|
char *p;
|
|
|
|
i = 0;
|
|
p = buf;
|
|
while (*s && i < BUF_DIGITS)
|
|
{
|
|
p += sprintf(p, "U+%04X ", *s);
|
|
i++;
|
|
s++;
|
|
}
|
|
*p = '\0';
|
|
|
|
return buf;
|
|
}
|
|
|
|
static int
|
|
pg_wcscmp(const pg_wchar *s1, const pg_wchar *s2)
|
|
{
|
|
for (;;)
|
|
{
|
|
if (*s1 < *s2)
|
|
return -1;
|
|
if (*s1 > *s2)
|
|
return 1;
|
|
if (*s1 == 0)
|
|
return 0;
|
|
s1++;
|
|
s2++;
|
|
}
|
|
}
|
|
|
|
int
|
|
main(int argc, char **argv)
|
|
{
|
|
const pg_unicode_test *test;
|
|
|
|
for (test = UnicodeNormalizationTests; test->input[0] != 0; test++)
|
|
{
|
|
for (int form = 0; form < 4; form++)
|
|
{
|
|
pg_wchar *result;
|
|
|
|
result = unicode_normalize(form, test->input);
|
|
|
|
if (pg_wcscmp(test->output[form], result) != 0)
|
|
{
|
|
printf("FAILURE (NormalizationTest.txt line %d form %d):\n", test->linenum, form);
|
|
printf("input: %s\n", print_wchar_str(test->input));
|
|
printf("expected: %s\n", print_wchar_str(test->output[form]));
|
|
printf("got: %s\n", print_wchar_str(result));
|
|
printf("\n");
|
|
exit(1);
|
|
}
|
|
}
|
|
}
|
|
|
|
printf("All tests successful!\n");
|
|
exit(0);
|
|
}
|