exsort.c 1.9 KB

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