免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 47839 | 回复: 16

[应用] 裁剪libiconv库 [复制链接]

论坛徽章:
0
发表于 2012-10-17 22:30 |显示全部楼层
本帖最后由 0n10rz1r0 于 2012-10-18 09:08 编辑

裁剪libiconv
项目里面只需要UTF8与GB2312的转换。
1.下载源代码编译,编写测试代码,gdb调试,查看UTF8和GB2312转换调用的函数,分别是xxx_wctomb和xxx_mbtowc(文件就是utf8.h/euc_cn.h),aliases.gperf文件里面有定义UTF-8, ei_utf8和GB2312, ei_euc_cn。
2.encoding.def文件进行修改,最后只剩下:
  1. DEFENCODING(( "US-ASCII",               /* IANA */
  2.               "ASCII",                  /* IANA, JDK 1.1 */
  3.               "ISO646-US",              /* IANA */
  4.               "ISO_646.IRV:1991",       /* IANA */
  5.               "ISO-IR-6",               /* IANA */
  6.               "ANSI_X3.4-1968",         /* IANA */
  7.               "ANSI_X3.4-1986",         /* IANA */
  8.               "CP367",                  /* IANA */
  9.               "IBM367",                 /* IANA */
  10.               "US",                     /* IANA */
  11.               "csASCII",                /* IANA */
  12.             /*"ISO646.1991-IRV",           X11R6.4 */
  13.             ),
  14.             ascii,
  15.             { ascii_mbtowc, NULL },       { ascii_wctomb, NULL })

  16. /* General multi-byte encodings */

  17. DEFENCODING(( "UTF-8",                  /* IANA, RFC 2279 */
  18.             /*"UTF8",                      JDK 1.1 */
  19.             /*"CP65001",                   Windows */
  20.             ),
  21.             utf8,
  22.             { utf8_mbtowc, NULL },        { utf8_wctomb, NULL })


  23. DEFENCODING(( "GB_2312-80",             /* IANA */
  24.               "ISO-IR-58",              /* IANA */
  25.               "csISO58GB231280",        /* IANA */
  26.               "CHINESE",                /* IANA */
  27.             /*"GB2312.1980-0",             X11R6.4 */
  28.             ),
  29.             gb2312,
  30.             { gb2312_mbtowc, NULL },      { gb2312_wctomb, NULL })

  31. DEFENCODING(( "EUC-CN",                 /* glibc */
  32.               "EUCCN",                  /* glibc, IRIX */
  33.               "GB2312",                 /* IANA */
  34.               "CN-GB",                  /* RFC 1922 */
  35.               "csGB2312",               /* IANA */
  36.             /*"EUC_CN",                    JDK 1.1 */
  37.             /*"CP51936",                   Windows */
  38.             ),
  39.             euc_cn,
  40.             { euc_cn_mbtowc, NULL },      { euc_cn_wctomb, NULL })
复制代码
3.然后对aliases.h进行修改,删除没有用的编码。
  1. struct stringpool_t
  2.   {
  3.     char stringpool_str117[sizeof("CHINESE")];
  4.     char stringpool_str120[sizeof("ASCII")];
  5.     char stringpool_str165[sizeof("GB2312")];
  6.     char stringpool_str255[sizeof("UTF-8")];
  7.   };
  8. static const struct stringpool_t stringpool_contents =
  9.   {
  10.     "CHINESE",
  11.     "ASCII",
  12.     "GB2312",
  13.     "UTF-8",
  14.   };
  15. /* 与上面的struct stringpool_t对应起来 */
  16. static const struct alias aliases[] =
  17.   {
  18. #line 14 "lib/aliases.gperf" /* 与gperf文件中的行号对应起来*/
  19.     {(int)(long)&((struct stringpool_t *)0)->stringpool_str117, ei_gb2312},
  20. #line 12 "lib/aliases.gperf"
  21.     {(int)(long)&((struct stringpool_t *)0)->stringpool_str120, ei_ascii},
  22. #line 15 "lib/aliases.gperf"
  23.     {(int)(long)&((struct stringpool_t *)0)->stringpool_str165, ei_euc_cn},
  24. #line 13 "lib/aliases.gperf"
  25.     {(int)(long)&((struct stringpool_t *)0)->stringpool_str255, ei_utf8},
  26.   };

  27. /*修改为只支持UTF8和GB2312,不用在查找,可以删除多余的代码*/
  28. const struct alias *
  29. aliases_lookup (register const char *str, register unsigned int len)
  30. {
  31.   if (!strcmp(str, "UTF-8"))
  32.     return &aliases[3];
  33.   else if (!strcmp(str, "GB2312"))
  34.     return &aliases[2];
  35.   return 0;
  36. }
