(root)/
gettext-0.22.4/
gettext-tools/
gnulib-lib/
sh-quote.c
       1  /* Shell quoting.
       2     Copyright (C) 2001-2004, 2006, 2009-2023 Free Software Foundation, Inc.
       3     Written by Bruno Haible <haible@clisp.cons.org>, 2001.
       4  
       5     This program is free software: you can redistribute it and/or modify
       6     it under the terms of the GNU General Public License as published by
       7     the Free Software Foundation, either version 3 of the License, or
       8     (at your option) any later version.
       9  
      10     This program is distributed in the hope that it will be useful,
      11     but WITHOUT ANY WARRANTY; without even the implied warranty of
      12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      13     GNU General Public License for more details.
      14  
      15     You should have received a copy of the GNU General Public License
      16     along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
      17  
      18  #include <config.h>
      19  
      20  /* Specification.  */
      21  #include "sh-quote.h"
      22  
      23  #include <string.h>
      24  
      25  #include "quotearg.h"
      26  #include "xalloc.h"
      27  
      28  /* Describes quoting for sh compatible shells.  */
      29  static struct quoting_options *sh_quoting_options;
      30  
      31  /* Initializes the sh_quoting_options variable.  */
      32  static void
      33  init_sh_quoting_options (void)
      34  {
      35    sh_quoting_options = clone_quoting_options (NULL);
      36    set_quoting_style (sh_quoting_options, shell_quoting_style);
      37  }
      38  
      39  /* Returns the number of bytes needed for the quoted string.  */
      40  size_t
      41  shell_quote_length (const char *string)
      42  {
      43    if (sh_quoting_options == NULL)
      44      init_sh_quoting_options ();
      45    return quotearg_buffer (NULL, 0, string, strlen (string),
      46                             sh_quoting_options);
      47  }
      48  
      49  /* Copies the quoted string to p and returns the incremented p.
      50     There must be room for shell_quote_length (string) + 1 bytes at p.  */
      51  char *
      52  shell_quote_copy (char *p, const char *string)
      53  {
      54    if (sh_quoting_options == NULL)
      55      init_sh_quoting_options ();
      56    return p + quotearg_buffer (p, (size_t)(-1), string, strlen (string),
      57                                sh_quoting_options);
      58  }
      59  
      60  /* Returns the freshly allocated quoted string.  */
      61  char *
      62  shell_quote (const char *string)
      63  {
      64    if (sh_quoting_options == NULL)
      65      init_sh_quoting_options ();
      66    return quotearg_alloc (string, strlen (string), sh_quoting_options);
      67  }
      68  
      69  /* Returns a freshly allocated string containing all argument strings, quoted,
      70     separated through spaces.  */
      71  char *
      72  shell_quote_argv (const char * const *argv)
      73  {
      74    if (*argv != NULL)
      75      {
      76        const char * const *argp;
      77        size_t length;
      78        char *command;
      79        char *p;
      80  
      81        length = 0;
      82        for (argp = argv; ; )
      83          {
      84            length += shell_quote_length (*argp) + 1;
      85            argp++;
      86            if (*argp == NULL)
      87              break;
      88          }
      89  
      90        command = XNMALLOC (length, char);
      91  
      92        p = command;
      93        for (argp = argv; ; )
      94          {
      95            p = shell_quote_copy (p, *argp);
      96            argp++;
      97            if (*argp == NULL)
      98              break;
      99            *p++ = ' ';
     100          }
     101        *p = '\0';
     102  
     103        return command;
     104      }
     105    else
     106      return xstrdup ("");
     107  }