grammar.y: fix childproxy code
[platform/upstream/gstreamer.git] / gst / parse / types.h
index fa1c405..3b2e4fd 100644 (file)
+#ifndef __GST_PARSE_TYPES_H__
+#define __GST_PARSE_TYPES_H__
+
 #include <glib-object.h>
 #include "../gstelement.h"
+#include "../gstparse.h"
 
 typedef struct {
-    gchar *type;
-    gint index;
-    GList *property_values;
-    GstElement *element;
-} element_t;
-
-typedef struct {
-    gchar *name;
-    GValue *value;
-} property_t;
+  GstElement *src;
+  GstElement *sink;
+  gchar *src_name;
+  gchar *sink_name;
+  GSList *src_pads;
+  GSList *sink_pads;
+  GstCaps *caps;
+} link_t;
 
 typedef struct {
-    /* if the names are present, upon connection we'll search out the pads of the
-       proper name and use those. otherwise, we'll search for elements of src_index
-       and sink_index. */
-    char *src_name;
-    char *sink_name;
-    int src_index;
-    int sink_index;
-    GList *src_pads;
-    GList *sink_pads;
-} connection_t;
+  GSList *elements;
+  GstElement *first;
+  GstElement *last;
+  link_t *front;
+  link_t *back;
+} chain_t;
 
 typedef struct _graph_t graph_t;
-
 struct _graph_t {
-    element_t *first;
-    element_t *current;
-    graph_t *parent;
-    gchar *current_bin_type;
-    GList *elements;
-    GList *connections;
-    GList *connections_pending;
-    GList *bins;
-    GstElement *bin;
+  chain_t *chain; /* links are supposed to be done now */
+  GSList *links;
+  GError **error;
+  GstParseContext *ctx; /* may be NULL */
+  GstParseFlags flags;
 };
 
-graph_t * _gst_parse_launch (const gchar *str, GError **error);
 
+/*
+ * Memory checking. Should probably be done with gsttrace stuff, but that
+ * doesn't really work.
+ * This is not safe from reentrance issues, but that doesn't matter as long as
+ * we lock a mutex before parsing anyway.
+ */
+#ifdef GST_DEBUG_ENABLED
+#  define __GST_PARSE_TRACE
+#endif
+
+#ifdef __GST_PARSE_TRACE
+gchar  *__gst_parse_strdup (gchar *org);
+void   __gst_parse_strfree (gchar *str);
+link_t *__gst_parse_link_new ();
+void   __gst_parse_link_free (link_t *data);
+chain_t *__gst_parse_chain_new ();
+void   __gst_parse_chain_free (chain_t *data);
+#  define gst_parse_strdup __gst_parse_strdup
+#  define gst_parse_strfree __gst_parse_strfree
+#  define gst_parse_link_new __gst_parse_link_new
+#  define gst_parse_link_free __gst_parse_link_free
+#  define gst_parse_chain_new __gst_parse_chain_new
+#  define gst_parse_chain_free __gst_parse_chain_free
+#else /* __GST_PARSE_TRACE */
+#  define gst_parse_strdup g_strdup
+#  define gst_parse_strfree g_free
+#  define gst_parse_link_new() g_new0 (link_t, 1)
+#  define gst_parse_link_free g_free
+#  define gst_parse_chain_new() g_new0 (chain_t, 1)
+#  define gst_parse_chain_free g_free
+#endif /* __GST_PARSE_TRACE */
+
+static inline void
+gst_parse_unescape (gchar *str)
+{
+  gchar *walk;
+  gboolean in_quotes;
+
+  g_return_if_fail (str != NULL);
+
+  walk = str;
+  in_quotes = FALSE;
+
+  while (*walk) {
+    if (*walk == '\\' && !in_quotes) {
+      walk++;
+      /* make sure we don't read beyond the end of the string */
+      if (*walk == '\0')
+        break;
+    } else if (*walk == '"' && (!in_quotes || (in_quotes
+                && (*(walk - 1) != '\\')))) {
+      /* don't unescape inside quotes and don't switch
+       * state with escaped quoted inside quotes */
+      in_quotes = !in_quotes;
+    }
+    *str = *walk;
+    str++;
+    walk++;
+  }
+  *str = '\0';
+}
+
+GstElement *priv_gst_parse_launch (const gchar *, GError **,
+    GstParseContext *, GstParseFlags);
+
+#endif /* __GST_PARSE_TYPES_H__ */