复制代码
4.修改aliases. gperf,删除大部分编码,只剩下你需要的编码类型。
  1. struct alias { int name; unsigned int encoding_index; };
  2. %struct-type
  3. %language=ANSI-C
  4. %define hash-function-name aliases_hash
  5. %define lookup-function-name aliases_lookup
  6. %7bit
  7. %readonly-tables
  8. %global-table
  9. %define word-array-name aliases
  10. %pic
  11. %%
  12. ASCII, ei_ascii
  13. UTF-8, ei_utf8
  14. CHINESE, ei_gb2312
  15. GB2312, ei_euc_cn
复制代码
5.然后再make,会有几个文件报错(canonical.h等),对报错的地方进行屏蔽,具体看上传已裁减的libiconv源代码包。







libiconv-1.14-small.gz

2.82 MB, 下载次数: 679

裁减libiconv

论坛徽章:
1
处女座
日期:2013-09-18 13:13:02
发表于 2012-10-31 23:46 |显示全部楼层
对库的裁剪以后可能有用,mark

论坛徽章:
0
发表于 2013-10-22 15:32 |显示全部楼层
这个好用,非常感谢

论坛徽章:
0
发表于 2013-11-25 16:16 |显示全部楼层
很好用哦,非常感谢!

论坛徽章:
0
发表于 2013-11-25 17:35 |显示全部楼层
本帖最后由 zhyangbj 于 2013-11-28 10:45 编辑

论坛徽章:
0
发表于 2014-02-13 16:59 |显示全部楼层
楼主可以参看一下gperf工具的使用,我也是在裁剪libiconv的过程中学习的。

论坛徽章:
31
CU大牛徽章
日期:2013-03-13 15:15:08CU大牛徽章
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-05-20 10:46:25CU大牛徽章
日期:2013-05-20 10:46:31CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-09-18 15:16:55CU大牛徽章
日期:2013-09-18 15:18:22CU大牛徽章
日期:2013-09-18 15:18:43CU十二周年纪念徽章
日期:2013-10-24 15:41:34丑牛
日期:2013-12-01 10:11:07水瓶座
日期:2014-01-15 08:47:25
发表于 2014-02-16 10:41 |显示全部楼层
shisiye14 发表于 2014-02-13 16:59
楼主可以参看一下gperf工具的使用,我也是在裁剪libiconv的过程中学习的。


话说接触到bison和gpref都比较多,但是从来就没有搞清楚过这者的作用。

论坛徽章:
0
发表于 2014-02-18 23:22 |显示全部楼层
看的明白清楚了,谢谢楼主。

论坛徽章:
0
发表于 2014-02-22 02:50 |显示全部楼层
本帖最后由 Hugo801122 于 2014-02-22 02:51 编辑

裁剪libiconv
项目里面只需要UTF8与GB2312的转换。
1.下载Linux系统源代码编译,编写测试代码,gdb调试,查看UTF8和GB2312转换调用的函数,分别是xxx_wctomb和xxx_mbtowc(文件就是utf8.h/euc_cn.h),aliases.gperf文件里面有定义UTF-8, ei_utf8和GB2312, ei_euc_cn。
2.encoding.def文件进行修改,最后只剩下:
DEFENCODING(( "US-ASCII",               /* IANA */
              "ASCII",                  /* IANA, JDK 1.1 */
              "ISO646-US",              /* IANA */
              "ISO_646.IRV:1991",       /* IANA */
              "ISO-IR-6",               /* IANA */
              "ANSI_X3.4-1968",         /* IANA */
              "ANSI_X3.4-1986",         /* IANA */
              "CP367",                  /* IANA */
              "IBM367",                 /* IANA */
              "US",                     /* IANA */
              "csASCII",                /* IANA */
            /*"ISO646.1991-IRV",           X11R6.4 */
            ),
            ascii,
            { ascii_mbtowc, NULL },       { ascii_wctomb, NULL })

