<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
                   "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd">

<book id="framework">

<bookinfo>
   <title>X11R6 Sample Implementation Frame Work</title>
   <releaseinfo>X Version 11, Release 7</releaseinfo>
   <authorgroup>
      <othercredit>
         <firstname>Katsuhisa</firstname><surname>Yano</surname>
         <affiliation><orgname>TOSHIBA Corporation</orgname></affiliation>
      </othercredit>
      <othercredit>
         <firstname>Yoshio</firstname><surname>Horiuchi</surname>
         <affiliation><orgname>IBM Japan</orgname></affiliation>
      </othercredit>
   </authorgroup>
   <copyright><year>1994</year><holder>TOSHIBA Corporation</holder></copyright>
   <copyright><year>1994</year><holder>IBM Corporation</holder></copyright>

<legalnotice>

<para>
Permission to use, copy, modify, and distribute this documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice and this permission notice appear in all copies. TOSHIBA Corporation and
IBM Corporation make no representations about the suitability for any purpose of the information in this document.
This documentation is provided as is without express or implied warranty.
</para>

<para>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files
(the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to permit
persons to whom the Software is furnished to do so, subject to the following
conditions:
</para>

<para>
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
</para>

<para>
THE SOFTWARE IS PROVIDED &ldquo;AS IS&rdquo;, WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN
NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
</para>

<para>
Except as contained in this notice, the name of The Open Group shall not
be used in advertising or otherwise to promote the sale, use or other dealings
in this Software without prior written authorization from X Consortium.
</para>

<para>X Window System is a trademark of The Open Group.</para>

</legalnotice>
</bookinfo>

<chapter id="framework_">
<title>Framework</title>
<sect1 id="preface">
<title>Preface</title>
<para>
This document proposes to define the structures, methods and their
signatures that are expected to be common to all locale dependent
functions within the Xlib sample implementation.  The following
illustration (Fig.1) <!-- xref --> is proposed to outline the separating of
the components within the sample implementation.
</para>

<para>
Preface drawing.
</para>

<mediaobject  id="framework_locale_service_api_proposal">
  <imageobject>
    <imagedata   width="540px" depth="530px" contentwidth="560px" contentdepth="550px" format="SVG"  fileref="framework.svg"/>
  </imageobject>
  <caption>Frame work of Locale Service API Proposal</caption>
</mediaobject>

<para>
Generally speaking, the internationalized portion of Xlib (Locale
Dependent X, LDX) consists of three objects;
locale (LC) , input method (IM) and output method (OM).
The LC provides a set of information that depends on user's language
environment.  The IM manages text inputing, and the OM manages text
drawing.  Both IM and OM highly depend on LC data.
</para>

<para>
In X11R5, there are two sample implementations, Ximp and Xsi, for
Xlib internationalization.  But in both implementations, IM and OM
actually refer the private extension of LC.  It breaks coexistence
of these two sample implementations.  For example, if a user creates
a new OM for special purpose as a part of Ximp, it will not work with
Xsi.
</para>

<para>
As a solution of this problem, we propose to define the standard
APIs between these three objects, and define the structure that are
common to these objects.
</para>
</sect1>

<sect1 id="Objective">
<title>Objective</title>

<itemizedlist>
  <listitem>
    <para>
Explain the current X11R6 sample implementation
    </para>
  </listitem>
  <listitem>
    <para>
Document the common set of locale dependent interfaces
    </para>
  </listitem>
  <listitem>
    <para>
Provide more flexible pluggable layer
    </para>
  </listitem>
</itemizedlist>
</sect1>

<sect1 id="Locale_Object_Binding_Functions">
<title>Locale Object Binding Functions</title>
<!-- .XS (SN Locale Object Binding Functions -->
<!-- .XE  -->
<para>
This chapter describes functions related locale object binding for
implementing the pluggable layer.
</para>

<para>
A locale loader is an entry point for locale object, which
instantiates XLCd object and binds locale methods with specified
locale name. The behavior of loader is implementation dependent.
And, what kind of loaders are available is also implementation
dependent.
</para>

<para>
<!-- .LP -->
The loader is called in
<function>_XOpenLC, </function>
but caller of
<function>_XOpenLC </function>
does not need to care about its inside.  For example, if the loader is
implemented with dynamic load functions, and the dynamic module is
expected to be unloaded when the corresponding XLCd is freed,
close methods of XLCdMethods should handle unloading.
</para>

<para>
<emphasis role="bold">Initializing a locale loader list</emphasis>
</para>

<para>void _XlcInitLoader</para>


<para>
The
<function>_XlcInitLoader</function>
function initializes the locale loader list with vendor specific
manner.  Each loader is registered with calling
<function>_XlcAddLoader.</function>
The number of loaders and their order in the loader list is
implementation dependent.
</para>

<para>
<emphasis role="bold">Add a loader</emphasis>
</para>

<literallayout>
typedef XLCd (*XLCdLoadProc)(<emphasis remap='I'>name</emphasis>);
      char <emphasis remap='I'>*name</emphasis>;

typedef int XlcPosition;

#define   XlcHead
#define   XlcTail
</literallayout>

<funcsynopsis>
<funcprototype>
  <funcdef>Bool <function> _XlcAddLoader</function></funcdef>
  <paramdef>XLCdLoadProc<parameter> proc</parameter></paramdef>
  <paramdef>XlcPosition<parameter> position</parameter></paramdef>
</funcprototype>
</funcsynopsis>

<para>
The
<function>_XlcAddLoader</function>
function registers the specified locale loader "<emphasis remap='I'>proc</emphasis>" to the
internal loader list.  The position specifies that the loader
"<emphasis remap='I'>proc</emphasis>" should be placed in the top of the loader list(XlcHead)
or last(XlcTail).
</para>

<para>
The object loader is called from the top of the loader list in order,
when calling time.
</para>

<para>
<function>Remove a loader</function>
</para>

<funcsynopsis>
<funcprototype>
  <funcdef>void <function> _XlcRemoveLoader</function></funcdef>
  <paramdef>XLCdLoadProc<parameter> proc</parameter></paramdef>
</funcprototype>
</funcsynopsis>

<para>
The
<function>_XlcRemoveLoader</function>
function removes the locale loader specified by "<emphasis remap='I'>proc</emphasis>" from the
loader list.
</para>

<para>
Current implementation provides following locale loaders;
</para>

<literallayout>
<function>_XlcDefaultLoader</function>
<function>_XlcGenericLoader</function>
<function>_XlcEucLoader</function>
<function>_XlcSjisLoader</function>
<function>_XlcUtfLoader</function>
<function>_XaixOsDynamicLoad</function>
</literallayout>

</sect1>

<sect1 id="Locale_Method_Interface">
<title>Locale Method Interface</title>

<para>
This chapter describes the locale method API, which is a set of
accessible functions from both IM and OM parts.
The locale method API provides the functionalities;  obtaining locale
dependent information, handling charset, converting text, etc.
</para>

<para>
As a result of using these APIs instead of accessing vender private
extension of the locale object, we can keep locale, IM and OM
independently each other.
</para>

</sect1>

<sect1 id="Locale_Method_Functions">
<title>Locale Method Functions</title>
<para>
<function>Open a Locale Method</function>
</para>

<funcsynopsis>
<funcprototype>
  <funcdef>XLCd <function> _XOpenLC</function></funcdef>
  <paramdef>char<parameter> *name</parameter></paramdef>
</funcprototype>
</funcsynopsis>

<para>
The
<function>_XOpenLC</function>
function opens a locale method which corresponds to the
specified locale name.
<function>_XOpenLC</function>
calls a locale object loader, which is registered via
<function>_XlcAddLoader into the internal loader list.  If the called loader </function>
is valid and successfully opens a locale,
<function>_XOpenLC</function>
returns the XLCd.  If the loader is invalid or failed to open a locale,
<function>_XOpenLC</function>
calls the next loader.  If all registered loaders cannot open a locale,
<function>_XOpenLC</function>
returns NULL.
</para>

<para>XLCd _XlcCurrentLC</para>

<para>
The
<function>_XlcCurrentLC</function>
function returns an XLCd that are bound to current locale.
</para>

<para>
<emphasis role="bold">Close a Locale Method</emphasis>
</para>

<funcsynopsis>
<funcprototype>
  <funcdef>void <function> _XCloseLC</function></funcdef>
  <paramdef>XLCd<parameter> lcd</parameter></paramdef>
</funcprototype>
</funcsynopsis>

<para>
<!-- .LP -->
The
<function>_XCloseLC</function>
function close a locale method the specified lcd.
</para>

<para>
<emphasis role="bold">Obtain Locale Method values</emphasis>
</para>

<funcsynopsis>
<funcprototype>
  <funcdef>char *<function>_XGetLCValues</function></funcdef>
  <paramdef>XLCd<parameter> lcd</parameter></paramdef>
</funcprototype>
</funcsynopsis>

<para>
The
<function>_XGetLCValues</function>
function returns NULL if no error occurred; otherwise, it returns the
name of the first argument that could not be obtained.
The following values are defined as standard arguments. Other values
are implementation dependent.
</para>

<informaltable frame="none">
  <tgroup cols='3' align='left'>
  <colspec colname='c1' colwidth="3*" colsep="0"/>
  <colspec colname='c2' colwidth="1*" colsep="0"/>
  <colspec colname='c3' colwidth="3*" colsep="0"/>
  <thead>
    <row>
      <entry>Name</entry>
      <entry>Type</entry>
      <entry>Description</entry>
    </row>
  </thead>
  <tbody>
    <row rowsep="0">
      <entry>XlcNCodeset</entry>
      <entry>char*</entry>
      <entry>codeset part of locale name</entry>
    </row>
    <row rowsep="0">
      <entry>XlcNDefaultString</entry>
      <entry>char*</entry>
      <entry>XDefaultString()</entry>
    </row>
    <row rowsep="0">
      <entry>XlcNEncodingName</entry>
      <entry>char*</entry>
      <entry>encoding name</entry>
    </row>
    <row rowsep="0">
      <entry>XlcNLanguage</entry>
      <entry>char*</entry>
      <entry>language part of locale name</entry>
    </row>
    <row rowsep="0">
      <entry>XlcNMbCurMax</entry>
      <entry>int</entry>
      <entry>ANSI C MB_CUR_MAX</entry>
    </row>
    <row rowsep="0">
      <entry>XlcNStateDependentEncoding</entry>
      <entry>Bool</entry>
      <entry>is state-dependent encoding or not</entry>
    </row>
    <row rowsep="0">
      <entry>XlcNTerritory</entry>
      <entry>char*</entry>
      <entry>territory part of locale name</entry>
    </row>
  </tbody>
  </tgroup>
</informaltable>

</sect1>

<sect1 id="Charset_functions">
<title>Charset functions</title>
<para>
The XlcCharSet is an identifier which represents a subset of characters
(character set) in the locale object.
</para>

<literallayout class="monospaced">
typedef enum {
      XlcUnknown, XlcC0, XlcGL, XlcC1, XlcGR, XlcGLGR, XlcOther
} XlcSide;

typedef struct _XlcCharSetRec *XlcCharSet;

typedef struct {
      char *name;
      XPointer value;
} XlcArg, *XlcArgList;

typedef char* (*XlcGetCSValuesProc)(<emphasis remap='I'>charset</emphasis>, <emphasis remap='I'>args</emphasis>, <emphasis remap='I'>num_args</emphasis>);
      XlcCharSet <emphasis remap='I'>charset</emphasis>;
      XlcArgList <emphasis remap='I'>args</emphasis>;
      int <emphasis remap='I'>num_args</emphasis>;

typedef struct _XlcCharSetRec {
      char *name;
      XrmQuark xrm_name;
      char *encoding_name;
      XrmQuark xrm_encoding_name;
      XlcSide side;
      int char_size;
      int set_size;
      char *ct_sequence;
      XlcGetCSValuesProc get_values;
} XlcCharSetRec;
</literallayout>

<para>
<emphasis role="bold">Get an XlcCharSet</emphasis>
</para>

<funcsynopsis>
<funcprototype>
  <funcdef>XlcCharSet <function> _XlcGetCharSet</function></funcdef>
  <paramdef>char<parameter> *name</parameter></paramdef>
</funcprototype>
</funcsynopsis>

<para>
The
<function>_XlcGetCharSet</function>
function gets an XlcCharSet which corresponds to the charset name
specified by "<emphasis remap='I'>name</emphasis>".
<function>_XlcGetCharSet </function>
returns NULL, if no XlcCharSet bound to specified "<emphasis remap='I'>name</emphasis>".
</para>

<para>
The following character sets are pre-registered.
</para>

<informaltable frame="none">
  <tgroup cols='2' align='left'>
  <colspec colname='c1' colwidth="1*" colsep="0"/>
  <colspec colname='c2' colwidth="2*" colsep="0"/>
  <thead>
    <row>
      <entry>Name</entry>
      <entry>Description</entry>
    </row>
  </thead>
  <tbody>
    <row rowsep="0">
      <entry>ISO8859-1:GL</entry>
      <entry>7-bit ASCII graphics (ANSI X3.4-1968),</entry>
    </row>
    <row rowsep="0">
      <entry></entry>
      <entry>Left half of ISO 8859 sets</entry>
    </row>
    <row rowsep="0">
      <entry>JISX0201.1976-0:GL</entry>
      <entry>Left half of JIS X0201-1976 (reaffirmed 1984),</entry>
    </row>
    <row rowsep="0">
      <entry></entry>
      <entry>8-Bit Alphanumeric-Katakana Code</entry>
    </row>
    <row rowsep="0">
      <entry>ISO8859-1:GR</entry>
      <entry>Right half of ISO 8859-1, Latin alphabet No. 1</entry>
    </row>
    <row rowsep="0">
      <entry>ISO8859-2:GR</entry>
      <entry>Right half of ISO 8859-2, Latin alphabet No. 2</entry>
    </row>
    <row rowsep="0">
      <entry>ISO8859-3:GR</entry>
      <entry>Right half of ISO 8859-3, Latin alphabet No. 3</entry>
    </row>
    <row rowsep="0">
      <entry>ISO8859-4:GR</entry>
      <entry>Right half of ISO 8859-4, Latin alphabet No. 4</entry>
    </row>
    <row rowsep="0">
      <entry>ISO8859-7:GR</entry>
      <entry>Right half of ISO 8859-7, Latin/Greek alphabet</entry>
    </row>
    <row rowsep="0">
      <entry>ISO8859-6:GR</entry>
      <entry>Right half of ISO 8859-6, Latin/Arabic alphabet</entry>
    </row>
    <row rowsep="0">
      <entry>ISO8859-8:GR</entry>
      <entry>Right half of ISO 8859-8, Latin/Hebrew alphabet</entry>
    </row>
    <row rowsep="0">
      <entry>ISO8859-5:GR</entry>
      <entry>Right half of ISO 8859-5, Latin/Cyrillic alphabet</entry>
    </row>
    <row rowsep="0">
      <entry>ISO8859-9:GR</entry>
      <entry>Right half of ISO 8859-9, Latin alphabet No. 5</entry>
    </row>
    <row rowsep="0">
      <entry>JISX0201.1976-0:GR</entry>
      <entry>Right half of JIS X0201-1976 (reaffirmed 1984),</entry>
    </row>
    <row rowsep="0">
      <entry></entry>
      <entry>8-Bit Alphanumeric-Katakana Code</entry>
    </row>
    <row rowsep="0">
      <entry>GB2312.1980-0:GL</entry>
      <entry>GB2312-1980, China (PRC) Hanzi defined as GL</entry>
    </row>
    <row rowsep="0">
      <entry>GB2312.1980-0:GR</entry>
      <entry>GB2312-1980, China (PRC) Hanzi defined as GR</entry>
    </row>
    <row rowsep="0">
      <entry>JISX0208.1983-0:GL</entry>
      <entry>JIS X0208-1983, Japanese Graphic Character Set</entry>
    </row>
    <row rowsep="0">
      <entry></entry>
      <entry>defined as GL</entry>
    </row>
    <row rowsep="0">
      <entry>JISX0208.1983-0:GR</entry>
      <entry>JIS X0208-1983, Japanese Graphic Character Set</entry>
    </row>
    <row rowsep="0">
      <entry></entry>
      <entry>defined as GR</entry>
    </row>
    <row rowsep="0">
      <entry>KSC5601.1987-0:GL</entry>
      <entry>KS C5601-1987, Korean Graphic Character Set</entry>
    </row>
    <row rowsep="0">
      <entry></entry>
      <entry>defined as GL</entry>
    </row>
    <row rowsep="0">
      <entry>KSC5601.1987-0:GR</entry>
      <entry>KS C5601-1987, Korean Graphic Character Set</entry>
    </row>
    <row rowsep="0">
      <entry></entry>
      <entry>defined as GR</entry>
    </row>
    <row rowsep="0">
      <entry>JISX0212.1990-0:GL</entry>
      <entry>JIS X0212-1990, Japanese Graphic Character Set</entry>
    </row>
    <row rowsep="0">
      <entry></entry>
      <entry>defined as GL</entry>
    </row>
    <row rowsep="0">
      <entry>JISX0212.1990-0:GR</entry>
      <entry>JIS X0212-1990, Japanese Graphic Character Set</entry>
    </row>
    <row rowsep="0">
      <entry></entry>
      <entry>defined as GR</entry>
    </row>
  </tbody>
  </tgroup>
</informaltable>

<para>
<emphasis role="bold">Add an XlcCharSet</emphasis>
</para>

<funcsynopsis>
<funcprototype>
  <funcdef>Bool <function> _XlcAddCharSet</function></funcdef>
  <paramdef>XlcCharSet<parameter> charset</parameter></paramdef>
</funcprototype>
</funcsynopsis>

<para>
The
<function>_XlcAddCharSet</function>
function registers XlcCharSet specified by "<emphasis remap='I'>charset</emphasis>".
</para>

<para>
<!-- .LP -->
<!-- .sp -->
<function>Obtain Character Set values</function>
</para>

<funcsynopsis>
<funcprototype>
  <funcdef>char * <function> _XlcGetCSValues</function></funcdef>
  <paramdef>XlcCharSet<parameter> charset</parameter></paramdef>
  <paramdef><parameter> ...</parameter></paramdef>
</funcprototype>
</funcsynopsis>

<para>
The
<function>_XlcGetCSValues</function>
function returns NULL if no error occurred;
otherwise, it returns the name of the first argument that could not
be obtained.  The following values are defined as standard arguments.
Other values are implementation dependent.
</para>

<informaltable frame="none">
  <tgroup cols='3' align='left'>
  <colspec colname='c1' colwidth="3*" colsep="0"/>
  <colspec colname='c2' colwidth="1*" colsep="0"/>
  <colspec colname='c3' colwidth="3*" colsep="0"/>
  <thead>
    <row>
      <entry>Name</entry>
      <entry>Type</entry>
      <entry>Description</entry>
    </row>
  </thead>
  <tbody>
    <row rowsep="0">
      <entry>XlcNName</entry>
      <entry>char*</entry>
      <entry>charset name</entry>
    </row>
    <row rowsep="0">
      <entry>XlcNEncodingName</entry>
      <entry>char*</entry>
      <entry>XLFD CharSet Registry and Encoding</entry>
    </row>
    <row rowsep="0">
      <entry>XlcNSide</entry>
      <entry>XlcSide</entry>
      <entry>charset side (GL, GR, ...)</entry>
    </row>
    <row rowsep="0">
      <entry>XlcNCharSize</entry>
      <entry>int</entry>
      <entry>number of octets per character</entry>
    </row>
    <row rowsep="0">
      <entry>XlcNSetSize</entry>
      <entry>int</entry>
      <entry>number of character sets</entry>
    </row>
    <row rowsep="0">
      <entry>XlcNControlSequence</entry>
      <entry>char*</entry>
      <entry>control sequence of Compound Text</entry>
    </row>
  </tbody>
  </tgroup>
</informaltable>

</sect1>

<sect1 id="Converter_Functions">
<title>Converter Functions</title>
<para>
We provide a set of the common converter APIs, that are independent
from both of source and destination text type.
</para>

<literallayout class="monospaced">
typedef struct _XlcConvRec *XlcConv;

typedef void (*XlcCloseConverterProc)(<emphasis remap='I'>conv</emphasis>);
      XlcConv <emphasis remap='I'>conv</emphasis>;

typedef int (*XlcConvertProc)(<emphasis remap='I'>conv</emphasis>, <emphasis remap='I'>from</emphasis>, <emphasis remap='I'>from_left</emphasis>, <emphasis remap='I'>to</emphasis>, <emphasis remap='I'>to_left</emphasis>, <emphasis remap='I'>args</emphasis>, <emphasis remap='I'>num_args</emphasis>);
      XlcConv <emphasis remap='I'>conv</emphasis>;
      XPointer <emphasis remap='I'>*from</emphasis>;
      int <emphasis remap='I'>*from_left</emphasis>;
      XPointer <emphasis remap='I'>*to</emphasis>;
      int <emphasis remap='I'>*to_left</emphasis>;
      XPointer <emphasis remap='I'>*args</emphasis>;
      int <emphasis remap='I'>num_args</emphasis>;

typedef void (*XlcResetConverterProc)(<emphasis remap='I'>conv</emphasis>);
      XlcConv <emphasis remap='I'>conv</emphasis>;

typedef struct _XlcConvMethodsRec {
      XlcCloseConverterProc close;
      XlcConvertProc convert;
      XlcResetConverterProc reset;
} XlcConvMethodsRec, *XlcConvMethods;

typedef struct _XlcConvRec {
    XlcConvMethods methods;
    XPointer state;
} XlcConvRec;
</literallayout>

<para>
<function>Open a converter</function>
</para>

<funcsynopsis>
<funcprototype>
  <funcdef>XlcConv <function> _XlcOpenConverter</function></funcdef>
  <paramdef>XLCd<parameter> from_lcd</parameter></paramdef>
  <paramdef>char<parameter> *from_type</parameter></paramdef>
  <paramdef>XLCd<parameter> to_lcd</parameter></paramdef>
  <paramdef>char<parameter> *to_type</parameter></paramdef>
</funcprototype>
</funcsynopsis>

<para>
<function>_XlcOpenConverter </function>
function opens the converter which converts a text from specified
"<emphasis remap='I'>from_type</emphasis>" to specified "<emphasis remap='I'>to_type</emphasis>" encoding.  If the
function cannot find proper converter or cannot open a corresponding
converter, it returns NULL.  Otherwise, it returns the conversion
descriptor.
</para>

<para>
The following types are pre-defined. Other types are implementation
dependent.
</para>

<informaltable>
  <tgroup cols='4' align='left'>
  <colspec colname='c1' colwidth="3*" colsep="0"/>
  <colspec colname='c2' colwidth="1*" colsep="0"/>
  <colspec colname='c3' colwidth="3*" colsep="0"/>
  <colspec colname='c4' colwidth="2*" colsep="0"/>
  <thead>
    <row>
      <entry>Name</entry>
      <entry>Type</entry>
      <entry>Description</entry>
      <entry>Arguments</entry>
    </row>
  </thead>
  <tbody>
    <row rowsep="0">
      <entry>XlcNMultiByte</entry>
      <entry>char *</entry>
      <entry>multibyte</entry>
      <entry>-</entry>
    </row>
    <row rowsep="0">
      <entry>XlcNWideChar</entry>
      <entry>wchar_t *</entry>
      <entry>wide character</entry>
      <entry>-</entry>
    </row>
    <row rowsep="0">
      <entry>XlcNCompoundText</entry>
      <entry>char *</entry>
      <entry>COMPOUND_TEXT</entry>
      <entry>-</entry>
    </row>
    <row rowsep="0">
      <entry>XlcNString</entry>
      <entry>char *</entry>
      <entry>STRING</entry>
      <entry>-</entry>
    </row>
    <row rowsep="0">
      <entry>XlcNCharSet</entry>
      <entry>char *</entry>
      <entry>per charset</entry>
      <entry>XlcCharSet</entry>
    </row>
    <row rowsep="0">
      <entry>XlcNChar</entry>
      <entry>char *</entry>
      <entry>per character</entry>
      <entry>XlcCharSet</entry>
    </row>
  </tbody>
  </tgroup>
</informaltable>

<para>
<emphasis role="bold">Close a converter</emphasis>
</para>

<funcsynopsis>
<funcprototype>
  <funcdef>void <function> _XlcCloseConverter</function></funcdef>
  <paramdef>XlcConv<parameter> conv</parameter></paramdef>
</funcprototype>
</funcsynopsis>

<para>
The
<function>_XlcCloseConverter</function>
function closes the specified converter "<emphasis remap='I'>conv</emphasis>".
</para>

<para>
<emphasis role="bold">Code conversion</emphasis>
</para>

<funcsynopsis>
<funcprototype>
  <funcdef>int <function> _XlcConvert</function></funcdef>
  <paramdef>XlcConv<parameter> conv</parameter></paramdef>
  <paramdef>XPointer<parameter> *from</parameter></paramdef>
  <paramdef>int<parameter> *from_left</parameter></paramdef>
  <paramdef>XPointer<parameter> *to</parameter></paramdef>
  <paramdef>int<parameter> *to_left</parameter></paramdef>
  <paramdef>XPointer<parameter> *args</parameter></paramdef>
  <paramdef>int<parameter> num_args</parameter></paramdef>
</funcprototype>
</funcsynopsis>

<para>
The
<function>_XlcConvert</function>
function converts a sequence of characters from one type, in the array
specified by "<emphasis remap='I'>from</emphasis>", into a sequence of corresponding characters
in another type, in the array specified by "<emphasis remap='I'>to</emphasis>".  The types are
those specified in the
<function>_XlcOpenConverter() </function>
call that returned the conversion descriptor, "<emphasis remap='I'>conv</emphasis>".
The arguments "<emphasis remap='I'>from</emphasis>", "<emphasis remap='I'>from_left</emphasis>", "<emphasis remap='I'>to</emphasis>" and
"<emphasis remap='I'>to_left</emphasis>" have the same specification of XPG4 iconv function.
</para>

<para>
For state-dependent encodings, the conversion descriptor "<emphasis remap='I'>conv</emphasis>"
is placed into its initial shift state by a call for which "<emphasis remap='I'>from</emphasis>"
is a NULL pointer, or for which "<emphasis remap='I'>from</emphasis>" points to a null pointer.
</para>

<para>
The following 2 converters prepared by locale returns appropriate
charset (XlcCharSet) in an area pointed by args[0].
</para>

<informaltable frame="none">
  <tgroup cols='3' align='left'>
  <colspec colname='c1' colwidth="1*" colsep="0"/>
  <colspec colname='c2' colwidth="1*" colsep="0"/>
  <colspec colname='c3' colwidth="2*" colsep="0"/>
  <thead>
    <row>
      <entry>From</entry>
      <entry>To</entry>
      <entry>Description</entry>
    </row>
  </thead>
  <tbody>
    <row rowsep="0">
      <entry>XlcNMultiByte</entry>
      <entry>XlcNCharSet</entry>
      <entry>Segmentation (Decomposing)</entry>
    </row>
    <row rowsep="0">
      <entry>XlcNWideChar</entry>
      <entry>XlcNCharSet</entry>
      <entry>Segmentation (Decomposing)</entry>
    </row>
  </tbody>
  </tgroup>
</informaltable>

<para>
The conversion, from XlcNMultiByte/XlcNWideChar to XlcNCharSet,
extracts a segment which has same charset encoding characters.
More than one segment cannot be converted in a call.
</para>

<para>
<emphasis role="bold">Reset a converter</emphasis>
</para>

<funcsynopsis>
<funcprototype>
  <funcdef>void <function> _XlcResetConverter</function></funcdef>
  <paramdef>XlcConv<parameter> conv</parameter></paramdef>
</funcprototype>
</funcsynopsis>

<para>
The
<function>_XlcResetConverter </function>
function reset the specified converter "<emphasis remap='I'>conv</emphasis>".
</para>

<para>
<emphasis role="bold">Register a converter</emphasis>
</para>

<literallayout class="monospaced">
typedef XlcConv (*XlcOpenConverterProc)(<emphasis remap='I'>from_lcd</emphasis>, <emphasis remap='I'>from_type</emphasis>, <emphasis remap='I'>to_lcd</emphasis>, <emphasis remap='I'>to_type</emphasis>);
      XLCd <emphasis remap='I'>from_lcd</emphasis>;
      char <emphasis remap='I'>*from_type</emphasis>;
      XLCd <emphasis remap='I'>to_lcd</emphasis>;
      char <emphasis remap='I'>*to_type</emphasis>;
</literallayout>

<funcsynopsis>
<funcprototype>
  <funcdef>Bool <function> _XlcSetConverter</function></funcdef>
  <paramdef>XLCd<parameter> from_lcd</parameter></paramdef>
  <paramdef>char<parameter> *from</parameter></paramdef>
  <paramdef>XLCd<parameter> to_lcd</parameter></paramdef>
  <paramdef>char<parameter> *to</parameter></paramdef>
  <paramdef>XlcOpenConverterProc<parameter> converter</parameter></paramdef>
</funcprototype>
</funcsynopsis>

<para>
The <function>XlcSetConverter</function> function registers a converter which convert
from "<emphasis remap='I'>from_type</emphasis>" to "<emphasis remap='I'>to_type</emphasis>" into the converter list
(in the specified XLCd).
</para>
</sect1>

<sect1 id="X_Locale_Database_functions">
<title>X Locale Database functions</title>
<para>
X Locale Database contains the subset of user's environment that
depends on language.  The following APIs are provided for accessing
X Locale Database and other locale relative files.
</para>

<para>
For more detail about  X Locale Database, please refer
X Locale Database Definition document.
</para>

<para>
<emphasis role="bold">Get a resource from database</emphasis>
</para>

<funcsynopsis>
<funcprototype>
  <funcdef>void <function> _XlcGetResource</function></funcdef>
  <paramdef>XLCd<parameter> lcd</parameter></paramdef>
  <paramdef>char<parameter> *category</parameter></paramdef>
  <paramdef>char<parameter> *class</parameter></paramdef>
  <paramdef>char<parameter> ***value</parameter></paramdef>
  <paramdef>int<parameter> *count</parameter></paramdef>
</funcprototype>
</funcsynopsis>

<para>
The
<function>_XlcGetResource</function>
function obtains a locale dependent data which is associated with the
locale of specified "<emphasis remap='I'>lcd</emphasis>".
The locale data is provided by system locale or by X Locale Database
file, and what kind of data is available is implementation dependent.
</para>

<para>
The specified "<emphasis remap='I'>category</emphasis>" and "<emphasis remap='I'>class</emphasis>" are used for
finding out the objective locale data.
</para>

<para>
The returned  value is returned in value argument in string list form,
and the returned count shows the number of strings in the value.
</para>

<para>
The returned value is owned by locale method, and should not be modified
or freed by caller.
</para>

<para>
<emphasis role="bold">Get a locale relative file name</emphasis>
</para>

<funcsynopsis>
<funcprototype>
  <funcdef>char *<function>_XlcFileName</function></funcdef>
  <paramdef>XLCd<parameter> lcd</parameter></paramdef>
  <paramdef>char<parameter> *category</parameter></paramdef>
</funcprototype>
</funcsynopsis>

<para>
The
<function>_XlcFileName</function>
functions returns a file name which is bound to the specified "<emphasis remap='I'>lcd</emphasis>"
and "<emphasis remap='I'>category</emphasis>", as a null-terminated string.  If no file name can
be found, or there is no readable file for the found file name,
<function>_XlcFileName</function>
returns NULL.  The returned file name should be freed by caller.
</para>

<para>
The rule for searching a file name is implementation dependent.
In current implementation,
<function>_XlcFileName </function>
uses "{category}.dir" file as mapping table, which has pairs of
strings, a full locale name and a corresponding file name.
</para>

</sect1>

<sect1 id="Utility_Functions">
<title>Utility Functions</title>

<para>
<emphasis role="bold">Compare Latin-1 strings</emphasis>
</para>

<funcsynopsis>
<funcprototype>
  <funcdef>int <function> _XlcCompareISOLatin1</function></funcdef>
  <paramdef>char*str1,<parameter> *str2</parameter></paramdef>
</funcprototype>
</funcsynopsis>

<funcsynopsis>
<funcprototype>
  <funcdef>int <function> _XlcNCompareISOLatin1</function></funcdef>
  <paramdef>char*str1,<parameter> *str2</parameter></paramdef>
  <paramdef>int<parameter> len</parameter></paramdef>
</funcprototype>
</funcsynopsis>

<para>
The
<function>_XlcCompareIsoLatin1 </function>
function to compares two ISO-8859-1 strings.  Bytes representing ASCII lower
case letters are converted to upper case before making the comparison.
The value returned is an integer less than, equal to, or greater than
zero, depending on whether "<emphasis remap='I'>str1</emphasis>" is lexicographicly less than,
equal to, or greater than "<emphasis remap='I'>str2</emphasis>".
</para>

<para>
The
<function>_XlcNCompareIsoLatin1</function>
function is identical to
<function>_XlcCompareISOLatin1,</function>
except that at most "<emphasis remap='I'>len</emphasis>" bytes are compared.
</para>

<para>
<emphasis role="bold">Resource Utility</emphasis>
</para>

<funcsynopsis>
<funcprototype>
  <funcdef>int <function> XlcNumber</function></funcdef>
  <paramdef>ArrayType<parameter> array</parameter></paramdef>
</funcprototype>
</funcsynopsis>

<para>
Similar to XtNumber.
</para>

<funcsynopsis>
<funcprototype>
  <funcdef>void <function> _XlcCopyFromArg</function></funcdef>
  <paramdef>char<parameter> *src</parameter></paramdef>
  <paramdef>char<parameter> *dst</parameter></paramdef>
  <paramdef>int<parameter> size</parameter></paramdef>
</funcprototype>
</funcsynopsis>

<funcsynopsis>
<funcprototype>
  <funcdef>void <function> _XlcCopyToArg</function></funcdef>
  <paramdef>char<parameter> *src</parameter></paramdef>
  <paramdef>char<parameter> **dst</parameter></paramdef>
  <paramdef>int<parameter> size</parameter></paramdef>
</funcprototype>
</funcsynopsis>

<para>
Similar to
<function>_XtCopyFromArg </function>
and
<function>_XtCopyToArg.</function>
</para>

<funcsynopsis>
<funcprototype>
  <funcdef>void <function> _XlcCountVaList</function></funcdef>
  <paramdef>va_list<parameter> var</parameter></paramdef>
  <paramdef>int<parameter> *count_ret</parameter></paramdef>
</funcprototype>
</funcsynopsis>

<para>
Similar to
<function>_XtCountVaList.</function>
</para>

<funcsynopsis>
<funcprototype>
  <funcdef>void <function> _XlcVaToArgList</function></funcdef>
  <paramdef>va_list<parameter> var</parameter></paramdef>
  <paramdef>int<parameter> count</parameter></paramdef>
  <paramdef>XlcArgList<parameter> *args_ret</parameter></paramdef>
</funcprototype>
</funcsynopsis>

<para>
Similar to
<function>_XtVaToArgList.</function>
</para>

<literallayout class="monospaced">
typedef struct _XlcResource {
      char *name;
      XrmQuark xrm_name;
      int size;
      int offset;
      unsigned long mask;
} XlcResource, *XlcResourceList;
</literallayout>

<literallayout class="monospaced">
#define    XlcCreateMask   (1L&lt;&lt;0)
#define    XlcDefaultMask  (1L&lt;&lt;1)
#define    XlcGetMask      (1L&lt;&lt;2)
#define    XlcSetMask      (1L&lt;&lt;3)
#define    XlcIgnoreMask   (1L&lt;&lt;4)
</literallayout>

<funcsynopsis>
<funcprototype>
  <funcdef>void <function> _XlcCompileResourceList</function></funcdef>
  <paramdef>XlcResourceList<parameter> resources</parameter></paramdef>
  <paramdef>int<parameter> num_resources</parameter></paramdef>
</funcprototype>
</funcsynopsis>

<para>
Similar to
<function>_XtCompileResourceList.</function>
</para>

<funcsynopsis>
<funcprototype>
  <funcdef>char * <function> _XlcGetValues</function></funcdef>
  <paramdef>XPointer<parameter> base</parameter></paramdef>
  <paramdef>XlcResourceList<parameter> resources</parameter></paramdef>
  <paramdef>int<parameter> num_resources</parameter></paramdef>
  <paramdef>XlcArgList<parameter> args</parameter></paramdef>
  <paramdef>int<parameter> num_args</parameter></paramdef>
  <paramdef>unsignedlong<parameter> mask</parameter></paramdef>
</funcprototype>
</funcsynopsis>

<para>
Similar to XtGetSubvalues.
</para>

<funcsynopsis>
<funcprototype>
  <funcdef>char * <function> _XlcSetValues</function></funcdef>
  <paramdef>XPointer<parameter> base</parameter></paramdef>
  <paramdef>XlcResourceList<parameter> resources</parameter></paramdef>
  <paramdef>int<parameter> num_resources</parameter></paramdef>
  <paramdef>XlcArgList<parameter> args</parameter></paramdef>
  <paramdef>int<parameter> num_args</parameter></paramdef>
  <paramdef>unsignedlong<parameter> mask</parameter></paramdef>
</funcprototype>
</funcsynopsis>

<para>
Similar to XtSetSubvalues.
</para>

<para>
<emphasis role="bold">ANSI C Compatible Functions</emphasis>
</para>

<para>
The following are ANSI C/MSE Compatible Functions for non-ANSI C environment.
</para>

<funcsynopsis>
<funcprototype>
  <funcdef>int <function> _Xmblen</function></funcdef>
  <paramdef>char<parameter> *str</parameter></paramdef>
  <paramdef>int<parameter> len</parameter></paramdef>
</funcprototype>
</funcsynopsis>

<para>
The
<function>_Xmblen </function>
function returns the number of characters pointed to by "<emphasis remap='I'>str</emphasis>".
Only "<emphasis remap='I'>len</emphasis>" bytes in "<emphasis remap='I'>str</emphasis>" are used in determining the
character count returned.  "<emphasis remap='I'>Str</emphasis>" may point at characters from
any valid codeset in the current locale.
</para>

<para>
The call
<function>_Xmblen</function>
is equivalent to
_Xmbtowc(_Xmbtowc((<emphasis remap='I'>wchar_t*</emphasis>)NULL, <emphasis remap='I'>str</emphasis>, <emphasis remap='I'>len</emphasis>))
</para>

<funcsynopsis>
<funcprototype>
  <funcdef>int <function> _Xmbtowc</function></funcdef>
  <paramdef>wchar_t<parameter> *wstr</parameter></paramdef>
  <paramdef>char<parameter> *str</parameter></paramdef>
  <paramdef>int<parameter> len</parameter></paramdef>
</funcprototype>
</funcsynopsis>

<para>
The
<function>_Xmbtowc</function>
function converts the character(s) pointed to by "<emphasis remap='I'>str</emphasis>"
to their wide character representation(s) pointed to by "<emphasis remap='I'>wstr</emphasis>".
"<emphasis remap='I'>Len</emphasis>" is the number of bytes in "<emphasis remap='I'>str</emphasis>" to be converted.
The return value is the number of characters converted.
</para>

<para>
The call
<function>_Xmbtowc</function>
is equivalent to
_Xlcmbtowc((XLCd)NULL, <emphasis remap='I'>wstr</emphasis>, <emphasis remap='I'>str</emphasis>, <emphasis remap='I'>len</emphasis>)
</para>

<funcsynopsis>
<funcprototype>
  <funcdef>int <function> _Xlcmbtowc</function></funcdef>
  <paramdef>XLCd<parameter> lcd</parameter></paramdef>
  <paramdef>wchar_t<parameter> *wstr</parameter></paramdef>
  <paramdef>char<parameter> *str</parameter></paramdef>
  <paramdef>int<parameter> len</parameter></paramdef>
</funcprototype>
</funcsynopsis>

<para>
The
<function>_Xlcmbtowc</function>
function is identical to
<function>_Xmbtowc, </function>
except that it requires the "<emphasis remap='I'>lcd</emphasis>" argument.  If "<emphasis remap='I'>lcd</emphasis>"
is (XLCd) NULL,
<function>_Xlcmbtowc, </function>
calls
<function>_XlcCurrentLC </function>
to determine the current locale.
</para>

<funcsynopsis>
<funcprototype>
  <funcdef>int <function> _Xwctomb</function></funcdef>
  <paramdef>char<parameter> *str</parameter></paramdef>
  <paramdef>wchar_t<parameter> wc</parameter></paramdef>
</funcprototype>
</funcsynopsis>

<para>
The
<function>_Xwctomb </function>
function converts a single wide character pointed to by "<emphasis remap='I'>wc</emphasis>" to
its multibyte representation pointed to by "<emphasis remap='I'>str</emphasis>".
On success, the return value is 1.
</para>

<para>
The call
<function>_Xwctomb</function>
is equivalent to
_Xlcwctomb((XLCd)NULL, <emphasis remap='I'>str</emphasis>, <emphasis remap='I'>wstr</emphasis>)
</para>

<funcsynopsis>
<funcprototype>
  <funcdef>int <function> _Xlcwctomb</function></funcdef>
  <paramdef>XLCd<parameter> lcd</parameter></paramdef>
  <paramdef>char<parameter> *str</parameter></paramdef>
  <paramdef>wchar_t<parameter> wc</parameter></paramdef>
</funcprototype>
</funcsynopsis>

<para>
The
<function>_Xlcwctomb</function>
function is identical to _Xwctomb, except that it requires the
"<emphasis remap='I'>lcd</emphasis>" argument.  If "<emphasis remap='I'>lcd</emphasis>" is (XLCd) NULL,
<function>_Xlcwctomb, </function>
calls
<function>_XlcCurrentLC </function>
to determine the current locale.
</para>

<funcsynopsis>
<funcprototype>
  <funcdef>int <function> _Xmbstowcs</function></funcdef>
  <paramdef>wchar_t<parameter> *wstr</parameter></paramdef>
  <paramdef>char<parameter> *str</parameter></paramdef>
  <paramdef>int<parameter> len</parameter></paramdef>
</funcprototype>
</funcsynopsis>

<para>
The
<function>_Xmbstowcs</function>
function converts the NULL-terminated string pointed to by "<emphasis remap='I'>str</emphasis>"
to its wide character string representation pointed to by "<emphasis remap='I'>wstr</emphasis>".
"<emphasis remap='I'>Len</emphasis>" is the number of characters in "<emphasis remap='I'>str</emphasis>" to be converted.
</para>

<para>
The call
<function>_Xmbstowcs</function>
is equivalent to
_Xlcmbstowcs((XLCd)NULL, <emphasis remap='I'>wstr</emphasis>, <emphasis remap='I'>str</emphasis>, <emphasis remap='I'>len</emphasis>)
</para>

<funcsynopsis>
<funcprototype>
  <funcdef>int <function> _Xlcmbstowcs</function></funcdef>
  <paramdef>XLCd<parameter> lcd</parameter></paramdef>
  <paramdef>wchar_t<parameter> *wstr</parameter></paramdef>
  <paramdef>char<parameter> *str</parameter></paramdef>
  <paramdef>int<parameter> len</parameter></paramdef>
</funcprototype>
</funcsynopsis>

<para>
The
<function>_Xlcmbstowcs </function>
function is identical to _Xmbstowcs, except that it requires the
"<emphasis remap='I'>lcd</emphasis>" argument.  If "<emphasis remap='I'>lcd</emphasis>" is (XLCd) NULL,
<function>_Xlcmbstowcs, </function>
calls
<function>_XlcCurrentLC</function>
to determine the current locale.
</para>

<funcsynopsis>
<funcprototype>
  <funcdef>int <function> _Xwcstombs</function></funcdef>
  <paramdef>char<parameter> *str</parameter></paramdef>
  <paramdef>wchar_t<parameter> *wstr</parameter></paramdef>
  <paramdef>int<parameter> len</parameter></paramdef>
</funcprototype>
</funcsynopsis>

<para>
The
<function>_Xwcstombs </function>
function converts the (wchar_t) NULL terminated wide character string
pointed to by "<emphasis remap='I'>wstr</emphasis>" to the NULL terminated multibyte string
pointed to by "<emphasis remap='I'>str</emphasis>".
</para>

<para>
The call
<function>_Xwcstombs </function>
is equivalent to
_Xlcwcstombs((XLCd)NULL, <emphasis remap='I'>str</emphasis>, <emphasis remap='I'>wstr</emphasis>, <emphasis remap='I'>len</emphasis>)
</para>

<funcsynopsis>
<funcprototype>
  <funcdef>int <function> _Xlcwcstombs</function></funcdef>
  <paramdef>XLCd<parameter> lcd</parameter></paramdef>
  <paramdef>char<parameter> *str</parameter></paramdef>
  <paramdef>wchar_t<parameter> *wstr</parameter></paramdef>
  <paramdef>int<parameter> len</parameter></paramdef>
</funcprototype>
</funcsynopsis>

<para>
The
<function>_Xlcwcstombs </function>
function is identical to _Xwcstombs, except that it requires the
"<emphasis remap='I'>lcd</emphasis>" argument.  If "<emphasis remap='I'>lcd</emphasis>" is (XLCd) NULL,
<function>_Xlcwcstombs, </function>
calls
<function>_XlcCurrentLC </function>
to determine the current locale.
</para>

<funcsynopsis>
<funcprototype>
  <funcdef>int <function> _Xwcslen</function></funcdef>
  <paramdef>wchar_t<parameter> *wstr</parameter></paramdef>
</funcprototype>
</funcsynopsis>

<para>
The
<function>_Xwcslen </function>
function returns the count of wide characters in the (wchar_t) NULL
terminated wide character string pointed to by "<emphasis remap='I'>wstr</emphasis>".
</para>

<funcsynopsis>
<funcprototype>
  <funcdef>wchar_t *<function> _Xwcscpy</function></funcdef>
  <paramdef>wchar_t<parameter> *wstr1</parameter></paramdef>
  <paramdef>wchar_t<parameter> *wstr2</parameter></paramdef>
</funcprototype>
</funcsynopsis>

<funcsynopsis>
<funcprototype>
  <funcdef>wchar_t * <function> _Xwcsncpy</function></funcdef>
  <paramdef>wchar_t<parameter> *wstr1</parameter></paramdef>
  <paramdef>wchar_t<parameter> *wstr2</parameter></paramdef>
  <paramdef>int<parameter> len</parameter></paramdef>
</funcprototype>
</funcsynopsis>

<para>
The
<function>_Xwcscpy </function>
function copies the (wchar_t) NULL terminated wide character string
pointed to by "<emphasis remap='I'>wstr2</emphasis>" to the object pointed at by "<emphasis remap='I'>wstr1</emphasis>".
"<emphasis remap='I'>Wstr1</emphasis>" is (wchar_t) NULL terminated.  The return value is a
pointer to "<emphasis remap='I'>wstr1</emphasis>".
</para>

<para>
The
<function>_Xwcsncpy</function>
function is identical to
<function>_Xwcscpy, </function>
except that it copies "<emphasis remap='I'>len</emphasis>" wide characters from the object
pointed to by "<emphasis remap='I'>wstr2</emphasis>" to the object pointed to "<emphasis remap='I'>wstr1</emphasis>".
</para>

<funcsynopsis>
<funcprototype>
  <funcdef>int <function> _Xwcscmp</function></funcdef>
  <paramdef>wchar_t*wstr1,<parameter> *wstr2</parameter></paramdef>
</funcprototype>
</funcsynopsis>

<funcsynopsis>
<funcprototype>
  <funcdef>int <function> _Xwcsncmp</function></funcdef>
  <paramdef>wchar_t*wstr1,<parameter> *wstr2</parameter></paramdef>
  <paramdef>int<parameter> len</parameter></paramdef>
</funcprototype>
</funcsynopsis>

<para>
The
<function>_Xwcscmp </function>
function  compares two (wchar_t) NULL terminated wide character strings.
The value returned is an integer less than, equal to, or greater than zero,
depending on whether "<emphasis remap='I'>wstr1</emphasis>" is lexicographicly less then, equal to,
or greater than "<emphasis remap='I'>str2</emphasis>".
</para>

<para>
The
<function>_Xwcsncmp </function>
function is identical to
<function>_XlcCompareISOLatin1, </function>
except that at most "<emphasis remap='I'>len</emphasis>" wide characters are compared.
</para>


<!-- .sp -->
<!-- .\" .LP -->
<!-- .\" <function>Locale Method Internal Functions</function> -->
<!-- .\" .LP -->
<!-- .\" .FD 0 -->
<!-- .\" XlcCharSet _XlcCreateDefaultCharSet(<emphasis remap='I'>name</emphasis>, <emphasis remap='I'>ct_sequence</emphasis>) -->
<!-- .\" .br -->
<!-- .\"       char <emphasis remap='I'>*name</emphasis>; -->
<!-- .\" .br -->
<!-- .\"       char <emphasis remap='I'>*ct_sequence</emphasis>; -->
<!-- .\" .FN -->
<!-- .\" .FD 0 -->
<!-- .\" Bool _XlcParseCharSet(<emphasis remap='I'>charset</emphasis>) -->
<!-- .\" .br -->
<!-- .\"       XlcCharSet <emphasis remap='I'>charset</emphasis>; -->
<!-- .\" .FN -->
<!-- .\" .FD 0 -->
<!-- .\" void _XlcGetLocaleDataBase(<emphasis remap='I'>lcd</emphasis>, <emphasis remap='I'>category</emphasis>, <emphasis remap='I'>name</emphasis>, <emphasis remap='I'>value</emphasis>, <emphasis remap='I'>count</emphasis>) -->
<!-- .\" .br -->
<!-- .\"       XLCd <emphasis remap='I'>lcd</emphasis>; -->
<!-- .\" .br -->
<!-- .\"       char <emphasis remap='I'>*category</emphasis>; -->
<!-- .\" .br -->
<!-- .\"       char <emphasis remap='I'>*name</emphasis>; -->
<!-- .\" .br -->
<!-- .\"       char <emphasis remap='I'>***value</emphasis>; -->
<!-- .\" .br -->
<!-- .\"       int <emphasis remap='I'>*count</emphasis>; -->
<!-- .\" .FN -->
<!-- .\" .FD 0 -->
<!-- .\" void _XlcDestroyLocaleDataBase(<emphasis remap='I'>lcd</emphasis>) -->
<!-- .\" .br -->
<!-- .\"       XLCd <emphasis remap='I'>lcd</emphasis>; -->
<!-- .\" .FN -->
<!-- .\" .FD 0 -->
<!-- .\" XPointer _XlcCreateLocaleDataBase(<emphasis remap='I'>lcd</emphasis>) -->
<!-- .\" .br -->
<!-- .\"       XLCd <emphasis remap='I'>lcd</emphasis>; -->
<!-- .\" .FN -->
<!-- .\" .LP -->
<!-- .\" .sp -->
<!-- .\" <function>Obtain an locale database path</function> -->
<!-- .\" .LP -->
<!-- .\" .FD 0 -->
<!-- .\" int _XlcResolveI18NPath(<emphasis remap='I'>dir</emphasis>) -->
<!-- .\" .br -->
<!-- .\"       char <emphasis remap='I'>*dir</emphasis>; -->
<!-- .\" .FN -->
<!-- .\" .LP -->
<!-- .\" The  -->
<!-- .\" .PN _XlcResolveI18NPath  -->
<!-- .\" function returns path name list that is related to X Locale Database. -->
<!-- .\" The obtained path is stored into the array which is pointed by -->
<!-- .\" specified "<emphasis remap='I'>dir</emphasis>".  The path consists of directory paths which  -->
<!-- .\" are separated with colon. -->
<!-- .\" If the environment variable XLOCALEDIR is specified, the path -->
<!-- .\" contains its contents. -->
<!-- .\" .LP -->
<!-- .\" The default path of X Locale Database is implementation dependent. -->
<!-- .\" In current implementation, it's determined in build time. -->
<!-- .\" .LP -->
<!-- .\" .PN _XlcResolveI18NPath  -->
<!-- .\" does not check overflow of the array to which the "<emphasis remap='I'>dir</emphasis>"  -->
<!-- .\" parameter points.  Caller should provide enough buffer to store this  -->
<!-- .\" string. -->
<!-- .\" .LP -->
<!-- .\" .sp -->
<!-- .\" <function>Obtain a full locale name</function> -->
<!-- .\" .LP -->
<!-- .\" .FD 0 -->
<!-- .\" int _XlcResolveLocaleName(<emphasis remap='I'>lc_name</emphasis>, <emphasis remap='I'>full_name</emphasis>, <emphasis remap='I'>language</emphasis>, <emphasis remap='I'>territory</emphasis>, <emphasis remap='I'>codeset</emphasis>) -->
<!-- .\" .br -->
<!-- .\"       char <emphasis remap='I'>*lc_name</emphasis>; -->
<!-- .\" .br -->
<!-- .\"       char <emphasis remap='I'>*full_name</emphasis>; -->
<!-- .\" .br -->
<!-- .\"       char <emphasis remap='I'>*language</emphasis>; -->
<!-- .\" .br -->
<!-- .\"       char <emphasis remap='I'>*territory</emphasis>; -->
<!-- .\" .br -->
<!-- .\"       char <emphasis remap='I'>*codeset</emphasis>; -->
<!-- .\" .FN -->
<!-- .\" .LP -->
<!-- .\" The  -->
<!-- .\" .PN _XlcResolveLocaleName  -->
<!-- .\" function returns a full locale name. -->
<!-- .\" The obtained full locale name is stored into the array which is -->
<!-- .\" pointed by specified "<emphasis remap='I'>full_name</emphasis>". -->
<!-- .\" The language, territory and codeset part of the full locale name -->
<!-- .\" are copied to the return arguments, "<emphasis remap='I'>language</emphasis>",  -->
<!-- .\" "<emphasis remap='I'>territory</emphasis>" and "<emphasis remap='I'>codeset</emphasis>", respectively. -->
<!-- .\" NULL can be specified for these arguments. -->
<!-- .\" .LP -->
<!-- .\" The rule for mapping from locale name to full locale name is -->
<!-- .\" implementation dependent. -->
<!-- .\" .LP -->
<!-- .\" .PN _XlcResolveLocaleName  -->
<!-- .\" does not check overflow of the array to which -->
<!-- .\" "<emphasis remap='I'>full_name</emphasis>", "<emphasis remap='I'>language</emphasis>", "<emphasis remap='I'>territory</emphasis>" and  -->
<!-- .\" "<emphasis remap='I'>codeset</emphasis>" parameter point. -->
<!-- .\" Caller should provide enough buffer to store those string. -->
<!-- .\" .LP -->
<!-- .\" In current implementation,  -->
<!-- .\" .PN _XlcResolveLocaleName  -->
<!-- .\" uses locale.alias file as mapping table, which has pairs of strings,  -->
<!-- .\" a locale name and a full locale name. -->
<!-- .\" .LP -->
<!-- .\" .FD 0 -->
<!-- .\" int _XlcResolveDBName(<emphasis remap='I'>lc_name</emphasis>, <emphasis remap='I'>file_name</emphasis>) -->
<!-- .\" .br -->
<!-- .\"       char <emphasis remap='I'>*lc_name</emphasis>; -->
<!-- .\" .br -->
<!-- .\"       char <emphasis remap='I'>*file_name</emphasis>; -->
<!-- .\" .FN -->
<!-- .\" .FD 0  -->
<!-- .\" XLCd _XlcCreateLC(<emphasis remap='I'>name</emphasis>, <emphasis remap='I'>methods</emphasis>) -->
<!-- .\" .br -->
<!-- .\"       char <emphasis remap='I'>*name</emphasis>; -->
<!-- .\" .br -->
<!-- .\"       XLCdMethods <emphasis remap='I'>methods</emphasis>; -->
<!-- .\" .FN -->
<!-- .\" .FD 0 -->
<!-- .\" void _XlcDestroyLC(<emphasis remap='I'>lcd</emphasis>) -->
<!-- .\" .br -->
<!-- .\"       XLCd <emphasis remap='I'>lcd</emphasis>; -->
<!-- .\" .FN -->
<!-- .\" .LP -->
<!-- .\"  -->

</sect1>
</chapter>
</book>
