Blame gnulib-tests/test-quotearg-simple.c

Packit Service fdd496
/* Test of quotearg family of functions.
Packit Service fdd496
   Copyright (C) 2008-2017 Free Software Foundation, Inc.
Packit Service fdd496
Packit Service fdd496
   This program is free software; you can redistribute it and/or modify
Packit Service fdd496
   it under the terms of the GNU General Public License as published by
Packit Service fdd496
   the Free Software Foundation; either version 3, or (at your option)
Packit Service fdd496
   any later version.
Packit Service fdd496
Packit Service fdd496
   This program is distributed in the hope that it will be useful,
Packit Service fdd496
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service fdd496
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service fdd496
   GNU General Public License for more details.
Packit Service fdd496
Packit Service fdd496
   You should have received a copy of the GNU General Public License
Packit Service fdd496
   along with this program; if not, see <http://www.gnu.org/licenses/>.  */
Packit Service fdd496
Packit Service fdd496
/* Written by Eric Blake <ebb9@byu.net>, 2008.  */
Packit Service fdd496
Packit Service fdd496
#include <config.h>
Packit Service fdd496
Packit Service fdd496
#include "quotearg.h"
Packit Service fdd496
Packit Service fdd496
#include <ctype.h>
Packit Service fdd496
#include <stdbool.h>
Packit Service fdd496
#include <stdint.h>
Packit Service fdd496
#include <stdlib.h>
Packit Service fdd496
#include <string.h>
Packit Service fdd496
Packit Service fdd496
#include "localcharset.h"
Packit Service fdd496
#include "macros.h"
Packit Service fdd496
#include "zerosize-ptr.h"
Packit Service fdd496
Packit Service fdd496
#include "test-quotearg.h"
Packit Service fdd496
Packit Service fdd496
static struct result_groups results_g[] = {
Packit Service fdd496
  /* literal_quoting_style */
Packit Service fdd496
  { { "", "\0""1\0", 3, "simple", " \t\n'\"\033?""?/\\", "a:b", "a\\b",
Packit Service fdd496
      "a' b", LQ RQ, LQ RQ },
Packit Service fdd496
    { "", "1", 1, "simple", " \t\n'\"\033?""?/\\", "a:b", "a\\b",
Packit Service fdd496
      "a' b", LQ RQ, LQ RQ },
Packit Service fdd496
    { "", "1", 1, "simple", " \t\n'\"\033?""?/\\", "a:b", "a\\b",
Packit Service fdd496
      "a' b", LQ RQ, LQ RQ } },
Packit Service fdd496
Packit Service fdd496
  /* shell_quoting_style */
Packit Service fdd496
  { { "''", "\0""1\0", 3, "simple", "' \t\n'\\''\"\033?""?/\\'", "a:b",
Packit Service fdd496
      "'a\\b'", "\"a' b\"", LQ RQ, LQ RQ },
Packit Service fdd496
    { "''", "1", 1, "simple", "' \t\n'\\''\"\033?""?/\\'", "a:b",
Packit Service fdd496
      "'a\\b'", "\"a' b\"", LQ RQ, LQ RQ },
Packit Service fdd496
    { "''", "1", 1, "simple", "' \t\n'\\''\"\033?""?/\\'", "'a:b'",
Packit Service fdd496
      "'a\\b'", "\"a' b\"", LQ RQ, LQ RQ } },
Packit Service fdd496
Packit Service fdd496
  /* shell_always_quoting_style */
Packit Service fdd496
  { { "''", "'\0""1\0'", 5, "'simple'", "' \t\n'\\''\"\033?""?/\\'", "'a:b'",
Packit Service fdd496
      "'a\\b'", "\"a' b\"", "'" LQ RQ "'", "'" LQ RQ "'" },
Packit Service fdd496
    { "''", "'1'", 3, "'simple'", "' \t\n'\\''\"\033?""?/\\'", "'a:b'",
Packit Service fdd496
      "'a\\b'", "\"a' b\"", "'" LQ RQ "'", "'" LQ RQ "'" },
Packit Service fdd496
    { "''", "'1'", 3, "'simple'", "' \t\n'\\''\"\033?""?/\\'", "'a:b'",
Packit Service fdd496
      "'a\\b'", "\"a' b\"", "'" LQ RQ "'", "'" LQ RQ "'" } },
Packit Service fdd496
Packit Service fdd496
  /* shell_escape_quoting_style */
Packit Service fdd496
  { { "''", "''$'\\0''1'$'\\0'", 15, "simple",
Packit Service fdd496
      "' '$'\\t\\n'\\''\"'$'\\033''?""?/\\'", "a:b",
Packit Service fdd496
      "'a\\b'", "\"a' b\"", "''$'" LQ_ENC RQ_ENC "'", LQ RQ },
Packit Service fdd496
    { "''", "''$'\\0''1'$'\\0'", 15, "simple",
Packit Service fdd496
      "' '$'\\t\\n'\\''\"'$'\\033''?""?/\\'", "a:b",
Packit Service fdd496
      "'a\\b'", "\"a' b\"", "''$'" LQ_ENC RQ_ENC "'", LQ RQ },
Packit Service fdd496
    { "''", "''$'\\0''1'$'\\0'", 15, "simple",
Packit Service fdd496
      "' '$'\\t\\n'\\''\"'$'\\033''?""?/\\'", "'a:b'",
Packit Service fdd496
      "'a\\b'", "\"a' b\"", "''$'" LQ_ENC RQ_ENC "'", LQ RQ } },
Packit Service fdd496
Packit Service fdd496
  /* shell_escape_always_quoting_style */
Packit Service fdd496
  { { "''", "''$'\\0''1'$'\\0'", 15, "'simple'",
Packit Service fdd496
      "' '$'\\t\\n'\\''\"'$'\\033''?""?/\\'", "'a:b'",
Packit Service fdd496
      "'a\\b'", "\"a' b\"", "''$'" LQ_ENC RQ_ENC "'", "'" LQ RQ "'" },
Packit Service fdd496
    { "''", "''$'\\0''1'$'\\0'", 15, "'simple'",
Packit Service fdd496
      "' '$'\\t\\n'\\''\"'$'\\033''?""?/\\'", "'a:b'",
Packit Service fdd496
      "'a\\b'", "\"a' b\"", "''$'" LQ_ENC RQ_ENC "'", "'" LQ RQ "'" },
Packit Service fdd496
    { "''", "''$'\\0''1'$'\\0'", 15, "'simple'",
Packit Service fdd496
      "' '$'\\t\\n'\\''\"'$'\\033''?""?/\\'", "'a:b'",
Packit Service fdd496
      "'a\\b'", "\"a' b\"", "''$'" LQ_ENC RQ_ENC "'", "'" LQ RQ "'" } },
Packit Service fdd496
Packit Service fdd496
  /* c_quoting_style */
Packit Service fdd496
  { { "\"\"", "\"\\0001\\0\"", 9, "\"simple\"",
Packit Service fdd496
      "\" \\t\\n'\\\"\\033?""?/\\\\\"", "\"a:b\"", "\"a\\\\b\"",
Packit Service fdd496
      "\"a' b\"", "\"" LQ_ENC RQ_ENC "\"", "\"" LQ RQ "\"" },
Packit Service fdd496
    { "\"\"", "\"\\0001\\0\"", 9, "\"simple\"",
Packit Service fdd496
      "\" \\t\\n'\\\"\\033?""?/\\\\\"", "\"a:b\"", "\"a\\\\b\"",
Packit Service fdd496
      "\"a' b\"", "\"" LQ_ENC RQ_ENC "\"", "\"" LQ RQ "\"" },
Packit Service fdd496
    { "\"\"", "\"\\0001\\0\"", 9, "\"simple\"",
Packit Service fdd496
      "\" \\t\\n'\\\"\\033?""?/\\\\\"", "\"a\\:b\"", "\"a\\\\b\"",
Packit Service fdd496
      "\"a' b\"", "\"" LQ_ENC RQ_ENC "\"", "\"" LQ RQ "\"" } },
Packit Service fdd496
Packit Service fdd496
  /* c_maybe_quoting_style */
Packit Service fdd496
  { { "", "\"\\0001\\0\"", 9, "simple", "\" \\t\\n'\\\"\\033?""?/\\\\\"",
Packit Service fdd496
      "a:b", "a\\b", "a' b", "\"" LQ_ENC RQ_ENC "\"", LQ RQ },
Packit Service fdd496
    { "", "\"\\0001\\0\"", 9, "simple", "\" \\t\\n'\\\"\\033?""?/\\\\\"",
Packit Service fdd496
      "a:b", "a\\b", "a' b", "\"" LQ_ENC RQ_ENC "\"", LQ RQ },
Packit Service fdd496
    { "", "\"\\0001\\0\"", 9, "simple", "\" \\t\\n'\\\"\\033?""?/\\\\\"",
Packit Service fdd496
      "\"a:b\"", "a\\b", "a' b", "\"" LQ_ENC RQ_ENC "\"", LQ RQ } },
Packit Service fdd496
Packit Service fdd496
  /* escape_quoting_style */
Packit Service fdd496
  { { "", "\\0001\\0", 7, "simple", " \\t\\n'\"\\033?""?/\\\\", "a:b",
Packit Service fdd496
      "a\\\\b", "a' b", LQ_ENC RQ_ENC, LQ RQ },
Packit Service fdd496
    { "", "\\0001\\0", 7, "simple", " \\t\\n'\"\\033?""?/\\\\", "a:b",
Packit Service fdd496
      "a\\\\b", "a' b", LQ_ENC RQ_ENC, LQ RQ },
Packit Service fdd496
    { "", "\\0001\\0", 7, "simple", " \\t\\n'\"\\033?""?/\\\\", "a\\:b",
Packit Service fdd496
      "a\\\\b", "a' b", LQ_ENC RQ_ENC, LQ RQ } },
Packit Service fdd496
Packit Service fdd496
  /* locale_quoting_style */
Packit Service fdd496
  { { "''", "'\\0001\\0'", 9, "'simple'", "' \\t\\n\\'\"\\033?""?/\\\\'",
Packit Service fdd496
      "'a:b'", "'a\\\\b'", "'a\\' b'", "'" LQ_ENC RQ_ENC "'", "'" LQ RQ "'" },
Packit Service fdd496
    { "''", "'\\0001\\0'", 9, "'simple'", "' \\t\\n\\'\"\\033?""?/\\\\'",
Packit Service fdd496
      "'a:b'", "'a\\\\b'", "'a\\' b'", "'" LQ_ENC RQ_ENC "'", "'" LQ RQ "'" },
Packit Service fdd496
    { "''", "'\\0001\\0'", 9, "'simple'", "' \\t\\n\\'\"\\033?""?/\\\\'",
Packit Service fdd496
      "'a\\:b'", "'a\\\\b'", "'a\\' b'",
Packit Service fdd496
      "'" LQ_ENC RQ_ENC "'", "'" LQ RQ "'" } },
Packit Service fdd496
Packit Service fdd496
  /* clocale_quoting_style */
Packit Service fdd496
  { { "\"\"", "\"\\0001\\0\"", 9, "\"simple\"",
Packit Service fdd496
      "\" \\t\\n'\\\"\\033?""?/\\\\\"", "\"a:b\"", "\"a\\\\b\"",
Packit Service fdd496
      "\"a' b\"", "\"" LQ_ENC RQ_ENC "\"", "\"" LQ RQ "\"" },
Packit Service fdd496
    { "\"\"", "\"\\0001\\0\"", 9, "\"simple\"",
Packit Service fdd496
      "\" \\t\\n'\\\"\\033?""?/\\\\\"", "\"a:b\"", "\"a\\\\b\"",
Packit Service fdd496
      "\"a' b\"", "\"" LQ_ENC RQ_ENC "\"", "\"" LQ RQ "\"" },
Packit Service fdd496
    { "\"\"", "\"\\0001\\0\"", 9, "\"simple\"",
Packit Service fdd496
      "\" \\t\\n'\\\"\\033?""?/\\\\\"", "\"a\\:b\"", "\"a\\\\b\"",
Packit Service fdd496
      "\"a' b\"", "\"" LQ_ENC RQ_ENC "\"", "\"" LQ RQ "\"" } }
Packit Service fdd496
};
Packit Service fdd496
Packit Service fdd496
static struct result_groups flag_results[] = {
Packit Service fdd496
  /* literal_quoting_style and QA_ELIDE_NULL_BYTES */
Packit Service fdd496
  { { "", "1", 1, "simple", " \t\n'\"\033?""?/\\", "a:b", "a\\b", "a' b",
Packit Service fdd496
      LQ RQ, LQ RQ },
Packit Service fdd496
    { "", "1", 1, "simple", " \t\n'\"\033?""?/\\", "a:b", "a\\b", "a' b",
Packit Service fdd496
      LQ RQ, LQ RQ },
Packit Service fdd496
    { "", "1", 1, "simple", " \t\n'\"\033?""?/\\", "a:b", "a\\b", "a' b",
Packit Service fdd496
      LQ RQ, LQ RQ } },
Packit Service fdd496
Packit Service fdd496
  /* c_quoting_style and QA_ELIDE_OUTER_QUOTES */
Packit Service fdd496
  { { "", "\"\\0001\\0\"", 9, "simple", "\" \\t\\n'\\\"\\033?""?/\\\\\"",
Packit Service fdd496
      "a:b", "a\\b", "a' b", "\"" LQ_ENC RQ_ENC "\"", LQ RQ },
Packit Service fdd496
    { "", "\"\\0001\\0\"", 9, "simple", "\" \\t\\n'\\\"\\033?""?/\\\\\"",
Packit Service fdd496
      "a:b", "a\\b", "a' b", "\"" LQ_ENC RQ_ENC "\"", LQ RQ },
Packit Service fdd496
    { "", "\"\\0001\\0\"", 9, "simple", "\" \\t\\n'\\\"\\033?""?/\\\\\"",
Packit Service fdd496
      "\"a:b\"", "a\\b", "a' b", "\"" LQ_ENC RQ_ENC "\"", LQ RQ } },
Packit Service fdd496
Packit Service fdd496
  /* c_quoting_style and QA_SPLIT_TRIGRAPHS */
Packit Service fdd496
  { { "\"\"", "\"\\0001\\0\"", 9, "\"simple\"",
Packit Service fdd496
      "\" \\t\\n'\\\"\\033?\"\"?/\\\\\"", "\"a:b\"", "\"a\\\\b\"",
Packit Service fdd496
      "\"a' b\"", "\"" LQ_ENC RQ_ENC "\"", "\"" LQ RQ "\"" },
Packit Service fdd496
    { "\"\"", "\"\\0001\\0\"", 9, "\"simple\"",
Packit Service fdd496
      "\" \\t\\n'\\\"\\033?\"\"?/\\\\\"", "\"a:b\"", "\"a\\\\b\"",
Packit Service fdd496
      "\"a' b\"", "\"" LQ_ENC RQ_ENC "\"", "\"" LQ RQ "\"" },
Packit Service fdd496
    { "\"\"", "\"\\0001\\0\"", 9, "\"simple\"",
Packit Service fdd496
      "\" \\t\\n'\\\"\\033?\"\"?/\\\\\"", "\"a\\:b\"", "\"a\\\\b\"",
Packit Service fdd496
      "\"a' b\"", "\"" LQ_ENC RQ_ENC "\"", "\"" LQ RQ "\"" } }
Packit Service fdd496
};
Packit Service fdd496
Packit Service fdd496
static char const *custom_quotes[][2] = {
Packit Service fdd496
  { "", ""  },
Packit Service fdd496
  { "'", "'"  },
Packit Service fdd496
  { "(", ")"  },
Packit Service fdd496
  { ":", " "  },
Packit Service fdd496
  { " ", ":"  },
Packit Service fdd496
  { "# ", "\n" },
Packit Service fdd496
  { "\"'", "'\"" }
Packit Service fdd496
};
Packit Service fdd496
Packit Service fdd496
static struct result_groups custom_results[] = {
Packit Service fdd496
  /* left_quote = right_quote = "" */
Packit Service fdd496
  { { "", "\\0001\\0", 7, "simple",
Packit Service fdd496
      " \\t\\n'\"\\033?""?/\\\\", "a:b", "a\\\\b",
Packit Service fdd496
      "a' b", LQ_ENC RQ_ENC, LQ RQ },
Packit Service fdd496
    { "", "\\0001\\0", 7, "simple",
Packit Service fdd496
      " \\t\\n'\"\\033?""?/\\\\", "a:b", "a\\\\b",
Packit Service fdd496
      "a' b", LQ_ENC RQ_ENC, LQ RQ },
Packit Service fdd496
    { "", "\\0001\\0", 7, "simple",
Packit Service fdd496
      " \\t\\n'\"\\033?""?/\\\\", "a\\:b", "a\\\\b",
Packit Service fdd496
      "a' b", LQ_ENC RQ_ENC, LQ RQ } },
Packit Service fdd496
Packit Service fdd496
  /* left_quote = right_quote = "'" */
Packit Service fdd496
  { { "''", "'\\0001\\0'", 9, "'simple'",
Packit Service fdd496
      "' \\t\\n\\'\"\\033?""?/\\\\'", "'a:b'", "'a\\\\b'",
Packit Service fdd496
      "'a\\' b'", "'" LQ_ENC RQ_ENC "'", "'" LQ RQ "'" },
Packit Service fdd496
    { "''", "'\\0001\\0'", 9, "'simple'",
Packit Service fdd496
      "' \\t\\n\\'\"\\033?""?/\\\\'", "'a:b'", "'a\\\\b'",
Packit Service fdd496
      "'a\\' b'", "'" LQ_ENC RQ_ENC "'", "'" LQ RQ "'" },
Packit Service fdd496
    { "''", "'\\0001\\0'", 9, "'simple'",
Packit Service fdd496
      "' \\t\\n\\'\"\\033?""?/\\\\'", "'a\\:b'", "'a\\\\b'",
Packit Service fdd496
      "'a\\' b'", "'" LQ_ENC RQ_ENC "'", "'" LQ RQ "'" } },
Packit Service fdd496
Packit Service fdd496
  /* left_quote = "(" and right_quote = ")" */
Packit Service fdd496
  { { "()", "(\\0001\\0)", 9, "(simple)",
Packit Service fdd496
      "( \\t\\n'\"\\033?""?/\\\\)", "(a:b)", "(a\\\\b)",
Packit Service fdd496
      "(a' b)", "(" LQ_ENC RQ_ENC ")", "(" LQ RQ ")" },
Packit Service fdd496
    { "()", "(\\0001\\0)", 9, "(simple)",
Packit Service fdd496
      "( \\t\\n'\"\\033?""?/\\\\)", "(a:b)", "(a\\\\b)",
Packit Service fdd496
      "(a' b)", "(" LQ_ENC RQ_ENC ")", "(" LQ RQ ")" },
Packit Service fdd496
    { "()", "(\\0001\\0)", 9, "(simple)",
Packit Service fdd496
      "( \\t\\n'\"\\033?""?/\\\\)", "(a\\:b)", "(a\\\\b)",
Packit Service fdd496
      "(a' b)", "(" LQ_ENC RQ_ENC ")", "(" LQ RQ ")" } },
Packit Service fdd496
Packit Service fdd496
  /* left_quote = ":" and right_quote = " " */
Packit Service fdd496
  { { ": ", ":\\0001\\0 ", 9, ":simple ",
Packit Service fdd496
      ":\\ \\t\\n'\"\\033?""?/\\\\ ", ":a:b ", ":a\\\\b ",
Packit Service fdd496
      ":a'\\ b ", ":" LQ_ENC RQ_ENC " ", ":" LQ RQ " " },
Packit Service fdd496
    { ": ", ":\\0001\\0 ", 9, ":simple ",
Packit Service fdd496
      ":\\ \\t\\n'\"\\033?""?/\\\\ ", ":a:b ", ":a\\\\b ",
Packit Service fdd496
      ":a'\\ b ", ":" LQ_ENC RQ_ENC " ", ":" LQ RQ " " },
Packit Service fdd496
    { ": ", ":\\0001\\0 ", 9, ":simple ",
Packit Service fdd496
      ":\\ \\t\\n'\"\\033?""?/\\\\ ", ":a\\:b ", ":a\\\\b ",
Packit Service fdd496
      ":a'\\ b ", ":" LQ_ENC RQ_ENC " ", ":" LQ RQ " " } },
Packit Service fdd496
Packit Service fdd496
  /* left_quote = " " and right_quote = ":" */
Packit Service fdd496
  { { " :", " \\0001\\0:", 9, " simple:",
Packit Service fdd496
      "  \\t\\n'\"\\033?""?/\\\\:", " a\\:b:", " a\\\\b:",
Packit Service fdd496
      " a' b:", " " LQ_ENC RQ_ENC ":", " " LQ RQ ":" },
Packit Service fdd496
    { " :", " \\0001\\0:", 9, " simple:",
Packit Service fdd496
      "  \\t\\n'\"\\033?""?/\\\\:", " a\\:b:", " a\\\\b:",
Packit Service fdd496
      " a' b:", " " LQ_ENC RQ_ENC ":", " " LQ RQ ":" },
Packit Service fdd496
    { " :", " \\0001\\0:", 9, " simple:",
Packit Service fdd496
      "  \\t\\n'\"\\033?""?/\\\\:", " a\\:b:", " a\\\\b:",
Packit Service fdd496
      " a' b:", " " LQ_ENC RQ_ENC ":", " " LQ RQ ":" } },
Packit Service fdd496
Packit Service fdd496
  /* left_quote = "# " and right_quote = "\n" */
Packit Service fdd496
  { { "# \n", "# \\0001\\0\n", 10, "# simple\n",
Packit Service fdd496
      "#  \\t\\n'\"\\033?""?/\\\\\n", "# a:b\n", "# a\\\\b\n",
Packit Service fdd496
      "# a' b\n", "# " LQ_ENC RQ_ENC "\n", "# " LQ RQ "\n" },
Packit Service fdd496
    { "# \n", "# \\0001\\0\n", 10, "# simple\n",
Packit Service fdd496
      "#  \\t\\n'\"\\033?""?/\\\\\n", "# a:b\n", "# a\\\\b\n",
Packit Service fdd496
      "# a' b\n", "# " LQ_ENC RQ_ENC "\n", "# " LQ RQ "\n" },
Packit Service fdd496
    { "# \n", "# \\0001\\0\n", 10, "# simple\n",
Packit Service fdd496
      "#  \\t\\n'\"\\033?""?/\\\\\n", "# a\\:b\n", "# a\\\\b\n",
Packit Service fdd496
      "# a' b\n", "# " LQ_ENC RQ_ENC "\n", "# " LQ RQ "\n" } },
Packit Service fdd496
Packit Service fdd496
  /* left_quote = "\"'" and right_quote = "'\"" */
Packit Service fdd496
  { { "\"''\"", "\"'\\0001\\0'\"", 11, "\"'simple'\"",
Packit Service fdd496
      "\"' \\t\\n\\'\"\\033?""?/\\\\'\"", "\"'a:b'\"", "\"'a\\\\b'\"",
Packit Service fdd496
      "\"'a' b'\"", "\"'" LQ_ENC RQ_ENC "'\"", "\"'" LQ RQ "'\"" },
Packit Service fdd496
    { "\"''\"", "\"'\\0001\\0'\"", 11, "\"'simple'\"",
Packit Service fdd496
      "\"' \\t\\n\\'\"\\033?""?/\\\\'\"", "\"'a:b'\"", "\"'a\\\\b'\"",
Packit Service fdd496
      "\"'a' b'\"", "\"'" LQ_ENC RQ_ENC "'\"", "\"'" LQ RQ "'\"" },
Packit Service fdd496
    { "\"''\"", "\"'\\0001\\0'\"", 11, "\"'simple'\"",
Packit Service fdd496
      "\"' \\t\\n\\'\"\\033?""?/\\\\'\"", "\"'a\\:b'\"", "\"'a\\\\b'\"",
Packit Service fdd496
      "\"'a' b'\"", "\"'" LQ_ENC RQ_ENC "'\"", "\"'" LQ RQ "'\"" } }
Packit Service fdd496
};
Packit Service fdd496
Packit Service fdd496
static char *
Packit Service fdd496
use_quote_double_quotes (const char *str, size_t *len)
Packit Service fdd496
{
Packit Service fdd496
  char *p = *len == SIZE_MAX ? quotearg_char (str, '"')
Packit Service fdd496
                               : quotearg_char_mem (str, *len, '"');
Packit Service fdd496
  *len = strlen (p);
Packit Service fdd496
  return p;
Packit Service fdd496
}
Packit Service fdd496
Packit Service fdd496
int
Packit Service fdd496
main (int argc _GL_UNUSED, char *argv[])
Packit Service fdd496
{
Packit Service fdd496
  int i;
Packit Service fdd496
  bool ascii_only = MB_CUR_MAX == 1 && !isprint ((unsigned char) LQ[0]);
Packit Service fdd496
Packit Service fdd496
  /* This part of the program is hard-wired to the C locale since it
Packit Service fdd496
     does not call setlocale.  However, according to POSIX, the use of
Packit Service fdd496
     8-bit bytes in a character context in the C locale gives
Packit Service fdd496
     unspecified results (that is, the C locale charset is allowed to
Packit Service fdd496
     be unibyte with 8-bit bytes rejected [ASCII], unibyte with 8-bit
Packit Service fdd496
     bytes being characters [often ISO-8859-1], or multibyte [often
Packit Service fdd496
     UTF-8]).  We assume that the latter two cases will be
Packit Service fdd496
     indistinguishable in this test - that is, the LQ and RQ sequences
Packit Service fdd496
     will pass through unchanged in either type of charset.  So when
Packit Service fdd496
     testing for quoting of str7, use the ascii_only flag to decide
Packit Service fdd496
     what to expect for the 8-bit data being quoted.  */
Packit Service fdd496
  ASSERT (!isprint ('\033'));
Packit Service fdd496
  for (i = literal_quoting_style; i <= clocale_quoting_style; i++)
Packit Service fdd496
    {
Packit Service fdd496
      set_quoting_style (NULL, (enum quoting_style) i);
Packit Service fdd496
      if (!(i == locale_quoting_style || i == clocale_quoting_style)
Packit Service fdd496
          || (strcmp (locale_charset (), "ASCII") == 0
Packit Service fdd496
              || strcmp (locale_charset (), "ANSI_X3.4-1968") == 0))
Packit Service fdd496
        {
Packit Service fdd496
          compare_strings (use_quotearg_buffer, &results_g[i].group1,
Packit Service fdd496
                           ascii_only);
Packit Service fdd496
          compare_strings (use_quotearg, &results_g[i].group2,
Packit Service fdd496
                           ascii_only);
Packit Service fdd496
          if (i == c_quoting_style)
Packit Service fdd496
            compare_strings (use_quote_double_quotes, &results_g[i].group2,
Packit Service fdd496
                             ascii_only);
Packit Service fdd496
          compare_strings (use_quotearg_colon, &results_g[i].group3,
Packit Service fdd496
                           ascii_only);
Packit Service fdd496
        }
Packit Service fdd496
    }
Packit Service fdd496
Packit Service fdd496
  set_quoting_style (NULL, literal_quoting_style);
Packit Service fdd496
  ASSERT (set_quoting_flags (NULL, QA_ELIDE_NULL_BYTES) == 0);
Packit Service fdd496
  compare_strings (use_quotearg_buffer, &flag_results[0].group1, ascii_only);
Packit Service fdd496
  compare_strings (use_quotearg, &flag_results[0].group2, ascii_only);
Packit Service fdd496
  compare_strings (use_quotearg_colon, &flag_results[0].group3, ascii_only);
Packit Service fdd496
Packit Service fdd496
  set_quoting_style (NULL, c_quoting_style);
Packit Service fdd496
  ASSERT (set_quoting_flags (NULL, QA_ELIDE_OUTER_QUOTES)
Packit Service fdd496
          == QA_ELIDE_NULL_BYTES);
Packit Service fdd496
  compare_strings (use_quotearg_buffer, &flag_results[1].group1, ascii_only);
Packit Service fdd496
  compare_strings (use_quotearg, &flag_results[1].group2, ascii_only);
Packit Service fdd496
  compare_strings (use_quote_double_quotes, &flag_results[1].group2,
Packit Service fdd496
                   ascii_only);
Packit Service fdd496
  compare_strings (use_quotearg_colon, &flag_results[1].group3, ascii_only);
Packit Service fdd496
Packit Service fdd496
  ASSERT (set_quoting_flags (NULL, QA_SPLIT_TRIGRAPHS)
Packit Service fdd496
          == QA_ELIDE_OUTER_QUOTES);
Packit Service fdd496
  compare_strings (use_quotearg_buffer, &flag_results[2].group1, ascii_only);
Packit Service fdd496
  compare_strings (use_quotearg, &flag_results[2].group2, ascii_only);
Packit Service fdd496
  compare_strings (use_quote_double_quotes, &flag_results[2].group2,
Packit Service fdd496
                   ascii_only);
Packit Service fdd496
  compare_strings (use_quotearg_colon, &flag_results[2].group3, ascii_only);
Packit Service fdd496
Packit Service fdd496
  ASSERT (set_quoting_flags (NULL, 0) == QA_SPLIT_TRIGRAPHS);
Packit Service fdd496
Packit Service fdd496
  for (i = 0; i < sizeof custom_quotes / sizeof *custom_quotes; ++i)
Packit Service fdd496
    {
Packit Service fdd496
      set_custom_quoting (NULL,
Packit Service fdd496
                          custom_quotes[i][0], custom_quotes[i][1]);
Packit Service fdd496
      compare_strings (use_quotearg_buffer, &custom_results[i].group1,
Packit Service fdd496
                       ascii_only);
Packit Service fdd496
      compare_strings (use_quotearg, &custom_results[i].group2, ascii_only);
Packit Service fdd496
      compare_strings (use_quotearg_colon, &custom_results[i].group3,
Packit Service fdd496
                       ascii_only);
Packit Service fdd496
    }
Packit Service fdd496
Packit Service fdd496
  {
Packit Service fdd496
    /* Trigger the bug whereby quotearg_buffer would read beyond the NUL
Packit Service fdd496
       that defines the end of the string being quoted.  Use an input
Packit Service fdd496
       string whose NUL is the last byte before an unreadable page.  */
Packit Service fdd496
    char *z = zerosize_ptr ();
Packit Service fdd496
Packit Service fdd496
    if (z)
Packit Service fdd496
      {
Packit Service fdd496
        size_t q_len = 1024;
Packit Service fdd496
        char *q = malloc (q_len + 1);
Packit Service fdd496
        char buf[10];
Packit Service fdd496
        memset (q, 'Q', q_len);
Packit Service fdd496
        q[q_len] = 0;
Packit Service fdd496
Packit Service fdd496
        /* Z points to the boundary between a readable/writable page
Packit Service fdd496
           and one that is neither readable nor writable.  Position
Packit Service fdd496
           our string so its NUL is at the end of the writable one.  */
Packit Service fdd496
        char const *str = "____";
Packit Service fdd496
        size_t s_len = strlen (str);
Packit Service fdd496
        z -= s_len + 1;
Packit Service fdd496
        memcpy (z, str, s_len + 1);
Packit Service fdd496
Packit Service fdd496
        set_custom_quoting (NULL, q, q);
Packit Service fdd496
        /* Whether this actually triggers a SEGV depends on the
Packit Service fdd496
           implementation of memcmp: whether it compares only byte-at-
Packit Service fdd496
           a-time, and from left to right (no SEGV) or some other way.  */
Packit Service fdd496
        size_t n = quotearg_buffer (buf, sizeof buf, z, SIZE_MAX, NULL);
Packit Service fdd496
        ASSERT (n == s_len + 2 * q_len);
Packit Service fdd496
        ASSERT (memcmp (buf, q, sizeof buf) == 0);
Packit Service fdd496
        free (q);
Packit Service fdd496
      }
Packit Service fdd496
  }
Packit Service fdd496
Packit Service fdd496
  quotearg_free ();
Packit Service fdd496
Packit Service fdd496
  return 0;
Packit Service fdd496
}