diff options
Diffstat (limited to 'src/sc_parse.c')
-rw-r--r-- | src/sc_parse.c | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/src/sc_parse.c b/src/sc_parse.c index 78f5799..b780046 100644 --- a/src/sc_parse.c +++ b/src/sc_parse.c @@ -480,8 +480,10 @@ static int get_subexpr(const char *sc, char *bk, char **pcontents, int *err) for ( i=0; i<ml; i++ ) { if ( sc[i] == bk[0] ) { bct++; - } else if ( sc[i] == bk[1] ) { - bct--; + } else if ( sc[i] == bk[1] ) { /* closing bracket? */ + if ( !((i>0) && (sc[i-1] == '\\')) ) { /* not escaped? */ + bct--; + } } if ( bct == 0 ) { found = 1; @@ -619,6 +621,17 @@ SCBlock *sc_parse(const char *sc) bl = NULL; len = strlen(sc); + + /* Starts and ends with '$' ---> no processing */ + if ( (sc[0] == '$') && (sc[len-1] == '$') ) { + char *nbl; + bl = sc_block_new(); + if ( bl == NULL ) return NULL; + nbl = strndup(sc+1, len-2); + sc_block_set_contents(bl, nbl); + return bl; + } + tbuf = malloc(len+1); if ( tbuf == NULL ) { sc_block_free(bl); @@ -642,6 +655,13 @@ SCBlock *sc_parse(const char *sc) continue; } + /* Escaped bracket? */ + if ( sc[i+1] == '}' ) { + tbuf[j++] = '}'; + i += 2; + continue; + } + /* No, it's a real block. Dispatch the previous block */ if ( j != 0 ) { tbuf[j] = '\0'; |