00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
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(®ex, needle, cflags);
00049 result = regexec(®ex, haystack->str, 0, NULL, 0);
00050 regfree(®ex);
00051
00052
00053
00054
00055
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