diff options
author | Manuel A. Fernandez Montecelo <manuel.montezelo@gmail.com> | 2016-05-26 16:48:15 +0100 |
---|---|---|
committer | Manuel A. Fernandez Montecelo <manuel.montezelo@gmail.com> | 2016-05-26 16:48:15 +0100 |
commit | 5f2b09982312c98863eb9a8dfe2c608b81f58259 (patch) | |
tree | e5d38581c2f36e1cca02efedd2d85044d77f76f9 /lib/memxfrm.c | |
parent | 3e0814cd9862b89c7a39672672937477bd87ddfb (diff) |
Imported Upstream version 0.9.6upstream/0.9.6
Diffstat (limited to 'lib/memxfrm.c')
-rw-r--r-- | lib/memxfrm.c | 137 |
1 files changed, 0 insertions, 137 deletions
diff --git a/lib/memxfrm.c b/lib/memxfrm.c deleted file mode 100644 index a1c6cf8a..00000000 --- a/lib/memxfrm.c +++ /dev/null @@ -1,137 +0,0 @@ -/* Locale dependent memory area transformation for comparison. - Copyright (C) 2009, 2010 Free Software Foundation, Inc. - Written by Bruno Haible <bruno@clisp.org>, 2009. - - This program is free software: you can redistribute it and/or modify it - under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. */ - -#include <config.h> - -/* Specification. */ -#include "memxfrm.h" - -#include <errno.h> -#include <stdlib.h> -#include <string.h> - -char * -memxfrm (char *s, size_t n, char *resultbuf, size_t *lengthp) -{ - /* Result accumulator. */ - char *result; - size_t length; - size_t allocated; - - char orig_sentinel; - - /* Initial memory allocation. */ - if (resultbuf != NULL && *lengthp > 0) - { - result = resultbuf; - allocated = *lengthp; - } - else - { - allocated = (n > 0 ? n : 1); - result = (char *) malloc (allocated); - if (result == NULL) - goto out_of_memory_2; - } - length = 0; - - /* Add sentinel.byte. */ - orig_sentinel = s[n]; - s[n] = '\0'; - - /* Iterate through S, transforming each NUL terminated segment. - Accumulate the resulting transformed segments in result, separated by - NULs. */ - { - const char *p_end = s + n + 1; - const char *p; - - p = s; - for (;;) - { - /* Search next NUL byte. */ - const char *q = p + strlen (p); - - for (;;) - { - size_t k; - - errno = 0; - k = strxfrm (result + length, p, allocated - length); - if (errno != 0) - goto fail; - if (k >= allocated - length) - { - /* Grow the result buffer. */ - char *new_result; - - allocated = 2 * allocated; - if (allocated < 64) - allocated = 64; - if (result == resultbuf) - new_result = (char *) malloc (allocated); - else - new_result = (char *) realloc (result, allocated); - if (new_result == NULL) - goto out_of_memory_1; - result = new_result; - } - else - { - length += k; - break; - } - } - - p = q + 1; - if (p == p_end) - break; - result[length] = '\0'; - length++; - } - } - - /* Shrink the allocated memory if possible. */ - if (result != resultbuf && (length > 0 ? length : 1) < allocated) - { - char *memory = (char *) realloc (result, length > 0 ? length : 1); - if (memory != NULL) - result = memory; - } - - s[n] = orig_sentinel; - *lengthp = length; - return result; - - fail: - { - int saved_errno = errno; - if (result != resultbuf) - free (result); - s[n] = orig_sentinel; - errno = saved_errno; - return NULL; - } - - out_of_memory_1: - if (result != resultbuf) - free (result); - s[n] = orig_sentinel; - out_of_memory_2: - errno = ENOMEM; - return NULL; -} |