1 /***************************************************************************
2 * Copyright (C) 2004, 2005 by Dominic Rath *
3 * Dominic.Rath@gmx.de *
5 * Copyright (C) 2007,2008 Øyvind Harboe *
6 * oyvind.harboe@zylin.com *
8 * This program is free software; you can redistribute it and/or modify *
9 * it under the terms of the GNU General Public License as published by *
10 * the Free Software Foundation; either version 2 of the License, or *
11 * (at your option) any later version. *
13 * This program is distributed in the hope that it will be useful, *
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
16 * GNU General Public License for more details. *
18 * You should have received a copy of the GNU General Public License *
19 * along with this program; if not, write to the *
20 * Free Software Foundation, Inc., *
21 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
22 ***************************************************************************/
23 #ifndef BINARYBUFFER_H
24 #define BINARYBUFFER_H
28 /* support functions to access arbitrary bits in a byte array
29 * flip_u32 inverses the bit order inside a 32-bit word (31..0 -> 0..31)
32 /* inlining this will help show what fn that is taking time during profiling. */
33 static inline void buf_set_u32(uint8_t* buffer
, unsigned int first
, unsigned int num
, uint32_t value
)
35 if ((num
== 32) && (first
== 0))
37 buffer
[3]=(value
>> 24)&0xff;
38 buffer
[2]=(value
>> 16)&0xff;
39 buffer
[1]=(value
>> 8)&0xff;
40 buffer
[0]=(value
>> 0)&0xff;
45 for (i
= first
; i
< first
+ num
; i
++)
47 if (((value
>> (i
-first
))&1) == 1)
48 buffer
[i
/8] |= 1 << (i
%8);
50 buffer
[i
/8] &= ~(1 << (i
%8));
54 static inline uint32_t buf_get_u32(const uint8_t* buffer
, unsigned int first
, unsigned int num
)
56 if ((num
== 32) && (first
== 0))
58 return (((uint32_t)buffer
[3]) << 24) | (((uint32_t)buffer
[2]) << 16) | (((uint32_t)buffer
[1]) << 8) | (((uint32_t)buffer
[0]) << 0);
64 for (i
= first
; i
< first
+ num
; i
++)
66 if (((buffer
[i
/8]>>(i
%8))&1) == 1)
67 result
|= 1 << (i
-first
);
74 extern uint32_t flip_u32(uint32_t value
, unsigned int num
);
76 extern int buf_cmp(const uint8_t *buf1
, const uint8_t *buf2
, int size
);
77 extern int buf_cmp_mask(const uint8_t *buf1
, const uint8_t *buf2
, const uint8_t *mask
, int size
);
78 extern uint8_t* buf_cpy(const uint8_t *from
, uint8_t *to
, int size
);
80 extern uint8_t* buf_set_ones(uint8_t *buf
, int count
);
81 extern uint8_t* buf_set_buf(const uint8_t *src
, int src_start
, uint8_t *dst
, int dst_start
, int len
);
83 extern int str_to_buf(const char *str
, int len
, uint8_t *bin_buf
, int buf_size
, int radix
);
84 extern char* buf_to_str(const uint8_t *buf
, int size
, int radix
);
87 extern int buf_to_u32_handler(uint8_t *in_buf
, void *priv
, struct scan_field_s
*field
);
89 #define CEIL(m, n) (((m) + (n) - 1) / (n))
91 /* read a uint32_t from a buffer in target memory endianness */
92 static inline uint32_t fast_target_buffer_get_u32(const uint8_t *buffer
, int little
)
95 return le_to_h_u32(buffer
);
97 return be_to_h_u32(buffer
);
100 #endif /* BINARYBUFFER_H */