bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: quotearg.c's shell_quoting_style and MinGW


From: Bruno Haible
Subject: Re: quotearg.c's shell_quoting_style and MinGW
Date: Sun, 06 May 2012 22:25:12 +0200
User-agent: KMail/4.7.4 (Linux/3.1.10-1.9-desktop; KDE/4.7.4; x86_64; ; )

Eli Zaretskii wrote:
> use a different set of styles: a "shell command-line argument" quoting
> style and a "file-name" quoting style.  The former would be used for
> producing shell commands, and will use platform-dependent quoting,
> similar to the patch I sent.  The latter would be used for quoting
> file names which are not meant to be passed to a shell

Yes, this idea of thinking is good: Different purposes need different
ways of quoting.

But instead of putting it all into the 'quotearg' module - whose primary
purpose has historically been error messages and file names -, I would
assiociate the "file-name" quoting style with the 'quotearg' module and
the "command-line argument" style with the following new API, closely
modeled on sh-quote.h.

=============================== system-quote.h ===============================
/* Quoting for a system command.
   Copyright (C) 2001-2012 Free Software Foundation, Inc.
   Written by Bruno Haible <address@hidden>, 2012.

   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

#ifndef _SYSTEM_QUOTE_H
#define _SYSTEM_QUOTE_H

/* When passing a command the system's command interpreter, we must quote the
   program name and arguments, since
     - Unix shells interpret characters like " ", "'", "<", ">", "$" etc. in a
       special way,
     - Windows CreateProcess() interprets characters like ' ', '\t', '\\', '"'
       etc. (but not '<' and '>') in a special way,
     - Windows cmd.exe also interprets characters like '<', '>', '&', '%', etc.
       in a special way.  */

#include <stddef.h>

#ifdef __cplusplus
extern "C" {
#endif

/* Identifier for the kind of interpreter of the command.  */
enum system_command_interpreter
{
  /* The interpreter used by the system() and popen() functions.
     This is equivalent to SCI_POSIX_SH on Unix platforms and
     SCI_WINDOWS_CMD on native Windows platforms.  */
  SCI_SYSTEM
  /* The POSIX /bin/sh.  */
  , SCI_POSIX_SH
#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
  /* The native Windows CreateProcess() function.  */
  , SCI_WINDOWS_CREATEPROCESS
  /* The native Windows cmd.exe interpreter.  */
  , SCI_WINDOWS_CMD
#endif
};

/* Returns the number of bytes needed for the quoted string.  */
extern size_t
       system_quote_length (enum system_command_interpreter interpreter,
                            const char *string);

/* Copies the quoted string to p and returns the incremented p.
   There must be room for shell_quote_length (string) + 1 bytes at p.  */
extern char *
       system_quote_copy (enum system_command_interpreter interpreter,
                          char *p, const char *string);

/* Returns the freshly allocated quoted string.  */
extern char *
       system_quote (enum system_command_interpreter interpreter,
                     const char *string);

/* Returns a freshly allocated string containing all argument strings, quoted,
   separated through spaces.  */
extern char *
       system_quote_argv (enum system_command_interpreter interpreter,
                          const char * const *argv);

#ifdef __cplusplus
}
#endif

#endif /* _SYSTEM_QUOTE_H */
==============================================================================

The system_quote_argv function would be what I called create_system_command
earlier, with the added 'interpreter' argument.

For GNU diffutils, this means just replacing specific uses of
sh_quote with system_quote(SCI_SYSTEM, ...), right before the calls to
popen() and system().

How does that sound?

Bruno




reply via email to

[Prev in Thread] Current Thread [Next in Thread]