diff options
author | Nalin Dahyabhai <nalin@dahyabhai.net> | 2008-05-13 22:59:37 -0400 |
---|---|---|
committer | Nalin Dahyabhai <nalin@dahyabhai.net> | 2008-05-13 22:59:37 -0400 |
commit | 5b0f265fee5b2ef67de8e800454c2e2c934fb029 (patch) | |
tree | 42263d74dfb7407893fc432ef2bf8b1e2ef4d9de /src | |
parent | 2d7f8b5fd3e843a44bac311f2c6fe802ef48333b (diff) | |
download | slapi-nis-5b0f265fee5b2ef67de8e800454c2e2c934fb029.tar.gz slapi-nis-5b0f265fee5b2ef67de8e800454c2e2c934fb029.tar.xz slapi-nis-5b0f265fee5b2ef67de8e800454c2e2c934fb029.zip |
- skip over quoted strings when searching for closing ) or }
- recognize functions as %function() or %function{}
Diffstat (limited to 'src')
-rw-r--r-- | src/format.c | 36 |
1 files changed, 26 insertions, 10 deletions
diff --git a/src/format.c b/src/format.c index 842048b..f625a1c 100644 --- a/src/format.c +++ b/src/format.c @@ -290,13 +290,23 @@ format_single(Slapi_PBlock *pb, Slapi_Entry *e, const char *attr, static const char * format_find_closer(const char *pair, const char *pattern) { - int i, level = 0; - for (i = 0; pattern[i] != '\0'; i++) { - if (pattern[i] == pair[0]) { - level++; - } else { - if (pattern[i] == pair[1]) { - level--; + int i, dq, level = 0; + for (i = 0, dq = 0; pattern[i] != '\0'; i++) { + if (pattern[i] == '\\') { + i += 2; + continue; + } + if (pattern[i] == '"') { + dq = !dq; + continue; + } + if (!dq) { + if (pattern[i] == pair[0]) { + level++; + } else { + if (pattern[i] == pair[1]) { + level--; + } } } if (level == 0) { @@ -403,7 +413,7 @@ format_expand(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e, default: /* Assume it's a "function" call. Pick out the * name of the function. */ - paramstart = strchr(fmt + i, '('); + paramstart = strpbrk(fmt + i, "{("); if (paramstart == NULL) { /* No start? Bad format. */ slapi_log_error(SLAPI_LOG_PLUGIN, @@ -413,7 +423,13 @@ format_expand(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e, "invocation\n"); return -1; } - paramend = strchr(paramstart + 1, ')'); + if (*paramstart == '{') { + paramend = format_find_closer("{}", + paramstart); + } else { + paramend = format_find_closer("()", + paramstart); + } if (paramend == NULL) { /* No matching end? Bad format. */ slapi_log_error(SLAPI_LOG_PLUGIN, @@ -448,7 +464,7 @@ format_expand(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e, } memcpy(tmp, paramstart + 1, paramend - (paramstart + 1)); - tmp[paramend - paramstart] = '\0'; + tmp[paramend - (paramstart + 1)] = '\0'; /* Find the "function". */ formatfn = format_lookup_fn(fnname); if (formatfn == NULL) { |