Chinaunix
标题:
今天论坛真冷清~~出个格式化缩进的题,求应战
[打印本页]
作者:
bulletmarquis
时间:
2014-09-30 14:35
标题:
今天论坛真冷清~~出个格式化缩进的题,求应战
本帖最后由 bulletmarquis 于 2014-09-30 15:53 编辑
从之前的帖子里面翻了一条比较长的单行awk代码,因为木有分行和缩进,看起来不忍直视
求自动排版,美化一下,不限语言~~
缩进以2个空格为准,前面的参数赋值部分可以忽略
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
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];
}'
复制代码
作者:
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-\
格式化后的代码如下:
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];
}
复制代码
格式化命令C-M-\对应的elisp函数:
;; 调用外部的indent命令格式化代码
(defun edx-indent-region (start end)
(interactive "r")
(let ((old-region-end (- (point-max) end)))
(save-excursion
;; 先调用Gnu indent命令对选中的代码进行格式化
(call-process-region
start end "indent" t (list (buffer-name) nil) nil
"-kr" ; K&R风格
"-l80" ; 超过这个值后断行
)
;; 然后用emacs自带的indent-region命令对代码进行二次格式化
(indent-region start (- (point-max) old-region-end))
(save-buffer)
)))
复制代码
作者:
jason680
时间:
2014-10-02 16:51
回复
15#
funexploit
There is some issue with
BEGIN
block
...
for (i = length(c); c[i] < 1 && i > 1; i--)
delete c[i]} BEGIN {
...
复制代码
作者:
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