Chinaunix

标题: 今天论坛真冷清~~出个格式化缩进的题,求应战 [打印本页]

作者: bulletmarquis    时间: 2014-09-30 14:35
标题: 今天论坛真冷清~~出个格式化缩进的题,求应战
本帖最后由 bulletmarquis 于 2014-09-30 15:53 编辑

从之前的帖子里面翻了一条比较长的单行awk代码,因为木有分行和缩进,看起来不忍直视

求自动排版,美化一下,不限语言~~
缩进以2个空格为准,前面的参数赋值部分可以忽略
  1. awk -v ord="$ord" -v key="$1" -v l=$length -v ka="0x41C64E6D" -v kb="0x3039" -v kc="0x80000000" 'function mod(p){return (p%256)}function div(p){return int(p/256)}function str_val(str,ret,chars,n,i,k,c){if(str ~ /^0[0-7]*$/){n=length(str);ret=0;for(i=1;i<=n;i++){c=substr(str,i,1);if((k=index("01234567",c))>0)k--;ret=ret*8+k}}else if(str ~ /^0[xX][[:xdigit:]]+/){str=substr(str,3);n=length(str);ret=0;for(i=1;i<=n;i++){c=substr(str,i,1);c=tolower(c);if((k=index("0123456789",c))>0)k--;else if((k=index("abcdef",c))>0) k+=9;ret=ret*16+k}}else if(str ~ /^[-+]?([0-9]+([.][0-9]*([Ee][0-9]+)?)?|([.][0-9]+([Ee][-+]?[0-9]+)?))$/){ret=str+0}else ret="NOT-A-NUMBER";return ret}function hex_ary(p,ary){p=str_val(p);ary="";while(p>0){ary=sprintf("%s:%d",ary,mod(p));p=div(p)}ary=substr(ary,2);return ary}function b_mul(a,b,c,i,j,m,n){m=length(a);n=length(b);for(i=1;i<=m;i++) for(j=1;j<=n;j++){c[i+j-1]+=a[i]*b[j];c[i+j]+=div(c[i+j-1]);c[i+j-1]=mod(c[i+j-1])}for(i=length(c);c[i]<1&&i>1;i--) delete c[i]}BEGIN{split(key,ks,":");split(ord,o,":");for(i=1;i<=l;i++) k[i]=str_val(sprintf("%s%s","0x",ks[length(ks)+1-o[i]]));split(hex_ary(ka),a,":");split(hex_ary(kb),b,":");split(hex_ary(kc),c,":");h=l;la=length(a);lb=length(b);lc=length(c);h=(h<la)?la:h;h=(h<lb)?lb:h;h=(h<lc)?lc:h;ta=str_val(ka);tb=str_val(kb);tc=str_val(kc)}{for(i=1;i<=NF;i++) printf "%02X ",xor(k[i],$i);if(NF<l) exit;tk=0;for(i=l;i>0;i--) tk=tk*256+k[o[i]];delete t;delete d;for(i=1;i<=2*h;i++) t[i]=(i>lb)?0:b[i];for(i=1;i<=l;i++) d[i]=k[o[i]];b_mul(d,a,t);delete p;tp=int((tk*ta+tb)/tc);i=1;while(tp>0){p[i++]=mod(tp);tp=div(tp)};delete q;b_mul(p,c,q);m=length(q);for(i=1;i<=m;i++){t[i]-=q[i];t[i+1]-=(t[i]<0);t[i]=mod(t[i]+256)}for(i=length(t);t[i]<1&&i>1;i--) delete t[i];for(i=1;i<=l;i++) k[o[i]]=t[i];}'
复制代码

作者: chengchow    时间: 2014-09-30 14:48
你写个我学学!
作者: yestreenstars    时间: 2014-09-30 15:08
四个字:闲得蛋疼
作者: wiliiwin    时间: 2014-09-30 15:19
我的妈呀  这么长的awk代码  
作者: reyleon    时间: 2014-09-30 15:29

作者: bulletmarquis    时间: 2014-09-30 15:37
回复 2# chengchow


    哈哈,我倒是真想写个sql的解析脚本,不过一直没精力,等着有现成的东东可以抄过来改改呢
作者: bulletmarquis    时间: 2014-09-30 15:38
回复 3# yestreenstars


    唉,这不是看你们一个个今天无聊的都在论坛里炒冷饭,想了半天也就这个能折腾一下你们了~
作者: Herowinter    时间: 2014-09-30 15:39
回复 1# bulletmarquis

节前大家都去happy了,话说能维护此类代码的也是神人,佩服.
   
作者: bulletmarquis    时间: 2014-09-30 15:44
回复 8# Herowinter


    想起以前写js的时候,看ext的源码压缩版就是这个样子。。
作者: yestreenstars    时间: 2014-09-30 16:10
回复 7# bulletmarquis

你那么喜欢折腾,很适合你,我看好你!
   
作者: bulletmarquis    时间: 2014-09-30 16:18
回复 10# yestreenstars


    {:3_191:}
作者: jason680    时间: 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. }'
复制代码

作者: yestreenstars    时间: 2014-09-30 17:42
回复 12# jason680

OMG
Orz
还真有人理楼主~
{:3_184:}
   
作者: reb00t    时间: 2014-09-30 17:47
回复 12# jason680


    大神威武!!
作者: funexploit    时间: 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.           )))
复制代码

作者: jason680    时间: 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.     ...
复制代码

作者: funexploit    时间: 2014-10-02 18:26
回复 16# jason680

这是格式化c代码的elisp程序,如果只是为了能看懂复杂的awk脚本的话,完全够用了
   
作者: 李满满    时间: 2014-10-02 18:33
大神为何如此叼扎天~
作者: Herowinter    时间: 2014-10-02 18:35
回复 12# jason680

大神为何这么吊,国庆的缘故吗?
   
作者: ziyunfei    时间: 2014-10-03 15:55
你需要写一个shell parser 和 awk parser, 才有可能写出适合这个 case 的完美的 beautifier
作者: bulletmarquis    时间: 2014-10-08 08:50
回复 12# jason680


    我擦,威猛先生啊。。。
作者: bulletmarquis    时间: 2014-10-08 08:53
吓尿了,国庆歇完回来,看到真有大神解题~~~~~




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2