(root)/
sed-4.9/
gnulib-tests/
test-quotearg.h
       1  /* Test of quotearg family of functions.
       2     Copyright (C) 2008-2022 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  }