1/* Locale dependent transformation for case insensitive comparison of 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 18#include <config.h> 19 20/* Specification. */ 21#include "unicase.h" 22 23#include <errno.h> 24#include <stdlib.h> 25 26#include "uniconv.h" 27 28char * 29ulc_casexfrm (const char *s, size_t n, const char *iso639_language, 30 uninorm_t nf, 31 char *resultbuf, size_t *lengthp) 32{ 33 uint8_t convbuf[2048 / sizeof (uint8_t)]; 34 uint8_t *conv; 35 size_t conv_length; 36 char *result; 37 38 /* Convert the string to UTF-8. */ 39 conv_length = sizeof (convbuf) / sizeof (uint8_t); 40 conv = 41 u8_conv_from_encoding (locale_charset (), iconveh_error, s, n, NULL, 42 convbuf, &conv_length); 43 if (conv == NULL) 44 /* errno is set here. */ 45 return NULL; 46 47 /* Case-fold and normalize. */ 48 result = u8_casexfrm (conv, conv_length, iso639_language, nf, 49 resultbuf, lengthp); 50 if (result == NULL) 51 { 52 if (conv != convbuf) 53 { 54 int saved_errno = errno; 55 free (conv); 56 errno = saved_errno; 57 } 58 return NULL; 59 } 60 61 if (conv != convbuf) 62 free (conv); 63 return result; 64} 65