1/* Normalization insensitive comparison of Unicode strings. 2 Copyright (C) 2009-2010 Free Software Foundation, Inc. 3 Written by Bruno Haible <bruno@clisp.org>, 2009. 4 5 This program is free software: you can redistribute it and/or modify it 6 under the terms of the GNU Lesser General Public License as published 7 by the Free Software Foundation; either version 3 of the License, or 8 (at your option) any later version. 9 10 This program is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 Lesser General Public License for more details. 14 15 You should have received a copy of the GNU Lesser General Public License 16 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 17 18int 19FUNC (const UNIT *s1, size_t n1, const UNIT *s2, size_t n2, 20 uninorm_t nf, int *resultp) 21{ 22 UNIT buf1[2048 / sizeof (UNIT)]; 23 UNIT buf2[2048 / sizeof (UNIT)]; 24 UNIT *norms1; 25 size_t norms1_length; 26 UNIT *norms2; 27 size_t norms2_length; 28 int cmp; 29 30 /* Normalize S1. */ 31 norms1_length = sizeof (buf1) / sizeof (UNIT); 32 norms1 = U_NORMALIZE (nf, s1, n1, buf1, &norms1_length); 33 if (norms1 == NULL) 34 /* errno is set here. */ 35 return -1; 36 37 /* Normalize S2. */ 38 norms2_length = sizeof (buf2) / sizeof (UNIT); 39 norms2 = U_NORMALIZE (nf, s2, n2, buf2, &norms2_length); 40 if (norms2 == NULL) 41 { 42 if (norms1 != buf1) 43 { 44 int saved_errno = errno; 45 free (norms1); 46 errno = saved_errno; 47 } 48 return -1; 49 } 50 51 /* Compare the normalized strings. */ 52 cmp = U_CMP2 (norms1, norms1_length, norms2, norms2_length); 53 if (cmp > 0) 54 cmp = 1; 55 else if (cmp < 0) 56 cmp = -1; 57 58 if (norms2 != buf2) 59 free (norms2); 60 if (norms1 != buf1) 61 free (norms1); 62 *resultp = cmp; 63 return 0; 64} 65