bits.c 1.3 KB

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