免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: bulletmarquis
打印 上一主题 下一主题

[文本处理] 今天论坛真冷清~~出个格式化缩进的题,求应战 [复制链接]

论坛徽章:
2
摩羯座
日期:2014-11-03 15:28:56卯兔
日期:2015-01-04 17:20:51
11 [报告]
发表于 2014-09-30 16:18 |只看该作者
回复 10# yestreenstars


    {:3_191:}

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
12 [报告]
发表于 2014-09-30 17:27 |只看该作者
本帖最后由 jason680 于 2014-09-30 17:33 编辑

回复 11# bulletmarquis

Would you like this way ...
Note: It's only work for some simple awk code

$ perl -lane '{s/(\)\{)/$1\n/g;s/(BEGIN|END)\{/$1\{\n/g;s/;([^"])/;\n$1/g;s/([^\n])}/$1\n}\n/g;s/^\s*\{/\{\n/gm;@d=split"\n";while($_=shift @d){$c--if(/^\s*\}/);$s="  " x $c;if(m/^\s*for/){$_.=shift(@d).shift(@d)};print "$s$_";$c++if(m/\{\s*$/)}}' x.awk
  1. awk -v ord="$ord" -v key="$1" -v l=$length -v ka="0x41C64E6D" -v kb="0x3039" -v kc="0x80000000" 'function mod(p){
  2.   return (p%256)
  3. }
  4. function div(p){
  5.   return int(p/256)
  6. }
  7. function str_val(str,ret,chars,n,i,k,c){
  8.   if(str ~ /^0[0-7]*$/){
  9.     n=length(str);
  10.     ret=0;
  11.     for(i=1;i<=n;i++){
  12.       c=substr(str,i,1);
  13.       if((k=index("01234567",c))>0)k--;
  14.       ret=ret*8+k
  15.     }
  16.   }else if(str ~ /^0[xX][[:xdigit:]]+/){
  17.     str=substr(str,3);
  18.     n=length(str);
  19.     ret=0;
  20.     for(i=1;i<=n;i++){
  21.       c=substr(str,i,1);
  22.       c=tolower(c);
  23.       if((k=index("0123456789",c))>0)k--;
  24.       else if((k=index("abcdef",c))>0) k+=9;
  25.       ret=ret*16+k
  26.     }
  27.   }else if(str ~ /^[-+]?([0-9]+([.][0-9]*([Ee][0-9]+)?)?|([.][0-9]+([Ee][-+]?[0-9]+)?))$/){
  28.     ret=str+0
  29.   }
  30.   else ret="NOT-A-NUMBER";
  31.   return ret
  32. }
  33. function hex_ary(p,ary){
  34.   p=str_val(p);
  35.   ary="";
  36.   while(p>0){
  37.     ary=sprintf("%s:%d",ary,mod(p));
  38.     p=div(p)
  39.   }
  40.   ary=substr(ary,2);
  41.   return ary
  42. }
  43. function b_mul(a,b,c,i,j,m,n){
  44.   m=length(a);
  45.   n=length(b);
  46.   for(i=1;i<=m;i++) for(j=1;
  47.   j<=n;
  48.   j++){
  49.     c[i+j-1]+=a[i]*b[j];
  50.     c[i+j]+=div(c[i+j-1]);
  51.     c[i+j-1]=mod(c[i+j-1])
  52.   }
  53.   for(i=length(c);c[i]<1&&i>1;i--) delete c[i]
  54. }
  55. BEGIN{
  56.   split(key,ks,":");
  57.   split(ord,o,":");
  58.   for(i=1;i<=l;i++) k[i]=str_val(sprintf("%s%s","0x",ks[length(ks)+1-o[i]]));
  59.   split(hex_ary(ka),a,":");
  60.   split(hex_ary(kb),b,":");
  61.   split(hex_ary(kc),c,":");
  62.   h=l;
  63.   la=length(a);
  64.   lb=length(b);
  65.   lc=length(c);
  66.   h=(h<la)?la:h;
  67.   h=(h<lb)?lb:h;
  68.   h=(h<lc)?lc:h;
  69.   ta=str_val(ka);
  70.   tb=str_val(kb);
  71.   tc=str_val(kc)
  72. }
  73. {
  74.   for(i=1;i<=NF;i++) printf "%02X ",xor(k[i],$i);
  75.   if(NF<l) exit;
  76.   tk=0;
  77.   for(i=l;i>0;i--) tk=tk*256+k[o[i]];
  78.   delete t;
  79.   delete d;
  80.   for(i=1;i<=2*h;i++) t[i]=(i>lb)?0:b[i];
  81.   for(i=1;i<=l;i++) d[i]=k[o[i]];
  82.   b_mul(d,a,t);
  83.   delete p;
  84.   tp=int((tk*ta+tb)/tc);
  85.   i=1;
  86.   while(tp>0){
  87.     p[i++]=mod(tp);
  88.     tp=div(tp)
  89.   }
  90.   ;
  91.   delete q;
  92.   b_mul(p,c,q);
  93.   m=length(q);
  94.   for(i=1;i<=m;i++){
  95.     t[i]-=q[i];
  96.     t[i+1]-=(t[i]<0);
  97.     t[i]=mod(t[i]+256)
  98.   }
  99.   for(i=length(t);t[i]<1&&i>1;i--) delete t[i];
  100.   for(i=1;i<=l;i++) k[o[i]]=t[i];
  101. }'
复制代码

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
13 [报告]
发表于 2014-09-30 17:42 |只看该作者
回复 12# jason680

OMG
Orz
还真有人理楼主~
{:3_184:}
   

论坛徽章:
14
15-16赛季CBA联赛之辽宁
日期:2019-06-16 15:47:3515-16赛季CBA联赛之广夏
日期:2016-08-13 21:24:352015亚冠之武里南联
日期:2015-07-07 17:37:372015亚冠之萨济拖拉机
日期:2015-07-06 17:07:482015亚冠之全北现代
日期:2015-06-04 13:54:272015亚冠之城南
日期:2015-05-21 15:43:212015年亚洲杯之伊朗
日期:2015-04-25 18:20:362015年亚洲杯之伊朗
日期:2015-04-20 16:06:052015年亚洲杯之科威特
日期:2015-03-07 12:51:26丑牛
日期:2014-12-30 10:26:38申猴
日期:2014-09-28 22:40:18金牛座
日期:2014-09-13 21:12:22
14 [报告]
发表于 2014-09-30 17:47 |只看该作者
回复 12# jason680


    大神威武!!

论坛徽章:
0
15 [报告]
发表于 2014-10-01 22:07 |只看该作者
本帖最后由 funexploit 于 2014-10-01 22:12 编辑

如果只是需要看懂代码的话,我的完全可以满足要求:
1、建立tmp.c,复制代码
2、全选,运行格式化代码的命令C-M-\

