2
0

bitarray.c 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #if ((!defined(PRF)))
  2. #error
  3. #endif
  4. #define BITS_OF_CHAR 8
  5. /*
  6. size_t PRF(_sizebytes)(size_t n);
  7. TYPE PRF(_get)(TYPE arr[], size_t i);
  8. void PRF(_set)(TYPE arr[], size_t i, TYPE val);
  9. */
  10. #define ALPRF(x) bitarrayalloc##x
  11. #define ALLOC_TYPE unsigned char
  12. #define ALLOC_PRF(x) ALPRF(x)
  13. #include "alloc.c"
  14. size_t wordalign(size_t n)
  15. {
  16. size_t al = sizeof(int);
  17. size_t m = al % n;
  18. if (m == 0)
  19. {
  20. return n;
  21. }
  22. else
  23. {
  24. return n + al - m;
  25. }
  26. }
  27. size_t PRF(_sizebytes)(size_t n)
  28. {
  29. return wordalign(n/BITS_OF_CHAR);
  30. }
  31. unsigned char* PRF(_alloc)(size_t count)
  32. {
  33. return ALPRF(_alloc)(PRF(_sizebytes)(count));
  34. }
  35. void PRF(_free)(unsigned char* arr)
  36. {
  37. ALPRF(_free)(arr);
  38. }
  39. unsigned char* PRF(_realloc)(unsigned char* arr, size_t newcount)
  40. {
  41. return ALPRF(_realloc)(arr, PRF(_sizebytes)(newcount));
  42. }
  43. #define LVAL(arr, i) ((arr)[(i)/BITS_OF_CHAR])
  44. #define MASK(i) (1<<((i)%BITS_OF_CHAR))
  45. int PRF(_get)(unsigned char arr[], size_t i)
  46. {
  47. return ((LVAL(arr,i) & MASK(i)) ? 1 : 0);
  48. }
  49. void PRF(_set)(unsigned char arr[], size_t i, int val)
  50. {
  51. unsigned char mask = MASK(i);
  52. if (val)
  53. {
  54. LVAL(arr,i) |= mask;
  55. }
  56. else
  57. {
  58. LVAL(arr,i) &= ~mask;
  59. }
  60. return;
  61. }
  62. void PRF(_init)(unsigned char arr[], size_t sz, int val)
  63. {
  64. size_t bytesize = sz/BITS_OF_CHAR;
  65. size_t i;
  66. unsigned char valbyte = val ? (-1) : 0;
  67. for (i=0; i<bytesize; ++i)
  68. {
  69. arr[i] = valbyte;
  70. };
  71. i *= BITS_OF_CHAR;
  72. while(i < sz)
  73. {
  74. PRF(_set)(arr, i, val);
  75. ++i;
  76. };
  77. return;
  78. }
  79. #undef MASK
  80. #undef LVAL
  81. #undef PRF