免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1722 | 回复: 8

[文本处理] 怎样从c代码文件中抽取出完整函数函数信息 [复制链接]

论坛徽章:
10
天蝎座
日期:2013-09-22 22:32:23程序设计版块每日发帖之星
日期:2016-08-07 06:20:00lufei
日期:2016-06-17 17:38:40程序设计版块每日发帖之星
日期:2016-06-12 06:20:002016科比退役纪念章
日期:2016-05-31 15:47:20CU十四周年纪念徽章
日期:2016-05-27 12:24:562015年亚洲杯之阿曼
日期:2015-05-03 21:01:352015年辞旧岁徽章
日期:2015-03-03 16:54:15天蝎座
日期:2013-10-20 21:05:24程序设计版块每日发帖之星
日期:2016-08-11 06:20:00
发表于 2014-06-17 09:45 |显示全部楼层
RT,函数里面的信息可以是任意满足c语法的内容

抽取出来的函数信息应该是
void fun()
{
  ....
}

论坛徽章:
465
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
发表于 2014-06-17 09:47 |显示全部楼层
回复 1# liion631818
我的理解是把除了函数定义之外的一些全局变量
和结构体等的数据结构定义代码删掉?
   

论坛徽章:
10
天蝎座
日期:2013-09-22 22:32:23程序设计版块每日发帖之星
日期:2016-08-07 06:20:00lufei
日期:2016-06-17 17:38:40程序设计版块每日发帖之星
日期:2016-06-12 06:20:002016科比退役纪念章
日期:2016-05-31 15:47:20CU十四周年纪念徽章
日期:2016-05-27 12:24:562015年亚洲杯之阿曼
日期:2015-05-03 21:01:352015年辞旧岁徽章
日期:2015-03-03 16:54:15天蝎座
日期:2013-10-20 21:05:24程序设计版块每日发帖之星
日期:2016-08-11 06:20:00
发表于 2014-06-17 09:50 |显示全部楼层
回复 2# Herowinter


    需要的抽取指定函数的信息,不是全部的,有什么好办法吗

论坛徽章:
465
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
发表于 2014-06-17 09:51 |显示全部楼层
回复 3# liion631818
那你的输入是指定的几个函数名,
输出是那几个指定的函数名的具体实现代码,
不需要考虑头文件中的那几个函数的声明吧?
   

论坛徽章:
465
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
发表于 2014-06-17 09:57 |显示全部楼层
不大理解为什么要用shell来做这个事,CDT或
vi或emacs应该都提供这种功能了吧。

论坛徽章:
10
天蝎座
日期:2013-09-22 22:32:23程序设计版块每日发帖之星
日期:2016-08-07 06:20:00lufei
日期:2016-06-17 17:38:40程序设计版块每日发帖之星
日期:2016-06-12 06:20:002016科比退役纪念章
日期:2016-05-31 15:47:20CU十四周年纪念徽章
日期:2016-05-27 12:24:562015年亚洲杯之阿曼
日期:2015-05-03 21:01:352015年辞旧岁徽章
日期:2015-03-03 16:54:15天蝎座
日期:2013-10-20 21:05:24程序设计版块每日发帖之星
日期:2016-08-11 06:20:00
发表于 2014-06-17 10:01 |显示全部楼层
回复 5# Herowinter


    好吧,我只是想把他写在脚本里。我用c写了个可执行文件,配合我自己的环境,目前可用。

论坛徽章:
465
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
发表于 2014-06-17 10:11 |显示全部楼层
回复 6# liion631818
你来一段具体的文本吧,这样需求不是很清晰。
比如,文本里会不会同时出现函数fun
的声明、实现、调用。
  1. int func(int a, int b);
  2. int func(int a, int b){
  3. ....

  4. }
  5. func(a,b);
复制代码
如果你指定抽取函数func的信息,这3种形式都要吗?

还有这问题其实是找到函数名,然后匹配"{" 和"}",
这其实一定程度上会受coding style的影响,比如"{"
是和函数名同一行还是在下一行。
   

