aboutsummaryrefslogtreecommitdiff
path: root/src/sc_parse.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/sc_parse.c')
-rw-r--r--src/sc_parse.c24
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';