1 /*
2 Copyright (C) 2015-2021, Dirk Krause
3 SPDX-License-Identifier: BSD-3-Clause
4 */
5
6 /*
7 WARNING: This file was generated by the dkct program (see
8 http://dktools.sourceforge.net/ for details).
9 Changes you make here will be lost if dkct is run again!
10 You should modify the original source and run dkct on it.
11 Original source: dk4bf.ctr
12 */
13
14 /** @file dk4bf.c The dk4bf module.
15 */
16
17
18 #include "dk4conf.h"
19
20 #if DK4_HAVE_ASSERT_H
21 #ifndef ASSERT_H_INCLUDED
22 #include <assert.h>
23 #define ASSERT_H_INCLUDED 1
24 #endif
25 #endif
26
27 #include <libdk4c/dk4bf.h>
28 #include <libdk4base/dk4mem.h>
29
30
31
32
33
34
35
36 /** Position of single bits within a byte.
37 */
38 static const unsigned char dk4bf_bits_in_byte[] = {
39 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01
40 };
41
42
43
44 dk4_bit_field_t *
45
dk4bf_open(size_t sz,dk4_er_t * erp)46 dk4bf_open(size_t sz, dk4_er_t *erp)
47 {
48 dk4_bit_field_t *back = NULL;
49 size_t bsz;
50 #if DK4_USE_ASSERT
51 assert(0 < sz);
52 #endif
53 if (0 < sz) {
54 back = dk4mem_new(dk4_bit_field_t,1,erp);
55 if (NULL != back) {
56 back->s = sz;
57 bsz = sz / 8;
58 if (0 != (sz % 8)) {
59 bsz++;
60 }
61 back->d = dk4mem_new(unsigned char,bsz,erp);
62 if (NULL == back->d) {
63 dk4bf_close(back);
64 back = NULL;
65 }
66 }
67 } else {
68 dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
69 }
70 return back;
71 }
72
73
74
75 int
76
dk4bf_set(dk4_bit_field_t * dptr,size_t bitno,int val,dk4_er_t * erp)77 dk4bf_set(dk4_bit_field_t *dptr, size_t bitno, int val, dk4_er_t *erp)
78 {
79 size_t bytei; /* Byte index */
80 size_t biti; /* Bit index */
81 int back = 0;
82 #if DK4_USE_ASSERT
83 assert(NULL != dptr);
84 #endif
85 if (NULL != dptr) {
86 if (bitno < dptr->s) {
87 bytei = bitno / 8;
88 biti = bitno % 8;
89 if (0 != val) {
90 (dptr->d)[bytei] |= dk4bf_bits_in_byte[biti];
91 } else {
92 #if VERSION_BEFORE_20210729
93 (dptr->d)[bytei] &= (~(dk4bf_bits_in_byte[biti]));
94 #else
95 (dptr->d)[bytei] = (unsigned char)(
96 ((dptr->d)[bytei]) & (~(dk4bf_bits_in_byte[biti]))
97 );
98 #endif
99 }
100 back = 1;
101 } else {
102 dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
103 }
104 } else {
105 dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
106 }
107 return back;
108 }
109
110
111
112 int
113
dk4bf_get(int * dptr,dk4_bit_field_t const * bfptr,size_t bitno,dk4_er_t * erp)114 dk4bf_get(int *dptr, dk4_bit_field_t const *bfptr, size_t bitno, dk4_er_t *erp)
115 {
116 size_t bytei; /* Byte index */
117 size_t biti; /* Bit index within byte */
118 int back = 0;
119 #if DK4_USE_ASSERT
120 assert(NULL != dptr);
121 assert(NULL != bfptr);
122 #endif
123 if ((NULL != dptr) && (NULL != bfptr)) {
124 if (bitno < bfptr->s) {
125 bytei = bitno / 8;
126 biti = bitno % 8;
127 if (0x00 != (((bfptr->d)[bytei]) & (dk4bf_bits_in_byte[biti]))) {
128 *dptr = 1;
129 } else {
130 *dptr = 0;
131 }
132 back = 1;
133 } else {
134 dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
135 }
136 } else {
137 dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
138 }
139 return back;
140 }
141
142
143
144 void
145
dk4bf_close(dk4_bit_field_t * ptr)146 dk4bf_close(dk4_bit_field_t *ptr)
147 {
148 #if DK4_USE_ASSERT
149 assert(NULL != ptr);
150 #endif
151 if (NULL != ptr) {
152 dk4mem_release(ptr->d);
153 dk4mem_free(ptr);
154 }
155 }
156
157