Use g_timeout_add_seconds for some long timeouts
[platform/upstream/glib.git] / glib / gshell.c
index 39ebdb6..2891206 100644 (file)
 
 #include <string.h>
 
-#include "glib.h"
-
-#ifdef _
-#warning "FIXME remove gettext hack"
-#endif
+#include "gshell.h"
 
+#include "gslist.h"
+#include "gstrfuncs.h"
+#include "gstring.h"
+#include "gtestutils.h"
 #include "glibintl.h"
+#include "gthread.h"
 
 /**
- * SECTION: shell
+ * SECTION:shell
  * @title: Shell-related Utilities
  * @short_description: shell-like commandline handling
  **/
  *
  * Error codes returned by shell functions.
  **/
-GQuark
-g_shell_error_quark (void)
-{
-  return g_quark_from_static_string ("g-shell-error-quark");
-}
+G_DEFINE_QUARK (g-shell-error-quark, g_shell_error)
 
 /* Single quotes preserve the literal string exactly. escape
  * sequences are not allowed; not even \' - if you want a '
@@ -521,12 +518,30 @@ tokenize_command_line (const gchar *command_line,
               g_string_append_c (current_token, *p);
 
               /* FALL THRU */
-              
-            case '#':
             case '\\':
               current_quote = *p;
               break;
 
+            case '#':
+              if (p == command_line)
+               { /* '#' was the first char */
+                  current_quote = *p;
+                  break;
+                }
+              switch(*(p-1))
+                {
+                  case ' ':
+                  case '\n':
+                  case '\0':
+                    current_quote = *p;
+                    break;
+                  default:
+                    ensure_token (&current_token);
+                    g_string_append_c (current_token, *p);
+                   break;
+                }
+              break;
+
             default:
               /* Combines rules 4) and 6) - if we have a token, append to it,
                * otherwise create a new token.
@@ -587,12 +602,8 @@ tokenize_command_line (const gchar *command_line,
 
  error:
   g_assert (error == NULL || *error != NULL);
-  
-  if (retval)
-    {
-      g_slist_foreach (retval, (GFunc)g_free, NULL);
-      g_slist_free (retval);
-    }
+
+  g_slist_free_full (retval, g_free);
 
   return NULL;
 }
@@ -600,8 +611,8 @@ tokenize_command_line (const gchar *command_line,
 /**
  * g_shell_parse_argv:
  * @command_line: command line to parse
- * @argcp: return location for number of args
- * @argvp: return location for array of args
+ * @argcp: (out): return location for number of args
+ * @argvp: (out) (array length=argcp zero-terminated=1): return location for array of args
  * @error: return location for error
  * 
  * Parses a command line into an argument vector, in much the same way
@@ -667,8 +678,7 @@ g_shell_parse_argv (const gchar *command_line,
       ++i;
     }
   
-  g_slist_foreach (tokens, (GFunc)g_free, NULL);
-  g_slist_free (tokens);
+  g_slist_free_full (tokens, g_free);
   
   if (argcp)
     *argcp = argc;
@@ -684,8 +694,7 @@ g_shell_parse_argv (const gchar *command_line,
 
   g_assert (error == NULL || *error != NULL);
   g_strfreev (argv);
-  g_slist_foreach (tokens, (GFunc) g_free, NULL);
-  g_slist_free (tokens);
+  g_slist_free_full (tokens, g_free);
   
   return FALSE;
 }