akosut 96/07/28 19:32:36
Modified: src httpd.h util.c
Log:
Add pregsub() function, for use with regex.
Revision Changes Path
1.41 +3 -0 apache/src/httpd.h
Index: httpd.h
===================================================================
RCS file: /export/home/cvs/apache/src/httpd.h,v
retrieving revision 1.40
retrieving revision 1.41
diff -C3 -r1.40 -r1.41
*** httpd.h 1996/07/28 19:27:46 1.40
--- httpd.h 1996/07/29 02:32:33 1.41
***************
*** 562,567 ****
--- 562,570 ----
int strcasecmp_match(char *str, char *exp);
char *uudecode (pool *, char *);
+ char *pregsub(pool *p, const char *input, const char *source,
+ size_t nmatch, regmatch_t pmatch[]);
+
void str_tolower (char *);
int ind (const char *, char); /* Sigh... */
int rind (const char *, char);
1.15 +78 -0 apache/src/util.c
Index: util.c
===================================================================
RCS file: /export/home/cvs/apache/src/util.c,v
retrieving revision 1.14
retrieving revision 1.15
diff -C3 -r1.14 -r1.15
*** util.c 1996/07/28 19:27:50 1.14
--- util.c 1996/07/29 02:32:34 1.15
***************
*** 227,232 ****
--- 227,310 ----
return 0;
}
+ /* This function substitues for $0-$9, filling in regular expression
+ * submatches. Pass it the same nmatch and pmatch arguments that you
+ * passed regexec(). pmatch should not be greater than the maximum number
+ * of subexpressions - i.e. one more than the re_nsub member of regex_t.
+ *
+ * input should be the string with the $-expressions, source should be the
+ * string that was matched against.
+ *
+ * It returns the substituted string, or NULL on error.
+ *
+ * Parts of this code are based on Henry Spencer's regsub(), from his
+ * AT&T V8 regexp package.
+ */
+
+ char *pregsub(pool *p, const char *input, const char *source,
+ size_t nmatch, regmatch_t pmatch[]) {
+ const char *src = input;
+ char *dest, *dst;
+ char c;
+ int no, len;
+
+ if (!source) return NULL;
+ if (!nmatch) return pstrdup(p, src);
+
+ /* First pass, find the size */
+
+ len = 0;
+
+ while ((c = *src++) != '\0') {
+ if (c == '&')
+ no = 0;
+ else if (c == '$' && isdigit(*src))
+ no = *src++ - '0';
+ else
+ no = -1;
+
+ if (no < 0) { /* Ordinary character. */
+ if (c == '\\' && (*src == '$' || *src == '&'))
+ c = *src++;
+ len++;
+ } else if (no <= nmatch && pmatch[no].rm_so < pmatch[no].rm_eo) {
+ len += pmatch[no].rm_eo - pmatch[no].rm_so;
+ }
+
+ }
+
+ dest = dst = pcalloc(p, len + 1);
+
+ /* Now actually fill in the string */
+
+ src = input;
+
+ while ((c = *src++) != '\0') {
+ if (c == '&')
+ no = 0;
+ else if (c == '$' && isdigit(*src))
+ no = *src++ - '0';
+ else
+ no = -1;
+
+ if (no < 0) { /* Ordinary character. */
+ if (c == '\\' && (*src == '$' || *src == '&'))
+ c = *src++;
+ *dst++ = c;
+ } else if (no <= nmatch && pmatch[no].rm_so < pmatch[no].rm_eo) {
+ len = pmatch[no].rm_eo - pmatch[no].rm_so;
+ strncpy(dst, source + pmatch[no].rm_so, len);
+ dst += len;
+ if (*(dst-1) == '\0') /* strncpy hit NULL. */
+ return NULL;
+ }
+
+ }
+ *dst = '\0';
+
+ return dest;
+ }
+
/*
* Parse .. so we don't compromise security
*/