语言环境方法源文件格式

用途

指定构造语言环境时要覆盖的方法。

描述

方法 源文件将方法名称映射到实现这些方法的 "本地语言支持" (NLS) 子例程。 方法 文件还指定了用于存储实现子例程的库。

这些方法对应于那些需要直接访问表示语言环境数据的数据结构的子例程。

以下是 方法 文件的期望语法:

method_def : "METHODS"
           | method_assign_list "END METHODS"
           ;
method_assign_list :
        method_assign_list method_assign
        | method_assign_list
        | method_assign
        ;
method_assign :
        "csid" meth_name meth_lib_path
        | "fnmatch" meth_name meth_lib_path
        | "get_wctype" meth_name meth_lib_path
        | "is_wctype" meth_name meth_lib_path
        | "mblen" meth_name meth_lib_path
        | "__mbstopcs" meth_name meth_lib_path
        | "mbstowcs" meth_name meth_lib_path
        | "__mbtopc" meth_name meth_lib_path
        | "mbtowc" meth_name meth_lib_path
        | "__pcstombs" meth_name meth_lib_path
        | "__pctomb" meth_name meth_lib_path
        | "regcomp" meth_name meth_lib_path
        | "regerror" meth_name meth_lib_path
        | "regexec" meth_name meth_lib_path
        | "regfree" meth_name meth_lib_path
        | "rpmatch" meth_name meth_lib_path
        | "strcoll" meth_name meth_lib_path
        | "strfmon" meth_name meth_lib_path
        | "strftime" meth_name meth_lib_path
        | "strptime" meth_name meth_lib_path
        | "strxfrm" meth_name meth_lib_path
        | "towlower" meth_name meth_lib_path
        | "towupper" meth_name meth_lib_path
        | "wcscoll" meth_name meth_lib_path
        | "wcsftime" meth_name meth_lib_path
        | "wcsid" meth_name meth_lib_path
        | "wcstombs" meth_name meth_lib_path
        | "wcswidth" meth_name meth_lib_path
        | "wcsxfrm" meth_name meth_lib_path
        | "wctomb" meth_name meth_lib_path
        | "wcwidth" meth_name meth_lib_path
        ;
meth_name: global_name
         | cfunc_name
         ;
global_name: "CSID_STD"
        | "FNMATCH_C"
        | "FNMATCH_STD"
        | "GET_WCTYPE_STD"
        | "IS_WCTYPE_SB"
        | "IS_WCTYPE_STD"
        | "LOCALECONV_STD"
        | "MBLEN_932"
        | "MBLEN_EUCJP"
        | "MBLEN_SB"
        | "__MBSTOPCS_932"
        | "__MBSTOPCS_EUCJP"
        | "__MBSTOPCS_SB"
        | "MBSTOWCS_932"
        | "MBSTOWCS_EUCJP"
        | "MBSTOWCS_SB"
        | "__MBTOPC_932"
        | "__MBTOPC_EUCJP"
        | "__MBTOPC_SB"
        | "MBTOWC_932"
        | "MBTOWC_EUCJP"
        | "MBTOWC_SB"
        | "NL_MONINFO"
        | "NL_NUMINFO"
        | "NL_RESPINFO"
        | "NL_TIMINFO"
        | "__PCSTOMBS_932"
        | "__PCSTOMBS_EUCJP"
        | "__PCSTOMBS_SB"
        | "__PCTOMB_932"
        | "__PCTOMB_EUCJP"
        | "__PCTOMB_SB"
        | "REGCOMP_STD"
        | "REGERROR_STD"
        | "REGEXEC_STD"
        | "REGFREE_STD"
        | "RPMATCH_C"
        | "RPMATCH_STD"
        | "STRCOLL_C"
        | "STRCOLL_SB"
        | "STRCOLL_STD"
        | "STRFMON_STD"
        | "STRFTIME_STD"
        | "STRPTIME_STD"
        | "STRXFRM_C"
        | "STRXFRM_SB"
        | "STRXFRM_STD"
        | "TOWLOWER_STD"
        | "TOWUPPER_STD"
        | "WCSCOLL_C"
        | "WCSCOLL_STD"
        | "WCSFTIME_STD"
        | "WCSID_STD"
        | "WCSTOMBS_932"
        | "WCSTOMBS_EUCJP"
        | "WCSTOMBS_SB"
        | "WCSWIDTH_932"
        | "WCSWIDTH_EUCJP"
        | "WCSWIDTH_LATIN"
        | "WCSXFRM_C"
        | "WCSXFRM_STD"
        | "WCTOMB_932"
        | "WCTOMB_EUCJP"
        | "WCTOMB_SB"
        | "WCWIDTH_932"
        | "WCWIDTH_EUCJP"
        | "WCWIDTH_LATIN"
        ;
