Hello,
I have modified the translate function in order to improve its
compatibility with Oracle. It now supports the replacement of multiple
characters and it will also shorten the length of the string when characters
are replaced with nothing.
[Note: The arguments are different from the original translate]
Can this function replace the existing function in the distribution?
-------NEW FUNCTION--------------------------------------
text *
translate(text *string, text *from, text *to)
{ text *ret; char *ptr_ret, *from_ptr, *to_ptr, *source, *target, *temp,
rep; int m, fromlen, tolen, retlen, i;
if ((string == (text *) NULL) || ((m = VARSIZE(string) - VARHDRSZ) <= 0)) return
string;
target = (char *) palloc(VARSIZE(string) - VARHDRSZ); source = VARDATA(string); temp =
target;
fromlen = VARSIZE(from) - VARHDRSZ; from_ptr = VARDATA(from); tolen = VARSIZE(to) - VARHDRSZ;
to_ptr = VARDATA(to); retlen = 0; while (m--) { rep = *source;
for(i=0;i<fromlen;i++){ if(from_ptr[i] == *source) { if(i < tolen) { rep =
to_ptr[i]; } else { rep = 0; } break; } }
if(rep!= 0) { *target++ = rep; retlen++; } source++; }
ret = (text *) palloc(retlen + VARHDRSZ); VARSIZE(ret) = retlen + VARHDRSZ; ptr_ret = VARDATA(ret);
for(i=0;i<retlen;i++) { *ptr_ret++ = temp[i]; } pfree(target); return ret;
}
Thanks,
Edwin S. Ramirez