#endif
#include "glibintl.h"
+#include "galias.h"
+/**
+ * SECTION: shell
+ * @title: Shell-related Utilities
+ * @short_description: shell-like commandline handling
+ **/
+
+/**
+ * G_SHELL_ERROR:
+ *
+ * Error domain for shell functions. Errors in this domain will be from
+ * the #GShellError enumeration. See #GError for information on error
+ * domains.
+ **/
+
+/**
+ * GShellError:
+ * @G_SHELL_ERROR_BAD_QUOTING: Mismatched or otherwise mangled quoting.
+ * @G_SHELL_ERROR_EMPTY_STRING: String to be parsed was empty.
+ * @G_SHELL_ERROR_FAILED: Some other error.
+ *
+ * Error codes returned by shell functions.
+ **/
GQuark
g_shell_error_quark (void)
{
- static GQuark quark = 0;
- if (quark == 0)
- quark = g_quark_from_static_string ("g-shell-error-quark");
- return quark;
+ return g_quark_from_static_string ("g-shell-error-quark");
}
/* Single quotes preserve the literal string exactly. escape
if (!(*s == '"' || *s == '\''))
{
- if (err)
- *err = g_error_new(G_SHELL_ERROR,
+ g_set_error_literal (err,
+ G_SHELL_ERROR,
G_SHELL_ERROR_BAD_QUOTING,
_("Quoted text doesn't begin with a quotation mark"));
*end = str;
*dest = '\0';
- if (err)
- *err = g_error_new(G_SHELL_ERROR,
+ g_set_error_literal (err,
+ G_SHELL_ERROR,
G_SHELL_ERROR_BAD_QUOTING,
_("Unmatched quotation mark in command line or other shell-quoted text"));
*end = s;
const gchar *p;
GString *current_token = NULL;
GSList *retval = NULL;
-
+ gboolean quoted;;
+
current_quote = '\0';
+ quoted = FALSE;
p = command_line;
-
+
while (*p)
{
if (current_quote == '\\')
{
if (*p == current_quote &&
/* check that it isn't an escaped double quote */
- !(current_quote == '"' && p != command_line && *(p - 1) == '\\'))
+ !(current_quote == '"' && quoted))
{
/* close the quote */
current_quote = '\0';
}
}
+ /* We need to count consecutive backslashes mod 2,
+ * to detect escaped doublequotes.
+ */
+ if (*p != '\\')
+ quoted = FALSE;
+ else
+ quoted = !quoted;
+
++p;
}
if (retval == NULL)
{
- g_set_error (error,
- G_SHELL_ERROR,
- G_SHELL_ERROR_EMPTY_STRING,
- _("Text was empty (or contained only whitespace)"));
+ g_set_error_literal (error,
+ G_SHELL_ERROR,
+ G_SHELL_ERROR_EMPTY_STRING,
+ _("Text was empty (or contained only whitespace)"));
goto error;
}
return FALSE;
}
+
+#define __G_SHELL_C__
+#include "galiasdef.c"