Copyright (C) Kevin Larke 2009-2020

This file is part of libcm.

libcm is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

libcm is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

See the GNU General Public License distributed with the libcm package or look here: .


cmGlobal : This is the globally included prefix file for all 'cm' files.

All operating system dependencies should be resolved in this file via testing for OS_LINUX, OS_OSX, or OS_W32.


#include "config.h"  // created by 'configure'
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <stdbool.h>
#include <stdarg.h>
#include <math.h>
#include <ctype.h>
#include <errno.h>
#include <float.h>
#include <limits.h>
#include <signal.h>  
#include <time.h>

#ifdef __cplusplus
extern "C" {
  #endif
  
  
  #define CM_FLOAT_SMP  1   // make cmSample_t = float in cmFloatTypes.h
  #define CM_FLOAT_REAL 0   // make cmReal_t = double in cmFloatTypes.h
  
  #ifdef NDEBUG
  #define cmDEBUG_FL 0   // Define cmDEBUG_FL as 0 when building in release mode. See \ref debug_mode.
  #else  
  #define cmDEBUG_FL 1   // Define cmDEBUG_FL as 1 when building in debug mode. See \ref debug_mode.
  #endif
  
  
  // Perform byte swapping on 16 bit values.
  #define   (((((unsigned short)(x)) & 0x00ff) << 8) | ((((unsigned short)(x)) & 0xff00) >> 8))cmSwap16(x) \
  
  
  #ifdef OS_LINUX
  #include <byteswap.h>   // gcc specific
  #include <unistd.h>
  
  // Perform byte swapping on 32 bit values on systems were &ltbyteswap.h&gt is available.
  #define cmSwap32(x) (bswap_32(x))
  
  // Perform byte swapping on 64 bit values on systems were &ltbyteswap.h&gt is  available.
  #define cmSwap64(x) (bswap_64(x))
  
  
  #endif
  
  
  #ifdef OS_OSX
  #include <unistd.h>
  
  // Perform byte swapping on 32 bit values on systems were &ltbyteswap.h&gt is not available.
  #define   ((((unsigned)((x) & 0x000000FF)) << 24) |   \    (((unsigned)((x) & 0x0000FF00)) << 8) |   \    (((unsigned)((x) & 0x00FF0000)) >> 8) |   \    (((unsigned)((x) & 0xFF000000)) >> 24))cmSwap32(x)                             \
  
  
  
  
  
  // Perform byte swapping on 64 bit values on systems were &ltbyteswap.h&gt is not available.
  #define   (((((unsigned long long)(x))<<56) & 0xFF00000000000000ULL)  |   \    ((((unsigned long long)(x))<<40) & 0x00FF000000000000ULL)  |  \    ((((unsigned long long)(x))<<24) & 0x0000FF0000000000ULL)  |  \    ((((unsigned long long)(x))<< 8) & 0x000000FF00000000ULL)  |  \    ((((unsigned long long)(x))>> 8) & 0x00000000FF000000ULL)  |  \    ((((unsigned long long)(x))>>24) & 0x0000000000FF0000ULL)  |  \    ((((unsigned long long)(x))>>40) & 0x000000000000FF00ULL)  |  \    ((((unsigned long long)(x))>>56) & 0x00000000000000FFULL))cmSwap64(x)                                 \
  
  
  
  
  
  
  
  
  
  #endif
  
  #define cmAllFlags(f,m) (((f) & (m)) == (m))                    // Test if all of a group 'm' of binary flags in 'f' are set.
  #define cmIsFlag(f,m)  (((f) & (m)) ? true : false)             // Test if any one of a the bits in 'm' is also set in 'f'. 
  #define cmIsNotFlag(f,m) (cmIsFlag(f,m)==false)                 // Test if none of the bits in 'm' are set in 'f'.
  #define cmSetFlag(f,m) ((f) | (m))                              // Return 'f' with the bits in 'm' set.
  #define cmClrFlag(f,m) ((f) & (~(m)))                           // Return 'f' with the bits in 'm' cleared.
  #define cmTogFlag(f,m) ((f)^(m))                                // Return 'f' with the bits in 'm' toggled.
  #define cmEnaFlag(f,m,b) (b) ? cmSetFlag(f,m) : cmClrFlag(f,m)  // \brief Set or clear bits in 'f' based on bits in 'm' and the state of 'b'. &lt If
                                                                                                                    // 'b' == 0 then return 'f' with the bits in 'm' cleared. otherwise return 'f' with the
                                                                                                                    // bits in 'm' set.  
  
  // In-place assignment version of the above bit operations
  #define cmSetBits(f,m)   ((f) |= (m))                              // Set 'f' with the bits in 'm' set.
  #define cmClrBits(f,m)   ((f) &= (~(m)))                           // Set 'f' with the bits in 'm' cleared.
  #define cmTogBits(f,m)   ((f)^=(m))                                // Return 'f' with the bits in 'm' toggled.
  #define cmEnaBits(f,m,b) ((b) ? cmSetBits(f,m) : cmClrBits(f,m))   // Set or clear bits in 'f' based on bits in 'm' and the state of 'b'.
  
  
  #define cmMin(v0,v1) ((v0)<(v1) ? (v0) : (v1))  // Return the minimum arg.
  #define cmMax(v0,v1) ((v0)>(v1) ? (v0) : (v1))  // Return the maximum arg.
  
  
  #define cmStringNullGuard(p) ((p)==NULL?"":(p))  // If 'p'==NULL return the static string &quot&ltnull&gt&quot otherwise return 'p'.
  #define cmStringLen(s)       ((s)==NULL? 0 : strlen(s))
  
  // Default return code indicating successful function completion.
  #define cmOkRC (0)                  
  
  // Default directory separator character for unix based systems.
  #define cmPathSeparatorChar ("/")
  
  #define cmInvalidIdx (0xffffffff)      // cm wide value indicating a invalid or NULL index.
  #define cmInvalidId  (cmInvalidIdx)    // cm wide value indicating an invalid or NULL numeric id.
  #define cmInvalidCnt (cmInvalidIdx)    // cm wide value indicating a invalid or NULL count of items.
  
  #define cmSTATIC_NULL_HANDLE {NULL}    // Default NULL value for cmHandle_t
  
  // Generic data type for implementing opaque object handles.
  //
  //typedef struct cmHandle_str
  //{
  //  void* h;
  //} cmHandle_t; 
  //  
  //  
  
  #define cmHandle_t struct { void* h; } 
  
  #define cmHandlesAreEqual(    a, b ) ((a).h == (b).h)   // Test if two cmHandle_t values are equivalent.
  #define cmHandlesAreNotEqual( a, b ) (!cmHandlesAreEqual(a,b))  // Test if two cmHandle_t value are not equivalent.
  
  // Data type commonly used as a function return value. Functions returning cmRC_t values 
  // return cmOkRC (0) to indicate successful completion or some other value to indicate 
  // some kind of exceptional conidtion.  In general the condition indicates an unexpected condition
  // such as resource exhaution, or a missing file.   
  typedef unsigned cmRC_t; 
  
  // A data type which indicates a system dependent error.  This is generally an abstraction for an 'errno'
  // like code.  
  typedef int      cmSysErrCode_t;   // same as errno
  
  
  // cmChar_t is a data type used to indicate that a char is being used to hold human readable
  // text.  Eventually this type will be used to locate and handle unicode based strings.  
  typedef char   cmChar_t;
  
  
  typedef unsigned int   cmUInt32_t;   // This typedef is used to indicate that the type must be an unsigned 32 bit integer.
  typedef unsigned short cmUInt16_t;   // This typedef is used to indicate that hte type must be an unsigned 16 bit integer.
  
  #ifdef __cplusplus
}
#endif