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 #include <regex.h>
00036 #include <string.h>
00037
00038 static ffbool ffregex_do_match(const ffchar* needle, const ffstring* haystack, ffint32 cflags)
00039 {
00040 regex_t regex;
00041 ffint32 result;
00042
00043 regcomp(®ex, needle, cflags);
00044 result = regexec(®ex, haystack->str, 0, NULL, 0);
00045 regfree(®ex);
00046
00047
00048
00049
00050
00051
00052 return !result;
00053 }
00054
00055 ffbool ffregex_match(const ffchar* needle, const ffstring* haystack)
00056 {
00057 return ffregex_do_match(needle, haystack, REG_NOSUB | REG_EXTENDED);
00058 }
00059
00060 ffbool ffregex_match_ci(const ffchar* needle, const ffstring* haystack)
00061 {
00062 return ffregex_do_match(needle, haystack, REG_ICASE | REG_NOSUB | REG_EXTENDED);
00063 }
00064
00065 static ffbool ffregex_do_replace(const ffchar* needle, const ffchar* replace, ffstring* haystack, ffint32 cflags)
00066 {
00067 ffchar* dst = tcregsub(haystack->str, needle, replace, cflags);
00068
00069 if(!dst)
00070 return 0;
00071 else {
00072 free(haystack->str);
00073 haystack->str = dst;
00074 haystack->len == strlen(dst);
00075 return 1;
00076 }
00077 }
00078
00079 ffbool ffregex_replace(const ffchar* needle, const ffchar* replace, ffstring* haystack)
00080 {
00081 return ffregex_do_replace(needle, replace, haystack, REG_EXTENDED);
00082 }
00083
00084 ffbool ffregex_replace_ci(const ffchar* needle, const ffchar* replace, ffstring* haystack)
00085 {
00086 return ffregex_do_replace(needle, replace, haystack, REG_ICASE | REG_EXTENDED);
00087 }
00088