postgresql/src/common/unicode/norm_test.c
Peter Eisentraut d40d564c5a Add support for other normal forms to Unicode normalization API
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
2020-03-24 10:02:46 +01:00

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);
}