| 1 | /* Test of quotearg family of functions.
|
|---|
| 2 | Copyright (C) 2008-2021 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, or (at your option)
|
|---|
| 7 | 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 <https://www.gnu.org/licenses/>. */
|
|---|
| 16 |
|
|---|
| 17 | /* Written by Eric Blake <ebb9@byu.net>, 2008. */
|
|---|
| 18 |
|
|---|
| 19 | struct result_strings {
|
|---|
| 20 | char const *str1; /* Translation of "". */
|
|---|
| 21 | char const *str2; /* Translation of "\0""1\0". */
|
|---|
| 22 | size_t len2; /* Length of str2. */
|
|---|
| 23 | char const *str3; /* Translation of "simple". */
|
|---|
| 24 | char const *str4; /* Translation of " \t\n'\"\033?""?/\\". */
|
|---|
| 25 | char const *str5; /* Translation of "a:b". */
|
|---|
| 26 | char const *str6; /* Translation of "a\\b". */
|
|---|
| 27 | char const *str7; /* Translation of "a' b". */
|
|---|
| 28 | char const *str8a; /* Translation of LQ RQ, in ASCII charset. */
|
|---|
| 29 | char const *str8b; /* Translation of LQ RQ, in Latin1 or UTF-8 charset. */
|
|---|
| 30 | };
|
|---|
| 31 |
|
|---|
| 32 | struct result_groups {
|
|---|
| 33 | struct result_strings group1; /* Via quotearg_buffer. */
|
|---|
| 34 | struct result_strings group2; /* Via quotearg{,_mem}. */
|
|---|
| 35 | struct result_strings group3; /* Via quotearg_colon{,_mem}. */
|
|---|
| 36 | };
|
|---|
| 37 |
|
|---|
| 38 | /* These quotes are borrowed from a pt_PT.utf8 translation. */
|
|---|
| 39 | # define LQ "\302\253"
|
|---|
| 40 | # define RQ "\302\273"
|
|---|
| 41 | # define LQ_ENC "\\302\\253"
|
|---|
| 42 | # define RQ_ENC "\\302\\273"
|
|---|
| 43 | # define RQ_ESC "\\\302\273"
|
|---|
| 44 |
|
|---|
| 45 | static struct result_strings inputs = {
|
|---|
| 46 | "", "\0001\0", 3, "simple", " \t\n'\"\033?""?/\\", "a:b", "a\\b",
|
|---|
| 47 | "a' b", LQ RQ, NULL
|
|---|
| 48 | };
|
|---|
| 49 |
|
|---|
| 50 | static void
|
|---|
| 51 | compare (char const *a, size_t la, char const *b, size_t lb)
|
|---|
| 52 | {
|
|---|
| 53 | ASSERT (la == lb);
|
|---|
| 54 | ASSERT (memcmp (a, b, la) == 0);
|
|---|
| 55 | ASSERT (b[lb] == '\0');
|
|---|
| 56 | }
|
|---|
| 57 |
|
|---|
| 58 | static void
|
|---|
| 59 | compare_strings (char *(func) (char const *, size_t *),
|
|---|
| 60 | struct result_strings *results, bool ascii_only)
|
|---|
| 61 | {
|
|---|
| 62 | size_t len;
|
|---|
| 63 | char *p;
|
|---|
| 64 |
|
|---|
| 65 | len = 0;
|
|---|
| 66 | p = func (inputs.str1, &len);
|
|---|
| 67 | compare (results->str1, strlen (results->str1), p, len);
|
|---|
| 68 |
|
|---|
| 69 | len = inputs.len2;
|
|---|
| 70 | p = func (inputs.str2, &len);
|
|---|
| 71 | compare (results->str2, results->len2, p, len);
|
|---|
| 72 |
|
|---|
| 73 | len = SIZE_MAX;
|
|---|
| 74 | p = func (inputs.str3, &len);
|
|---|
| 75 | compare (results->str3, strlen (results->str3), p, len);
|
|---|
| 76 |
|
|---|
| 77 | len = strlen (inputs.str4);
|
|---|
| 78 | p = func (inputs.str4, &len);
|
|---|
| 79 | compare (results->str4, strlen (results->str4), p, len);
|
|---|
| 80 |
|
|---|
| 81 | len = SIZE_MAX;
|
|---|
| 82 | p = func (inputs.str5, &len);
|
|---|
| 83 | compare (results->str5, strlen (results->str5), p, len);
|
|---|
| 84 |
|
|---|
| 85 | len = strlen (inputs.str6);
|
|---|
| 86 | p = func (inputs.str6, &len);
|
|---|
| 87 | compare (results->str6, strlen (results->str6), p, len);
|
|---|
| 88 |
|
|---|
| 89 | len = strlen (inputs.str7);
|
|---|
| 90 | p = func (inputs.str7, &len);
|
|---|
| 91 | compare (results->str7, strlen (results->str7), p, len);
|
|---|
| 92 |
|
|---|
| 93 | len = strlen (inputs.str8a);
|
|---|
| 94 | p = func (inputs.str8a, &len);
|
|---|
| 95 | if (ascii_only)
|
|---|
| 96 | compare (results->str8a, strlen (results->str8a), p, len);
|
|---|
| 97 | else
|
|---|
| 98 | compare (results->str8b, strlen (results->str8b), p, len);
|
|---|
| 99 | }
|
|---|
| 100 |
|
|---|
| 101 | static char *
|
|---|
| 102 | use_quotearg_buffer (const char *str, size_t *len)
|
|---|
| 103 | {
|
|---|
| 104 | static char buf[100];
|
|---|
| 105 | size_t size;
|
|---|
| 106 | memset (buf, 0xa5, 100);
|
|---|
| 107 | size = quotearg_buffer (buf, 100, str, *len, NULL);
|
|---|
| 108 | *len = size;
|
|---|
| 109 | ASSERT ((unsigned char) buf[size + 1] == 0xa5);
|
|---|
| 110 | return buf;
|
|---|
| 111 | }
|
|---|
| 112 |
|
|---|
| 113 | static char *
|
|---|
| 114 | use_quotearg (const char *str, size_t *len)
|
|---|
| 115 | {
|
|---|
| 116 | char *p = *len == SIZE_MAX ? quotearg (str) : quotearg_mem (str, *len);
|
|---|
| 117 | *len = strlen (p);
|
|---|
| 118 | return p;
|
|---|
| 119 | }
|
|---|
| 120 |
|
|---|
| 121 | static char *
|
|---|
| 122 | use_quotearg_colon (const char *str, size_t *len)
|
|---|
| 123 | {
|
|---|
| 124 | char *p = (*len == SIZE_MAX ? quotearg_colon (str)
|
|---|
| 125 | : quotearg_colon_mem (str, *len));
|
|---|
| 126 | *len = strlen (p);
|
|---|
| 127 | return p;
|
|---|
| 128 | }
|
|---|