/src/libunistring/lib/unicase/u8-tolower.c
| Line | Count | Source | 
| 1 |  | /* Lowercase mapping for UTF-8 strings (locale dependent). | 
| 2 |  |    Copyright (C) 2009-2023 Free Software Foundation, Inc. | 
| 3 |  |    Written by Bruno Haible <bruno@clisp.org>, 2009. | 
| 4 |  |  | 
| 5 |  |    This file is free software. | 
| 6 |  |    It is dual-licensed under "the GNU LGPLv3+ or the GNU GPLv2+". | 
| 7 |  |    You can redistribute it and/or modify it under either | 
| 8 |  |      - the terms of the GNU Lesser General Public License as published | 
| 9 |  |        by the Free Software Foundation, either version 3, or (at your | 
| 10 |  |        option) any later version, or | 
| 11 |  |      - the terms of the GNU General Public License as published by the | 
| 12 |  |        Free Software Foundation; either version 2, or (at your option) | 
| 13 |  |        any later version, or | 
| 14 |  |      - the same dual license "the GNU LGPLv3+ or the GNU GPLv2+". | 
| 15 |  |  | 
| 16 |  |    This file is distributed in the hope that it will be useful, | 
| 17 |  |    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
| 18 |  |    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
| 19 |  |    Lesser General Public License and the GNU General Public License | 
| 20 |  |    for more details. | 
| 21 |  |  | 
| 22 |  |    You should have received a copy of the GNU Lesser General Public | 
| 23 |  |    License and of the GNU General Public License along with this | 
| 24 |  |    program.  If not, see <https://www.gnu.org/licenses/>.  */ | 
| 25 |  |  | 
| 26 |  | #include <config.h> | 
| 27 |  |  | 
| 28 |  | /* Specification.  */ | 
| 29 |  | #include "unicase.h" | 
| 30 |  |  | 
| 31 |  | #include <stddef.h> | 
| 32 |  |  | 
| 33 |  | #include "unicase/unicasemap.h" | 
| 34 |  | #include "unicase/special-casing.h" | 
| 35 |  |  | 
| 36 |  | uint8_t * | 
| 37 |  | u8_tolower (const uint8_t *s, size_t n, const char *iso639_language, | 
| 38 |  |             uninorm_t nf, | 
| 39 |  |             uint8_t *resultbuf, size_t *lengthp) | 
| 40 | 3.86k | { | 
| 41 | 3.86k |   return u8_casemap (s, n, | 
| 42 | 3.86k |                      unicase_empty_prefix_context, unicase_empty_suffix_context, | 
| 43 | 3.86k |                      iso639_language, | 
| 44 | 3.86k |                      uc_tolower, offsetof (struct special_casing_rule, lower[0]), | 
| 45 | 3.86k |                      nf, | 
| 46 | 3.86k |                      resultbuf, lengthp); | 
| 47 | 3.86k | } | 
| 48 |  |  | 
| 49 |  |  | 
| 50 |  | #ifdef TEST | 
| 51 |  |  | 
| 52 |  | #include <locale.h> | 
| 53 |  | #include <stdio.h> | 
| 54 |  | #include <stdlib.h> | 
| 55 |  | #include <string.h> | 
| 56 |  |  | 
| 57 |  | /* Read the contents of an input stream, and return it, terminated with a NUL | 
| 58 |  |    byte. */ | 
| 59 |  | char * | 
| 60 |  | read_file (FILE *stream) | 
| 61 |  | { | 
| 62 |  | #define BUFSIZE 4096 | 
| 63 |  |   char *buf = NULL; | 
| 64 |  |   int alloc = 0; | 
| 65 |  |   int size = 0; | 
| 66 |  |   int count; | 
| 67 |  |  | 
| 68 |  |   while (! feof (stream)) | 
| 69 |  |     { | 
| 70 |  |       if (size + BUFSIZE > alloc) | 
| 71 |  |         { | 
| 72 |  |           alloc = alloc + alloc / 2; | 
| 73 |  |           if (alloc < size + BUFSIZE) | 
| 74 |  |             alloc = size + BUFSIZE; | 
| 75 |  |           buf = realloc (buf, alloc); | 
| 76 |  |           if (buf == NULL) | 
| 77 |  |             { | 
| 78 |  |               fprintf (stderr, "out of memory\n"); | 
| 79 |  |               exit (1); | 
| 80 |  |             } | 
| 81 |  |         } | 
| 82 |  |       count = fread (buf + size, 1, BUFSIZE, stream); | 
| 83 |  |       if (count == 0) | 
| 84 |  |         { | 
| 85 |  |           if (ferror (stream)) | 
| 86 |  |             { | 
| 87 |  |               perror ("fread"); | 
| 88 |  |               exit (1); | 
| 89 |  |             } | 
| 90 |  |         } | 
| 91 |  |       else | 
| 92 |  |         size += count; | 
| 93 |  |     } | 
| 94 |  |   buf = realloc (buf, size + 1); | 
| 95 |  |   if (buf == NULL) | 
| 96 |  |     { | 
| 97 |  |       fprintf (stderr, "out of memory\n"); | 
| 98 |  |       exit (1); | 
| 99 |  |     } | 
| 100 |  |   buf[size] = '\0'; | 
| 101 |  |   return buf; | 
| 102 |  | #undef BUFSIZE | 
| 103 |  | } | 
| 104 |  |  | 
| 105 |  | int | 
| 106 |  | main (int argc, char * argv[]) | 
| 107 |  | { | 
| 108 |  |   setlocale (LC_ALL, ""); | 
| 109 |  |   if (argc == 1) | 
| 110 |  |     { | 
| 111 |  |       /* Display the lower case of the input string.  */ | 
| 112 |  |       char *input = read_file (stdin); | 
| 113 |  |       int length = strlen (input); | 
| 114 |  |       size_t output_length; | 
| 115 |  |       uint8_t *output = | 
| 116 |  |         u8_tolower ((uint8_t *) input, length, uc_locale_language (), | 
| 117 |  |                     NULL, | 
| 118 |  |                     NULL, &output_length); | 
| 119 |  |  | 
| 120 |  |       fwrite (output, 1, output_length, stdout); | 
| 121 |  |  | 
| 122 |  |       return 0; | 
| 123 |  |     } | 
| 124 |  |   else | 
| 125 |  |     return 1; | 
| 126 |  | } | 
| 127 |  |  | 
| 128 |  | #endif /* TEST */ |