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
     */
  
  
  

Reply via email to