1/* Test whether a Unicode string is invariant under a given case mapping. 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 *s, size_t n, 20 UNIT * (*mapping) (const UNIT *s, size_t n, const char *iso639_language, 21 uninorm_t nf, 22 UNIT *resultbuf, size_t *lengthp), 23 const char *iso639_language, 24 bool *resultp) 25{ 26 UNIT normsbuf[2048 / sizeof (UNIT)]; 27 UNIT *norms; 28 size_t norms_length; 29 UNIT mappedbuf[2048 / sizeof (UNIT)]; 30 UNIT *mapped; 31 size_t mapped_length; 32 33 /* Apply canonical decomposition to S. */ 34 norms_length = sizeof (normsbuf) / sizeof (UNIT); 35 norms = U_NORMALIZE (UNINORM_NFD, s, n, normsbuf, &norms_length); 36 if (norms == NULL) 37 /* errno is set here. */ 38 return -1; 39 40 /* Apply mapping. */ 41 mapped_length = sizeof (mappedbuf) / sizeof (UNIT); 42 mapped = mapping (norms, norms_length, iso639_language, NULL, 43 mappedbuf, &mapped_length); 44 if (mapped == NULL) 45 { 46 if (norms != normsbuf) 47 { 48 int saved_errno = errno; 49 free (norms); 50 errno = saved_errno; 51 } 52 return -1; 53 } 54 55 /* Compare. */ 56 *resultp = (mapped_length == norms_length 57 && U_CMP (mapped, norms, norms_length) == 0); 58 59 if (mapped != mappedbuf) 60 free (mapped); 61 if (norms != normsbuf) 62 free (norms); 63 return 0; 64} 65