Improved subject simplification by regexp.
[claws.git] / src / string_match.c
1 /*
2  * Sylpheed -- regexp pattern matching utilities
3  * Copyright (C) 2001 Thomas Link, Hiroyuki Yamamoto
4  *                    Modified by Melvin Hadasht.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19  */
20
21 #include "intl.h"
22 #include "string_match.h"
23
24 int string_match_precompile (gchar *rexp, regex_t *preg, int cflags)
25 {
26         int problem = 0;
27
28         g_return_val_if_fail(rexp, -1);
29         g_return_val_if_fail(*rexp, -1);
30
31         problem = regcomp(preg, rexp, cflags);  
32         
33         return problem;
34 }
35
36
37 gchar *string_remove_match(gchar *buf, gint buflen, gchar * txt, regex_t *preg)
38 {
39         regmatch_t match;
40         int notfound;
41         gint i, j ,k;
42
43         if (!preg)
44                 return txt;
45         if (*txt != 0x00) {
46                 i = 0;
47                 j = 0;
48                 do {
49                         notfound = regexec(preg, txt+j, 1, &match, (j ? REG_NOTBOL : 0));
50                         if (notfound) {
51                                 while (txt[j] && i < buflen -1)
52                                         buf[i++] = txt[j++];
53                         } else {
54                                 if ( match.rm_so == match.rm_eo)
55                                         buf[i++] = txt[j++];
56                                 else {
57                                         k = j;
58                                         while (txt[j] &&  j != k + match.rm_so) 
59                                                 buf[i++] = txt[j++];
60                                         if (txt[j])
61                                                 j = k + match.rm_eo;
62                                 }
63                         }
64                 } while (txt[j] && i < buflen - 1);
65                 buf[i] = 0x00;
66                 if (buf[0] == 0x00)
67                         strcpy(buf, _("(Subject cleared by regexp)"));
68                 return buf;             
69         }
70         return txt;
71 }
72