Blame include/cdio/types.h

Packit dd8086
/*
Packit dd8086
    Copyright (C) 2002, 2003, 2004, 2005, 2006, 2008, 2012, 2017
Packit dd8086
                  Rocky Bernstein <rocky@gnu.org>
Packit dd8086
    Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org>
Packit dd8086
Packit dd8086
    This program is free software: you can redistribute it and/or modify
Packit dd8086
    it under the terms of the GNU General Public License as published by
Packit dd8086
    the Free Software Foundation, either version 3 of the License, or
Packit dd8086
    (at your option) any later version.
Packit dd8086
Packit dd8086
    This program is distributed in the hope that it will be useful,
Packit dd8086
    but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit dd8086
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit dd8086
    GNU General Public License for more details.
Packit dd8086
Packit dd8086
    You should have received a copy of the GNU General Public License
Packit dd8086
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
Packit dd8086
*/
Packit dd8086
Packit dd8086
/** \file types.h
Packit dd8086
 *  \brief  Common type definitions used pervasively in libcdio.
Packit dd8086
 */
Packit dd8086
Packit dd8086

Packit dd8086
#ifndef CDIO_TYPES_H_
Packit dd8086
#define CDIO_TYPES_H_
Packit dd8086
Packit dd8086
#ifdef __cplusplus
Packit dd8086
extern "C" {
Packit dd8086
#endif /* __cplusplus */
Packit dd8086
Packit dd8086
/* If <sys/types.h> is not available on your platform please
Packit dd8086
   contact the libcdio mailing list so that we can fix it! */
Packit dd8086
#if !defined(ARE_THERE_STILL_ENVS_WITHOUT_SYS_TYPES)
Packit dd8086
#include <sys/types.h>
Packit dd8086
#endif
Packit dd8086
Packit dd8086
#if defined(AMIGA)
Packit dd8086
typedef u_int8_t uint8_t;
Packit dd8086
typedef u_int16_t uint16_t;
Packit dd8086
typedef u_int32_t uint32_t;
Packit dd8086
typedef u_int64_t uint64_t;
Packit dd8086
#else
Packit dd8086
/* If <stdint.h> is not available on your platform please
Packit dd8086
   contact the libcdio mailing list so that we can fix it!
Packit dd8086
   For MSVC, you can find both a public domain stdint.h and
Packit dd8086
   inttypes.h in the MSVC/missing directory of libcdio. */
Packit dd8086
#include <stdint.h>
Packit dd8086
#endif
Packit dd8086
Packit dd8086
typedef uint8_t ubyte;
Packit dd8086
Packit dd8086
/* MSVC does not define mode_t and ssize_t by default. The way
Packit dd8086
   to compensate for missing UNIX types is to include a custom
Packit dd8086
   unistd.h that defines them. Such a file is provided with
Packit dd8086
   the libcdio source, in the MSVC/missing directory */
Packit dd8086
#if defined(_MSC_VER)
Packit dd8086
#include <unistd.h>
Packit dd8086
#endif
Packit dd8086
Packit dd8086
  /* default HP/UX macros are broken */
Packit dd8086
#if defined(__hpux__)
Packit dd8086
# undef UINT16_C
Packit dd8086
# undef UINT32_C
Packit dd8086
# undef UINT64_C
Packit dd8086
# undef INT64_C
Packit dd8086
#endif
Packit dd8086
Packit dd8086
  /* if it's still not defined, take a good guess... should work for
Packit dd8086
     most 32bit and 64bit archs */
Packit dd8086
Packit dd8086
#ifndef UINT16_C
Packit dd8086
# define UINT16_C(c) c ## U
Packit dd8086
#endif
Packit dd8086
Packit dd8086
#ifndef UINT32_C
Packit dd8086
# if defined (SIZEOF_INT) && SIZEOF_INT == 4
Packit dd8086
#  define UINT32_C(c) c ## U
Packit dd8086
# elif defined (SIZEOF_LONG) && SIZEOF_LONG == 4
Packit dd8086
#  define UINT32_C(c) c ## UL
Packit dd8086
# else
Packit dd8086
#  define UINT32_C(c) c ## U
Packit dd8086
# endif
Packit dd8086
#endif
Packit dd8086
Packit dd8086
#ifndef UINT64_C
Packit dd8086
# if defined (SIZEOF_LONG) && SIZEOF_LONG == 8
Packit dd8086
#  define UINT64_C(c) c ## UL
Packit dd8086
# elif defined (SIZEOF_INT) && SIZEOF_INT == 8
Packit dd8086
#  define UINT64_C(c) c ## U
Packit dd8086
# else
Packit dd8086
#  define UINT64_C(c) c ## ULL
Packit dd8086
# endif
Packit dd8086
#endif
Packit dd8086
Packit dd8086
#ifndef INT64_C
Packit dd8086
# if defined (SIZEOF_LONG) && SIZEOF_LONG == 8
Packit dd8086
#  define INT64_C(c) c ## L
Packit dd8086
# elif defined (SIZEOF_INT) && SIZEOF_INT == 8
Packit dd8086
#  define INT64_C(c) c
Packit dd8086
# else
Packit dd8086
#  define INT64_C(c) c ## LL
Packit dd8086
# endif
Packit dd8086
#endif
Packit dd8086
Packit dd8086
#ifndef __cplusplus
Packit dd8086
Packit dd8086
/* All the stdbool.h seem to define those */
Packit dd8086
#ifndef __bool_true_false_are_defined
Packit dd8086
#define __bool_true_false_are_defined 1
Packit dd8086
Packit dd8086
#undef bool
Packit dd8086
#undef true
Packit dd8086
#undef false
Packit dd8086
Packit dd8086
#ifdef _Bool
Packit dd8086
#define bool _Bool
Packit dd8086
#else
Packit dd8086
#define bool unsigned char
Packit dd8086
#endif
Packit dd8086
#define true 1
Packit dd8086
#define false 0
Packit dd8086
Packit dd8086
#endif /* __bool_true_false_are_defined */
Packit dd8086
#endif /*C++*/
Packit dd8086
Packit dd8086
  /* some GCC optimizations -- gcc 2.5+ */
Packit dd8086
Packit dd8086
#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4)
Packit dd8086
#define GNUC_PRINTF( format_idx, arg_idx )              \
Packit dd8086
  __attribute__((format (printf, format_idx, arg_idx)))
Packit dd8086
#define GNUC_SCANF( format_idx, arg_idx )               \
Packit dd8086
  __attribute__((format (scanf, format_idx, arg_idx)))
Packit dd8086
#define GNUC_FORMAT( arg_idx )                  \
Packit dd8086
  __attribute__((format_arg (arg_idx)))
Packit dd8086
#define GNUC_NORETURN                           \
Packit dd8086
  __attribute__((noreturn))
Packit dd8086
#define GNUC_CONST                              \
Packit dd8086
  __attribute__((const))
Packit dd8086
#define GNUC_UNUSED                             \
Packit dd8086
  __attribute__((unused))
Packit dd8086
#define GNUC_PACKED                             \
Packit dd8086
  __attribute__((packed))
Packit dd8086
#else   /* !__GNUC__ */
Packit dd8086
#define GNUC_PRINTF( format_idx, arg_idx )
Packit dd8086
#define GNUC_SCANF( format_idx, arg_idx )
Packit dd8086
#define GNUC_FORMAT( arg_idx )
Packit dd8086
#define GNUC_NORETURN
Packit dd8086
#define GNUC_CONST
Packit dd8086
#define GNUC_UNUSED
Packit dd8086
#define GNUC_PACKED
Packit dd8086
#endif  /* !__GNUC__ */
Packit dd8086
Packit dd8086
#if defined(__MINGW32__)
Packit dd8086
#  define PRAGMA_BEGIN_PACKED _Pragma("pack(push)") \
Packit dd8086
                              _Pragma("pack(1)")
Packit dd8086
#  define PRAGMA_END_PACKED   _Pragma("pack(pop)")
Packit dd8086
#elif __GNUC__ > 4  || (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901)
Packit dd8086
     /* should work with GCC > 4.0 clang and most EDG-frontend based C
Packit dd8086
        and C++ compilers */
Packit dd8086
#    define PRAGMA_BEGIN_PACKED _Pragma("pack(1)")
Packit dd8086
#    define PRAGMA_END_PACKED   _Pragma("pack()")
Packit dd8086
#elif defined(_MSC_VER)
Packit dd8086
#  define PRAGMA_BEGIN_PACKED __pragma(pack(push, 1))
Packit dd8086
#  define PRAGMA_END_PACKED   __pragma(pack(pop))
Packit dd8086
#else /* neither gcc nor _Pragma() available... */
Packit dd8086
   /* ...so let's be naive and hope the regression testsuite is run... */
Packit dd8086
#  define PRAGMA_BEGIN_PACKED
Packit dd8086
#  define PRAGMA_END_PACKED
Packit dd8086
#endif
Packit dd8086
Packit dd8086
  /*
Packit dd8086
   * user directed static branch prediction gcc 2.96+
Packit dd8086
   */
Packit dd8086
#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 95)
Packit dd8086
# define GNUC_LIKELY(x)   __builtin_expect((x),true)
Packit dd8086
# define GNUC_UNLIKELY(x) __builtin_expect((x),false)
Packit dd8086
#else
Packit dd8086
# define GNUC_LIKELY(x)   (x)
Packit dd8086
# define GNUC_UNLIKELY(x) (x)
Packit dd8086
#endif
Packit dd8086
Packit dd8086
#ifndef NULL
Packit dd8086
# define NULL ((void*) 0)
Packit dd8086
#endif
Packit dd8086
Packit dd8086
  /** Provide a notice for deprecated elements. Before gcc 4.5 'deprecated'
Packit dd8086
   takes no arguments. */
Packit dd8086
#if defined(__GNUC__)
Packit dd8086
# if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 5)
Packit dd8086
#   define LIBCDIO_DEPRECATED(object, notice) object __attribute__ ((deprecated(notice)))
Packit dd8086
# else
Packit dd8086
#   define LIBCDIO_DEPRECATED(object, notice) object __attribute__ ((deprecated))
Packit dd8086
# endif
Packit dd8086
#elif defined(_MSC_VER)
Packit dd8086
#define LIBCDIO_DEPRECATED(object, notice) __declspec(deprecated(notice)) object
Packit dd8086
#else
Packit dd8086
#define LIBCDIO_DEPRECATED(object, notice)
Packit dd8086
#endif
Packit dd8086
Packit dd8086
  /** our own offsetof()-like macro */
Packit dd8086
#define __cd_offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    \brief MSF (minute/second/frame) structure
Packit dd8086
Packit dd8086
    One CD-ROMs addressing scheme especially used in audio formats
Packit dd8086
    (Red Book) is an address by minute, sector and frame which
Packit dd8086
    BCD-encoded in three bytes. An alternative format is an lba_t.
Packit dd8086
Packit dd8086
    Note: the fields in this structure are BCD encoded. Use
Packit dd8086
    cdio_to_bcd8() or cdio_from_bcd8() to convert an integer into or
Packit dd8086
    out of this format. The format specifier %x (not %d) can be used
Packit dd8086
    if you need to format or print values in this structure.
Packit dd8086
Packit dd8086
    @see lba_t
Packit dd8086
  */
Packit dd8086
  PRAGMA_BEGIN_PACKED
Packit dd8086
  struct msf_s {
Packit dd8086
    uint8_t m, s, f; /* BCD encoded! */
Packit dd8086
  } GNUC_PACKED;
Packit dd8086
  PRAGMA_END_PACKED
Packit dd8086
Packit dd8086
  typedef struct msf_s msf_t;
Packit dd8086
Packit dd8086
#define msf_t_SIZEOF 3
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    \brief UTF-8 char definition
Packit dd8086
Packit dd8086
    Type to denote UTF-8 strings.
Packit dd8086
  */
Packit dd8086
Packit dd8086
  typedef char cdio_utf8_t;
Packit dd8086
Packit dd8086
  typedef enum  {
Packit dd8086
    nope  = 0,
Packit dd8086
    yep   = 1,
Packit dd8086
    dunno = 2
Packit dd8086
  } bool_3way_t;
Packit dd8086
Packit dd8086
  /* type used for bit-fields in structs (1 <= bits <= 8) */
Packit dd8086
#if defined(__GNUC__)
Packit dd8086
  /* this is strict ISO C99 which allows only 'unsigned int', 'signed
Packit dd8086
     int' and '_Bool' explicitly as bit-field type */
Packit dd8086
  typedef unsigned int bitfield_t;
Packit dd8086
#else
Packit dd8086
  /* other compilers might increase alignment requirements to match the
Packit dd8086
     'unsigned int' type -- fixme: find out how unalignment accesses can
Packit dd8086
     be pragma'ed on non-gcc compilers */
Packit dd8086
  typedef uint8_t bitfield_t;
Packit dd8086
#endif
Packit dd8086
Packit dd8086
  /*! The type of a Logical Block Address. We allow for an lba to be
Packit dd8086
    negative to be consistent with an lba, although I'm not sure this
Packit dd8086
    this is possible.
Packit dd8086
Packit dd8086
   */
Packit dd8086
  typedef int32_t lba_t;
Packit dd8086
Packit dd8086
  /*! The type of a Logical Sector Number. Note that an lba can be negative
Packit dd8086
    and the MMC3 specs allow for a conversion of a negative lba.
Packit dd8086
Packit dd8086
    @see msf_t
Packit dd8086
  */
Packit dd8086
  typedef int32_t lsn_t;
Packit dd8086
Packit dd8086
  /* Address in either MSF or logical format */
Packit dd8086
  union cdio_cdrom_addr
Packit dd8086
  {
Packit dd8086
    msf_t       msf;
Packit dd8086
    lba_t       lba;
Packit dd8086
  };
Packit dd8086
Packit dd8086
  /*! The type of a track number 0..99. */
Packit dd8086
  typedef uint8_t track_t;
Packit dd8086
Packit dd8086
  /*! The type of a session number 0..99. */
Packit dd8086
  typedef uint8_t session_t;
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Constant for invalid session number
Packit dd8086
  */
Packit dd8086
#define CDIO_INVALID_SESSION   0xFF
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Constant for invalid LBA. It is 151 less than the most negative
Packit dd8086
    LBA -45150. This provide slack for the 150-frame offset in
Packit dd8086
    LBA to LSN 150 conversions
Packit dd8086
  */
Packit dd8086
#define CDIO_INVALID_LBA    -45301
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Constant for invalid LSN
Packit dd8086
  */
Packit dd8086
#define CDIO_INVALID_LSN    CDIO_INVALID_LBA
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Number of ASCII bytes in a media catalog number (MCN).
Packit dd8086
    We include an extra 0 byte so these can be used as C strings.
Packit dd8086
  */
Packit dd8086
#define CDIO_MCN_SIZE       13
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Type to hold ASCII bytes in a media catalog number (MCN).
Packit dd8086
    We include an extra 0 byte so these can be used as C strings.
Packit dd8086
  */
Packit dd8086
  typedef char cdio_mcn_t[CDIO_MCN_SIZE+1];
Packit dd8086
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Number of ASCII bytes in International Standard Recording Codes (ISRC)
Packit dd8086
  */
Packit dd8086
#define CDIO_ISRC_SIZE       12
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    Type to hold ASCII bytes in a ISRC.
Packit dd8086
    We include an extra 0 byte so these can be used as C strings.
Packit dd8086
  */
Packit dd8086
  typedef char cdio_isrc_t[CDIO_ISRC_SIZE+1];
Packit dd8086
Packit dd8086
  typedef int cdio_fs_anal_t;
Packit dd8086
Packit dd8086
  /*!
Packit dd8086
    track flags
Packit dd8086
    Q Sub-channel Control Field (4.2.3.3)
Packit dd8086
  */
Packit dd8086
  typedef enum {
Packit dd8086
    CDIO_TRACK_FLAG_NONE =               0x00,  /**< no flags set */
Packit dd8086
    CDIO_TRACK_FLAG_PRE_EMPHASIS =       0x01,  /**< audio track recorded with
Packit dd8086
                                                   pre-emphasis */
Packit dd8086
    CDIO_TRACK_FLAG_COPY_PERMITTED =     0x02,  /**< digital copy permitted */
Packit dd8086
    CDIO_TRACK_FLAG_DATA =               0x04,  /**< data track */
Packit dd8086
    CDIO_TRACK_FLAG_FOUR_CHANNEL_AUDIO = 0x08,  /**< 4 audio channels */
Packit dd8086
  CDIO_TRACK_FLAG_SCMS =                 0x10   /**< SCMS (5.29.2.7) */
Packit dd8086
} cdio_track_flag;
Packit dd8086
Packit dd8086
Packit dd8086
/* Note that this matches the free() prototype.*/
Packit dd8086
typedef void (*CdioDataFree_t)(void *ptr);
Packit dd8086
Packit dd8086
#ifdef __cplusplus
Packit dd8086
}
Packit dd8086
#endif /* __cplusplus */
Packit dd8086
Packit dd8086
#endif /* CDIO_TYPES_H_ */
Packit dd8086
Packit dd8086

Packit dd8086
/*
Packit dd8086
 * Local variables:
Packit dd8086
 *  c-file-style: "gnu"
Packit dd8086
 *  tab-width: 8
Packit dd8086
 *  indent-tabs-mode: nil
Packit dd8086
 * End:
Packit dd8086
 */