]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/disk/exsort.c
disk/format: removed 9fat magic VOLID value
[plan9front.git] / sys / src / cmd / disk / exsort.c
1 #include        <u.h>
2 #include        <libc.h>
3
4 int     ulcmp(void*, void*);
5 void    swapem(ulong*, long);
6
7 enum
8 {
9         Wormsize        = 157933,
10 };
11 int     wflag;
12
13 void
14 main(int argc, char *argv[])
15 {
16         long i, l, x, lobits, hibits, tot;
17         int f, j;
18         char *file;
19         ulong *b, a, lo, hi;
20
21         ARGBEGIN {
22         default:
23                 print("usage: disk/exsort [-w] [file]\n");
24                 exits("usage");
25         case 'w':
26                 wflag++;
27                 break;
28         } ARGEND;
29
30         file = "/adm/cache";
31         if(argc > 0)
32                 file = argv[0];
33
34         if(wflag)
35                 f = open(file, ORDWR);
36         else
37                 f = open(file, OREAD);
38         if(f < 0) {
39                 print("cant open %s: %r\n", file);
40                 exits("open");
41         }
42         l = seek(f, 0, 2) / sizeof(long);
43
44         b = malloc(l*sizeof(long));
45         if(b == 0) {
46                 print("cant malloc %s: %r\n", file);
47                 exits("malloc");
48         }
49         seek(f, 0, 0);
50         if(read(f, b, l*sizeof(long)) != l*sizeof(long)) {
51                 print("short read %s: %r\n", file);
52                 exits("read");
53         }
54
55         lobits = 0;
56         hibits = 0;
57         for(i=0; i<l; i++) {
58                 a = b[i];
59                 if(a & (1L<<7))
60                         lobits++;
61                 if(a & (1L<<31))
62                         hibits++;
63         }
64
65         print("lobits = %6ld\n", lobits);
66         print("hibits = %6ld\n", hibits);
67
68         if(hibits > lobits) {
69                 print("swapping\n");
70                 swapem(b, l);
71         }
72
73         qsort(b, l, sizeof(ulong), ulcmp);
74
75         tot = 0;
76         for(j=0; j<100; j++) {
77                 lo = j*Wormsize;
78                 hi = lo + Wormsize;
79
80                 x = 0;
81                 for(i=0; i<l; i++) {
82                         a = b[i];
83                         if(a >= lo && a < hi)
84                                 x++;
85                 }
86                 if(x) {
87                         print("disk %2d %6ld blocks\n", j, x);
88                         tot += x;
89                 }
90         }
91         print("total   %6ld blocks\n", tot);
92
93
94         if(wflag) {
95                 if(hibits > lobits)
96                         swapem(b, l);
97                 seek(f, 0, 0);
98                 if(write(f, b, l*sizeof(long)) != l*sizeof(long)) {
99                         print("short write %s\n", file);
100                         exits("write");
101                 }
102         }
103
104         exits(0);
105 }
106
107 int
108 ulcmp(void *va, void *vb)
109 {
110         ulong *a, *b;
111
112         a = va;
113         b = vb;
114
115         if(*a > *b)
116                 return 1;
117         if(*a < *b)
118                 return -1;
119         return 0;
120 }
121
122 void
123 swapem(ulong *b, long l)
124 {
125         long i;
126         ulong x, a;
127
128         for(i=0; i<l; i++, b++) {
129                 a = *b;
130                 x = (((a>>0) & 0xff) << 24) |
131                         (((a>>8) & 0xff) << 16) |
132                         (((a>>16) & 0xff) << 8) |
133                         (((a>>24) & 0xff) << 0);
134                 *b = x;
135         }
136 }