1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*
2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru**********************************************************************
383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius*   Copyright (C) 1999-2011, International Business Machines
4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   Corporation and others.  All Rights Reserved.
5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru**********************************************************************
6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*  ucnv_imp.h:
9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*  Contains all internal and external data structure definitions
10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Created & Maitained by Bertrand A. Damiba
11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* ATTENTION:
15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* ---------
16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Although the data structures in this file are open and stack allocatable
17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* we reserve the right to hide them in further releases.
18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*/
19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifndef UCNV_IMP_H
21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define UCNV_IMP_H
22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/utypes.h"
24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if !UCONFIG_NO_CONVERSION
26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/uloc.h"
28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "ucnv_bld.h"
29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/*
3185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * Fast check for whether a charset name is "UTF-8".
3285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * This does not recognize all of the variations that ucnv_open()
3385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * and other functions recognize, but it covers most cases.
3485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * @param name const char * charset name
3585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * @return
3685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho */
3785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define UCNV_FAST_IS_UTF8(name) \
3885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    (((name[0]=='U' ? \
3985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho      (                name[1]=='T' && name[2]=='F') : \
4085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho      (name[0]=='u' && name[1]=='t' && name[2]=='f'))) \
4185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho  && (name[3]=='-' ? \
4285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho     (name[4]=='8' && name[5]==0) : \
4385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho     (name[3]=='8' && name[4]==0)))
4485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
4585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hotypedef struct {
4685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    char cnvName[UCNV_MAX_CONVERTER_NAME_LENGTH];
4785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    char locale[ULOC_FULLNAME_CAPACITY];
4885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    uint32_t options;
4985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} UConverterNamePieces;
5085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
5185bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoU_CFUNC UBool
5285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Houcnv_canCreateConverter(const char *converterName, UErrorCode *err);
5385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* figures out if we need to go to file to read in the data tables.
55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param converterName The name of the converter
56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param err The error code
57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return the newly created converter
58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
5983a171d1a62abf406f7f44ae671823d5ec20db7dCraig CorneliusU_CAPI UConverter *
6083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Corneliusucnv_createConverter(UConverter *myUConverter, const char *converterName, UErrorCode * err);
61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*
63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Open a purely algorithmic converter, specified by a type constant.
64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param myUConverter  NULL, or pre-allocated UConverter structure to avoid
65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *                      a memory allocation
66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param type          requested converter type
67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param locale        locale parameter, or ""
68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param options       converter options bit set (default 0)
69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param err           ICU error code, not tested for U_FAILURE on input
70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *                      because this is an internal function
71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @internal
72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CFUNC UConverter *
74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruucnv_createAlgorithmicConverter(UConverter *myUConverter,
75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                                UConverterType type,
76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                                const char *locale, uint32_t options,
77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                                UErrorCode *err);
78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
7985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/*
8085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * Creates a converter from shared data.
8185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * Adopts mySharedConverterData: No matter what happens, the caller must not
8285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * unload mySharedConverterData, except via ucnv_close(return value)
8385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * if this function is successful.
84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
8583a171d1a62abf406f7f44ae671823d5ec20db7dCraig CorneliusU_CFUNC UConverter *
8685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Houcnv_createConverterFromSharedData(UConverter *myUConverter,
8785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                                   UConverterSharedData *mySharedConverterData,
8885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                                   UConverterLoadArgs *pArgs,
8985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                                   UErrorCode *err);
90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
9183a171d1a62abf406f7f44ae671823d5ec20db7dCraig CorneliusU_CFUNC UConverter *
9283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Corneliusucnv_createConverterFromPackage(const char *packageName, const char *converterName, UErrorCode *err);
93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Load a converter but do not create a UConverter object.
96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Simply return the UConverterSharedData.
97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Performs alias lookup etc.
9885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * The UConverterNamePieces need not be initialized
9985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * before calling this function.
10085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * The UConverterLoadArgs must be initialized
10185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * before calling this function.
10285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * If the args are passed in, then the pieces must be passed in too.
10385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * In other words, the following combinations are allowed:
10485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * - pieces==NULL && args==NULL
10585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * - pieces!=NULL && args==NULL
10685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * - pieces!=NULL && args!=NULL
107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @internal
108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
10983a171d1a62abf406f7f44ae671823d5ec20db7dCraig CorneliusU_CFUNC UConverterSharedData *
11085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Houcnv_loadSharedData(const char *converterName,
11185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                    UConverterNamePieces *pieces,
11285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                    UConverterLoadArgs *pArgs,
11385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                    UErrorCode * err);
114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * This may unload the shared data in a thread safe manner.
117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * This will only unload the data if no other converters are sharing it.
118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
11983a171d1a62abf406f7f44ae671823d5ec20db7dCraig CorneliusU_CFUNC void
120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruucnv_unloadSharedDataIfReady(UConverterSharedData *sharedData);
121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * This is a thread safe way to increment the reference count.
124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
12583a171d1a62abf406f7f44ae671823d5ec20db7dCraig CorneliusU_CFUNC void
126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruucnv_incrementRefCount(UConverterSharedData *sharedData);
127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
12885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/**
12985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * These are the default error handling callbacks for the charset conversion framework.
13085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * For performance reasons, they are only called to handle an error (not normally called for a reset or close).
13185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho */
132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define UCNV_TO_U_DEFAULT_CALLBACK ((UConverterToUCallback) UCNV_TO_U_CALLBACK_SUBSTITUTE)
133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define UCNV_FROM_U_DEFAULT_CALLBACK ((UConverterFromUCallback) UCNV_FROM_U_CALLBACK_SUBSTITUTE)
134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif /* _UCNV_IMP */
138