1/* Case and normalization 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 "minmax.h" 27#include "uninorm.h" 28#include "uniconv.h" 29#include "unistr.h" 30 31static uint8_t * 32ulc_u8_casefold (const char *s, size_t n, const char *iso639_language, 33 uninorm_t nf, 34 uint8_t *resultbuf, size_t *lengthp) 35{ 36 uint8_t convbuf[2048 / sizeof (uint8_t)]; 37 uint8_t *conv; 38 size_t conv_length; 39 uint8_t *result; 40 41 /* Convert the string to UTF-8. */ 42 conv_length = sizeof (convbuf) / sizeof (uint8_t); 43 conv = 44 u8_conv_from_encoding (locale_charset (), iconveh_error, s, n, NULL, 45 convbuf, &conv_length); 46 if (conv == NULL) 47 /* errno is set here. */ 48 return NULL; 49 50 /* Case-fold and normalize. */ 51 result = u8_casefold (conv, conv_length, iso639_language, nf, 52 resultbuf, lengthp); 53 if (result == NULL) 54 { 55 if (conv != convbuf) 56 { 57 int saved_errno = errno; 58 free (conv); 59 errno = saved_errno; 60 } 61 return NULL; 62 } 63 64 if (conv != convbuf) 65 free (conv); 66 return result; 67} 68 69#define FUNC ulc_casecmp 70#define UNIT uint8_t 71#define SRC_UNIT char 72#define U_CASEFOLD ulc_u8_casefold 73#define U_CMP2 u8_cmp2 74#include "u-casecmp.h" 75