bits.c 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. #define EXTERN
  2. #include "gc.h"
  3. /*
  4. Bits
  5. bor(Bits a, Bits b)
  6. {
  7. Bits c;
  8. int i;
  9. for(i=0; i<BITS; i++)
  10. c.b[i] = a.b[i] | b.b[i];
  11. return c;
  12. }
  13. */
  14. /*
  15. Bits
  16. band(Bits a, Bits b)
  17. {
  18. Bits c;
  19. int i;
  20. for(i=0; i<BITS; i++)
  21. c.b[i] = a.b[i] & b.b[i];
  22. return c;
  23. }
  24. */
  25. /*
  26. Bits
  27. bnot(Bits a)
  28. {
  29. Bits c;
  30. int i;
  31. for(i=0; i<BITS; i++)
  32. c.b[i] = ~a.b[i];
  33. return c;
  34. }
  35. */
  36. int
  37. bany(Bits *a)
  38. {
  39. int i;
  40. for(i=0; i<BITS; i++)
  41. if(a->b[i])
  42. return 1;
  43. return 0;
  44. }
  45. /*
  46. int
  47. beq(Bits a, Bits b)
  48. {
  49. int i;
  50. for(i=0; i<BITS; i++)
  51. if(a.b[i] != b.b[i])
  52. return 0;
  53. return 1;
  54. }
  55. */
  56. int
  57. bnum(Bits a)
  58. {
  59. int i;
  60. long b;
  61. for(i=0; i<BITS; i++)
  62. if(b = a.b[i])
  63. return 32*i + bitno(b);
  64. diag(Z, "bad in bnum");
  65. return 0;
  66. }
  67. Bits
  68. blsh(unsigned n)
  69. {
  70. Bits c;
  71. c = zbits;
  72. c.b[n/32] = 1L << (n%32);
  73. return c;
  74. }
  75. /*
  76. int
  77. bset(Bits a, unsigned n)
  78. {
  79. int i;
  80. if(a.b[n/32] & (1L << (n%32)))
  81. return 1;
  82. return 0;
  83. }
  84. */
  85. int
  86. Bconv(va_list *arg, Fconv *fp)
  87. {
  88. char str[STRINGSZ], ss[STRINGSZ], *s;
  89. Bits bits;
  90. int i;
  91. str[0] = 0;
  92. bits = va_arg(*arg, Bits);
  93. while(bany(&bits)) {
  94. i = bnum(bits);
  95. if(str[0])
  96. strcat(str, " ");
  97. if(var[i].sym == S) {
  98. sprint(ss, "$%ld", var[i].offset);
  99. s = ss;
  100. } else
  101. s = var[i].sym->name;
  102. if(strlen(str) + strlen(s) + 1 >= STRINGSZ)
  103. break;
  104. strcat(str, s);
  105. bits.b[i/32] &= ~(1L << (i%32));
  106. }
  107. strconv(str, fp);
  108. return 0;
  109. }