Index: ossp-pkg/fsl/fsl.c RCS File: /v/ossp/cvs/ossp-pkg/fsl/fsl.c,v rcsdiff -q -kk '-r1.7' '-r1.8' -u '/v/ossp/cvs/ossp-pkg/fsl/fsl.c,v' 2>/dev/null --- fsl.c 2002/07/16 15:59:44 1.7 +++ fsl.c 2002/07/17 09:57:44 1.8 @@ -200,6 +200,61 @@ return; } +/* Substitutes $[0-9] in inbuf[inlen] with captured strings passed through capary[nary]. + * Returns the number of characters (to be) written to output. Output can be suppressed + * by passing a NULL outpbuf. The terminating NUL is not counted but will be written! + */ +int substcapture(const char *inbuf, int inlen, const char **capary, int nary, char *outbuf) +{ + int i; /* input cursor, current position */ + int n; /* outbuf cursor, next possible write position */ + int m; /* index to capary */ + char c; /* scratch variable */ + + i = 0; + n = 0; + while (i < inlen - 1 /* last char cannot start a two-character sequence, skipping it allows safe look ahead */) { + c = inbuf[i]; + if (c == '$') { + c = inbuf[i+1]; + if (c == '$') { + if (outbuf != NULL) + outbuf[n] = '$'; + i+=2; + n++; + } + else if ((c >= '0') && (c <= '9')) { + m = c - '0'; + if (outbuf != NULL) { + outbuf[n] = '\0'; + strcat(&outbuf[n], ((m < nary) && (capary[m] != NULL)) ? capary[m] : ""); + } + i+=2; + n+= ((m < nary) && (capary[m] != NULL)) ? strlen(capary[m]) : 0; + } + else { + if (outbuf != NULL) + outbuf[n] = '$'; + i++; + n++; + if (outbuf != NULL) + outbuf[n] = c; + i++; + n++; + } + } + else { + if (outbuf != NULL) + outbuf[n] = c; + i++; + n++; + } + } + if (outbuf != NULL) + outbuf[n] = '\0'; + return n; +} + void openlog(const char *ident, int logopt, int facility) { int rc; @@ -215,8 +270,9 @@ char *argident; char *argmatch; char *argl2spec; - char *cp; - int i; + char *cp; /* scratch variable */ + int i; /* scratch variable */ + int n; /* scratch variable */ char *cpIdent; char *cpFacility; char *cpISF; @@ -228,12 +284,14 @@ buf.base = NULL; buf.used = 0; buf.size = 0; + cpIdent = NULL; cpISF = NULL; fprintf(stderr, "DEBUG: BEGIN ident=\"%s\", logopt=0x%.8lx, facility=0x%.8lx\n", ident, (unsigned long)logopt, (unsigned long)facility); /* create IdentSlashFacility */ - cpIdent = ident != NULL ? ident : "unknown"; + if ((cpIdent = strdup((ident != NULL) ? ident : "unknown")) == NULL) { + fprintf(stderr, "ERROR: strdup() failed\n"); CU(1); } cpFacility = "unknown"; for (i = 0; facility2string[i].string != NULL; i++) { if (facility == facility2string[i].facility) { @@ -349,12 +407,17 @@ nMatch = pcre_exec(pcreRegex, pcreExtra, cpISF, strlen(cpISF), 0, 0, ovec, OVECSIZE); fprintf(stderr, "DEBUG: nMatch=%d when \"%s\" is used against \"%s\"\n", nMatch, argmatch, cpISF); if (nMatch >= 1) { - int i; - char *cp; pcre_get_substring_list(cpISF, ovec, nMatch, &acpMatch); if (acpMatch != NULL) for (i = 0; i < nMatch; i++) fprintf(stderr, "DEBUG: regex reference[%d]=\'%s\'\n", i, acpMatch[i] == NULL ? "(UNDEFINED)" : acpMatch[i]); + n = substcapture(argl2spec, strlen(argl2spec), acpMatch, nMatch, NULL); + if ((cp = (char *)malloc(n + 1)) == NULL) { + fprintf(stderr, "ERROR: malloc() failed\n"); CU(1); } + if (substcapture(argl2spec, strlen(argl2spec), acpMatch, nMatch, cp) != n) { + fprintf(stderr, "ERROR: substcapture() failed\n"); CU(1); } + fprintf(stderr, "DEBUG: cp=\"%s\"\n", cp); + free(cp); } } @@ -369,6 +432,8 @@ CUS: if (cpISF != NULL) free(cpISF); + if (cpIdent != NULL) + free(cpIdent); #if 0 if (cfg != NULL) if ((cfgrv = cfg_destroy(cfg)) != CFG_OK) { Index: ossp-pkg/fsl/fsl.pod RCS File: /v/ossp/cvs/ossp-pkg/fsl/fsl.pod,v rcsdiff -q -kk '-r1.2' '-r1.3' -u '/v/ossp/cvs/ossp-pkg/fsl/fsl.pod,v' 2>/dev/null --- fsl.pod 2002/07/16 13:20:33 1.2 +++ fsl.pod 2002/07/17 09:57:44 1.3 @@ -75,8 +75,9 @@ The configuration section contains an B specification enclosed in curly brackets and terminated with a semicolon. The B -specification may contain $1, $2, ... variables which are filled in from -the I regex parts enclosed in round brackets. +specification may contain $1 ... $9 variables which are filled in from +the I regex parts enclosed in round brackets. The $0 variable +captures the wholly match and $$ diverts to a single escaped $. An B channel tree is build from each matching section and all found trees are merged together with a "null" channel to form a single