/* General multi-byte encodings */

DEFENCODING(( "UTF-8",                  /* IANA, RFC 2279 */
            /*"UTF8",                      JDK 1.1 */
            /*"CP65001",                   Windows */
            ),
            utf8,
            { utf8_mbtowc, NULL },        { utf8_wctomb, NULL })


DEFENCODING(( "GB_2312-80",             /* IANA */
              "ISO-IR-58",              /* IANA */
              "csISO58GB231280",        /* IANA */
              "CHINESE",                /* IANA */
            /*"GB2312.1980-0",             X11R6.4 */
            ),
            gb2312,
            { gb2312_mbtowc, NULL },      { gb2312_wctomb, NULL })

DEFENCODING(( "EUC-CN",                 /* glibc */
              "EUCCN",                  /* glibc, IRIX */
              "GB2312",                 /* IANA */
              "CN-GB",                  /* RFC 1922 */
              "csGB2312",               /* IANA */
            /*"EUC_CN",                    JDK 1.1 */
            /*"CP51936",                   Windows */
            ),
            euc_cn,
            { euc_cn_mbtowc, NULL },      { euc_cn_wctomb, NULL })
复制代码
3.然后对aliases.h进行修改,删除没有用的编码。
struct stringpool_t
  {
    char stringpool_str117[sizeof("CHINESE")];
    char stringpool_str120[sizeof("ASCII")];
    char stringpool_str165[sizeof("GB2312")];
    char stringpool_str255[sizeof("UTF-8")];
  };
static const struct stringpool_t stringpool_contents =
  {
    "CHINESE",
    "ASCII",
    "GB2312",
    "UTF-8",
  };
/* 与上面的struct stringpool_t对应起来 */
static const struct alias aliases[] =
  {
#line 14 "lib/aliases.gperf" /* 与gperf文件中的行号对应起来*/
    {(int)(long)&((struct stringpool_t *)0)->stringpool_str117, ei_gb2312},
#line 12 "lib/aliases.gperf"
    {(int)(long)&((struct stringpool_t *)0)->stringpool_str120, ei_ascii},
#line 15 "lib/aliases.gperf"
    {(int)(long)&((struct stringpool_t *)0)->stringpool_str165, ei_euc_cn},
#line 13 "lib/aliases.gperf"
    {(int)(long)&((struct stringpool_t *)0)->stringpool_str255, ei_utf8},
  };

/*修改为只支持UTF8和GB2312,不用在查找,可以删除多余的代码*/
const struct alias *
aliases_lookup (register const char *str, register unsigned int len)
{
  if (!strcmp(str, "UTF-8"))
    return &aliases[3];
  else if (!strcmp(str, "GB2312"))
    return &aliases[2];
  return 0;
}
复制代码
4.修改aliases. gperf,删除大部分编码,只剩下你需要的编码类型。
struct alias { int name; unsigned int encoding_index; };
%struct-type
%language=ANSI-C
%define hash-function-name aliases_hash
%define lookup-function-name aliases_lookup
%7bit
%readonly-tables
%global-table
%define word-array-name aliases
%pic
%%
ASCII, ei_ascii
UTF-8, ei_utf8
CHINESE, ei_gb2312
GB2312, ei_euc_cn
复制代码
5.然后再make,会有几个文件报错(canonical.h等),对报错的地方进行屏蔽,具体看上传已裁减的libiconv源代码包。


这个真的很好用,多谢!

论坛徽章:
0
发表于 2015-10-19 11:59 |显示全部楼层
针对嵌入式内存不够用的系统来说很有用
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP