13e12c5d1SDavid du Colombier #include <u.h>
23e12c5d1SDavid du Colombier #include <libc.h>
33e12c5d1SDavid du Colombier
4*7dd7cddfSDavid du Colombier int ulcmp(void*, void*);
53e12c5d1SDavid du Colombier void swapem(ulong*, long);
63e12c5d1SDavid du Colombier
7*7dd7cddfSDavid du Colombier enum
8*7dd7cddfSDavid du Colombier {
9*7dd7cddfSDavid du Colombier Wormsize = 157933,
10*7dd7cddfSDavid du Colombier };
113e12c5d1SDavid du Colombier int wflag;
123e12c5d1SDavid du Colombier
133e12c5d1SDavid du Colombier void
main(int argc,char * argv[])143e12c5d1SDavid du Colombier main(int argc, char *argv[])
153e12c5d1SDavid du Colombier {
163e12c5d1SDavid du Colombier long i, l, x, lobits, hibits, tot;
173e12c5d1SDavid du Colombier int f, j;
183e12c5d1SDavid du Colombier char *file;
193e12c5d1SDavid du Colombier ulong *b, a, lo, hi;
203e12c5d1SDavid du Colombier
213e12c5d1SDavid du Colombier ARGBEGIN {
223e12c5d1SDavid du Colombier default:
23*7dd7cddfSDavid du Colombier print("usage: disk/exsort [-w] [file]\n");
243e12c5d1SDavid du Colombier exits("usage");
253e12c5d1SDavid du Colombier case 'w':
263e12c5d1SDavid du Colombier wflag++;
273e12c5d1SDavid du Colombier break;
283e12c5d1SDavid du Colombier } ARGEND;
293e12c5d1SDavid du Colombier
303e12c5d1SDavid du Colombier file = "/adm/cache";
313e12c5d1SDavid du Colombier if(argc > 0)
323e12c5d1SDavid du Colombier file = argv[0];
333e12c5d1SDavid du Colombier
343e12c5d1SDavid du Colombier if(wflag)
353e12c5d1SDavid du Colombier f = open(file, ORDWR);
363e12c5d1SDavid du Colombier else
373e12c5d1SDavid du Colombier f = open(file, OREAD);
383e12c5d1SDavid du Colombier if(f < 0) {
39219b2ee8SDavid du Colombier print("cant open %s: %r\n", file);
403e12c5d1SDavid du Colombier exits("open");
413e12c5d1SDavid du Colombier }
423e12c5d1SDavid du Colombier l = seek(f, 0, 2) / sizeof(long);
433e12c5d1SDavid du Colombier
443e12c5d1SDavid du Colombier b = malloc(l*sizeof(long));
453e12c5d1SDavid du Colombier if(b == 0) {
46219b2ee8SDavid du Colombier print("cant malloc %s: %r\n", file);
473e12c5d1SDavid du Colombier exits("malloc");
483e12c5d1SDavid du Colombier }
493e12c5d1SDavid du Colombier seek(f, 0, 0);
503e12c5d1SDavid du Colombier if(read(f, b, l*sizeof(long)) != l*sizeof(long)) {
51219b2ee8SDavid du Colombier print("short read %s: %r\n", file);
523e12c5d1SDavid du Colombier exits("read");
533e12c5d1SDavid du Colombier }
543e12c5d1SDavid du Colombier
553e12c5d1SDavid du Colombier lobits = 0;
563e12c5d1SDavid du Colombier hibits = 0;
573e12c5d1SDavid du Colombier for(i=0; i<l; i++) {
583e12c5d1SDavid du Colombier a = b[i];
59219b2ee8SDavid du Colombier if(a & (1L<<7))
603e12c5d1SDavid du Colombier lobits++;
61219b2ee8SDavid du Colombier if(a & (1L<<31))
623e12c5d1SDavid du Colombier hibits++;
633e12c5d1SDavid du Colombier }
643e12c5d1SDavid du Colombier
653e12c5d1SDavid du Colombier print("lobits = %6ld\n", lobits);
663e12c5d1SDavid du Colombier print("hibits = %6ld\n", hibits);
673e12c5d1SDavid du Colombier
683e12c5d1SDavid du Colombier if(hibits > lobits) {
693e12c5d1SDavid du Colombier print("swapping\n");
703e12c5d1SDavid du Colombier swapem(b, l);
713e12c5d1SDavid du Colombier }
723e12c5d1SDavid du Colombier
733e12c5d1SDavid du Colombier qsort(b, l, sizeof(ulong), ulcmp);
743e12c5d1SDavid du Colombier
753e12c5d1SDavid du Colombier tot = 0;
76219b2ee8SDavid du Colombier for(j=0; j<100; j++) {
773e12c5d1SDavid du Colombier lo = j*Wormsize;
783e12c5d1SDavid du Colombier hi = lo + Wormsize;
79219b2ee8SDavid du Colombier
803e12c5d1SDavid du Colombier x = 0;
813e12c5d1SDavid du Colombier for(i=0; i<l; i++) {
823e12c5d1SDavid du Colombier a = b[i];
833e12c5d1SDavid du Colombier if(a >= lo && a < hi)
843e12c5d1SDavid du Colombier x++;
853e12c5d1SDavid du Colombier }
86219b2ee8SDavid du Colombier if(x) {
873e12c5d1SDavid du Colombier print("disk %2d %6ld blocks\n", j, x);
883e12c5d1SDavid du Colombier tot += x;
893e12c5d1SDavid du Colombier }
90219b2ee8SDavid du Colombier }
913e12c5d1SDavid du Colombier print("total %6ld blocks\n", tot);
923e12c5d1SDavid du Colombier
933e12c5d1SDavid du Colombier
943e12c5d1SDavid du Colombier if(wflag) {
953e12c5d1SDavid du Colombier if(hibits > lobits)
963e12c5d1SDavid du Colombier swapem(b, l);
973e12c5d1SDavid du Colombier seek(f, 0, 0);
983e12c5d1SDavid du Colombier if(write(f, b, l*sizeof(long)) != l*sizeof(long)) {
993e12c5d1SDavid du Colombier print("short write %s\n", file);
1003e12c5d1SDavid du Colombier exits("write");
1013e12c5d1SDavid du Colombier }
1023e12c5d1SDavid du Colombier }
1033e12c5d1SDavid du Colombier
1043e12c5d1SDavid du Colombier exits(0);
1053e12c5d1SDavid du Colombier }
1063e12c5d1SDavid du Colombier
1073e12c5d1SDavid du Colombier int
ulcmp(void * va,void * vb)108*7dd7cddfSDavid du Colombier ulcmp(void *va, void *vb)
1093e12c5d1SDavid du Colombier {
110*7dd7cddfSDavid du Colombier ulong *a, *b;
111*7dd7cddfSDavid du Colombier
112*7dd7cddfSDavid du Colombier a = va;
113*7dd7cddfSDavid du Colombier b = vb;
114*7dd7cddfSDavid du Colombier
1153e12c5d1SDavid du Colombier if(*a > *b)
1163e12c5d1SDavid du Colombier return 1;
1173e12c5d1SDavid du Colombier if(*a < *b)
1183e12c5d1SDavid du Colombier return -1;
1193e12c5d1SDavid du Colombier return 0;
1203e12c5d1SDavid du Colombier }
1213e12c5d1SDavid du Colombier
1223e12c5d1SDavid du Colombier void
swapem(ulong * b,long l)1233e12c5d1SDavid du Colombier swapem(ulong *b, long l)
1243e12c5d1SDavid du Colombier {
1253e12c5d1SDavid du Colombier long i;
1263e12c5d1SDavid du Colombier ulong x, a;
1273e12c5d1SDavid du Colombier
1283e12c5d1SDavid du Colombier for(i=0; i<l; i++, b++) {
1293e12c5d1SDavid du Colombier a = *b;
1303e12c5d1SDavid du Colombier x = (((a>>0) & 0xff) << 24) |
1313e12c5d1SDavid du Colombier (((a>>8) & 0xff) << 16) |
1323e12c5d1SDavid du Colombier (((a>>16) & 0xff) << 8) |
1333e12c5d1SDavid du Colombier (((a>>24) & 0xff) << 0);
1343e12c5d1SDavid du Colombier *b = x;
1353e12c5d1SDavid du Colombier }
1363e12c5d1SDavid du Colombier }
137