1/* Locale dependent, 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 char buf1[2048]; 23 char buf2[2048]; 24 char *transformed1; 25 size_t transformed1_length; 26 char *transformed2; 27 size_t transformed2_length; 28 int cmp; 29 30 /* Normalize and transform S1. */ 31 transformed1_length = sizeof (buf1); 32 transformed1 = U_NORMXFRM (s1, n1, nf, buf1, &transformed1_length); 33 if (transformed1 == NULL) 34 /* errno is set here. */ 35 return -1; 36 37 /* Normalize and transform S2. */ 38 transformed2_length = sizeof (buf2); 39 transformed2 = U_NORMXFRM (s2, n2, nf, buf2, &transformed2_length); 40 if (transformed2 == NULL) 41 { 42 if (transformed1 != buf1) 43 { 44 int saved_errno = errno; 45 free (transformed1); 46 errno = saved_errno; 47 } 48 return -1; 49 } 50 51 /* Compare the transformed strings. */ 52 cmp = memcmp2 (transformed1, transformed1_length, 53 transformed2, transformed2_length); 54 if (cmp < 0) 55 cmp = -1; 56 else if (cmp > 0) 57 cmp = 1; 58 59 if (transformed2 != buf2) 60 free (transformed2); 61 if (transformed1 != buf1) 62 free (transformed1); 63 *resultp = cmp; 64 return 0; 65} 66