summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorNalin Dahyabhai <nalin@dahyabhai.net>2008-05-13 22:59:37 -0400
committerNalin Dahyabhai <nalin@dahyabhai.net>2008-05-13 22:59:37 -0400
commit5b0f265fee5b2ef67de8e800454c2e2c934fb029 (patch)
tree42263d74dfb7407893fc432ef2bf8b1e2ef4d9de /src
parent2d7f8b5fd3e843a44bac311f2c6fe802ef48333b (diff)
downloadslapi-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.c36
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) {