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>