> I had to back out the patch. It only compiles with multi-byte enabled.

Ooops, I forget... here it is again.

> > >  If encoding is not supported returns ERROR.

 and if multibyte not enabled too....


 Thanks.

                                Karel
~
This commit is contained in:
Bruce Momjian 2000-08-05 14:59:29 +00:00
parent 4ebb751219
commit 75b61043b0
4 changed files with 240 additions and 3 deletions

View File

@ -1,7 +1,7 @@
#
# Makefile for utils/adt
#
# $Header: /cvsroot/pgsql/src/backend/utils/adt/Makefile,v 1.43 2000/08/04 20:46:43 momjian Exp $
# $Header: /cvsroot/pgsql/src/backend/utils/adt/Makefile,v 1.44 2000/08/05 14:59:17 momjian Exp $
#
subdir = src/backend/utils/adt
@ -23,7 +23,8 @@ OBJS = acl.o arrayfuncs.o arrayutils.o bool.o cash.o char.o \
regexp.o regproc.o ruleutils.o selfuncs.o sets.o \
tid.o timestamp.o varbit.o varchar.o varlena.o version.o \
network.o mac.o inet_net_ntop.o inet_net_pton.o \
ri_triggers.o pg_lzcompress.o pg_locale.o formatting.o
ri_triggers.o pg_lzcompress.o pg_locale.o formatting.o \
ascii.o
all: SUBSYS.o

View File

@ -0,0 +1,201 @@
/* -----------------------------------------------------------------------
* ascii.c
*
* $Header: /cvsroot/pgsql/src/backend/utils/adt/ascii.c,v 1.3 2000/08/05 14:59:17 momjian Exp $
*
* Portions Copyright (c) 1999-2000, PostgreSQL, Inc
*
*
* TO_ASCII()
*
* The PostgreSQL routine for string to ascii conversion.
*
* -----------------------------------------------------------------------
*/
#include "postgres.h"
#include "utils/builtins.h"
#include "mb/pg_wchar.h"
#include "utils/ascii.h"
/* ----------
* even if MULTIBYTE is not enabled, these functions are necessary
* since pg_proc.h has references to them.
* ----------
*/
#ifndef MULTIBYTE
static void multibyte_error(void);
static void
multibyte_error()
{
elog(ERROR, "multibyte not supported.");
}
Datum
to_ascii_encname(PG_FUNCTION_ARGS)
{
multibyte_error();
}
Datum
to_ascii_enc(PG_FUNCTION_ARGS)
{
multibyte_error();
}
Datum
to_ascii_default(PG_FUNCTION_ARGS)
{
multibyte_error();
}
#else /* with MULTIBYTE */
/* ----------
* even if MULTIBYTE is enabled
* ----------
*/
static text *encode_to_ascii(text *data, int enc);
/* ----------
* to_ascii
* ----------
*/
char *
pg_to_ascii(unsigned char *src, unsigned char *src_end, unsigned char *desc, int enc)
{
unsigned char *x = NULL;
unsigned char *ascii = NULL ;
int range = 0;
/*
* relevant start for an encoding
*/
#define RANGE_128 128
#define RANGE_160 160
if (enc == LATIN1)
{
/* ----------
* ISO-8859-1 <range: 160 -- 255>
* ----------
*/
ascii = " cL Y \"Ca -R 'u ., ?AAAAAAACEEEEIIII NOOOOOxOUUUUYTBaaaaaaaceeeeiiii nooooo/ouuuuyty";
range = RANGE_160;
}
else if (enc == LATIN2)
{
/* ----------
* ISO-8859-2 <range: 160 -- 255>
* ----------
*/
ascii = " A L LS \"SSTZ-ZZ a,l'ls ,sstz\"zzRAAAALCCCEEEEIIDDNNOOOOxRUUUUYTBraaaalccceeeeiiddnnoooo/ruuuuyt.";
range = RANGE_160;
}
else if (enc == WIN1250)
{
/* ----------
* Window CP1250 <range: 128 -- 255>
* ----------
*/
ascii = " ' \" %S<STZZ `'\"\".-- s>stzz L A \"CS -RZ ,l'u .,as L\"lzRAAAALCCCEEEEIIDDNNOOOOxRUUUUYTBraaaalccceeeeiiddnnoooo/ruuuuyt ";
range = RANGE_128;
}
else
{
elog(ERROR, "pg_to_ascii(): unsupported encoding from %s",
pg_encoding_to_char(enc));
}
/* ----------
* Encode
* ----------
*/
for (x = src; x <= src_end; x++)
{
if (*x < 128)
*desc++ = *x;
else if (*x < range)
*desc++ = ' '; /* bogus 128 to 'range' */
else
*desc++ = ascii[*x - range];
}
return desc;
}
/* ----------
* encode text
* ----------
*/
static text *
encode_to_ascii(text *data, int enc)
{
pg_to_ascii(
(unsigned char *) VARDATA(data), /* src */
VARDATA(data) + VARSIZE(data), /* src end */
(unsigned char *) VARDATA(data), /* desc */
enc); /* encoding */
return data;
}
/* ----------
* convert to ASCII - enc is set as 'name' arg.
* ----------
*/
Datum
to_ascii_encname(PG_FUNCTION_ARGS)
{
PG_RETURN_TEXT_P
(
encode_to_ascii
(
PG_GETARG_TEXT_P_COPY(0),
pg_char_to_encoding( NameStr(*PG_GETARG_NAME(1)) )
)
);
}
/* ----------
* convert to ASCII - enc is set as int4
* ----------
*/
Datum
to_ascii_enc(PG_FUNCTION_ARGS)
{
PG_RETURN_TEXT_P
(
encode_to_ascii
(
PG_GETARG_TEXT_P_COPY(0),
PG_GETARG_INT32(1)
)
);
}
/* ----------
* convert to ASCII - current enc is DatabaseEncoding
* ----------
*/
Datum
to_ascii_default(PG_FUNCTION_ARGS)
{
PG_RETURN_TEXT_P
(
encode_to_ascii
(
PG_GETARG_TEXT_P_COPY(0),
GetDatabaseEncoding()
)
);
}
#endif /* MULTIBYTE */

