File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / istgt / src / istgt_misc.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 16:42:02 2012 UTC (13 years, 1 month ago) by misho
Branches: istgt, MAIN
CVS tags: v20121028, v20120901, v20111008, HEAD
istgt

    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>