regexp.c

Go to the documentation of this file.
00001 /*
00002  * $Id$
00003  *
00004  * Regular expression functions
00005  *
00006  * Copyright (C) 2003 Juha Heinanen
00007  *
00008  * This file is part of Kamailio, a free SIP server.
00009  *
00010  * Kamailio is free software; you can redistribute it and/or modify
00011  * it under the terms of the GNU General Public License as published by
00012  * the Free Software Foundation; either version 2 of the License, or
00013  * (at your option) any later version
00014  *
00015  * Kamailio is distributed in the hope that it will be useful,
00016  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00017  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00018  * GNU General Public License for more details.
00019  *
00020  * You should have received a copy of the GNU General Public License 
00021  * along with this program; if not, write to the Free Software 
00022  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00023  *
00024  */
00025 
00031 #include <sys/types.h>
00032 #include <string.h>
00033 #include <regex.h>
00034 #include <ctype.h>
00035 #include "regexp.h"
00036 #include "../../dprint.h"
00037 
00041 int replace(regmatch_t* pmatch, char* string, char* replacement, str* result)
00042 {
00043         int len, i, j, digit, size;
00044 
00045         len = strlen(replacement);
00046         j = 0;
00047 
00048         for (i = 0; i < len; i++) {
00049                 if (replacement[i] == '\\') {
00050                         if (i < len - 1) {
00051                                 if (isdigit((unsigned char)replacement[i+1])) {
00052                                         digit = replacement[i+1] - '0';
00053                                         if (pmatch[digit].rm_so != -1) {
00054                                                 size = pmatch[digit].rm_eo - pmatch[digit].rm_so;
00055                                                 if (j + size < result->len) {
00056                                                         memcpy(&(result->s[j]), string+pmatch[digit].rm_so, size);
00057                                                         j = j + size;
00058                                                 } else {
00059                                                         return -1;
00060                                                 }
00061                                         } else {
00062                                                 return -2;
00063                                         }
00064                                         i = i + 1;
00065                                         continue;
00066                                 } else {
00067                                         i = i + 1;
00068                                 }
00069                         } else {
00070                                 return -3;
00071                         }
00072                 }
00073                 if (j + 1 < result->len) {
00074                         result->s[j] = replacement[i];
00075                         j = j + 1;
00076                 } else {
00077                         return -4;
00078                 }
00079         }
00080         result->len = j;
00081         return 1;
00082 }
00083 
00084 
00086 int reg_match(char *pattern, char *string, regmatch_t *pmatch)
00087 {
00088         regex_t preg;
00089 
00090         if (regcomp(&preg, pattern, REG_EXTENDED | REG_NEWLINE)) {
00091                 return -1;
00092         }
00093         if (preg.re_nsub > MAX_MATCH) {
00094                 regfree(&preg);
00095                 return -2;
00096         }
00097         if (regexec(&preg, string, MAX_MATCH, pmatch, 0)) {
00098                 regfree(&preg);
00099                 return -3;
00100         }
00101         regfree(&preg);
00102         return 0;
00103 }
00104 
00105 
00109 int reg_replace(char *pattern, char *replacement, char *string, str *result)
00110 {
00111         regmatch_t pmatch[MAX_MATCH];
00112 
00113         LM_DBG("pattern: '%s', replacement: '%s', string: '%s'\n",
00114             pattern, replacement, string);
00115 
00116         if (reg_match(pattern, string, &(pmatch[0]))) {
00117                 return -1;
00118         }
00119 
00120         return replace(&pmatch[0], string, replacement, result);
00121 
00122 }