httpd-cvs mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Alexei Kosut <ako...@hyperreal.com>
Subject cvs commit: apache/src httpd.h util.c
Date Mon, 29 Jul 1996 02:32:37 GMT
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
     */
  
  
  

Mime
View raw message