论坛徽章:
10
天蝎座
日期:2013-09-22 22:32:23程序设计版块每日发帖之星
日期:2016-08-07 06:20:00lufei
日期:2016-06-17 17:38:40程序设计版块每日发帖之星
日期:2016-06-12 06:20:002016科比退役纪念章
日期:2016-05-31 15:47:20CU十四周年纪念徽章
日期:2016-05-27 12:24:562015年亚洲杯之阿曼
日期:2015-05-03 21:01:352015年辞旧岁徽章
日期:2015-03-03 16:54:15天蝎座
日期:2013-10-20 21:05:24程序设计版块每日发帖之星
日期:2016-08-11 06:20:00
发表于 2014-06-17 12:49 |显示全部楼层
回复 7# Herowinter


    只要函数的实现,格式不固定哦,所以有点麻烦,我用c代码实现的被中文搞死了,唉

论坛徽章:
465
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
发表于 2014-06-17 13:47 |显示全部楼层
回复 8# liion631818
Just a simple example, hope it can be useful to you.
  1. awk -vf="ngx_create_chain_of_bufs" '$0~f&&$0!~/;/{in_func=1} in_func{left+=gsub(/{/,"{");right+=gsub(/}/,"}");print;if(left>0&&left==right)in_func=0}' ngx_buf.c
  2. ngx_create_chain_of_bufs(ngx_pool_t *pool, ngx_bufs_t *bufs)
  3. {
  4.     u_char       *p;
  5.     ngx_int_t     i;
  6.     ngx_buf_t    *b;
  7.     ngx_chain_t  *chain, *cl, **ll;

  8.     p = ngx_palloc(pool, bufs->num * bufs->size);
  9.     if (p == NULL) {
  10.         return NULL;
  11.     }

  12.     ll = &chain;

  13.     for (i = 0; i < bufs->num; i++) {

  14.         b = ngx_calloc_buf(pool);
  15.         if (b == NULL) {
  16.             return NULL;
  17.         }

  18.         /*
  19.          * set by ngx_calloc_buf():
  20.          *
  21.          *     b->file_pos = 0;
  22.          *     b->file_last = 0;
  23.          *     b->file = NULL;
  24.          *     b->shadow = NULL;
  25.          *     b->tag = 0;
  26.          *     and flags
  27.          *
  28.          */

  29.         b->pos = p;
  30.         b->last = p;
  31.         b->temporary = 1;

  32.         b->start = p;
  33.         p += bufs->size;
  34.         b->end = p;

  35.         cl = ngx_alloc_chain_link(pool);
  36.         if (cl == NULL) {
  37.             return NULL;
  38.         }

  39.         cl->buf = b;
  40.         *ll = cl;
  41.         ll = &cl->next;
  42.     }

  43.     *ll = NULL;

  44.     return chain;
  45. }
