2.7.3. 定义区域设置块

区域设置数据块是使用 rt_locale.s 文件中提供的一组汇编语言宏定义的。 因此,建议使用的区域设置块定义方法是编写汇编语言源文件。 RVCT 为每种类型的区域设置数据块提供了一组宏,例如,LC_CTYPELC_COLLATELC_MONETARYLC_NUMERICLC_TIME。 可以使用 _begin 宏、一些数据宏以及 _end 宏,按相同方式定义每个区域设置块。

指定开头

要开始定义区域设置块,请调用 _begin 宏。 该宏使用两个参数:前缀和文本名称。 例如:

LC_TYPE_begin prefix, name

其中:

TYPE

是以下项之一:

  • CTYPE

  • COLLATE

  • MONETARY

  • NUMERIC

  • TIME

prefix

是在区域设置数据中定义的汇编程序符号的前缀

name

是区域设置数据的文本名称。

指定数据

要指定区域设置块数据,请按照文档中指定的顺序为该区域设置类型调用宏。 例如:

LC_TYPE_function

其中:

TYPE

是以下项之一:

  • CTYPE

  • COLLATE

  • MONETARY

  • NUMERIC

  • TIME

function

是一个与区域设置数据相关的特定函数。

指定区域设置数据时,必须为每个相应函数重复调用宏。

指定结尾

要结束区域设置数据块定义,请调用 _end 宏。 该宏不使用任何参数。 例如:

LC_TYPE_end

其中:

TYPE

是以下项之一:

  • CTYPE

  • COLLATE

  • MONETARY

  • NUMERIC

  • TIME

指定固定区域设置

要编写一个始终返回相同区域设置的固定函数,您可以使用由这些宏定义的 _start 符号名称。Example 2.2 说明了如何为 CTYPE 区域设置实现此操作。

Example 2.2. 固定区域设置


        GET rt_locale.s



        AREA my_locales, DATA, READONLY



        LC_CTYPE_begin my_ctype_locale, "MyLocale"



        ...                           ; include other LC_CTYPE_xxx macros here



        LC_CTYPE_end



        AREA my_locale_func, CODE, READONLY



    _get_lc_ctype FUNCTION

        LDR r0, =my_ctype_locale_start

        BX lr

        ENDFUNC

指定多个区域设置

必须依次声明适于传递给 _findlocale() 函数的连续区域设置块。 您必须调用 LC_index_end 宏以结束区域设置块序列。Example 2.3 说明了如何为 CTYPE 区域设置实现此操作。

Example 2.3. 多个区域设置


        GET rt_locale.s



        AREA my_locales, DATA, READONLY



    my_ctype_locales



        LC_CTYPE_begin my_first_ctype_locale, "MyLocale1"



        ...                           ; include other LC_CTYPE_xxx macros here



        LC_CTYPE_end



        LC_CTYPE_begin my_second_ctype_locale, "MyLocale2"



        ...                           ; include other LC_CTYPE_xxx macros here



        LC_CTYPE_end



        LC_index_end



        AREA my_locale_func, CODE, READONLY



        IMPORT _findlocale

    _get_lc_ctype FUNCTION

        LDR r0, =my_ctype_locales

        B _findlocale

        ENDFUNC

Copyright © 2007 ARM Limited. All rights reserved. ARM DUI 0349AC
Non-Confidential