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