bitfield.c 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. /*
  2. * Bitfield
  3. * Copyright (c) 2013, Jouni Malinen <j@w1.fi>
  4. *
  5. * This software may be distributed under the terms of the BSD license.
  6. * See README for more details.
  7. */
  8. #include "includes.h"
  9. #include "common.h"
  10. #include "bitfield.h"
  11. struct bitfield {
  12. u8 *bits;
  13. size_t max_bits;
  14. };
  15. struct bitfield * bitfield_alloc(size_t max_bits)
  16. {
  17. struct bitfield *bf;
  18. bf = os_zalloc(sizeof(*bf) + (max_bits + 7) / 8);
  19. if (bf == NULL)
  20. return NULL;
  21. bf->bits = (u8 *) (bf + 1);
  22. bf->max_bits = max_bits;
  23. return bf;
  24. }
  25. void bitfield_free(struct bitfield *bf)
  26. {
  27. os_free(bf);
  28. }
  29. void bitfield_set(struct bitfield *bf, size_t bit)
  30. {
  31. if (bit >= bf->max_bits)
  32. return;
  33. bf->bits[bit / 8] |= BIT(bit % 8);
  34. }
  35. void bitfield_clear(struct bitfield *bf, size_t bit)
  36. {
  37. if (bit >= bf->max_bits)
  38. return;
  39. bf->bits[bit / 8] &= ~BIT(bit % 8);
  40. }
  41. int bitfield_is_set(struct bitfield *bf, size_t bit)
  42. {
  43. if (bit >= bf->max_bits)
  44. return 0;
  45. return !!(bf->bits[bit / 8] & BIT(bit % 8));
  46. }
  47. static int first_zero(u8 val)
  48. {
  49. int i;
  50. for (i = 0; i < 8; i++) {
  51. if (!(val & 0x01))
  52. return i;
  53. val >>= 1;
  54. }
  55. return -1;
  56. }
  57. int bitfield_get_first_zero(struct bitfield *bf)
  58. {
  59. size_t i;
  60. for (i = 0; i < (bf->max_bits + 7) / 8; i++) {
  61. if (bf->bits[i] != 0xff)
  62. break;
  63. }
  64. if (i == (bf->max_bits + 7) / 8)
  65. return -1;
  66. i = i * 8 + first_zero(bf->bits[i]);
  67. if (i >= bf->max_bits)
  68. return -1;
  69. return i;
  70. }