1/* Test of ulc_vasnprintf() function in an UTF-8 locale. 2 Copyright (C) 2007-2010 Free Software Foundation, Inc. 3 4 This program is free software: you can redistribute it and/or modify 5 it under the terms of the GNU General Public License as published by 6 the Free Software Foundation; either version 3 of the License, or 7 (at your option) any later version. 8 9 This program is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 GNU General Public License for more details. 13 14 You should have received a copy of the GNU General Public License 15 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 16 17/* Written by Bruno Haible <bruno@clisp.org>, 2007. */ 18 19#include <config.h> 20 21#include "unistdio.h" 22 23#include <locale.h> 24#include <stdarg.h> 25#include <stdint.h> 26#include <stdlib.h> 27#include <string.h> 28 29#include "macros.h" 30 31static void 32test_function (char * (*my_asnprintf) (char *, size_t *, const char *, ...)) 33{ 34 /* Test the support of the 'U' conversion specifier for Unicode strings. */ 35 36 { 37 static const uint8_t unicode_string[] = "Rafa\305\202 Maszkowski"; /* Rafa�� Maszkowski */ 38 { 39 size_t length; 40 char *result = 41 my_asnprintf (NULL, &length, "%U %d", unicode_string, 33, 44, 55); 42 ASSERT (result != NULL); 43 ASSERT (strcmp (result, "Rafa\305\202 Maszkowski 33") == 0); 44 ASSERT (length == strlen (result)); 45 free (result); 46 } 47 { /* Width. */ 48 size_t length; 49 char *result = 50 my_asnprintf (NULL, &length, "%20U %d", unicode_string, 33, 44, 55); 51 ASSERT (result != NULL); 52 ASSERT (strcmp (result, " Rafa\305\202 Maszkowski 33") == 0); 53 ASSERT (length == strlen (result)); 54 free (result); 55 } 56 { /* FLAG_LEFT. */ 57 size_t length; 58 char *result = 59 my_asnprintf (NULL, &length, "%-20U %d", unicode_string, 33, 44, 55); 60 ASSERT (result != NULL); 61 ASSERT (strcmp (result, "Rafa\305\202 Maszkowski 33") == 0); 62 ASSERT (length == strlen (result)); 63 free (result); 64 } 65 { /* FLAG_ZERO: no effect. */ 66 size_t length; 67 char *result = 68 my_asnprintf (NULL, &length, "%020U %d", unicode_string, 33, 44, 55); 69 ASSERT (result != NULL); 70 ASSERT (strcmp (result, " Rafa\305\202 Maszkowski 33") == 0); 71 ASSERT (length == strlen (result)); 72 free (result); 73 } 74 } 75 76 { 77 static const uint16_t unicode_string[] = /* Rafa�� Maszkowski */ 78 { 79 'R', 'a', 'f', 'a', 0x0142, ' ', 'M', 'a', 's', 'z', 'k', 'o', 'w', 80 's', 'k', 'i', 0 81 }; 82 { 83 size_t length; 84 char *result = 85 my_asnprintf (NULL, &length, "%lU %d", unicode_string, 33, 44, 55); 86 ASSERT (result != NULL); 87 ASSERT (strcmp (result, "Rafa\305\202 Maszkowski 33") == 0); 88 ASSERT (length == strlen (result)); 89 free (result); 90 } 91 { /* Width. */ 92 size_t length; 93 char *result = 94 my_asnprintf (NULL, &length, "%20lU %d", unicode_string, 33, 44, 55); 95 ASSERT (result != NULL); 96 ASSERT (strcmp (result, " Rafa\305\202 Maszkowski 33") == 0); 97 ASSERT (length == strlen (result)); 98 free (result); 99 } 100 { /* FLAG_LEFT. */ 101 size_t length; 102 char *result = 103 my_asnprintf (NULL, &length, "%-20lU %d", unicode_string, 33, 44, 55); 104 ASSERT (result != NULL); 105 ASSERT (strcmp (result, "Rafa\305\202 Maszkowski 33") == 0); 106 ASSERT (length == strlen (result)); 107 free (result); 108 } 109 { /* FLAG_ZERO: no effect. */ 110 size_t length; 111 char *result = 112 my_asnprintf (NULL, &length, "%020lU %d", unicode_string, 33, 44, 55); 113 ASSERT (result != NULL); 114 ASSERT (strcmp (result, " Rafa\305\202 Maszkowski 33") == 0); 115 ASSERT (length == strlen (result)); 116 free (result); 117 } 118 } 119 120 { 121 static const uint32_t unicode_string[] = /* Rafa�� Maszkowski */ 122 { 123 'R', 'a', 'f', 'a', 0x0142, ' ', 'M', 'a', 's', 'z', 'k', 'o', 'w', 124 's', 'k', 'i', 0 125 }; 126 { 127 size_t length; 128 char *result = 129 my_asnprintf (NULL, &length, "%llU %d", unicode_string, 33, 44, 55); 130 ASSERT (result != NULL); 131 ASSERT (strcmp (result, "Rafa\305\202 Maszkowski 33") == 0); 132 ASSERT (length == strlen (result)); 133 free (result); 134 } 135 { /* Width. */ 136 size_t length; 137 char *result = 138 my_asnprintf (NULL, &length, "%20llU %d", unicode_string, 33, 44, 55); 139 ASSERT (result != NULL); 140 ASSERT (strcmp (result, " Rafa\305\202 Maszkowski 33") == 0); 141 ASSERT (length == strlen (result)); 142 free (result); 143 } 144 { /* FLAG_LEFT. */ 145 size_t length; 146 char *result = 147 my_asnprintf (NULL, &length, "%-20llU %d", unicode_string, 33, 44, 55); 148 ASSERT (result != NULL); 149 ASSERT (strcmp (result, "Rafa\305\202 Maszkowski 33") == 0); 150 ASSERT (length == strlen (result)); 151 free (result); 152 } 153 { /* FLAG_ZERO: no effect. */ 154 size_t length; 155 char *result = 156 my_asnprintf (NULL, &length, "%020llU %d", unicode_string, 33, 44, 55); 157 ASSERT (result != NULL); 158 ASSERT (strcmp (result, " Rafa\305\202 Maszkowski 33") == 0); 159 ASSERT (length == strlen (result)); 160 free (result); 161 } 162 } 163 164 /* Test the support of the 's' conversion specifier for strings. */ 165 166 { 167 const char *locale_string = "\303\204rger"; /* ��rger */ 168 { 169 size_t length; 170 char *result = 171 my_asnprintf (NULL, &length, "%s %d", locale_string, 33, 44, 55); 172 ASSERT (result != NULL); 173 ASSERT (strcmp (result, "\303\204rger 33") == 0); 174 ASSERT (length == strlen (result)); 175 free (result); 176 } 177 { /* Width. */ 178 size_t length; 179 char *result = 180 my_asnprintf (NULL, &length, "%10s %d", locale_string, 33, 44, 55); 181 ASSERT (result != NULL); 182 ASSERT (strcmp (result, " \303\204rger 33") == 0); 183 ASSERT (length == strlen (result)); 184 free (result); 185 } 186 { /* FLAG_LEFT. */ 187 size_t length; 188 char *result = 189 my_asnprintf (NULL, &length, "%-10s %d", locale_string, 33, 44, 55); 190 ASSERT (result != NULL); 191 ASSERT (strcmp (result, "\303\204rger 33") == 0); 192 ASSERT (length == strlen (result)); 193 free (result); 194 } 195 { /* FLAG_ZERO: no effect. */ 196 size_t length; 197 char *result = 198 my_asnprintf (NULL, &length, "%010s %d", locale_string, 33, 44, 55); 199 ASSERT (result != NULL); 200 ASSERT (strcmp (result, " \303\204rger 33") == 0); 201 ASSERT (length == strlen (result)); 202 free (result); 203 } 204 } 205} 206 207static char * 208my_asnprintf (char *resultbuf, size_t *lengthp, const char *format, ...) 209{ 210 va_list args; 211 char *ret; 212 213 va_start (args, format); 214 ret = ulc_vasnprintf (resultbuf, lengthp, format, args); 215 va_end (args); 216 return ret; 217} 218 219static void 220test_vasnprintf () 221{ 222 test_function (my_asnprintf); 223} 224 225int 226main (int argc, char *argv[]) 227{ 228 /* configure should already have checked that the locale is supported. */ 229 if (setlocale (LC_ALL, "") == NULL) 230 return 1; 231 232 test_vasnprintf (); 233 return 0; 234} 235