xref: /plan9/sys/src/cmd/disk/exsort.c (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
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