Annotation of embedaddon/istgt/src/istgt_misc.h, revision 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>