On Mon, 4 Dec 2006, Stephen Woodbridge wrote:

Hi all,

I was wondering if anyone has unac.c which is the lib used in Text::Unaccent built and wrap as a plpgsql stored procedure not using plperl. Or maybe there is another general solution that I am no aware of.

I have one, don't remember whet did I get it.


Thanks,
 -Steve

---------------------------(end of broadcast)---------------------------
TIP 6: explain analyze is your friend


        Regards,
                Oleg
_____________________________________________________________
Oleg Bartunov, Research Scientist, Head of AstroNet (www.astronet.ru),
Sternberg Astronomical Institute, Moscow University, Russia
Internet: oleg@sai.msu.su, http://www.sai.msu.su/~megera/
phone: +007(495)939-16-83, +007(495)939-23-83
/*
 * pg_unac.c
 *
 * Author: Nhan NGO DINH
 * Version: 1.1
 * Description: PostgreSQL external function
 *   unaccent the given string
 *
 */

#include <stdio.h>
#include <postgres.h>
#include <string.h>
#include <fmgr.h>
#include <unac.h>

PG_FUNCTION_INFO_V1(unac);

Datum unac(PG_FUNCTION_ARGS) {

  text *str = PG_GETARG_TEXT_P(0);
  text *result;
  
  int tlen, nlen;
  char *tstr, *nstr;
  
  tlen = VARSIZE(str) - VARHDRSZ;
  tstr = (char *) palloc(tlen + 1);
  memcpy(tstr, VARDATA(str), tlen);
  tstr[tlen] = '\0';

  nstr = NULL; nlen = 0;
  unac_string("UTF-8", tstr, strlen(tstr), &nstr, &nlen);

  /* It may happen that unac_string returns NULL, because iconv
   * can't translate the input string. In this case we output
   * the string as it is. */
  if (nstr == NULL) nstr = tstr;
  
  result = (text *) palloc(strlen(nstr) + VARHDRSZ);
  memcpy(VARDATA(result), nstr, strlen(nstr));
  VARATT_SIZEP(result) = strlen(nstr) + VARHDRSZ;
  
  PG_RETURN_TEXT_P(result);
  
}
---------------------------(end of broadcast)---------------------------
TIP 2: Don't 'kill -9' the postmaster

Reply via email to