diff options
-rw-r--r-- | .gitmodules | 3 | ||||
-rw-r--r-- | Makefile.am | 14 | ||||
-rwxr-xr-x | autogen.sh | 4 | ||||
-rw-r--r-- | configure.ac | 1 | ||||
m--------- | libstorycode | 0 | ||||
-rw-r--r-- | src/frame.c | 3 | ||||
-rw-r--r-- | src/render.c | 3 | ||||
-rw-r--r-- | src/storycode.c | 392 | ||||
-rw-r--r-- | src/storycode.h | 47 | ||||
-rw-r--r-- | src/wrap.c | 3 |
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 @@ -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 */ @@ -31,8 +31,7 @@ #include <pango/pangocairo.h> #include <math.h> -#include <storycode.h> - +#include "storycode.h" #include "wrap.h" #include "frame.h" |