Main Page | Data Structures | Directories | File List | Data Fields | Globals | Related Pages

ffregex.c

Go to the documentation of this file.
00001 /*
00002  * finflect - Algorithms and tools for inflecting Finnish nouns
00003  * Copyright (C) 2004, 2005  The FinFlect Team
00004  * 
00005  * This library is free software; you can redistribute it and/or
00006  * modify it under the terms of the GNU Lesser General Public
00007  * License as published by the Free Software Foundation; either
00008  * version 2.1 of the License, or (at your option) any later version.
00009  * 
00010  * This library is distributed in the hope that it will be useful,
00011  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00012  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013  * Lesser General Public License for more details.
00014  * 
00015  * You should have received a copy of the GNU Lesser General Public
00016  * License along with this library; if not, write to the Free Software
00017  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00018  * 
00019  * 
00020  * For the complete legal text of the GNU Lesser General Public License,
00021  * see the file LICENSE. For a complete list of authors and copyright
00022  * holders, see the file AUTHORS.
00023  */
00024 
00025 /**
00026  * @file ffregex.c Implements the ffstring regular expression wrappers declared
00027  * in ffregex.h.
00028  */
00029 
00030 #include "ffregex.h"
00031 #include "tcrip.h"
00032 
00033 #include <stdlib.h>
00034 #include <sys/types.h>
00035 
00036 #ifdef __WIN32__
00037 #include "../windows/regex/regex.h"
00038 #else
00039 #include <regex.h>
00040 #endif
00041 
00042 #include <string.h>
00043 
00044 static ffbool ffregex_do_match(const ffchar* needle, const ffstring* haystack, ffint32 cflags) {
00045   regex_t regex;
00046   ffint32 result;
00047 
00048   regcomp(&regex, needle, cflags);
00049   result = regexec(&regex, haystack->str, 0, NULL, 0);
00050   regfree(&regex);
00051 
00052   /*
00053    * regexec returns 0 on match, REG_NOMATCH (presumably non-zero) on no match
00054    * so let's just negate it, because we want to be true on match and false on
00055    * no match
00056    */
00057   return !result;
00058 }
00059 
00060 ffbool ffregex_match(const ffchar* needle, const ffstring* haystack) {
00061   return ffregex_do_match(needle, haystack, REG_NOSUB | REG_EXTENDED);
00062 }
00063 
00064 ffbool ffregex_match_ci(const ffchar* needle, const ffstring* haystack) {
00065   return ffregex_do_match(needle, haystack, REG_ICASE | REG_NOSUB | REG_EXTENDED);
00066 }
00067 
00068 static ffbool ffregex_do_replace(const ffchar* needle, const ffchar* replace, ffstring* haystack, ffint32 cflags) {
00069   ffchar* dst = tcregsub(haystack->str, needle, replace, cflags);
00070 
00071   if(!dst)
00072     return 0;
00073   else {
00074     free(haystack->str);
00075     haystack->str = dst;
00076     haystack->len == strlen(dst);
00077     return 1;
00078   }
00079 }
00080 
00081 ffbool ffregex_replace(const ffchar* needle, const ffchar* replace, ffstring* haystack) {
00082   return ffregex_do_replace(needle, replace, haystack, REG_EXTENDED);
00083 }
00084 
00085 ffbool ffregex_replace_ci(const ffchar* needle, const ffchar* replace, ffstring* haystack) {
00086   return ffregex_do_replace(needle, replace, haystack, REG_ICASE | REG_EXTENDED);
00087 }
00088 

Generated on Thu Jun 2 23:16:59 2005 for FinFlect by  doxygen 1.4.2