+/* shquote - functions to quote and dequote strings */
+
/* Copyright (C) 1999 Free Software Foundation, Inc.
This file is part of GNU Bash, the Bourne Again SHell.
- Bash 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.
+ Bash 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.
+
+ Bash 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.
- Bash 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 Bash; see the file COPYING. If not, write to the Free Software
- Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+ You should have received a copy of the GNU General Public License
+ along with Bash. If not, see <http://www.gnu.org/licenses/>.
+*/
#include <config.h>
#include <stdio.h>
-#if !defined(slashify_in_quotes)
-# define slashify_in_quotes "\\`$\"\n"
-#endif
-
-extern char *xmalloc ();
+#include "syntax.h"
+#include <xmalloc.h>
/* **************************************************************** */
/* */
/* Return a new string which is the single-quoted version of STRING.
Used by alias and trap, among others. */
char *
-single_quote (string)
+sh_single_quote (string)
char *string;
{
register int c;
char *result, *r, *s;
- result = xmalloc (3 + (4 * strlen (string)));
+ result = (char *)xmalloc (3 + (4 * strlen (string)));
r = result;
*r++ = '\'';
/* Quote STRING using double quotes. Return a new string. */
char *
-double_quote (string)
+sh_double_quote (string)
char *string;
{
- register int c;
+ register unsigned char c;
char *result, *r, *s;
- result = xmalloc (3 + (2 * strlen (string)));
+ result = (char *)xmalloc (3 + (2 * strlen (string)));
r = result;
*r++ = '"';
for (s = string; s && (c = *s); s++)
{
- switch (c)
- {
- case '"':
- case '$':
- case '`':
- case '\\':
- case '\n': /* XXX */
- *r++ = '\\';
- default:
- *r++ = c;
- break;
- }
+ /* Backslash-newline disappears within double quotes, so don't add one. */
+ if ((sh_syntaxtab[c] & CBSDQUOTE) && c != '\n')
+ *r++ = '\\';
+ else if (c == CTLESC || c == CTLNUL)
+ *r++ = CTLESC; /* could be '\\'? */
+
+ *r++ = c;
}
*r++ = '"';
return (result);
}
+/* Turn S into a simple double-quoted string. If FLAGS is non-zero, quote
+ double quote characters in S with backslashes. */
+char *
+sh_mkdoublequoted (s, slen, flags)
+ const char *s;
+ int slen, flags;
+{
+ char *r, *ret;
+ int rlen;
+
+ rlen = (flags == 0) ? slen + 3 : (2 * slen) + 1;
+ ret = r = (char *)xmalloc (rlen);
+
+ *r++ = '"';
+ while (*s)
+ {
+ if (flags && *s == '"')
+ *r++ = '\\';
+ *r++ = *s++;
+ }
+ *r++ = '"';
+ *r = '\0';
+
+ return ret;
+}
+
/* Remove backslashes that are quoting characters that are special between
- double quotes. Return a new string. */
+ double quotes. Return a new string. XXX - should this handle CTLESC
+ and CTLNUL? */
char *
-un_double_quote (string)
+sh_un_double_quote (string)
char *string;
{
register int c, pass_next;
char *result, *r, *s;
- r = result = xmalloc (strlen (string) + 1);
+ r = result = (char *)xmalloc (strlen (string) + 1);
for (pass_next = 0, s = string; s && (c = *s); s++)
{
pass_next = 0;
continue;
}
- if (c == '\\' && strchr (slashify_in_quotes, s[1]))
+ if (c == '\\' && (sh_syntaxtab[(unsigned char) s[1]] & CBSDQUOTE))
{
pass_next = 1;
continue;
}
/* Quote special characters in STRING using backslashes. Return a new
- string. */
+ string. NOTE: if the string is to be further expanded, we need a
+ way to protect the CTLESC and CTLNUL characters. As I write this,
+ the current callers will never cause the string to be expanded without
+ going through the shell parser, which will protect the internal
+ quoting characters. */
char *
-backslash_quote (string)
+sh_backslash_quote (string)
char *string;
{
int c;
char *result, *r, *s;
- result = xmalloc (2 * strlen (string) + 1);
+ result = (char *)xmalloc (2 * strlen (string) + 1);
for (r = result, s = string; s && (c = *s); s++)
{
case '*': case '[': case '?': case ']': /* globbing chars */
case '^':
case '$': case '`': /* expansion chars */
+ case ',': /* brace expansion */
*r++ = '\\';
*r++ = c;
break;
*r++ = '\\';
*r++ = c;
break;
+
+ case CTLESC: case CTLNUL: /* internal quoting characters */
+ *r++ = CTLESC; /* could be '\\'? */
+ *r++ = c;
+ break;
#endif
+
case '#': /* comment char */
if (s == string)
*r++ = '\\';
return (result);
}
+#if defined (PROMPT_STRING_DECODE)
+/* Quote characters that get special treatment when in double quotes in STRING
+ using backslashes. Return a new string. */
+char *
+sh_backslash_quote_for_double_quotes (string)
+ char *string;
+{
+ unsigned char c;
+ char *result, *r, *s;
+
+ result = (char *)xmalloc (2 * strlen (string) + 1);
+
+ for (r = result, s = string; s && (c = *s); s++)
+ {
+ if (sh_syntaxtab[c] & CBSDQUOTE)
+ *r++ = '\\';
+ /* I should probably add flags for these to sh_syntaxtab[] */
+ else if (c == CTLESC || c == CTLNUL)
+ *r++ = CTLESC; /* could be '\\'? */
+
+ *r++ = c;
+ }
+
+ *r = '\0';
+ return (result);
+}
+#endif /* PROMPT_STRING_DECODE */
+
int
-contains_shell_metas (string)
+sh_contains_shell_metas (string)
char *string;
{
char *s;
case '~': /* tilde expansion */
if (s == string || s[-1] == '=' || s[-1] == ':')
return (1);
+ break;
case '#':
if (s == string) /* comment char */
return (1);