aboutsummaryrefslogtreecommitdiff
path: root/lib/experiment-reader
diff options
context:
space:
mode:
Diffstat (limited to 'lib/experiment-reader')
-rw-r--r--lib/experiment-reader/Makefile.am19
-rw-r--r--lib/experiment-reader/experiment-reader.c113
-rw-r--r--lib/experiment-reader/experiment-reader.h40
-rwxr-xr-xlib/experiment-reader/session.dtd130
4 files changed, 300 insertions, 2 deletions
diff --git a/lib/experiment-reader/Makefile.am b/lib/experiment-reader/Makefile.am
index d49eb8e..84be179 100644
--- a/lib/experiment-reader/Makefile.am
+++ b/lib/experiment-reader/Makefile.am
@@ -1,2 +1,21 @@
+AM_CFLAGS = -Wall
+
+reader_datadir = @datarootdir@/libexperiment-reader
+
+lib_LTLIBRARIES = libexperiment-reader.la
+libexperiment_reader_la_SOURCES = experiment-reader.c experiment-reader.h
+
+libexperiment_reader_la_CFLAGS = $(AM_CFLAGS)
+libexperiment_reader_la_CPPFLAGS =
+libexperiment_reader_la_LDFLAGS = -bindir @bindir@
+libexperiment_reader_la_LIBADD =
+
+libexperiment_reader_la_CFLAGS += @LIBGLIB_CFLAGS@
+libexperiment_reader_la_LIBADD += @LIBGLIB_LIBS@
+
+libexperiment_reader_la_CFLAGS += @LIBXML2_CFLAGS@
+libexperiment_reader_la_LIBADD += @LIBXML2_LIBS@
include_HEADERS = experiment-reader.h
+
+dist_reader_data_DATA = session.dtd
diff --git a/lib/experiment-reader/experiment-reader.c b/lib/experiment-reader/experiment-reader.c
new file mode 100644
index 0000000..fc22378
--- /dev/null
+++ b/lib/experiment-reader/experiment-reader.c
@@ -0,0 +1,113 @@
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <assert.h>
+
+#include <glib.h>
+#include <glib/gprintf.h>
+
+#include <libxml/tree.h>
+#include <libxml/parser.h>
+#include <libxml/xpath.h>
+#include <libxml/xpathInternals.h>
+
+#include "experiment-reader.h"
+
+static void experiment_reader_class_init(ExperimentReaderClass *klass);
+static void experiment_reader_init(ExperimentReader *klass);
+static void experiment_reader_finalize(GObject *gobject);
+
+#define EXPERIMENT_READER_GET_PRIVATE(obj) \
+ (G_TYPE_INSTANCE_GET_PRIVATE((obj), EXPERIMENT_TYPE_READER, ExperimentReaderPrivate))
+
+struct _ExperimentReaderPrivate {
+ xmlDoc *doc;
+};
+
+GType
+experiment_reader_get_type(void)
+{
+ static GType type = 0;
+
+ if (!type) {
+ const GTypeInfo info = {
+ sizeof(ExperimentReaderClass),
+ NULL, /* base_init */
+ NULL, /* base_finalize */
+ (GClassInitFunc)experiment_reader_class_init,
+ NULL, /* class_finalize */
+ NULL, /* class_data */
+ sizeof(ExperimentReader),
+ 0, /* n_preallocs */
+ (GInstanceInitFunc)experiment_reader_init,
+ };
+
+ type = g_type_register_static(G_TYPE_OBJECT,
+ "ExperimentReader", &info, 0);
+ }
+
+ return type;
+}
+
+static void
+experiment_reader_class_init(ExperimentReaderClass *klass)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
+
+ /* gobject_class->dispose = experiment_reader_dispose; */
+ gobject_class->finalize = experiment_reader_finalize;
+
+ g_type_class_add_private(klass, sizeof(ExperimentReaderPrivate));
+}
+
+static void
+experiment_reader_init(ExperimentReader *klass)
+{
+ klass->priv = EXPERIMENT_READER_GET_PRIVATE(klass);
+
+ klass->priv->doc = NULL;
+}
+
+static void
+experiment_reader_finalize(GObject *gobject)
+{
+ ExperimentReader *reader = EXPERIMENT_READER(gobject);
+
+ if (reader->priv->doc != NULL)
+ xmlFreeDoc(reader->priv->doc);
+
+ /* Chain up to the parent class */
+ //G_OBJECT_CLASS(experiment_reader_parent_class)->finalize(gobject);
+}
+
+/*
+ * API
+ */
+
+ExperimentReader *
+experiment_reader_new(const gchar *filename)
+{
+ ExperimentReader *reader;
+
+ reader = EXPERIMENT_READER(g_object_new(EXPERIMENT_TYPE_READER, NULL));
+ reader->priv->doc = xmlParseFile(filename);
+ if (reader->priv->doc == NULL) {
+ g_object_unref(G_OBJECT(reader));
+ return NULL;
+ }
+
+ /* TODO: validate against session.dtd */
+
+ return reader;
+}
+
+#if 0
+void
+experiment_reader_greeting_foreach_topic(ExperimentReader *reader,
+ ExperimentReaderTopicCb cb,
+ gpointer data)
+{
+
+}
+#endif \ No newline at end of file
diff --git a/lib/experiment-reader/experiment-reader.h b/lib/experiment-reader/experiment-reader.h
index 27fd885..2558799 100644
--- a/lib/experiment-reader/experiment-reader.h
+++ b/lib/experiment-reader/experiment-reader.h
@@ -1,9 +1,45 @@
#ifndef __EXPERIMENT_READER_H
#define __EXPERIMENT_READER_H
+#include <glib.h>
#include <glib-object.h>
-/* TODO */
-typedef int ExperimentReader;
+G_BEGIN_DECLS
+
+#define EXPERIMENT_TYPE_READER \
+ (experiment_reader_get_type())
+#define EXPERIMENT_READER(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj), EXPERIMENT_TYPE_READER, ExperimentReader))
+#define EXPERIMENT_READER_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass), EXPERIMENT_TYPE_READER, ExperimentReaderClass))
+#define EXPERIMENT_IS_READER(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj), EXPERIMENT_TYPE_READER))
+#define EXPERIMENT_IS_READER_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass), EXPERIMENT_TYPE_READER))
+#define EXPERIMENT_READER_GET_CLASS(obj) \
+ (G_TYPE_INSTANCE_GET_CLASS((obj), EXPERIMENT_TYPE_READER, ExperimentReaderClass))
+
+typedef struct _ExperimentReaderPrivate ExperimentReaderPrivate;
+
+typedef struct _ExperimentReader {
+ GObject parent_instance;
+
+ ExperimentReaderPrivate *priv; /** private */
+} ExperimentReader;
+
+typedef struct _ExperimentReaderClass {
+ GObjectClass parent_class;
+} ExperimentReaderClass;
+
+GType experiment_reader_get_type(void);
+
+/*
+ * API
+ */
+ExperimentReader *experiment_reader_new(const gchar *filename);
+
+
+
+G_END_DECLS
#endif
diff --git a/lib/experiment-reader/session.dtd b/lib/experiment-reader/session.dtd
new file mode 100755
index 0000000..386709a
--- /dev/null
+++ b/lib/experiment-reader/session.dtd
@@ -0,0 +1,130 @@
+<!-- ==========================================================
+ Elements refering to the target transcript structure
+ ========================================================== -->
+
+<!ELEMENT session (head, speakers, recording, timeline, greeting, experiment, farewell)>
+
+<!ELEMENT greeting (topic)+>
+<!ELEMENT experiment (initial-narrative, last-minute)>
+<!ELEMENT farewell (topic)+>
+
+<!ELEMENT initial-narrative (topic+)>
+<!ELEMENT last-minute (phase, phase, phase, phase, phase, phase)>
+
+<!ELEMENT phase (topic)+>
+<!ATTLIST phase id NMTOKEN #REQUIRED >
+
+<!ELEMENT topic (contribution)+>
+<!ATTLIST topic
+ id (bz_1|bz_2|
+ i_1|i_2|i_3|i_4|i_5|i_6|i_7|i_8|i_10|i_12|i_14|i_15|i_16|i_17|i_19|i_20|
+ lm_1_1|lm_1_2|lm_1_3|lm_1_5|lm_1_6|lm_1_7|lm_1_8|
+ lm_2_1|lm_2_4|lm_2_6|lm_2_9|
+ lm_2_11|lm_2_13|lm_2_15|lm_2_16|lm_2_17|lm_2_20|
+ lm_2_23|lm_2_25|lm_2_27|lm_2_28|lm_2_30|
+ lm_2_31|lm_2_38|
+ lm_3_1|lm_3_2|lm_3_3|lm_3_4|lm_3_6|lm_3_7|lm_3_8|
+ lm_4_1|lm_4_2|lm_4_4|lm_4_6|
+ lm_5_1|lm_5_2|lm_5_5|lm_5_7|
+ lm_5_19|lm_5_20|
+ lm_5_21|lm_5_22|lm_5_24|lm_5_30|
+ lm_5_31|lm_5_32|lm_5_33|
+ a_6_1|a_6_3|a_6_5|
+ v_1) #REQUIRED
+>
+
+
+
+<!-- ==========================================================
+ Elements inspired by Folker-Schema
+ ========================================================== -->
+
+<!ELEMENT head ANY>
+
+
+<!ELEMENT speakers (speaker)*>
+<!ELEMENT speaker (#PCDATA|name)*>
+<!ATTLIST speaker
+ speaker-id ID #REQUIRED
+>
+
+<!ELEMENT name (#PCDATA)>
+
+<!ELEMENT recording EMPTY>
+<!ATTLIST recording
+ path CDATA #IMPLIED
+>
+
+
+<!ELEMENT timeline (timepoint, (timepoint)+)>
+<!ELEMENT timepoint EMPTY>
+<!ATTLIST timepoint
+ timepoint-id ID #REQUIRED
+ absolute-time NMTOKEN #REQUIRED
+>
+
+
+<!ELEMENT contribution (#PCDATA|segment|unparsed|breathe|non-phonological|uncertain|pause|time|phrase)*>
+<!ATTLIST contribution
+ speaker-reference IDREF #IMPLIED
+ start-reference IDREF #REQUIRED
+ end-reference IDREF #REQUIRED
+ parse-level NMTOKEN #IMPLIED
+ id (addition|elaboration|removal|repetition|rejection|weight_limit|weight_limit_extended|
+ save_comment|make_comment|enumeration|selected_category|remaining_time|acknowledgement) #IMPLIED
+>
+
+
+<!ELEMENT segment (#PCDATA)>
+<!ATTLIST segment
+ start-reference IDREF #IMPLIED
+ end-reference IDREF #IMPLIED
+>
+
+
+<!ELEMENT unparsed (time)*>
+
+
+<!ELEMENT breathe EMPTY>
+<!ATTLIST breathe
+ type (in|out) #IMPLIED
+ length NMTOKEN #REQUIRED
+>
+
+
+<!ELEMENT non-phonological EMPTY>
+<!ATTLIST non-phonological
+ description CDATA #REQUIRED
+>
+
+
+<!ELEMENT uncertain (#PCDATA|time|stress|lengthening|alternative)*>
+
+
+<!ELEMENT alternative (#PCDATA|time|stress|lengthening)*>
+
+
+<!ELEMENT pause EMPTY>
+<!ATTLIST pause
+ duration NMTOKEN #REQUIRED
+>
+
+
+<!ELEMENT time EMPTY>
+<!ATTLIST time
+ timepoint-reference IDREF #REQUIRED
+>
+
+
+<!ELEMENT phrase (#PCDATA|breathe|non-phonological|uncertain|pause|time|stress|lengthening)*>
+<!ATTLIST phrase
+ type (intonation-phrase|fragment|unaccentuated) #REQUIRED
+ boundary-intonation (high-rise|rise|steady|fall|low-fall) #IMPLIED
+>
+
+
+<!ELEMENT stress (time)*>
+<!ELEMENT lengthening EMPTY>
+<!ATTLIST lengthening
+ length NMTOKEN #IMPLIED
+> \ No newline at end of file