亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 24700695 | 回復: 24700695
打印 上一主題 下一主題

[應用] 裁剪libiconv庫 [復制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2012-10-17 22:30 |只看該作者 |倒序瀏覽
本帖最后由 0n10rz1r0 于 2012-10-18 09:08 編輯

裁剪libiconv
項目里面只需要UTF8與GB2312的轉(zhuǎn)換。
1.下載源代碼編譯,編寫測試代碼,gdb調(diào)試,查看UTF8和GB2312轉(zhuǎn)換調(diào)用的函數(shù),分別是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, 下載次數(shù): 686

裁減libiconv

論壇徽章:
1
處女座
日期:2013-09-18 13:13:02
2 [報告]
發(fā)表于 2012-10-31 23:46 |只看該作者
對庫的裁剪以后可能有用,mark

論壇徽章:
0
3 [報告]
發(fā)表于 2013-10-22 15:32 |只看該作者
這個好用,非常感謝

論壇徽章:
0
4 [報告]
發(fā)表于 2013-11-25 16:16 |只看該作者
很好用哦,非常感謝!

論壇徽章:
0
5 [報告]
發(fā)表于 2013-11-25 17:35 |只看該作者
本帖最后由 zhyangbj 于 2013-11-28 10:45 編輯

論壇徽章:
0
6 [報告]
發(fā)表于 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
7 [報告]
發(fā)表于 2014-02-16 10:41 |只看該作者
shisiye14 發(fā)表于 2014-02-13 16:59
樓主可以參看一下gperf工具的使用,我也是在裁剪libiconv的過程中學習的。


話說接觸到bison和gpref都比較多,但是從來就沒有搞清楚過這者的作用。

論壇徽章:
0
8 [報告]
發(fā)表于 2014-02-18 23:22 |只看該作者
看的明白清楚了,謝謝樓主。

論壇徽章:
0
9 [報告]
發(fā)表于 2014-02-22 02:50 |只看該作者
本帖最后由 Hugo801122 于 2014-02-22 02:51 編輯

裁剪libiconv
項目里面只需要UTF8與GB2312的轉(zhuǎn)換。
1.下載Linux系統(tǒng)源代碼編譯,編寫測試代碼,gdb調(diào)試,查看UTF8和GB2312轉(zhuǎn)換調(diào)用的函數(shù),分別是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
10 [報告]
發(fā)表于 2015-10-19 11:59 |只看該作者
針對嵌入式內(nèi)存不夠用的系統(tǒng)來說很有用
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP