装载LC_CTYPE初探

2009-05-13 02:03:06来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

在系统装载locale的时候,通过阅读源代码,得知mbwc的转换初始化大都在装载LC_CTYPE上,总结流程:

系统装载locale设置的时候,首先会找locale的目录,然后对系统locale环境设置进行检测,之后设置系统地locale,对每个种类的locale进行装载,在装载LC_CTYPE的时候,根据LC_CTYPE的值来进行mbwc的初始化配置:-)

主要的代码实现在 /usr/src/lib/libc/locale/setrunelocale.c 中的setrunelocale()函数中:



static int __setrunelocale(const char *encoding)
{
FILE *fp;      //用于打开LC_CTYPE文件
char name[PATH_MAX];
_RuneLocale *rl;
int saverr, ret;
static char ctype_encoding[ENCODING_LEN + 1];
static _RuneLocale *CachedRuneLocale;
static int Cached__mb_cur_max;
static size_t (*Cached__mbrtowc)(wchar_t * __restrict,
     const char * __restrict, size_t, mbstate_t * __restrict);
static size_t (*Cached__wcrtomb)(char * __restrict, wchar_t,
     mbstate_t * __restrict);
static int (*Cached__mbsinit)(const mbstate_t *);
static size_t (*Cached__mbsnrtowcs)(wchar_t * __restrict,
     const char ** __restrict, size_t, size_t, mbstate_t * __restrict);
static size_t (*Cached__wcsnrtombs)(char * __restrict,
     const wchar_t ** __restrict, size_t, size_t,
     mbstate_t * __restrict);




/*
  * The "C" and "POSIX" locale are always here.
  */
if (strcmp(encoding, "C") == 0 || strcmp(encoding, "POSIX") == 0) {
  _none_init(&_DefaultRuneLocale);
  return (0);
}



/*
  * If the locale name is the same as our cache, use the cache.
  */
if (CachedRuneLocale != NULL &&
     strcmp(encoding, ctype_encoding) == 0) {
  _CurrentRuneLocale = CachedRuneLocale;
  __mb_cur_max = Cached__mb_cur_max;
  __mbrtowc = Cached__mbrtowc;
  __mbsinit = Cached__mbsinit;
  __mbsnrtowcs = Cached__mbsnrtowcs;
  __wcrtomb = Cached__wcrtomb;
  __wcsnrtombs = Cached__wcsnrtombs;
  return (0);
}


__mbrtowc,__mbsinit,__mbsnrtowcs,__wcrtomb,__wcsnrtombs都是函数指针,可以根据locale的不同,指向不同语言区域的处理函数



/*
  * Slurp the locale file into the cache.
  */
/* Range checking not needed, encoding length already checked before */
(void) strcpy(name, _PathLocale);
(void) strcat(name, "/");
(void) strcat(name, encoding);
(void) strcat(name, "/LC_CTYPE");


加工name,保存LC_CTYPE文件的具体路径



标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:FreeBSD下动态库路径的问题

下一篇:(转载.整理)KDE简介