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