其中, cfunc_name 是用户提供的子例程的名称, meth_lib_path 是包含指定子例程的库的可选路径名。
注: 如果要创建 64 位语言环境,那么 meth_lib_path 必须为包含指定子例程的两个共享对象 (一个 32 位对象和另一个 64 位对象) 指定单个归档的路径。 对 32 位和 64 位共享对象指定单独的路径将导致 本地定义 由于 XCOFF 格式不兼容而失败。

本地定义 命令将解析此信息以确定要用于此语言环境的方法。 以下子例程必须在 方法 文件中指定:

方法 文件中未指定的任何其他方法都保留缺省值。

不允许混用 cfunc_name 个值和 全局名称 个值。 方法 文件不应同时包含这两者。 如果 本地定义 命令接收到同时包含 cfunc_name 值和 全局名称 值的 方法 文件,那么将生成错误并且不会创建语言环境。

方法 节指定库名不是必需的。 如果个别方法没有指定库,那么该方法将继承最近指定的库。 libc.a 库是缺省库。

姆布托克wcwidth 子例程的方法应避免在可能的情况下调用其他方法。

在构造 方法 文件时,了解 __mbtopc__mbstopcs__pctomb__pcstombs 子例程处理宽字符的方式很有用。 这些子例程不应该在应用程序中使用。

__mbtopc 子例程

__mbtopc 子例程将字符转换为进程代码。

__mbtopc 子例程的语法为如下所示:

size_t __mbtopc( PC, S, LenS, Err ) wchar_t * PC; uchar * S; size_t LenS; int * Err;

S 参数指向的输入缓冲区包含 LenS 参数中指定的字符数据的字节数。 __mbtopc 子例程尝试将该字符转换为进程代码。 如果在 S 参数所指向的输入缓冲区中找到有效字符,那么将转换该字符并将其存储在 PC 参数中,并返回该字符中的字节数。

如果由 S 参数指向的输入缓冲区中, LenS 参数指定的字节数组成了无效字符,则子程序返回 0 并将 Err 参数设置为 值 -1。 若字符无法在参数指定的 LenS 字节数或更少字节内形成,则子程序返回0, 并将Err 参数设置为形成以S 参数所指数据为起始的字符所需的字节数。

这些参数具有以下值:

描述
PC 指向一个宽字符以包含转换后的字符。
指向要进行转换的字符数据的缓冲区。
LenS 指定由 S 参数指向的字符数据的字节数。
err 指定指示转换失败原因的错误值。

__mbstopcs 子例程

__mbstopcs 子例程将一个字符串转换为进程代码字符串。

__mbstopcs 子例程的语法为如下所示:

size_t __mbstopcs( PC, LenPC, S, LenS, StopCh, EndPtr, Err ) wchar_t * PC; size_t LenPC; uchar * S; size_t LenS; uchar StopCh; uchar ** EndPtr; int * Err;

S 参数指向的输入缓冲区包含 LenS 参数中指定的字符数据的字节数。 __mbstopcs 子例程尝试将字符数据转换为进程代码。 字符转换将继续进行,直到发生下列其中一种情况:

  • 已转换由 LenS 参数指定的字节数。
  • 已转换由 LenPC 参数指定的字符数。
  • S 参数指向的输入缓冲区中迂到 StopCh 参数中指定的字节值。
  • S 参数所指向的输入缓冲区中找到无效或不完整的字符。

如果成功转换了 LenS 参数指定的字节数或 LenPC 参数指定的字符数,那么 __mbstopcs 子例程返回转换的字符数,将 Err 参数设置为 0 , 并将 EndPtr 参数设置为紧跟在 S 参数所指向的输入缓冲区中转换的最后一个字符之后。

如果在 S 参数指向的输入缓冲区中找到 StopCh 参数指定的字节,那么会发生以下情况:

  • 转换停止。
  • StopCh 参数指定的值放在 PC 参数中。
  • EndPtr 参数设置为紧跟在 StopCh 参数指定的值之后。
  • 错误 参数将设置为 0。
  • 返回已转换的字符数。

如果在 S 参数指向的输入缓冲区中找到无效字符,那么 EndPtr 参数设置为指向此字符的开头, Err 参数设置为 (size_t) -1 ,并且 __mbstopcs 子例程返回转换的字符数。

