changeset 5598:09d49a2e321b

New module 'sh-quote'.
author Bruno Haible <bruno@clisp.org>
date Wed, 19 Jan 2005 13:54:54 +0000
parents ba56441fa7c6
children 3f35d537957f
files ChangeLog MODULES.html.sh lib/ChangeLog lib/sh-quote.c lib/sh-quote.h modules/sh-quote
diffstat 6 files changed, 184 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Tue Jan 18 23:53:37 2005 +0000
+++ b/ChangeLog	Wed Jan 19 13:54:54 2005 +0000
@@ -1,3 +1,8 @@
+2005-01-19  Bruno Haible  <bruno@clisp.org>
+
+	* modules/sh-quote: New file.
+	* MODULES.html.sh (Executing programs): Add sh-quote.
+
 2005-01-18  Paul Eggert  <eggert@cs.ucla.edu>
 
 	* modules/ullong_max: New file.
--- a/MODULES.html.sh	Tue Jan 18 23:53:37 2005 +0000
+++ b/MODULES.html.sh	Wed Jan 19 13:54:54 2005 +0000
@@ -1,6 +1,6 @@
 #!/bin/sh
 #
-# Copyright (C) 2002-2004 Free Software Foundation, Inc.
+# Copyright (C) 2002-2005 Free Software Foundation, Inc.
 #
 # 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
@@ -1922,7 +1922,7 @@
   func_module wait-process
   func_module execute
   func_module pipe
-  #func_module sh-quote
+  func_module sh-quote
   func_end_table
 
   element="Java"
--- a/lib/ChangeLog	Tue Jan 18 23:53:37 2005 +0000
+++ b/lib/ChangeLog	Wed Jan 19 13:54:54 2005 +0000
@@ -1,3 +1,8 @@
+2005-01-19  Bruno Haible  <bruno@clisp.org>
+
+	* sh-quote.h: New file, from GNU gettext.
+	* sh-quote.c: New file, from GNU gettext.
+
 2005-01-18  Paul Eggert  <eggert@cs.ucla.edu>
 
 	Merge changes from coreutils, as described below in several
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/sh-quote.c	Wed Jan 19 13:54:54 2005 +0000
@@ -0,0 +1,110 @@
+/* Shell quoting.
+   Copyright (C) 2001-2004 Free Software Foundation, Inc.
+   Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+   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 2, 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, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/* Specification.  */
+#include "sh-quote.h"
+
+#include <string.h>
+
+#include "quotearg.h"
+#include "xalloc.h"
+
+/* Describes quoting for sh compatible shells.  */
+static struct quoting_options *sh_quoting_options;
+
+/* Initializes the sh_quoting_options variable.  */
+static void
+init_sh_quoting_options ()
+{
+  sh_quoting_options = clone_quoting_options (NULL);
+  set_quoting_style (sh_quoting_options, shell_quoting_style);
+}
+
+/* Returns the number of bytes needed for the quoted string.  */
+size_t
+shell_quote_length (const char *string)
+{
+  if (sh_quoting_options == NULL)
+    init_sh_quoting_options ();
+  return quotearg_buffer (NULL, 0, string, strlen (string),
+			   sh_quoting_options);
+}
+
+/* Copies the quoted string to p and returns the incremented p.
+   There must be room for shell_quote_length (string) + 1 bytes at p.  */
+char *
+shell_quote_copy (char *p, const char *string)
+{
+  if (sh_quoting_options == NULL)
+    init_sh_quoting_options ();
+  return p + quotearg_buffer (p, (size_t)(-1), string, strlen (string),
+			      sh_quoting_options);
+}
+
+/* Returns the freshly allocated quoted string.  */
+char *
+shell_quote (const char *string)
+{
+  if (sh_quoting_options == NULL)
+    init_sh_quoting_options ();
+  return quotearg_alloc (string, strlen (string), sh_quoting_options);
+}
+
+/* Returns a freshly allocated string containing all argument strings, quoted,
+   separated through spaces.  */
+char *
+shell_quote_argv (char **argv)
+{
+  if (*argv != NULL)
+    {
+      char **argp;
+      size_t length;
+      char *command;
+      char *p;
+
+      length = 0;
+      for (argp = argv; ; )
+	{
+	  length += shell_quote_length (*argp) + 1;
+	  argp++;
+	  if (*argp == NULL)
+	    break;
+	}
+
+      command = (char *) xmalloc (length);
+
+      p = command;
+      for (argp = argv; ; )
+	{
+	  p = shell_quote_copy (p, *argp);
+	  argp++;
+	  if (*argp == NULL)
+	    break;
+	  *p++ = ' ';
+	}
+      *p = '\0';
+
+      return command;
+    }
+  else
+    return xstrdup ("");
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/sh-quote.h	Wed Jan 19 13:54:54 2005 +0000
@@ -0,0 +1,37 @@
+/* Shell quoting.
+   Copyright (C) 2001-2002, 2004 Free Software Foundation, Inc.
+   Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+   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 2, 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, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+
+/* When passing a command to a shell, we must quote the program name and
+   arguments, since Unix shells interpret characters like " ", "'", "<", ">",
+   "$" etc. in a special way.  */
+
+#include <stddef.h>
+
+/* Returns the number of bytes needed for the quoted string.  */
+extern size_t shell_quote_length (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 * shell_quote_copy (char *p, const char *string);
+
+/* Returns the freshly allocated quoted string.  */
+extern char * shell_quote (const char *string);
+
+/* Returns a freshly allocated string containing all argument strings, quoted,
+   separated through spaces.  */
+extern char * shell_quote_argv (char **argv);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/modules/sh-quote	Wed Jan 19 13:54:54 2005 +0000
@@ -0,0 +1,25 @@
+Description:
+Shell quoting.
+
+Files:
+lib/sh-quote.h
+lib/sh-quote.c
+
+Depends-on:
+quotearg
+xalloc
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += sh-quote.h sh-quote.c
+
+Include:
+"sh-quote.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
+