8
0
mirror of https://github.com/FirebirdSQL/firebird.git synced 2025-01-24 21:23:04 +01:00
firebird-mirror/src/jrd/intl.h

145 lines
4.7 KiB
C
Raw Normal View History

2001-05-23 15:26:42 +02:00
/*
* PROGRAM: JRD International support
* MODULE: intl.h
* DESCRIPTION: International text handling definitions
*
* The contents of this file are subject to the Interbase Public
* License Version 1.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy
* of the License at http://www.Inprise.com/IPL.html
*
* Software distributed under the License is distributed on an
* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express
* or implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code was created by Inprise Corporation
* and its predecessors. Portions created by Inprise Corporation are
* Copyright (C) Inprise Corporation.
*
* All Rights Reserved.
* Contributor(s): ______________________________________.
*/
#ifndef JRD_INTL_H
#define JRD_INTL_H
2001-05-23 15:26:42 +02:00
#include "../intl/charsets.h"
#define ASCII_SPACE 32 /* ASCII code for space */
#define INTL_name_not_found 1
#define INTL_subtype_not_implemented 2
/*
* Default character set name for specification of COLLATE clause without
* a CHARACTER SET clause.
*
* NATIONAL_CHARACTER_SET is used for SQL's NATIONAL character type.
*/
2003-01-25 04:12:46 +01:00
#define DEFAULT_CHARACTER_SET_NAME "ISO8859_1"
2001-05-23 15:26:42 +02:00
#define NATIONAL_CHARACTER_SET DEFAULT_CHARACTER_SET_NAME
#define DEFAULT_DB_CHARACTER_SET_NAME "NONE"
2001-05-23 15:26:42 +02:00
/*
* Character Set used for system metadata information
*/
#define CS_METADATA CS_UNICODE_FSS /* metadata charset */
/* text type definitions */
#define ttype_none CS_NONE /* 0 */
#define ttype_ascii CS_ASCII /* 2 */
#define ttype_binary CS_BINARY /* 1 */
#define ttype_unicode_fss CS_UNICODE_FSS /* 3 */
#define ttype_last_internal 4 /* CS_reserved4 */
#define ttype_dynamic CS_dynamic /* use att_charset */
#define ttype_sort_key ttype_binary
#define ttype_metadata ttype_unicode_fss
/* Note:
* changing the value of ttype_metadata is an ODS System Metadata change
* changing the value of CS_METADATA is an ODS System Metadata change
*/
#define COLLATE_NONE 0 /* No special collation, use codepoint order */
#define INTL_ASSIGN_DSC(dsc, cs, coll) \
{ (dsc)->dsc_sub_type = (SSHORT) ((coll) << 8 | (cs)); }
#define INTL_COPY_DSC(dest, src) \
{ (dest)->dsc_sub_type = (src)->dsc_sub_type; }
#define INTL_GET_TTYPE(dsc) \
((dsc)->dsc_sub_type)
#define INTL_GET_CHARSET(dsc) ((SCHAR)((dsc)->dsc_sub_type & 0x00FF))
#define INTL_GET_COLLATE(dsc) ((SCHAR)((dsc)->dsc_sub_type >> 8))
/* Define tests for international data */
2004-05-12 02:02:37 +02:00
#define INTL_TTYPE(desc) ((desc)->dsc_sub_type)
#define INTL_ASSIGN_TTYPE(desc, value) ((desc)->dsc_sub_type = (SSHORT)(value))
2001-05-23 15:26:42 +02:00
2004-05-12 02:02:37 +02:00
#define INTERNAL_TTYPE(d) (((USHORT)((d)->dsc_sub_type)) <= ttype_last_internal)
2001-05-23 15:26:42 +02:00
#define IS_INTL_DATA(d) ((d)->dsc_dtype <= dtype_any_text && \
2004-05-12 02:02:37 +02:00
(((USHORT)((d)->dsc_sub_type)) > ttype_last_internal))
2001-05-23 15:26:42 +02:00
2003-10-21 00:41:11 +02:00
#define INTL_TEXT_TYPE(desc) ((DTYPE_IS_TEXT((desc).dsc_dtype)) ? INTL_TTYPE (&(desc)) : ttype_ascii)
2001-05-23 15:26:42 +02:00
#define INTL_DYNAMIC_CHARSET(desc) (INTL_GET_CHARSET(desc) == CS_dynamic)
/*
* There are several ways text types are used internally to InterBase
* 1) As a CHARACTER_SET_ID & COLLATION_ID pair (in metadata).
* 2) As a CHARACTER_SET_ID (when collation isn't relevent, like UDF parms)
* 3) As an index type - (btr.h)
* 4) As a driver ID (used to lookup the code which implements the locale)
2004-05-12 02:02:37 +02:00
* This is also known as dsc_sub_type (aka text subtype).
2001-05-23 15:26:42 +02:00
*
* In Descriptors (DSC) the data is encoded as:
* dsc_charset overloaded into dsc_scale
* dsc_collate overloaded into dsc_sub_type
*
* Index types are converted to driver ID's via INTL_INDEX_TYPE
*
*/
/* There must be a 1-1 mapping between index types and International text
* subtypes -
* Index-to-subtype: to compute a KEY from a Text string we must know both
* the TEXT format and the COLLATE routine to use (eg: the subtype info).
* We need the text-format as the datavalue for key creation may not
* match that needed for the index.
* Subtype-to-index: When creating indices, they are assigned an
* Index type, which is derived from the datatype of the target.
*
*/
#define INTL_INDEX_TO_TEXT(idxType) ((SSHORT)((idxType) - idx_offset_intl_range))
/* Maps a text_type to an index ID */
#define INTL_TEXT_TO_INDEX(tType) ((USHORT)((tType) + idx_offset_intl_range))
#define MAP_CHARSET_TO_TTYPE(cs) (cs & 0x00FF)
#define INTL_RES_TTYPE(desc) (INTL_DYNAMIC_CHARSET(desc) ?\
MAP_CHARSET_TO_TTYPE(tdbb->tdbb_attachment->att_charset) :\
INTL_GET_TTYPE (desc))
#define INTL_INDEX_TYPE(desc) INTL_TEXT_TO_INDEX (INTL_RES_TTYPE (desc))
/* Maps a Character_set_id & collation_id to a text_type (driver ID) */
#define INTL_CS_COLL_TO_TTYPE(cs,coll) ((SSHORT)((coll) << 8 | ((cs) & 0x00FF)))
#endif /* JRD_INTL_H */
2004-03-07 08:58:55 +01:00