免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5488 | 回复: 18
打印 上一主题 下一主题

[C] [code review了]一个函数,看了眼,吓坏了。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-06-05 15:50 |只看该作者 |倒序浏览
本帖最后由 image_z 于 2013-06-05 20:51 编辑

  1. int next_token(struct parse_state *state)
  2. {
  3.     char *x = state->ptr;
  4.     char *s;

  5.     if (state->nexttoken) {
  6.         int t = state->nexttoken;
  7.         state->nexttoken = 0;
  8.         return t;
  9.     }

  10.     for (;;) {
  11.         switch (*x) {
  12.         case 0:
  13.             state->ptr = x;
  14.             return T_EOF;
  15.         case '\n':
  16.             x++;
  17.             state->ptr = x;
  18.             return T_NEWLINE;
  19.         case ' ':
  20.         case '\t':
  21.         case '\r':
  22.             x++;
  23.             continue;
  24.         case '#':
  25.             while (*x && (*x != '\n')) x++;
  26.             if (*x == '\n') {
  27.                 state->ptr = x+1;
  28.                 return T_NEWLINE;
  29.             } else {
  30.                 state->ptr = x;
  31.                 return T_EOF;
  32.             }
  33.         default:
  34.             goto text;
  35.         }
  36.     }

  37. textdone:
  38.     state->ptr = x;
  39.     *s = 0;
  40.     return T_TEXT;
  41. text:
  42.     state->text = s = x;
  43. textresume:
  44.     for (;;) {
  45.         switch (*x) {
  46.         case 0:
  47.             goto textdone;
  48.         case ' ':
  49.         case '\t':
  50.         case '\r':
  51.             x++;
  52.             goto textdone;
  53.         case '\n':
  54.             state->nexttoken = T_NEWLINE;
  55.             x++;
  56.             goto textdone;
  57.         case '"':
  58.             x++;
  59.             for (;;) {
  60.                 switch (*x) {
  61.                 case 0:
  62.                         /* unterminated quoted thing */
  63.                     state->ptr = x;
  64.                     return T_EOF;
  65.                 case '"':
  66.                     x++;
  67.                     goto textresume;
  68.                 default:
  69.                     *s++ = *x++;
  70.                 }
  71.             }
  72.             break;
  73.         case '\\':
  74.             x++;
  75.             switch (*x) {
  76.             case 0:
  77.                 goto textdone;
  78.             case 'n':
  79.                 *s++ = '\n';
  80.                 break;
  81.             case 'r':
  82.                 *s++ = '\r';
  83.                 break;
  84.             case 't':
  85.                 *s++ = '\t';
  86.                 break;
  87.             case '\\':
  88.                 *s++ = '\\';
  89.                 break;
  90.             case '\r':
  91.                     /* \ <cr> <lf> -> line continuation */
  92.                 if (x[1] != '\n') {
  93.                     x++;
  94.                     continue;
  95.                 }
  96.             case '\n':
  97.                     /* \ <lf> -> line continuation */
  98.                 state->line++;
  99.                 x++;
  100.                     /* eat any extra whitespace */
  101.                 while((*x == ' ') || (*x == '\t')) x++;
  102.                 continue;
  103.             default:
  104.                     /* unknown escape -- just copy */
  105.                 *s++ = *x++;
  106.             }
  107.             continue;
  108.         default:
  109.             *s++ = *x++;
  110.         }
  111.     }
  112.     return T_EOF;
  113. }
复制代码
提几个问题:
1,此处无注释(本来也没有,不是没贴出来),有谁能在10分钟内大概推测下该接口的功能。
2,如果你作为该段代码的维护者,测试人员测试出该段代码有bug,有谁能在1天内,尝试入手修改调试。(不需要你立即定位,解掉,看到这段代码的逻辑结构,你在那个地方添加语句,能预测该语句对整个接口的影响)
3,你能够在多长时间内大概的理清这一小段代码的逻辑,流程?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2013-06-05 15:54 |只看该作者
很正常的代码啊,goto用得好,驱动级代码

论坛徽章:
0
3 [报告]
发表于 2013-06-05 16:04 |只看该作者
回复 2# safedead


    我要再告诉你这个是我写的,估计会被黑出翔吧

论坛徽章:
0
4 [报告]
发表于 2013-06-05 16:11 |只看该作者
功能不知道, 代码还蛮整齐呀,

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
5 [报告]
发表于 2013-06-05 16:23 |只看该作者
还行吧,就是出口多了点

论坛徽章:
0
6 [报告]
发表于 2013-06-05 19:53 |只看该作者
没人气啊。标题不够长!

论坛徽章:
1
操作系统版块每日发帖之星
日期:2015-07-31 06:20:00
7 [报告]
发表于 2013-06-05 20:07 |只看该作者
哪里被吓到了

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:15程序设计版块每日发帖之星
日期:2015-09-21 06:20:002015亚冠之卡尔希纳萨夫
日期:2015-09-22 14:11:11程序设计版块每日发帖之星
日期:2015-09-25 06:20:00每日论坛发贴之星
日期:2015-09-25 06:20:00
8 [报告]
发表于 2013-06-05 23:08 |只看该作者
这个是解析脚本的吧,android里边init.rc文件的解析程序就是这个这个样的

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:15程序设计版块每日发帖之星
日期:2015-09-21 06:20:002015亚冠之卡尔希纳萨夫
日期:2015-09-22 14:11:11程序设计版块每日发帖之星
日期:2015-09-25 06:20:00每日论坛发贴之星
日期:2015-09-25 06:20:00
9 [报告]
发表于 2013-06-05 23:10 |只看该作者
这种程序拿个具体文件对比走一遍就全都清楚了——面向过程的嘛

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:50:28
10 [报告]
发表于 2013-06-06 08:47 |只看该作者
解析文本?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP