13e12c5d1SDavid du Colombier #include <u.h> 23e12c5d1SDavid du Colombier #include <libc.h> 33e12c5d1SDavid du Colombier 43e12c5d1SDavid du Colombier int ulcmp(ulong*, ulong*); 53e12c5d1SDavid du Colombier void swapem(ulong*, long); 63e12c5d1SDavid du Colombier 73e12c5d1SDavid du Colombier #define Wormsize 546000 83e12c5d1SDavid du Colombier int wflag; 93e12c5d1SDavid du Colombier 103e12c5d1SDavid du Colombier void 113e12c5d1SDavid du Colombier main(int argc, char *argv[]) 123e12c5d1SDavid du Colombier { 133e12c5d1SDavid du Colombier long i, l, x, lobits, hibits, tot; 143e12c5d1SDavid du Colombier int f, j; 153e12c5d1SDavid du Colombier char *file; 163e12c5d1SDavid du Colombier ulong *b, a, lo, hi; 173e12c5d1SDavid du Colombier 183e12c5d1SDavid du Colombier ARGBEGIN { 193e12c5d1SDavid du Colombier default: 203e12c5d1SDavid du Colombier print("usage: exsort [-w] [file]\n"); 213e12c5d1SDavid du Colombier exits("usage"); 223e12c5d1SDavid du Colombier case 'w': 233e12c5d1SDavid du Colombier wflag++; 243e12c5d1SDavid du Colombier break; 253e12c5d1SDavid du Colombier } ARGEND; 263e12c5d1SDavid du Colombier 273e12c5d1SDavid du Colombier file = "/adm/cache"; 283e12c5d1SDavid du Colombier if(argc > 0) 293e12c5d1SDavid du Colombier file = argv[0]; 303e12c5d1SDavid du Colombier 313e12c5d1SDavid du Colombier if(wflag) 323e12c5d1SDavid du Colombier f = open(file, ORDWR); 333e12c5d1SDavid du Colombier else 343e12c5d1SDavid du Colombier f = open(file, OREAD); 353e12c5d1SDavid du Colombier if(f < 0) { 36*219b2ee8SDavid du Colombier print("cant open %s: %r\n", file); 373e12c5d1SDavid du Colombier exits("open"); 383e12c5d1SDavid du Colombier } 393e12c5d1SDavid du Colombier l = seek(f, 0, 2) / sizeof(long); 403e12c5d1SDavid du Colombier 413e12c5d1SDavid du Colombier b = malloc(l*sizeof(long)); 423e12c5d1SDavid du Colombier if(b == 0) { 43*219b2ee8SDavid du Colombier print("cant malloc %s: %r\n", file); 443e12c5d1SDavid du Colombier exits("malloc"); 453e12c5d1SDavid du Colombier } 463e12c5d1SDavid du Colombier seek(f, 0, 0); 473e12c5d1SDavid du Colombier if(read(f, b, l*sizeof(long)) != l*sizeof(long)) { 48*219b2ee8SDavid du Colombier print("short read %s: %r\n", file); 493e12c5d1SDavid du Colombier exits("read"); 503e12c5d1SDavid du Colombier } 513e12c5d1SDavid du Colombier 523e12c5d1SDavid du Colombier lobits = 0; 533e12c5d1SDavid du Colombier hibits = 0; 543e12c5d1SDavid du Colombier for(i=0; i<l; i++) { 553e12c5d1SDavid du Colombier a = b[i]; 56*219b2ee8SDavid du Colombier if(a & (1L<<7)) 573e12c5d1SDavid du Colombier lobits++; 58*219b2ee8SDavid du Colombier if(a & (1L<<31)) 593e12c5d1SDavid du Colombier hibits++; 603e12c5d1SDavid du Colombier } 613e12c5d1SDavid du Colombier 623e12c5d1SDavid du Colombier print("lobits = %6ld\n", lobits); 633e12c5d1SDavid du Colombier print("hibits = %6ld\n", hibits); 643e12c5d1SDavid du Colombier 653e12c5d1SDavid du Colombier if(hibits > lobits) { 663e12c5d1SDavid du Colombier print("swapping\n"); 673e12c5d1SDavid du Colombier swapem(b, l); 683e12c5d1SDavid du Colombier } 693e12c5d1SDavid du Colombier 703e12c5d1SDavid du Colombier qsort(b, l, sizeof(ulong), ulcmp); 713e12c5d1SDavid du Colombier 723e12c5d1SDavid du Colombier tot = 0; 73*219b2ee8SDavid du Colombier for(j=0; j<100; j++) { 743e12c5d1SDavid du Colombier lo = j*Wormsize; 753e12c5d1SDavid du Colombier hi = lo + Wormsize; 76*219b2ee8SDavid du Colombier 773e12c5d1SDavid du Colombier x = 0; 783e12c5d1SDavid du Colombier for(i=0; i<l; i++) { 793e12c5d1SDavid du Colombier a = b[i]; 803e12c5d1SDavid du Colombier if(a >= lo && a < hi) 813e12c5d1SDavid du Colombier x++; 823e12c5d1SDavid du Colombier } 83*219b2ee8SDavid du Colombier if(x) { 843e12c5d1SDavid du Colombier print("disk %2d %6ld blocks\n", j, x); 853e12c5d1SDavid du Colombier tot += x; 863e12c5d1SDavid du Colombier } 87*219b2ee8SDavid du Colombier } 883e12c5d1SDavid du Colombier print("total %6ld blocks\n", tot); 893e12c5d1SDavid du Colombier 903e12c5d1SDavid du Colombier 913e12c5d1SDavid du Colombier if(wflag) { 923e12c5d1SDavid du Colombier if(hibits > lobits) 933e12c5d1SDavid du Colombier swapem(b, l); 943e12c5d1SDavid du Colombier seek(f, 0, 0); 953e12c5d1SDavid du Colombier if(write(f, b, l*sizeof(long)) != l*sizeof(long)) { 963e12c5d1SDavid du Colombier print("short write %s\n", file); 973e12c5d1SDavid du Colombier exits("write"); 983e12c5d1SDavid du Colombier } 993e12c5d1SDavid du Colombier } 1003e12c5d1SDavid du Colombier 1013e12c5d1SDavid du Colombier exits(0); 1023e12c5d1SDavid du Colombier } 1033e12c5d1SDavid du Colombier 1043e12c5d1SDavid du Colombier int 1053e12c5d1SDavid du Colombier ulcmp(ulong *a, ulong *b) 1063e12c5d1SDavid du Colombier { 1073e12c5d1SDavid du Colombier if(*a > *b) 1083e12c5d1SDavid du Colombier return 1; 1093e12c5d1SDavid du Colombier if(*a < *b) 1103e12c5d1SDavid du Colombier return -1; 1113e12c5d1SDavid du Colombier return 0; 1123e12c5d1SDavid du Colombier } 1133e12c5d1SDavid du Colombier 1143e12c5d1SDavid du Colombier void 1153e12c5d1SDavid du Colombier swapem(ulong *b, long l) 1163e12c5d1SDavid du Colombier { 1173e12c5d1SDavid du Colombier long i; 1183e12c5d1SDavid du Colombier ulong x, a; 1193e12c5d1SDavid du Colombier 1203e12c5d1SDavid du Colombier for(i=0; i<l; i++, b++) { 1213e12c5d1SDavid du Colombier a = *b; 1223e12c5d1SDavid du Colombier x = (((a>>0) & 0xff) << 24) | 1233e12c5d1SDavid du Colombier (((a>>8) & 0xff) << 16) | 1243e12c5d1SDavid du Colombier (((a>>16) & 0xff) << 8) | 1253e12c5d1SDavid du Colombier (((a>>24) & 0xff) << 0); 1263e12c5d1SDavid du Colombier *b = x; 1273e12c5d1SDavid du Colombier } 1283e12c5d1SDavid du Colombier } 129