Annotation of embedaddon/istgt/src/istgt_misc.h, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (C) 2008-2010 Daisuke Aoyama <aoyama@peach.ne.jp>.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms, with or without
6: * modification, are permitted provided that the following conditions
7: * are met:
8: * 1. Redistributions of source code must retain the above copyright
9: * notice, this list of conditions and the following disclaimer.
10: * 2. Redistributions in binary form must reproduce the above copyright
11: * notice, this list of conditions and the following disclaimer in the
12: * documentation and/or other materials provided with the distribution.
13: *
14: * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17: * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
18: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24: * SUCH DAMAGE.
25: *
26: */
27:
28: #ifndef ISTGT_MISC_H
29: #define ISTGT_MISC_H
30:
31: #include <stdint.h>
32: #include <stddef.h>
33: #include <stdio.h>
34:
35: #define ISTGT_USE_MACRO_EXPAND
36:
37: #ifdef ISTGT_USE_MACRO_EXPAND
38: #define DSET8(B,D) (*((uint8_t *)(B)) = (uint8_t)(D))
39: #define DSET16(B,D) \
40: (((*((uint8_t *)(B)+0)) = (uint8_t)((uint16_t)(D) >> 8)), \
41: ((*((uint8_t *)(B)+1)) = (uint8_t)((uint16_t)(D) >> 0)))
42: #define DSET24(B,D) \
43: (((*((uint8_t *)(B)+0)) = (uint8_t)((uint32_t)(D) >> 16)), \
44: ((*((uint8_t *)(B)+1)) = (uint8_t)((uint32_t)(D) >> 8)), \
45: ((*((uint8_t *)(B)+2)) = (uint8_t)((uint32_t)(D) >> 0)))
46: #define DSET32(B,D) \
47: (((*((uint8_t *)(B)+0)) = (uint8_t)((uint32_t)(D) >> 24)), \
48: ((*((uint8_t *)(B)+1)) = (uint8_t)((uint32_t)(D) >> 16)), \
49: ((*((uint8_t *)(B)+2)) = (uint8_t)((uint32_t)(D) >> 8)), \
50: ((*((uint8_t *)(B)+3)) = (uint8_t)((uint32_t)(D) >> 0)))
51: #define DSET48(B,D) \
52: (((*((uint8_t *)(B)+0)) = (uint8_t)((uint64_t)(D) >> 40)), \
53: ((*((uint8_t *)(B)+1)) = (uint8_t)((uint64_t)(D) >> 32)), \
54: ((*((uint8_t *)(B)+2)) = (uint8_t)((uint64_t)(D) >> 24)), \
55: ((*((uint8_t *)(B)+3)) = (uint8_t)((uint64_t)(D) >> 16)), \
56: ((*((uint8_t *)(B)+4)) = (uint8_t)((uint64_t)(D) >> 8)), \
57: ((*((uint8_t *)(B)+5)) = (uint8_t)((uint64_t)(D) >> 0)))
58: #define DSET64(B,D) \
59: (((*((uint8_t *)(B)+0)) = (uint8_t)((uint64_t)(D) >> 56)), \
60: ((*((uint8_t *)(B)+1)) = (uint8_t)((uint64_t)(D) >> 48)), \
61: ((*((uint8_t *)(B)+2)) = (uint8_t)((uint64_t)(D) >> 40)), \
62: ((*((uint8_t *)(B)+3)) = (uint8_t)((uint64_t)(D) >> 32)), \
63: ((*((uint8_t *)(B)+4)) = (uint8_t)((uint64_t)(D) >> 24)), \
64: ((*((uint8_t *)(B)+5)) = (uint8_t)((uint64_t)(D) >> 16)), \
65: ((*((uint8_t *)(B)+6)) = (uint8_t)((uint64_t)(D) >> 8)), \
66: ((*((uint8_t *)(B)+7)) = (uint8_t)((uint64_t)(D) >> 0)))
67: #define DGET8(B) (*((uint8_t *)(B)))
68: #define DGET16(B) \
69: ((( (uint16_t) *((uint8_t *)(B)+0)) << 8) \
70: | (((uint16_t) *((uint8_t *)(B)+1)) << 0))
71: #define DGET24(B) \
72: ((( (uint32_t) *((uint8_t *)(B)+0)) << 16) \
73: | (((uint32_t) *((uint8_t *)(B)+1)) << 8) \
74: | (((uint32_t) *((uint8_t *)(B)+2)) << 0))
75: #define DGET32(B) \
76: ((( (uint32_t) *((uint8_t *)(B)+0)) << 24) \
77: | (((uint32_t) *((uint8_t *)(B)+1)) << 16) \
78: | (((uint32_t) *((uint8_t *)(B)+2)) << 8) \
79: | (((uint32_t) *((uint8_t *)(B)+3)) << 0))
80: #define DGET48(B) \
81: ((( (uint64_t) *((uint8_t *)(B)+0)) << 40) \
82: | (((uint64_t) *((uint8_t *)(B)+1)) << 32) \
83: | (((uint64_t) *((uint8_t *)(B)+2)) << 24) \
84: | (((uint64_t) *((uint8_t *)(B)+3)) << 16) \
85: | (((uint64_t) *((uint8_t *)(B)+4)) << 8) \
86: | (((uint64_t) *((uint8_t *)(B)+5)) << 0))
87: #define DGET64(B) \
88: ((( (uint64_t) *((uint8_t *)(B)+0)) << 56) \
89: | (((uint64_t) *((uint8_t *)(B)+1)) << 48) \
90: | (((uint64_t) *((uint8_t *)(B)+2)) << 40) \
91: | (((uint64_t) *((uint8_t *)(B)+3)) << 32) \
92: | (((uint64_t) *((uint8_t *)(B)+4)) << 24) \
93: | (((uint64_t) *((uint8_t *)(B)+5)) << 16) \
94: | (((uint64_t) *((uint8_t *)(B)+6)) << 8) \
95: | (((uint64_t) *((uint8_t *)(B)+7)) << 0))
96: #else /* ISTGT_USE_MACRO_EXPAND */
97: //#define DSET8(B,D) (istgt_dset8((B),(D)))
98: #define DSET8(B,D) (*((uint8_t *)(B)) = (uint8_t)(D))
99: #define DSET16(B,D) (istgt_dset16((B),(D)))
100: #define DSET24(B,D) (istgt_dset24((B),(D)))
101: #define DSET32(B,D) (istgt_dset32((B),(D)))
102: #define DSET48(B,D) (istgt_dset48((B),(D)))
103: #define DSET64(B,D) (istgt_dset64((B),(D)))
104: //#define DGET8(B) (istgt_dget8((B)))
105: #define DGET8(B) (*((uint8_t *)(B)))
106: #define DGET16(B) (istgt_dget16((B)))
107: #define DGET24(B) (istgt_dget24((B)))
108: #define DGET32(B) (istgt_dget32((B)))
109: #define DGET48(B) (istgt_dget48((B)))
110: #define DGET64(B) (istgt_dget64((B)))
111: #endif /* ISTGT_USE_MACRO_EXPAND */
112:
113: #define DMIN8(A,B) ((uint8_t) ((A) > (B) ? (B) : (A)))
114: #define DMIN16(A,B) ((uint16_t) ((A) > (B) ? (B) : (A)))
115: #define DMIN24(A,B) ((uint32_t) ((A) > (B) ? (B) : (A)))
116: #define DMIN32(A,B) ((uint32_t) ((A) > (B) ? (B) : (A)))
117: #define DMIN48(A,B) ((uint64_t) ((A) > (B) ? (B) : (A)))
118: #define DMIN64(A,B) ((uint64_t) ((A) > (B) ? (B) : (A)))
119: #define DMAX8(A,B) ((uint8_t) ((A) > (B) ? (A) : (B)))
120: #define DMAX16(A,B) ((uint16_t) ((A) > (B) ? (A) : (B)))
121: #define DMAX24(A,B) ((uint32_t) ((A) > (B) ? (A) : (B)))
122: #define DMAX32(A,B) ((uint32_t) ((A) > (B) ? (A) : (B)))
123: #define DMAX48(A,B) ((uint64_t) ((A) > (B) ? (A) : (B)))
124: #define DMAX64(A,B) ((uint64_t) ((A) > (B) ? (A) : (B)))
125:
126: #define BSHIFTNW(N,W) (((W) > 0) ? (((N) > ((W)-1)) ? ((N) - ((W)-1)) : 0) : 0)
127: #define BMASKW(W) (((W) > 0) ? (~((~0) << (W))) : 0)
128:
129: #define BDSET8W(B,D,N,W) DSET8((B),(((D)&BMASKW((W)))<<BSHIFTNW((N),(W))))
130: #define BDADD8W(B,D,N,W) DSET8((B),((DGET8((B)) & ~(BMASKW((W)) << BSHIFTNW((N),(W)))) | (uint8_t) (((D) & BMASKW((W))) << BSHIFTNW((N),(W)))))
131: #define BSET8W(B,N,W) (*((uint8_t *)(B)) |= (uint8_t) (BMASKW((W))) << BSHIFTNW((N),(W)))
132: #define BCLR8W(B,N,W) (*((uint8_t *)(B)) &= (uint8_t) (~(BMASKW((W))) << BSHIFTNW((N),(W))))
133: #define BGET8W(B,N,W) ((*((uint8_t *)(B)) >> BSHIFTNW((N),(W))) & BMASKW((W)))
134:
135: #define BDSET8(B,D,N) (BDSET8W((B),(D),(N),1))
136: #define BDADD8(B,D,N) (BDADD8W((B),(D),(N),1))
137: #define BSET8(B,N) (BSET8W((B),(N),1))
138: #define BCLR8(B,N) (BCLR8W((B),(N),1))
139: #define BGET8(B,N) (BGET8W((B),(N),1))
140:
141: /* memory allocate */
142: void *xmalloc(size_t size);
143: void *xrealloc(void *p, size_t size);
144: void xfree(void *p);
145: char *xstrdup(const char *s);
146:
147: /* string functions */
148: char *strlwr(char *s);
149: char *strupr(char *s);
150: char *strsepq(char **stringp, const char *delim);
151: char *trim_string(char *s);
152: char *escape_string(const char *s);
153: #ifndef HAVE_STRLCPY
154: size_t strlcpy(char *dst, const char *src, size_t size);
155: #endif /* HAVE_STRLCPY */
156:
157: /* convert from/to LBA/MSF */
158: uint32_t istgt_msf2lba(uint32_t msf);
159: uint32_t istgt_lba2msf(uint32_t lba);
160:
161: /* network byte order operation */
162: uint8_t istgt_dget8(const uint8_t *data);
163: void istgt_dset8(uint8_t *data, uint32_t value);
164: uint16_t istgt_dget16(const uint8_t *data);
165: void istgt_dset16(uint8_t *data, uint32_t value);
166: uint32_t istgt_dget24(const uint8_t *data);
167: void istgt_dset24(uint8_t *data, uint32_t value);
168: uint32_t istgt_dget32(const uint8_t *data);
169: void istgt_dset32(uint8_t *data, uint32_t value);
170: uint64_t istgt_dget48(const uint8_t *data);
171: void istgt_dset48(uint8_t *data, uint64_t value);
172: uint64_t istgt_dget64(const uint8_t *data);
173: void istgt_dset64(uint8_t *data, uint64_t value);
174:
175: /* random value generation */
176: void istgt_gen_random(uint8_t *buf, size_t len);
177: #ifndef HAVE_SRANDOMDEV
178: void srandomdev(void);
179: #endif /* HAVE_SRANDOMDEV */
180: #ifndef HAVE_ARC4RANDOM
181: uint32_t arc4random(void);
182: #endif /* HAVE_ARC4RANDOM */
183:
184: /* convert from/to bin/hex */
185: int istgt_bin2hex(char *buf, size_t len, const uint8_t *data, size_t data_len);
186: int istgt_hex2bin(uint8_t *data, size_t data_len, const char *str);
187:
188: /* other functions */
189: void istgt_dump(const char *label, const uint8_t *buf, size_t len);
190: void istgt_fdump(FILE *fp, const char *label, const uint8_t *buf, size_t len);
191: void istgt_yield(void);
192:
193: #endif /* ISTGT_MISC_H */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>