From 7f2d0abd61d9d25c7c07ad1de1de2e6067c22b3e Mon Sep 17 00:00:00 2001 From: Thomas White Date: Thu, 19 Oct 2017 21:42:48 +0200 Subject: Track the newlines at ends of paragraphs directly No more messing around searching for \n characters --- src/sc_parse.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) (limited to 'src/sc_parse.c') diff --git a/src/sc_parse.c b/src/sc_parse.c index 56ebcaf..79e59a0 100644 --- a/src/sc_parse.c +++ b/src/sc_parse.c @@ -296,6 +296,9 @@ char *serialise_sc_block(const SCBlock *bl) if ( bl->name == NULL ) { strcat(a, bl->contents); + } else if ( strcmp(bl->name, "newpara") == 0 ) { + strcat(a, "\n"); + } else { strcat(a, "\\"); @@ -503,6 +506,41 @@ static size_t read_block(const char *sc, char **pname, char **options, } +static void separate_newlines(SCBlock *bl) +{ + while ( bl != NULL ) { + + char *npos; + const char *contents = sc_block_contents(bl); + + if ( contents != NULL ) { + npos = strchr(contents, '\n'); + if ( npos != NULL ) { + SCBlock *nb = NULL; + if ( npos == contents ) { + bl->name = strdup("newpara"); + bl->contents = NULL; + nb = bl; + } else { + sc_block_append(bl, strdup("newpara"), NULL, NULL, &nb); + } + if ( strlen(npos+1) > 0 ) { + sc_block_append(nb, NULL, NULL, strdup(npos+1), &nb); + } + npos[0] = '\0'; + } + } + + if ( sc_block_child(bl) != NULL ) { + separate_newlines(sc_block_child(bl)); + } + + bl = sc_block_next(bl); + + } +} + + SCBlock *sc_parse(const char *sc) { SCBlock *bl; @@ -601,10 +639,19 @@ SCBlock *sc_parse(const char *sc) j = 0; } + separate_newlines(blf); + return blf; } +void sc_block_set_name(SCBlock *bl, char *nam) +{ + free(bl->name); + bl->name = nam; +} + + void sc_block_set_options(SCBlock *bl, char *opt) { free(bl->options); -- cgit v1.2.3