如果在 S 参数指向的输入缓冲区末尾找到不完整的字符,那么 EndPtr 参数将设置为指向不完整字符的开头,并且 Err 参数将设置为以 EndPtr 参数指向的字节开头的字符中的字节数。 __mbstopcs 子例程返回已转换的字符数。

这些参数具有以下值:

描述
PC 指向 wchar_t 数组以包含转换后的字符。
LenPC 指定可放置在 PC 参数中的最大宽字符数。
指向要转换的字符数据的缓冲区的位置。
LenS 指定 S 参数中的字符数据的字节数。
StopCh 指定一个单字节字符值,以指示 S 参数中的数据结束。
EndPtr 指向字符转换结束所在的 S 参数。
err 指定指示转换失败原因的错误值。

__pctomb 子例程

__pctomb 子例程将进程代码转换为字符。

__pctomb 子例程的语法为如下所示:

size_t __pctomb( S, LenS, PC, Err ) char * S; size_t LenS; wchar_t * PC; int * Err;

PC 参数所指向的输入缓冲区包含一个宽字符,子例程尝试将该字符转换为 S 参数所指向的输入缓冲区中的字符。 如果在 PC 参数所指向的输入缓冲区中找到有效的进程代码,那么会将其转换并存储在 S 参数所指向的输入缓冲区中,并且会返回字符中的字节数。

如果 PC 参数所指向的输入缓冲区中的宽字符无效,那么 __pctomb 子例程 0 返回 0 并将 错误 参数设置为值 (大小) -1。 如果字符长度大于 LenS 参数指定的字节数,那么 __pctomb 子例程返回 0 并将 Err 参数设置为构成字符所需的字节数。

这些参数具有以下值:

描述
指向包含已转换的进程代码的缓冲区。
LenS 指定 S 参数所指向的字符数组的大小。
PC 指向要进行转换的宽字符。
err 指定指示转换失败原因的错误值。

__pcstombs 子例程

__pcstombs 子例程将一个宽字符字符串转换为一个字符串。

__pcstombs 子例程的语法为如下所示:

size_t __pcstombs( S, LenS, PC, LenPC, StopCh, EndPtr, Err ) char * S; size_t LenS; wchar_t * PC; size_t LenPC; wchar_t StopCh; char ** EndPtr; int * Err;

PC 参数指向的输入缓冲区包含 LenPC 参数指定的宽字符数。 __pcstombs 子例程尝试将进程代码转换为字符。 转换将继续进行,直至发生下列其中一种情况:

  • 已转换由 LenPC 参数指定的宽字符数。
  • 已转换由 LenS 参数指定的字节数。
  • PC 参数指向的输入缓冲区中迂到 StopCh 参数中指定的字符值。
  • 在由 PC 参数指向的输入缓冲区中找到无效的宽字符。

如果成功转换了 LenS 参数指定的字节数或 LenPC 参数指定的字符数,那么 __pcstombs 子例程将返回放在由 S 参数指向的缓冲区中的字节数,并将 Err 参数设置为 0。 并将 EndPtr 参数设置为紧跟在 PC 参数所指向的输入缓冲区中转换的最后一个字符之后。

如果在 PC 参数指向的输入缓冲区中找到 StopCh 参数指定的字符,那么会发生以下情况:

  • 转换停止。
  • StopCh 参数指定的字符放置在当前由 S 参数指向的数据的末尾。
  • EndPtr 参数设置为紧跟在 StopCh 参数指定的字符之后。
  • 错误 参数将设置为 0。
  • 将返回放置在 S 参数所指向的缓冲区中的字节数。

如果在 PC 参数指向的输入缓冲区中找到无效的宽字符,那么 EndPtr 参数设置为指向此字符的开头, Err 参数设置为 (size_t) -1 ,并且 __pcstombs 子例程返回由 S 参数指向的缓冲区中的字节数。

这些参数具有以下值:

描述
指向缓冲区以包含已转换的数据。
LenS 指定 S 参数指向的字符数组的大小 (以字节为单位)。
PC 指向要转换为的 wchar_t 数组。
LenPC 指定由 PC 参数指向的数组中的宽字符数。
StopCh 指定一个宽字符值,以指示 PC 参数所指向的数组中的数据结束。
EndPtr 指向字符转换结束所在的 S 参数。
err 指定指示转换失败原因的错误值。

文件

描述
/usr/lib/nls/loc/* 指定受支持语言环境的语言环境定义源文件。
/ usr/lib/nls/charmap/* 指定受支持语言环境的字符集描述 (图表映射) 源文件。