📄 ascii.c
字号:
/*----------------------------------------------------------------------- * ascii.c * The PostgreSQL routine for string to ascii conversion. * * Portions Copyright (c) 1999-2003, PostgreSQL Global Development Group * * IDENTIFICATION * $Header: /cvsroot/pgsql/src/backend/utils/adt/ascii.c,v 1.19 2003/09/26 15:27:36 petere Exp $ * *----------------------------------------------------------------------- */#include "postgres.h"#include "utils/builtins.h"#include "mb/pg_wchar.h"#include "utils/ascii.h"static void pg_to_ascii(unsigned char *src, unsigned char *src_end, unsigned char *dest, int enc);static text *encode_to_ascii(text *data, int enc);/* ---------- * to_ascii * ---------- */static voidpg_to_ascii(unsigned char *src, unsigned char *src_end, unsigned char *dest, int enc){ unsigned char *x; unsigned char *ascii; int range; /* * relevant start for an encoding */#define RANGE_128 128#define RANGE_160 160 if (enc == PG_LATIN1) { /* * ISO-8859-1 <range: 160 -- 255> */ ascii = " cL Y \"Ca -R 'u ., ?AAAAAAACEEEEIIII NOOOOOxOUUUUYTBaaaaaaaceeeeiiii nooooo/ouuuuyty"; range = RANGE_160; } else if (enc == PG_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 == PG_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 { ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("encoding conversion from %s to ASCII not supported", pg_encoding_to_char(enc)))); return; /* keep compiler quiet */ } /* * Encode */ for (x = src; x < src_end; x++) { if (*x < 128) *dest++ = *x; else if (*x < range) *dest++ = ' '; /* bogus 128 to 'range' */ else *dest++ = ascii[*x - range]; }}/* ---------- * encode text * * The text datum is overwritten in-place, therefore this coding method * cannot support conversions that change the string length! * ---------- */static text *encode_to_ascii(text *data, int enc){ pg_to_ascii((unsigned char *) VARDATA(data), /* src */ (unsigned char *) (data) + VARSIZE(data), /* src end */ (unsigned char *) VARDATA(data), /* dest */ enc); /* encoding */ return data;}/* ---------- * convert to ASCII - enc is set as 'name' arg. * ---------- */Datumto_ascii_encname(PG_FUNCTION_ARGS){ text *data = PG_GETARG_TEXT_P_COPY(0); int enc = pg_char_to_encoding(NameStr(*PG_GETARG_NAME(1))); PG_RETURN_TEXT_P(encode_to_ascii(data, enc));}/* ---------- * convert to ASCII - enc is set as int4 * ---------- */Datumto_ascii_enc(PG_FUNCTION_ARGS){ text *data = PG_GETARG_TEXT_P_COPY(0); int enc = PG_GETARG_INT32(1); PG_RETURN_TEXT_P(encode_to_ascii(data, enc));}/* ---------- * convert to ASCII - current enc is DatabaseEncoding * ---------- */Datumto_ascii_default(PG_FUNCTION_ARGS){ text *data = PG_GETARG_TEXT_P_COPY(0); int enc = GetDatabaseEncoding(); PG_RETURN_TEXT_P(encode_to_ascii(data, enc));}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -