📄 exsort.c
字号:
#include <u.h>#include <libc.h>int ulcmp(void*, void*);void swapem(ulong*, long);enum{ Wormsize = 157933,};int wflag;voidmain(int argc, char *argv[]){ long i, l, x, lobits, hibits, tot; int f, j; char *file; ulong *b, a, lo, hi; ARGBEGIN { default: print("usage: disk/exsort [-w] [file]\n"); exits("usage"); case 'w': wflag++; break; } ARGEND; file = "/adm/cache"; if(argc > 0) file = argv[0]; if(wflag) f = open(file, ORDWR); else f = open(file, OREAD); if(f < 0) { print("cant open %s: %r\n", file); exits("open"); } l = seek(f, 0, 2) / sizeof(long); b = malloc(l*sizeof(long)); if(b == 0) { print("cant malloc %s: %r\n", file); exits("malloc"); } seek(f, 0, 0); if(read(f, b, l*sizeof(long)) != l*sizeof(long)) { print("short read %s: %r\n", file); exits("read"); } lobits = 0; hibits = 0; for(i=0; i<l; i++) { a = b[i]; if(a & (1L<<7)) lobits++; if(a & (1L<<31)) hibits++; } print("lobits = %6ld\n", lobits); print("hibits = %6ld\n", hibits); if(hibits > lobits) { print("swapping\n"); swapem(b, l); } qsort(b, l, sizeof(ulong), ulcmp); tot = 0; for(j=0; j<100; j++) { lo = j*Wormsize; hi = lo + Wormsize; x = 0; for(i=0; i<l; i++) { a = b[i]; if(a >= lo && a < hi) x++; } if(x) { print("disk %2d %6ld blocks\n", j, x); tot += x; } } print("total %6ld blocks\n", tot); if(wflag) { if(hibits > lobits) swapem(b, l); seek(f, 0, 0); if(write(f, b, l*sizeof(long)) != l*sizeof(long)) { print("short write %s\n", file); exits("write"); } } exits(0);}intulcmp(void *va, void *vb){ ulong *a, *b; a = va; b = vb; if(*a > *b) return 1; if(*a < *b) return -1; return 0;}voidswapem(ulong *b, long l){ long i; ulong x, a; for(i=0; i<l; i++, b++) { a = *b; x = (((a>>0) & 0xff) << 24) | (((a>>8) & 0xff) << 16) | (((a>>16) & 0xff) << 8) | (((a>>24) & 0xff) << 0); *b = x; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -