aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitmodules3
-rw-r--r--Makefile.am14
-rwxr-xr-xautogen.sh4
-rw-r--r--configure.ac1
m---------libstorycode0
-rw-r--r--src/frame.c3
-rw-r--r--src/render.c3
-rw-r--r--src/storycode.c392
-rw-r--r--src/storycode.h47
-rw-r--r--src/wrap.c3
10 files changed, 449 insertions, 21 deletions
diff --git a/.gitmodules b/.gitmodules
index 93a5aa7..f6fb2fb 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,6 +1,3 @@
[submodule "harfatum"]
path = harfatum
url = ssh://git@git.bitwiz.org.uk/harfatum.git
-[submodule "libstorycode"]
- path = libstorycode
- url = ssh://git@git.bitwiz.org.uk/libstorycode.git
diff --git a/Makefile.am b/Makefile.am
index 3ee669c..d80325f 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,5 +1,5 @@
EXTRA_DIST = configure m4/gnulib-cache.m4
-SUBDIRS = lib libstorycode harfatum
+SUBDIRS = lib harfatum
ACLOCAL_AMFLAGS = -I m4
bin_PROGRAMS = src/colloquium
@@ -8,17 +8,17 @@ AM_CFLAGS = -Wall
AM_CPPFLAGS = -DDATADIR=\""$(datadir)"\" -I$(top_builddir)/lib \
-I$(top_srcdir)/lib
LDADD = $(top_builddir)/lib/libgnu.la @IGNORE_UNUSED_LIBRARIES_CFLAGS@ \
- libstorycode/src/libstorycode.la harfatum/src/libharfatum.la
+ harfatum/src/libharfatum.la
src_colloquium_SOURCES = src/colloquium.c src/render.c \
src/mainwindow.c src/presentation.c \
src/stylesheet.c src/loadsave.c src/frame.c \
- src/slideshow.c src/wrap.c
+ src/slideshow.c src/wrap.c src/storycode.c
-INCLUDES = -Ilibstorycode/src -Iharfatum/src
+INCLUDES = -Iharfatum/src
EXTRA_DIST += src/presentation.h src/render.h src/wrap.h \
- src/stylesheet.h src/loadsave.h src/slideshow.h
+ src/stylesheet.h src/loadsave.h src/slideshow.h src/storycode.h
colloquiumdir = $(datadir)/colloquium
colloquium_DATA = data/colloquium.ui
@@ -33,7 +33,7 @@ noinst_PROGRAMS = tests/render_test tests/render_test_sc1
TESTS = tests/render_test tests/render_test_sc1
tests_render_test_SOURCES = tests/render_test.c src/render.c src/frame.c \
- src/wrap.c
+ src/wrap.c src/storycode.c
-tests_render_test_sc1_SOURCES = tests/render_test_sc1.c \
+tests_render_test_sc1_SOURCES = tests/render_test_sc1.c src/storycode.c \
src/render.c src/frame.c src/wrap.c
diff --git a/autogen.sh b/autogen.sh
index 03a0a31..aa52220 100755
--- a/autogen.sh
+++ b/autogen.sh
@@ -6,10 +6,6 @@ libtoolize --force --copy \
&& automake --add-missing --copy --force \
&& autoconf --force
-pushd libstorycode
-./autogen.sh
-popd
-
pushd harfatum
./autogen.sh
popd
diff --git a/configure.ac b/configure.ac
index 5dac98b..eff1f2a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -69,6 +69,5 @@ LIBS="$LIBS $GDK_pixbuf_2_LIBS $LDFLAGS"
AC_CONFIG_FILES(Makefile lib/Makefile)
-AC_CONFIG_FILES(libstorycode/Makefile libstorycode/lib/Makefile)
AC_CONFIG_FILES(harfatum/Makefile harfatum/lib/Makefile)
AC_OUTPUT
diff --git a/libstorycode b/libstorycode
deleted file mode 160000
-Subproject bc5064bf99ae0cf53b27eba1341447809639ff9
diff --git a/src/frame.c b/src/frame.c
index 4cbb432..ed6047a 100644
--- a/src/frame.c
+++ b/src/frame.c
@@ -29,8 +29,7 @@
#include <stdlib.h>
#include <string.h>
-#include <storycode.h>
-
+#include "storycode.h"
#include "frame.h"
diff --git a/src/render.c b/src/render.c
index ed72fe0..3aa3d05 100644
--- a/src/render.c
+++ b/src/render.c
@@ -32,8 +32,7 @@
#include <string.h>
#include <stdlib.h>
-#include <storycode.h>
-
+#include "storycode.h"
#include "stylesheet.h"
#include "presentation.h"
#include "frame.h"
diff --git a/src/storycode.c b/src/storycode.c
new file mode 100644
index 0000000..45638b4
--- /dev/null
+++ b/src/storycode.c
@@ -0,0 +1,392 @@
+/*
+ * storycode.c
+ *
+ * Copyright (c) 2012 Thomas White <taw@bitwiz.org.uk>
+ *
+ * This program 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.
+ *
+ * This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <ctype.h>
+
+#include "storycode.h"
+
+
+struct _scblocklist
+{
+ int n_blocks;
+ int max_blocks;
+
+ struct scblock *blocks;
+};
+
+
+struct _scblocklistiterator
+{
+ int pos;
+};
+
+
+static int allocate_blocks(SCBlockList *bl)
+{
+ struct scblock *blocks_new;
+
+ blocks_new = realloc(bl->blocks, bl->max_blocks*sizeof(struct scblock));
+ if ( blocks_new == NULL ) {
+ return 1;
+ }
+ bl->blocks = blocks_new;
+
+ return 0;
+}
+
+
+SCBlockList *sc_block_list_new()
+{
+ SCBlockList *bl;
+
+ bl = calloc(1, sizeof(SCBlockList));
+ if ( bl == NULL ) return NULL;
+
+ bl->n_blocks = 0;
+ bl->max_blocks = 64;
+ bl->blocks = NULL;
+ if ( allocate_blocks(bl) ) {
+ free(bl);
+ return NULL;
+ }
+
+ return bl;
+}
+
+
+void sc_block_list_free(SCBlockList *bl)
+{
+ int i;
+
+ for ( i=0; i<bl->n_blocks; i++ ) {
+ free(bl->blocks[i].name);
+ free(bl->blocks[i].options);
+ free(bl->blocks[i].contents);
+ }
+ free(bl->blocks);
+ free(bl);
+}
+
+
+struct scblock *sc_block_list_first(SCBlockList *bl,
+ SCBlockListIterator **piter)
+{
+ SCBlockListIterator *iter;
+
+ if ( bl->n_blocks == 0 ) return NULL;
+
+ iter = calloc(1, sizeof(SCBlockListIterator));
+ if ( iter == NULL ) return NULL;
+
+ iter->pos = 0;
+ *piter = iter;
+
+ return &bl->blocks[0];
+}
+
+
+struct scblock *sc_block_list_next(SCBlockList *bl, SCBlockListIterator *iter)
+{
+ iter->pos++;
+ if ( iter->pos == bl->n_blocks ) {
+ free(iter);
+ return NULL;
+ }
+
+ return &bl->blocks[iter->pos];
+}
+
+
+static int sc_block_list_add(SCBlockList *bl,
+ char *name, char *options, char *contents)
+{
+ if ( bl->n_blocks == bl->max_blocks ) {
+ bl->max_blocks += 64;
+ if ( allocate_blocks(bl) ) return 1;
+ }
+
+ bl->blocks[bl->n_blocks].name = name;
+ bl->blocks[bl->n_blocks].options = options;
+ bl->blocks[bl->n_blocks].contents = contents;
+ bl->n_blocks++;
+
+ return 0;
+}
+
+
+static int get_subexpr(const char *sc, char *bk, char **pcontents, int *err)
+{
+ size_t ml;
+ int i;
+ int bct = 1;
+ int found = 0;
+ char *contents;
+
+ *err = 0;
+
+ ml = strlen(sc);
+ contents = malloc(ml+1);
+ if ( contents == NULL ) {
+ *err = -1;
+ return 0;
+ }
+ *pcontents = contents;
+
+ for ( i=0; i<ml; i++ ) {
+ if ( sc[i] == bk[0] ) {
+ bct++;
+ } else if ( sc[i] == bk[1] ) {
+ bct--;
+ }
+ if ( bct == 0 ) {
+ found = 1;
+ break;
+ }
+ contents[i] = sc[i];
+ }
+
+ if ( (!found) || (bct != 0) ) {
+ *err = 1;
+ return 0;
+ }
+
+ contents[i] = '\0';
+ return i+1;
+}
+
+
+static size_t read_block(const char *sc, char **pname, char **options,
+ char **contents, int *err)
+{
+ size_t l, i, j;
+ char *name;
+ int done;
+
+ *err = 0;
+
+ l = strlen(sc);
+ i = 0; j = 0;
+ name = malloc(l+1);
+ if ( name == NULL ) {
+ *err = 1;
+ return 0;
+ }
+
+ done = 0;
+ do {
+
+ char c = sc[i];
+
+ if ( isalnum(c) ) {
+ name[j++] = c;
+ i++;
+ } else {
+ /* Found the end of the name */
+ done = 1;
+ }
+
+ } while ( !done && (i<l) );
+
+ name[j] = '\0';
+
+ if ( !done ) {
+ *err = 1;
+ printf("Couldn't find end of block beginning '%s'\n", sc);
+ return 0;
+ }
+ *pname = name;
+
+ if ( sc[i] == '[' ) {
+
+ i += get_subexpr(sc+i+1, "[]", options, err) + 1;
+ if ( *err ) {
+ printf("Couldn't find end of options '%s'\n", sc+i);
+ return 0;
+ }
+
+ } else {
+ *options = NULL;
+ }
+
+ if ( sc[i] == '{' ) {
+
+ i += get_subexpr(sc+i+1, "{}", contents, err) + 1;
+ if ( *err ) {
+ printf("Couldn't find end of content '%s'\n", sc+i);
+ return 0;
+ }
+
+ } else {
+ *contents = NULL;
+ }
+
+ return i+1;
+}
+
+
+SCBlockList *sc_find_blocks(const char *sc, const char *blockname)
+{
+ SCBlockList *bl;
+ char *tbuf;
+ size_t len, i, j;
+
+ bl = sc_block_list_new();
+ if ( bl == NULL ) return NULL;
+
+ len = strlen(sc);
+ tbuf = malloc(len+1);
+ if ( tbuf == NULL ) {
+ sc_block_list_free(bl);
+ return NULL;
+ }
+
+ i = 0; j = 0;
+ do {
+
+ if ( sc[i] == '\\' ) {
+
+ int err;
+ char *name = NULL;
+ char *options = NULL;
+ char *contents = NULL;
+
+ if ( (blockname == NULL) && (j != 0) ) {
+ tbuf[j] = '\0';
+ if ( sc_block_list_add(bl, NULL, NULL,
+ strdup(tbuf)) )
+ {
+ fprintf(stderr,
+ "Failed to add block.\n");
+ sc_block_list_free(bl);
+ free(tbuf);
+ return NULL;
+ }
+ j = 0;
+ }
+
+ i += read_block(sc+i+1, &name, &options, &contents,
+ &err);
+ if ( err ) {
+ printf("Parse error\n");
+ sc_block_list_free(bl);
+ free(tbuf);
+ return NULL;
+ }
+
+ if ( (blockname == NULL)
+ || ((blockname != NULL) && !strcmp(blockname, name)) )
+ {
+ if ( sc_block_list_add(bl, name, options,
+ contents) )
+ {
+ fprintf(stderr,
+ "Failed to add block.\n");
+ sc_block_list_free(bl);
+ free(tbuf);
+ return NULL;
+ }
+ }
+
+ } else {
+
+ tbuf[j++] = sc[i++];
+ }
+
+ } while ( i<len );
+
+ if ( (blockname == NULL) && (j != 0) ) {
+ tbuf[j] = '\0';
+ if ( sc_block_list_add(bl, NULL, NULL, tbuf) )
+ {
+ fprintf(stderr,
+ "Failed to add block.\n");
+ sc_block_list_free(bl);
+ free(tbuf);
+ return NULL;
+ }
+ j = 0;
+ }
+
+ return bl;
+}
+
+
+char *remove_blocks(const char *in, const char *blockname)
+{
+ SCBlockList *bl;
+ SCBlockListIterator *iter;
+ char *out;
+ struct scblock *b;
+
+ bl = sc_find_blocks(in, NULL);
+ if ( bl == NULL ) {
+ printf("Failed to find blocks.\n");
+ return NULL;
+ }
+
+ out = malloc(strlen(in)+1);
+ if ( out == NULL ) return NULL;
+ out[0] = '\0';
+
+ for ( b = sc_block_list_first(bl, &iter);
+ b != NULL;
+ b = sc_block_list_next(bl, iter) )
+ {
+ if ( b->name == NULL ) {
+ strcat(out, b->contents);
+ } else {
+
+ if ( strcmp(blockname, b->name) != 0 ) {
+ strcat(out, "\\");
+ strcat(out, b->name);
+ if ( b->options != NULL ) {
+ strcat(out, "[");
+ strcat(out, b->options);
+ strcat(out, "]");
+ }
+ if ( b->contents != NULL ) {
+ strcat(out, "{");
+ strcat(out, b->contents);
+ strcat(out, "}");
+ }
+
+ if ( (b->options == NULL)
+ && (b->contents == NULL) ) {
+ strcat(out, " ");
+ }
+
+ }
+
+ }
+ }
+ sc_block_list_free(bl);
+
+ return out;
+}
+
diff --git a/src/storycode.h b/src/storycode.h
new file mode 100644
index 0000000..39ff18b
--- /dev/null
+++ b/src/storycode.h
@@ -0,0 +1,47 @@
+/*
+ * storycode.h
+ *
+ * Copyright (c) 2012 Thomas White <taw@bitwiz.org.uk>
+ *
+ * This program 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.
+ *
+ * This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef STORYCODE_H
+#define STORYCODE_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+typedef struct _scblocklist SCBlockList;
+typedef struct _scblocklistiterator SCBlockListIterator;
+
+struct scblock
+{
+ char *name;
+ char *options;
+ char *contents;
+};
+
+struct scblock *sc_block_list_first(SCBlockList *bl,
+ SCBlockListIterator **piter);
+struct scblock *sc_block_list_next(SCBlockList *bl, SCBlockListIterator *iter);
+
+extern SCBlockList *sc_find_blocks(const char *sc, const char *blockname);
+extern void sc_block_list_free(SCBlockList *bl);
+
+extern char *remove_blocks(const char *in, const char *blockname);
+
+#endif /* STORYCODE_H */
diff --git a/src/wrap.c b/src/wrap.c
index 17713ec..6092fa3 100644
--- a/src/wrap.c
+++ b/src/wrap.c
@@ -31,8 +31,7 @@
#include <pango/pangocairo.h>
#include <math.h>
-#include <storycode.h>
-
+#include "storycode.h"
#include "wrap.h"
#include "frame.h"