View File

@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California
*
* $Id: pg_proc.h,v 1.159 2000/08/04 20:46:43 momjian Exp $
* $Id: pg_proc.h,v 1.160 2000/08/05 14:59:19 momjian Exp $
*
* NOTES
* The script catalog/genbki.sh reads this file and generates .bki
@ -2442,6 +2442,14 @@ DESCR("aggregate transition function");
DATA(insert OID = 1844 ( interval_avg PGUID 12 f t t t 1 f 1186 "1187" 100 0 0 100 interval_avg - ));
DESCR("AVG aggregate final function");
/* To ASCII conversion */
DATA(insert OID = 1845 ( to_ascii PGUID 12 f t t t 1 f 25 "25" 100 0 0 100 to_ascii_default - ));
DESCR("encode text from DB encoding to ASCII text");
DATA(insert OID = 1846 ( to_ascii PGUID 12 f t t t 2 f 25 "25 23" 100 0 0 100 to_ascii_enc - ));
DESCR("encode text from encoding to ASCII text");
DATA(insert OID = 1847 ( to_ascii PGUID 12 f t t t 2 f 25 "25 19" 100 0 0 100 to_ascii_encname - ));
DESCR("encode text from encoding to ASCII text");
DATA(insert OID = 1850 ( int28eq PGUID 12 f t t t 2 f 16 "21 20" 100 0 0 100 int28eq - ));
DESCR("equal");
DATA(insert OID = 1851 ( int28ne PGUID 12 f t t t 2 f 16 "21 20" 100 0 0 100 int28ne - ));

View File

@ -0,0 +1,27 @@
/* -----------------------------------------------------------------------
* ascii.h
*
* $Id: ascii.h,v 1.3 2000/08/05 14:59:29 momjian Exp $
*
* Portions Copyright (c) 1999-2000, PostgreSQL, Inc
*
* -----------------------------------------------------------------------
*/
#ifndef _ASCII_H_
#define _ASCII_H_
#include "fmgr.h"
extern Datum to_ascii_encname(PG_FUNCTION_ARGS);
extern Datum to_ascii_enc(PG_FUNCTION_ARGS);
extern Datum to_ascii_default(PG_FUNCTION_ARGS);
#ifdef MULTIBYTE
extern char *pg_to_ascii(unsigned char *src, unsigned char *src_end,
unsigned char *desc, int enc);
#endif /* MULTIBYTE */
#endif /* _ASCII_H_ */