复制代码
ngx_buf.c

  1. /*
  2. * Copyright (C) Igor Sysoev
  3. * Copyright (C) Nginx, Inc.
  4. */


  5. #include <ngx_config.h>
  6. #include <ngx_core.h>


  7. ngx_buf_t *
  8. ngx_create_temp_buf(ngx_pool_t *pool, size_t size)
  9. {
  10.     ngx_buf_t *b;

  11.     b = ngx_calloc_buf(pool);
  12.     if (b == NULL) {
  13.         return NULL;
  14.     }

  15.     b->start = ngx_palloc(pool, size);
  16.     if (b->start == NULL) {
  17.         return NULL;
  18.     }

  19.     /*
  20.      * set by ngx_calloc_buf():
  21.      *
  22.      *     b->file_pos = 0;
  23.      *     b->file_last = 0;
  24.      *     b->file = NULL;
  25.      *     b->shadow = NULL;
  26.      *     b->tag = 0;
  27.      *     and flags
  28.      */

  29.     b->pos = b->start;
  30.     b->last = b->start;
  31.     b->end = b->last + size;
  32.     b->temporary = 1;

  33.     return b;
  34. }


  35. ngx_chain_t *
  36. ngx_alloc_chain_link(ngx_pool_t *pool)
  37. {
  38.     ngx_chain_t  *cl;

  39.     cl = pool->chain;

  40.     if (cl) {
  41.         pool->chain = cl->next;
  42.         return cl;
  43.     }

  44.     cl = ngx_palloc(pool, sizeof(ngx_chain_t));
  45.     if (cl == NULL) {
  46.         return NULL;
  47.     }

  48.     return cl;
  49. }

  50. ngx_create_chain_of_bufs(p,q);
  51. ngx_chain_t *
  52. ngx_create_chain_of_bufs(ngx_pool_t *pool, ngx_bufs_t *bufs)
  53. {
  54.     u_char       *p;
  55.     ngx_int_t     i;
  56.     ngx_buf_t    *b;
  57.     ngx_chain_t  *chain, *cl, **ll;

  58.     p = ngx_palloc(pool, bufs->num * bufs->size);
  59.     if (p == NULL) {
  60.         return NULL;
  61.     }

  62.     ll = &chain;

  63.     for (i = 0; i < bufs->num; i++) {

  64.         b = ngx_calloc_buf(pool);
  65.         if (b == NULL) {
  66.             return NULL;
  67.         }

  68.         /*
  69.          * set by ngx_calloc_buf():
  70.          *
  71.          *     b->file_pos = 0;
  72.          *     b->file_last = 0;
  73.          *     b->file = NULL;
  74.          *     b->shadow = NULL;
  75.          *     b->tag = 0;
  76.          *     and flags
  77.          *
  78.          */

  79.         b->pos = p;
  80.         b->last = p;
  81.         b->temporary = 1;

  82.         b->start = p;
  83.         p += bufs->size;
  84.         b->end = p;

  85.         cl = ngx_alloc_chain_link(pool);
  86.         if (cl == NULL) {
  87.             return NULL;
  88.         }

  89.         cl->buf = b;
  90.         *ll = cl;
  91.         ll = &cl->next;
  92.     }

  93.     *ll = NULL;

  94.     return chain;
  95. }


  96. ngx_int_t
  97. ngx_chain_add_copy(ngx_pool_t *pool, ngx_chain_t **chain, ngx_chain_t *in)
  98. {
  99.     ngx_chain_t  *cl, **ll;

  100.     ll = chain;

  101.     for (cl = *chain; cl; cl = cl->next) {
  102.         ll = &cl->next;
  103.     }

  104.     while (in) {
  105.         cl = ngx_alloc_chain_link(pool);
  106.         if (cl == NULL) {
  107.             return NGX_ERROR;
  108.         }

  109.         cl->buf = in->buf;
  110.         *ll = cl;
  111.         ll = &cl->next;
  112.         in = in->next;
  113.     }

  114.     *ll = NULL;

  115.     return NGX_OK;
  116. }


  117. ngx_chain_t *
  118. ngx_chain_get_free_buf(ngx_pool_t *p, ngx_chain_t **free)
  119. {
  120.     ngx_chain_t  *cl;

  121.     if (*free) {
  122.         cl = *free;
  123.         *free = cl->next;
  124.         cl->next = NULL;
  125.         return cl;
  126.     }

  127.     cl = ngx_alloc_chain_link(p);
  128.     if (cl == NULL) {
  129.         return NULL;
  130.     }

  131.     cl->buf = ngx_calloc_buf(p);
  132.     if (cl->buf == NULL) {
  133.         return NULL;
  134.     }

  135.     cl->next = NULL;

  136.     return cl;
  137. }


  138. void
  139. ngx_chain_update_chains(ngx_pool_t *p, ngx_chain_t **free, ngx_chain_t **busy,
  140.     ngx_chain_t **out, ngx_buf_tag_t tag)
  141. {
  142.     ngx_chain_t  *cl;

  143.     if (*busy == NULL) {
  144.         *busy = *out;

  145.     } else {
  146.         for (cl = *busy; cl->next; cl = cl->next) { /* void */ }

  147.         cl->next = *out;
  148.     }

  149.     *out = NULL;

  150.     while (*busy) {
  151.         cl = *busy;

  152.         if (ngx_buf_size(cl->buf) != 0) {
  153.             break;
  154.         }

  155.         if (cl->buf->tag != tag) {
  156.             *busy = cl->next;
  157.             ngx_free_chain(p, cl);
  158.             continue;
  159.         }

  160.         cl->buf->pos = cl->buf->start;
  161.         cl->buf->last = cl->buf->start;

  162.         *busy = cl->next;
  163.         cl->next = *free;
  164.         *free = cl;
  165.     }
  166. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,7折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时七折期:2019年8月31日前


----------------------------------------

大会官网>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP