PG_MODULE_MAGIC;
#endif
+UNormalizer2 *normalizer;
+
static int32_t regexp_expand_string(const UChar *src,
int32_t src_len,
UChar *des,
int32_t des_capacity)
{
int des_len;
- UChar s, e;
+ UChar s;
const UChar *cur_pos;
const UChar *pre_pos;
UChar *des,
int32_t des_capacity)
{
- int i, j;
+ int i;
int32_t des_len;
UChar *cur_pos;
}
des_len++;
- if(cur_pos = u_strchr(search_list, src[i]))
+ if((cur_pos = u_strchr(search_list, src[i])))
{
if(cur_pos - search_list > replacement_list_len)
des_len--;
replacement_len,
str,
str_len,
- NULL,
- 0,
+ str,
+ str_len,
is_global);
- des = palloc((des_len + 1)* sizeof(UChar));
-
- des_len = regexp_replace(regexp,
- regexp_len,
- replacement,
- replacement_len,
- str,
- str_len,
- des,
- des_len,
- is_global);
- if(des != NULL)
- des[des_len] = '\0';
-
- pfree(str);
- return des;
+ if (des_len > str_capacity)
+ {
+ pfree(str);
+
+ des = palloc((des_len + 1)* sizeof(UChar));
+
+ des_len = regexp_replace(regexp,
+ regexp_len,
+ replacement,
+ replacement_len,
+ str,
+ str_len,
+ des,
+ des_len,
+ is_global);
+ if(des != NULL)
+ des[des_len] = '\0';
+
+ return des;
+ }
+
+ return str;
}
static UChar *additional_substitutions(UChar *nustr, int is_search)
}
+void _PG_fini()
+{
+ UErrorCode err = 0;
+ normalizer = unorm2_getInstance(NULL, "nfkc", UNORM2_DECOMPOSE, &err);
+ if (U_FAILURE(err))
+ {
+ normalizer = NULL;
+ }
+ return;
+}
+
text *normalize(text *str, text *sf, int is_search)
{
UChar *ustr = NULL, *nustr = NULL, *temp = NULL, *usf = NULL;
int32_t nustr_len, temp_len, str_len, sf_len, ustr_len;
- UNormalizer2 *normalizer;
- char *regexp, *result;
+ char *result;
char *s;
UChar uregexp[200], replacement[200];
UErrorCode err = 0;
-
+
if (str == NULL || sf == NULL)
{
return NULL;
}
- normalizer = unorm2_getNFKDInstance(&err);
- if (U_FAILURE(err))
- {
- return NULL;
- }
+
s = VARDATA(str);