格式化后的代码如下:
  1. function mod(p)
  2. {
  3.     return (p % 256)}

  4. function div(p)
  5. {
  6.     return int (p / 256)} function str_val(str, ret, chars, n, i, k, c)
  7.     {
  8.         if (str ~ /^0[0 - 7] * $ /) {
  9.             n = length(str);
  10.             ret = 0;
  11.             for (i = 1; i <= n; i++) {
  12.                 c = substr(str, i, 1);
  13.                 if ((k = index("01234567", c)) > 0)
  14.                     k--;
  15.                 ret = ret * 8 + k}
  16.         } else if (str ~ /^0[xX][[: xdigit:]] + /) {
  17.             str = substr(str, 3);
  18.             n = length(str);
  19.             ret = 0;
  20.             for (i = 1; i <= n; i++) {
  21.                 c = substr(str, i, 1);
  22.                 c = tolower(c);
  23.                 if ((k = index("0123456789", c)) > 0)
  24.                     k--;
  25.                 else if ((k = index("abcdef", c)) > 0)
  26.                     k += 9;
  27.                 ret = ret * 16 + k}
  28.         } else if (str ~
  29.                    /^[-+]? ([0 - 9] +
  30.                             ([.][0 - 9] * ([Ee][0 - 9] +) ?) ? |([.][0 - 9] +
  31.                                                                  ([Ee][-+]?[0 - 9]
  32.                                                                   +) ?)) $ /) {
  33.             ret = str + 0} else
  34.             ret = "NOT-A-NUMBER";
  35.         return ret}

  36. function hex_ary(p, ary)
  37. {
  38.     p = str_val(p);
  39.     ary = "";
  40.     while (p > 0) {
  41.         ary = sprintf("%s:%d", ary, mod(p));
  42.         p = div(p)}
  43.     ary = substr(ary, 2);
  44.     return ary}

  45. function b_mul(a, b, c, i, j, m, n)
  46. {
  47.     m = length(a);
  48.     n = length(b);
  49.     for (i = 1; i <= m; i++)
  50.         for (j = 1; j <= n; j++) {
  51.             c[i + j - 1] += a[i] * b[j];
  52.             c[i + j] += div(c[i + j - 1]);
  53.             c[i + j - 1] = mod(c[i + j - 1])}
  54.     for (i = length(c); c[i] < 1 && i > 1; i--)
  55.         delete c[i]} BEGIN {
  56.             split(key, ks, ":");
  57.             split(ord, o, ":");
  58.             for (i = 1; i <= l; i++)
  59.                 k[i] = str_val(sprintf("%s%s", "0x", ks[length(ks) + 1 - o[i]]));
  60.             split(hex_ary(ka), a, ":");
  61.             split(hex_ary(kb), b, ":");
  62.             split(hex_ary(kc), c, ":");
  63.             h = l;
  64.             la = length(a);
  65.             lb = length(b);
  66.             lc = length(c);
  67.             h = (h < la) ? la : h;
  68.             h = (h < lb) ? lb : h;
  69.             h = (h < lc) ? lc : h;
  70.             ta = str_val(ka);
  71.             tb = str_val(kb);
  72.             tc = str_val(kc)} {
  73.             for (i = 1; i <= NF; i++)
  74.                 printf "%02X ", xor(k[i], $i);
  75.             if (NF < l)
  76.                 exit;
  77.             tk = 0;
  78.             for (i = l; i > 0; i--)
  79.                 tk = tk * 256 + k[o[i]];
  80.             delete t;
  81.             delete d;
  82.             for (i = 1; i <= 2 * h; i++)
  83.                 t[i] = (i > lb) ? 0 : b[i];
  84.             for (i = 1; i <= l; i++)
  85.                 d[i] = k[o[i]];
  86.             b_mul(d, a, t);
  87.             delete p;
  88.             tp = int ((tk * ta + tb) / tc);
  89.             i = 1;
  90.             while (tp > 0) {
  91.                 p[i++] = mod(tp);
  92.                 tp = div(tp)};
  93.             delete q;
  94.             b_mul(p, c, q);
  95.             m = length(q);
  96.             for (i = 1; i <= m; i++) {
  97.                 t[i] -= q[i];
  98.                 t[i + 1] -= (t[i] < 0);
  99.                 t[i] = mod(t[i] + 256)}
  100.             for (i = length(t); t[i] < 1 && i > 1; i--)
  101.                 delete t[i];
  102.             for (i = 1; i <= l; i++)
  103.                 k[o[i]] = t[i];
  104.                      }

复制代码
格式化命令C-M-\对应的elisp函数:
  1. ;; 调用外部的indent命令格式化代码
  2. (defun edx-indent-region (start end)
  3.   (interactive "r")
  4.   (let ((old-region-end (- (point-max) end)))
  5.         (save-excursion
  6.           ;; 先调用Gnu indent命令对选中的代码进行格式化
  7.           (call-process-region
  8.                 start end "indent" t (list (buffer-name) nil) nil
  9.                 "-kr"                                                        ; K&R风格
  10.                 "-l80"                                                        ; 超过这个值后断行
  11.                 )
  12.           ;; 然后用emacs自带的indent-region命令对代码进行二次格式化
  13.           (indent-region start (- (point-max) old-region-end))
  14.           (save-buffer)
  15.           )))
复制代码

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
16 [报告]
发表于 2014-10-02 16:51 |只看该作者
回复 15# funexploit

There is some issue with BEGIN block
  1.     ...
  2.     for (i = length(c); c[i] < 1 && i > 1; i--)
  3.         delete c[i]} BEGIN {
  4.     ...
复制代码

论坛徽章:
0
17 [报告]
发表于 2014-10-02 18:26 |只看该作者
回复 16# jason680

这是格式化c代码的elisp程序,如果只是为了能看懂复杂的awk脚本的话,完全够用了
   

论坛徽章:
3
丑牛
日期:2014-09-13 18:19:22摩羯座
日期:2014-10-10 17:43:02水瓶座
日期:2014-10-16 01:00:22
18 [报告]
发表于 2014-10-02 18:33 |只看该作者
大神为何如此叼扎天~

论坛徽章:
769
金牛座
日期: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
19 [报告]
发表于 2014-10-02 18:35 |只看该作者
回复 12# jason680

大神为何这么吊,国庆的缘故吗?
   

论坛徽章:
1
摩羯座
日期:2014-12-29 15:59:36
20 [报告]
发表于 2014-10-03 15:55 |只看该作者
你需要写一个shell parser 和 awk parser, 才有可能写出适合这个 case 的完美的 beautifier
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP