diff options
| author | Josh Blum <josh@joshknows.com> | 2011-01-11 19:44:46 -0800 | 
|---|---|---|
| committer | Josh Blum <josh@joshknows.com> | 2011-01-11 19:44:46 -0800 | 
| commit | 18defbd9d40a4c11a33025c8684f48fe51f102c5 (patch) | |
| tree | 0108636abe7a42f1c3de22043e7ef230dec89cba | |
| parent | 6c03f7e74bf7fcbfbcbc02de89aac9550097afc9 (diff) | |
| download | uhd-18defbd9d40a4c11a33025c8684f48fe51f102c5.tar.gz uhd-18defbd9d40a4c11a33025c8684f48fe51f102c5.tar.bz2 uhd-18defbd9d40a4c11a33025c8684f48fe51f102c5.zip | |
uhd: add msvc stdint.h so we can use stdints typedefs normally like, fix in fw_common.h
| -rw-r--r-- | firmware/zpu/lib/eth_addrs.c | 6 | ||||
| -rw-r--r-- | host/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | host/lib/gain_group.cpp | 149 | ||||
| -rw-r--r-- | host/lib/transport/CMakeLists.txt | 3 | ||||
| -rw-r--r-- | host/lib/transport/msvc/stdint.h | 35 | ||||
| -rw-r--r-- | host/lib/usrp/usrp2/fw_common.h | 48 | ||||
| -rw-r--r-- | host/msvc/inttypes.h | 301 | ||||
| -rw-r--r-- | host/msvc/stdint.h | 226 | 
8 files changed, 550 insertions, 219 deletions
| diff --git a/firmware/zpu/lib/eth_addrs.c b/firmware/zpu/lib/eth_addrs.c index 0c40e2dca..fc35a3c9b 100644 --- a/firmware/zpu/lib/eth_addrs.c +++ b/firmware/zpu/lib/eth_addrs.c @@ -23,12 +23,6 @@  #include "i2c.h"  #include "usrp2/fw_common.h" -//////////////////////////////////////////////////////////////////////// -// EEPROM Layout -//////////////////////////////////////////////////////////////////////// -#define USRP2_EE_MBOARD_MAC_ADDR 0x02 //6 bytes -#define USRP2_EE_MBOARD_IP_ADDR  0x0C //uint32, big-endian -  static bool  unprogrammed(const void *t, size_t len)  { diff --git a/host/CMakeLists.txt b/host/CMakeLists.txt index f59cda23f..6a2b62a6d 100644 --- a/host/CMakeLists.txt +++ b/host/CMakeLists.txt @@ -74,6 +74,7 @@ IF(CMAKE_COMPILER_IS_GNUCXX)  ENDIF(CMAKE_COMPILER_IS_GNUCXX)  IF(MSVC) +    INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/msvc)      ADD_DEFINITIONS(-D_WIN32_WINNT=0x0501) #minimum version required is windows xp      ADD_DEFINITIONS(-DNOMINMAX) #disables stupidity and enables std::min and std::max      ADD_DEFINITIONS(-D_SCL_SECURE_NO_WARNINGS) #avoid warnings from boost::split diff --git a/host/lib/gain_group.cpp b/host/lib/gain_group.cpp deleted file mode 100644 index 1be09dee2..000000000 --- a/host/lib/gain_group.cpp +++ /dev/null @@ -1,149 +0,0 @@ -// -// Copyright 2010 Ettus Research LLC -// -// This program 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. -// -// This program 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. -// -// You should have received a copy of the GNU General Public License -// along with this program.  If not, see <http://www.gnu.org/licenses/>. -// - -#include <uhd/utils/gain_group.hpp> -#include <uhd/types/dict.hpp> -#include <uhd/utils/algorithm.hpp> -#include <uhd/utils/assert.hpp> -#include <boost/foreach.hpp> -#include <boost/bind.hpp> -#include <algorithm> -#include <vector> -#include <iostream> - -using namespace uhd; - -static const bool verbose = false; - -static bool compare_by_step_size( -    const size_t &rhs, const size_t &lhs, std::vector<gain_fcns_t> &fcns -){ -    return fcns.at(rhs).get_range().step > fcns.at(lhs).get_range().step; -} - -/*********************************************************************** - * gain group implementation - **********************************************************************/ -class gain_group_impl : public gain_group{ -public: -    gain_group_impl(void){ -        /*NOP*/ -    } - -    gain_range_t get_range(void){ -        float overall_min = 0, overall_max = 0, overall_step = 0; -        BOOST_FOREACH(const gain_fcns_t &fcns, get_all_fcns()){ -            const gain_range_t range = fcns.get_range(); -            overall_min += range.min; -            overall_max += range.max; -            //the overall step is the min (zero is invalid, first run) -            if (overall_step == 0) overall_step = range.step; -            overall_step = std::min(overall_step, range.step); -        } -        return gain_range_t(overall_min, overall_max, overall_step); -    } - -    float get_value(void){ -        float overall_gain = 0; -        BOOST_FOREACH(const gain_fcns_t &fcns, get_all_fcns()){ -            overall_gain += fcns.get_value(); -        } -        return overall_gain; -    } - -    void set_value(float gain){ -        std::vector<gain_fcns_t> all_fcns = get_all_fcns(); -        if (all_fcns.size() == 0) return; //nothing to set! - -        //get the max step size among the gains -        float max_step = 0; -        BOOST_FOREACH(const gain_fcns_t &fcns, all_fcns){ -            max_step = std::max(max_step, fcns.get_range().step); -        } - -        //create gain bucket to distribute power -        std::vector<float> gain_bucket; - -        //distribute power according to priority (round to max step) -        float gain_left_to_distribute = gain; -        BOOST_FOREACH(const gain_fcns_t &fcns, all_fcns){ -            const gain_range_t range = fcns.get_range(); -            gain_bucket.push_back( -                max_step*int(std::clip(gain_left_to_distribute, range.min, range.max)/max_step) -            ); -            gain_left_to_distribute -= gain_bucket.back(); -        } - -        //get a list of indexes sorted by step size large to small -        std::vector<size_t> indexes_step_size_dec; -        for (size_t i = 0; i < all_fcns.size(); i++){ -            indexes_step_size_dec.push_back(i); -        } -        std::sort( -            indexes_step_size_dec.begin(), indexes_step_size_dec.end(), -            boost::bind(&compare_by_step_size, _1, _2, all_fcns) -        ); -        UHD_ASSERT_THROW( -            all_fcns.at(indexes_step_size_dec.front()).get_range().step >= -            all_fcns.at(indexes_step_size_dec.back()).get_range().step -        ); - -        //distribute the remainder (less than max step) -        //fill in the largest step sizes first that are less than the remainder -        BOOST_FOREACH(size_t i, indexes_step_size_dec){ -            const gain_range_t range = all_fcns.at(i).get_range(); -            float additional_gain = range.step*int( -                std::clip(gain_bucket.at(i) + gain_left_to_distribute, range.min, range.max -            )/range.step) - gain_bucket.at(i); -            gain_bucket.at(i) += additional_gain; -            gain_left_to_distribute -= additional_gain; -        } -        if (verbose) std::cout << "gain_left_to_distribute " << gain_left_to_distribute << std::endl; - -        //now write the bucket out to the individual gain values -        for (size_t i = 0; i < gain_bucket.size(); i++){ -            if (verbose) std::cout << gain_bucket.at(i) << std::endl; -            all_fcns.at(i).set_value(gain_bucket.at(i)); -        } -    } - -    void register_fcns( -        const gain_fcns_t &gain_fcns, size_t priority -    ){ -        _registry[priority].push_back(gain_fcns); -    } - -private: -    //! get the gain function sets in order (highest priority first) -    std::vector<gain_fcns_t> get_all_fcns(void){ -        std::vector<gain_fcns_t> all_fcns; -        BOOST_FOREACH(ssize_t key, std::sorted(_registry.keys())){ -            const std::vector<gain_fcns_t> &fcns = _registry[key]; -            all_fcns.insert(all_fcns.begin(), fcns.begin(), fcns.end()); -        } -        return all_fcns; -    } - -    uhd::dict<size_t, std::vector<gain_fcns_t> > _registry; -}; - -/*********************************************************************** - * gain group factory function - **********************************************************************/ -gain_group::sptr gain_group::make(void){ -    return sptr(new gain_group_impl()); -} diff --git a/host/lib/transport/CMakeLists.txt b/host/lib/transport/CMakeLists.txt index 67865e0fe..8765c6703 100644 --- a/host/lib/transport/CMakeLists.txt +++ b/host/lib/transport/CMakeLists.txt @@ -37,9 +37,6 @@ IF(ENABLE_USB)          ${CMAKE_CURRENT_SOURCE_DIR}/libusb1_base.cpp          ${CMAKE_CURRENT_SOURCE_DIR}/libusb1_base.hpp      ) -    IF(MSVC) #include our custom stdint for libusb -        INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/msvc) -    ENDIF(MSVC)  ELSE(ENABLE_USB)      LIBUHD_APPEND_SOURCES(          ${CMAKE_CURRENT_SOURCE_DIR}/usb_dummy_impl.cpp diff --git a/host/lib/transport/msvc/stdint.h b/host/lib/transport/msvc/stdint.h deleted file mode 100644 index b3eb61aae..000000000 --- a/host/lib/transport/msvc/stdint.h +++ /dev/null @@ -1,35 +0,0 @@ -//
 -// Copyright 2010 Ettus Research LLC
 -//
 -// This program 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.
 -//
 -// This program 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.
 -//
 -// You should have received a copy of the GNU General Public License
 -// along with this program.  If not, see <http://www.gnu.org/licenses/>.
 -//
 -
 -#ifndef INCLUDED_LIBUHD_TRANSPORT_STDINT_H
 -#define INCLUDED_LIBUHD_TRANSPORT_STDINT_H
 -
 -#include <boost/cstdint.hpp>
 -
 -//provide a stdint implementation for libusb
 -
 -typedef boost::uint64_t uint64_t;
 -typedef boost::uint32_t uint32_t;
 -typedef boost::uint16_t uint16_t;
 -typedef boost::uint8_t uint8_t;
 -
 -typedef boost::int64_t int64_t;
 -typedef boost::int32_t int32_t;
 -typedef boost::int16_t int16_t;
 -typedef boost::int8_t int8_t;
 -
 -#endif /* INCLUDED_LIBUHD_TRANSPORT_STDINT_H */
 diff --git a/host/lib/usrp/usrp2/fw_common.h b/host/lib/usrp/usrp2/fw_common.h index 67ba90658..a22f805e1 100644 --- a/host/lib/usrp/usrp2/fw_common.h +++ b/host/lib/usrp/usrp2/fw_common.h @@ -18,18 +18,15 @@  #ifndef INCLUDED_USRP2_FW_COMMON_H  #define INCLUDED_USRP2_FW_COMMON_H +#include <stdint.h> +  /*!   * Structs and constants for usrp2 communication.   * This header is shared by the firmware and host code.   * Therefore, this header may only contain valid C code.   */  #ifdef __cplusplus -    #include <boost/cstdint.hpp> -    #define __stdint(type) boost::type  extern "C" { -#else -    #include <stdint.h> -    #define __stdint(type) type  #endif  //fpga and firmware compatibility numbers @@ -106,39 +103,38 @@ typedef enum{  } usrp2_clk_edge_t;  typedef struct{ -    __stdint(uint32_t) proto_ver; -    __stdint(uint32_t) id; -    __stdint(uint32_t) seq; +    uint32_t proto_ver; +    uint32_t id; +    uint32_t seq;      union{ -        __stdint(uint32_t) ip_addr; +        uint32_t ip_addr;          struct { -            __stdint(uint32_t) dev; -            __stdint(uint32_t) data; -            __stdint(uint8_t) miso_edge; -            __stdint(uint8_t) mosi_edge; -            __stdint(uint8_t) num_bits; -            __stdint(uint8_t) readback; +            uint32_t dev; +            uint32_t data; +            uint8_t miso_edge; +            uint8_t mosi_edge; +            uint8_t num_bits; +            uint8_t readback;          } spi_args;          struct { -            __stdint(uint8_t) addr; -            __stdint(uint8_t) bytes; -            __stdint(uint8_t) data[20]; +            uint8_t addr; +            uint8_t bytes; +            uint8_t data[20];          } i2c_args;          struct { -            __stdint(uint32_t) addr; -            __stdint(uint32_t) data; -            __stdint(uint32_t) _pad[2]; -            __stdint(uint8_t) num_bytes; //1, 2, 4 +            uint32_t addr; +            uint32_t data; +            uint32_t _pad[2]; +            uint8_t num_bytes; //1, 2, 4          } poke_args;          struct { -            __stdint(uint8_t) dev; -            __stdint(uint8_t) bytes; -            __stdint(uint8_t) data[20]; +            uint8_t dev; +            uint8_t bytes; +            uint8_t data[20];          } uart_args;      } data;  } usrp2_ctrl_data_t; -#undef __stdint  #ifdef __cplusplus  }  #endif diff --git a/host/msvc/inttypes.h b/host/msvc/inttypes.h new file mode 100644 index 000000000..1c2baa82e --- /dev/null +++ b/host/msvc/inttypes.h @@ -0,0 +1,301 @@ +// ISO C9x  compliant inttypes.h for Microsoft Visual Studio +// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124  +//  +//  Copyright (c) 2006 Alexander Chemeris +//  +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +//  +//   1. Redistributions of source code must retain the above copyright notice, +//      this list of conditions and the following disclaimer. +//  +//   2. Redistributions in binary form must reproduce the above copyright +//      notice, this list of conditions and the following disclaimer in the +//      documentation and/or other materials provided with the distribution. +//  +//   3. The name of the author may be used to endorse or promote products +//      derived from this software without specific prior written permission. +//  +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,  +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//  +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _MSC_VER // [ +#error "Use this header only with Microsoft Visual C++ compilers!" +#endif // _MSC_VER ] + +#ifndef _MSC_INTTYPES_H_ // [ +#define _MSC_INTTYPES_H_ + +#if _MSC_VER > 1000 +#pragma once +#endif + +#include <stdint.h> + +// 7.8 Format conversion of integer types + +typedef struct { +   intmax_t quot; +   intmax_t rem; +} imaxdiv_t; + +// 7.8.1 Macros for format specifiers + +// The fprintf macros for signed integers are: +#define PRId8       "d" +#define PRIi8       "i" +#define PRIdLEAST8  "d" +#define PRIiLEAST8  "i" +#define PRIdFAST8   "d" +#define PRIiFAST8   "i" + +#define PRId16       "hd" +#define PRIi16       "hi" +#define PRIdLEAST16  "hd" +#define PRIiLEAST16  "hi" +#define PRIdFAST16   "hd" +#define PRIiFAST16   "hi" + +#define PRId32       "I32d" +#define PRIi32       "I32i" +#define PRIdLEAST32  "I32d" +#define PRIiLEAST32  "I32i" +#define PRIdFAST32   "I32d" +#define PRIiFAST32   "I32i" + +#define PRId64       "I64d" +#define PRIi64       "I64i" +#define PRIdLEAST64  "I64d" +#define PRIiLEAST64  "I64i" +#define PRIdFAST64   "I64d" +#define PRIiFAST64   "I64i" + +#define PRIdMAX     "I64d" +#define PRIiMAX     "I64i" + +#define PRIdPTR     "Id" +#define PRIiPTR     "Ii" + +// The fprintf macros for unsigned integers are: +#define PRIo8       "o" +#define PRIu8       "u" +#define PRIx8       "x" +#define PRIX8       "X" +#define PRIoLEAST8  "o" +#define PRIuLEAST8  "u" +#define PRIxLEAST8  "x" +#define PRIXLEAST8  "X" +#define PRIoFAST8   "o" +#define PRIuFAST8   "u" +#define PRIxFAST8   "x" +#define PRIXFAST8   "X" + +#define PRIo16       "ho" +#define PRIu16       "hu" +#define PRIx16       "hx" +#define PRIX16       "hX" +#define PRIoLEAST16  "ho" +#define PRIuLEAST16  "hu" +#define PRIxLEAST16  "hx" +#define PRIXLEAST16  "hX" +#define PRIoFAST16   "ho" +#define PRIuFAST16   "hu" +#define PRIxFAST16   "hx" +#define PRIXFAST16   "hX" + +#define PRIo32       "I32o" +#define PRIu32       "I32u" +#define PRIx32       "I32x" +#define PRIX32       "I32X" +#define PRIoLEAST32  "I32o" +#define PRIuLEAST32  "I32u" +#define PRIxLEAST32  "I32x" +#define PRIXLEAST32  "I32X" +#define PRIoFAST32   "I32o" +#define PRIuFAST32   "I32u" +#define PRIxFAST32   "I32x" +#define PRIXFAST32   "I32X" + +#define PRIo64       "I64o" +#define PRIu64       "I64u" +#define PRIx64       "I64x" +#define PRIX64       "I64X" +#define PRIoLEAST64  "I64o" +#define PRIuLEAST64  "I64u" +#define PRIxLEAST64  "I64x" +#define PRIXLEAST64  "I64X" +#define PRIoFAST64   "I64o" +#define PRIuFAST64   "I64u" +#define PRIxFAST64   "I64x" +#define PRIXFAST64   "I64X" + +#define PRIoMAX     "I64o" +#define PRIuMAX     "I64u" +#define PRIxMAX     "I64x" +#define PRIXMAX     "I64X" + +#define PRIoPTR     "Io" +#define PRIuPTR     "Iu" +#define PRIxPTR     "Ix" +#define PRIXPTR     "IX" + +// The fscanf macros for signed integers are: +#define SCNd8       "d" +#define SCNi8       "i" +#define SCNdLEAST8  "d" +#define SCNiLEAST8  "i" +#define SCNdFAST8   "d" +#define SCNiFAST8   "i" + +#define SCNd16       "hd" +#define SCNi16       "hi" +#define SCNdLEAST16  "hd" +#define SCNiLEAST16  "hi" +#define SCNdFAST16   "hd" +#define SCNiFAST16   "hi" + +#define SCNd32       "ld" +#define SCNi32       "li" +#define SCNdLEAST32  "ld" +#define SCNiLEAST32  "li" +#define SCNdFAST32   "ld" +#define SCNiFAST32   "li" + +#define SCNd64       "I64d" +#define SCNi64       "I64i" +#define SCNdLEAST64  "I64d" +#define SCNiLEAST64  "I64i" +#define SCNdFAST64   "I64d" +#define SCNiFAST64   "I64i" + +#define SCNdMAX     "I64d" +#define SCNiMAX     "I64i" + +#ifdef _WIN64 // [ +#  define SCNdPTR     "I64d" +#  define SCNiPTR     "I64i" +#else  // _WIN64 ][ +#  define SCNdPTR     "ld" +#  define SCNiPTR     "li" +#endif  // _WIN64 ] + +// The fscanf macros for unsigned integers are: +#define SCNo8       "o" +#define SCNu8       "u" +#define SCNx8       "x" +#define SCNX8       "X" +#define SCNoLEAST8  "o" +#define SCNuLEAST8  "u" +#define SCNxLEAST8  "x" +#define SCNXLEAST8  "X" +#define SCNoFAST8   "o" +#define SCNuFAST8   "u" +#define SCNxFAST8   "x" +#define SCNXFAST8   "X" + +#define SCNo16       "ho" +#define SCNu16       "hu" +#define SCNx16       "hx" +#define SCNX16       "hX" +#define SCNoLEAST16  "ho" +#define SCNuLEAST16  "hu" +#define SCNxLEAST16  "hx" +#define SCNXLEAST16  "hX" +#define SCNoFAST16   "ho" +#define SCNuFAST16   "hu" +#define SCNxFAST16   "hx" +#define SCNXFAST16   "hX" + +#define SCNo32       "lo" +#define SCNu32       "lu" +#define SCNx32       "lx" +#define SCNX32       "lX" +#define SCNoLEAST32  "lo" +#define SCNuLEAST32  "lu" +#define SCNxLEAST32  "lx" +#define SCNXLEAST32  "lX" +#define SCNoFAST32   "lo" +#define SCNuFAST32   "lu" +#define SCNxFAST32   "lx" +#define SCNXFAST32   "lX" + +#define SCNo64       "I64o" +#define SCNu64       "I64u" +#define SCNx64       "I64x" +#define SCNX64       "I64X" +#define SCNoLEAST64  "I64o" +#define SCNuLEAST64  "I64u" +#define SCNxLEAST64  "I64x" +#define SCNXLEAST64  "I64X" +#define SCNoFAST64   "I64o" +#define SCNuFAST64   "I64u" +#define SCNxFAST64   "I64x" +#define SCNXFAST64   "I64X" + +#define SCNoMAX     "I64o" +#define SCNuMAX     "I64u" +#define SCNxMAX     "I64x" +#define SCNXMAX     "I64X" + +#ifdef _WIN64 // [ +#  define SCNoPTR     "I64o" +#  define SCNuPTR     "I64u" +#  define SCNxPTR     "I64x" +#  define SCNXPTR     "I64X" +#else  // _WIN64 ][ +#  define SCNoPTR     "lo" +#  define SCNuPTR     "lu" +#  define SCNxPTR     "lx" +#  define SCNXPTR     "lX" +#endif  // _WIN64 ] + +// 7.8.2 Functions for greatest-width integer types + +// 7.8.2.1 The imaxabs function +#define imaxabs _abs64 + +// 7.8.2.2 The imaxdiv function + +// This is modified version of div() function from Microsoft's div.c found +// in %MSVC.NET%\crt\src\div.c +#ifdef STATIC_IMAXDIV // [ +static +#else // STATIC_IMAXDIV ][ +_inline +#endif // STATIC_IMAXDIV ] +imaxdiv_t __cdecl imaxdiv(intmax_t numer, intmax_t denom) +{ +   imaxdiv_t result; + +   result.quot = numer / denom; +   result.rem = numer % denom; + +   if (numer < 0 && result.rem > 0) { +      // did division wrong; must fix up +      ++result.quot; +      result.rem -= denom; +   } + +   return result; +} + +// 7.8.2.3 The strtoimax and strtoumax functions +#define strtoimax _strtoi64 +#define strtoumax _strtoui64 + +// 7.8.2.4 The wcstoimax and wcstoumax functions +#define wcstoimax _wcstoi64 +#define wcstoumax _wcstoui64 + + +#endif // _MSC_INTTYPES_H_ ] diff --git a/host/msvc/stdint.h b/host/msvc/stdint.h new file mode 100644 index 000000000..15333b467 --- /dev/null +++ b/host/msvc/stdint.h @@ -0,0 +1,226 @@ +// ISO C9x  compliant stdint.h for Microsoft Visual Studio +// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124  +//  +//  Copyright (c) 2006 Alexander Chemeris +//  +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +//  +//   1. Redistributions of source code must retain the above copyright notice, +//      this list of conditions and the following disclaimer. +//  +//   2. Redistributions in binary form must reproduce the above copyright +//      notice, this list of conditions and the following disclaimer in the +//      documentation and/or other materials provided with the distribution. +//  +//   3. The name of the author may be used to endorse or promote products +//      derived from this software without specific prior written permission. +//  +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,  +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//  +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _MSC_VER // [ +#error "Use this header only with Microsoft Visual C++ compilers!" +#endif // _MSC_VER ] + +#ifndef _MSC_STDINT_H_ // [ +#define _MSC_STDINT_H_ + +#if _MSC_VER > 1000 +#pragma once +#endif + +#include <limits.h> + +// For Visual Studio 6 in C++ mode wrap <wchar.h> include with 'extern "C++" {}' +// or compiler give many errors like this: +//   error C2733: second C linkage of overloaded function 'wmemchr' not allowed +#if (_MSC_VER < 1300) && defined(__cplusplus) +   extern "C++" { +#endif  +#     include <wchar.h> +#if (_MSC_VER < 1300) && defined(__cplusplus) +   } +#endif + +// 7.18.1 Integer types + +// 7.18.1.1 Exact-width integer types +typedef __int8            int8_t; +typedef __int16           int16_t; +typedef __int32           int32_t; +typedef __int64           int64_t; +typedef unsigned __int8   uint8_t; +typedef unsigned __int16  uint16_t; +typedef unsigned __int32  uint32_t; +typedef unsigned __int64  uint64_t; + +// 7.18.1.2 Minimum-width integer types +typedef int8_t    int_least8_t; +typedef int16_t   int_least16_t; +typedef int32_t   int_least32_t; +typedef int64_t   int_least64_t; +typedef uint8_t   uint_least8_t; +typedef uint16_t  uint_least16_t; +typedef uint32_t  uint_least32_t; +typedef uint64_t  uint_least64_t; + +// 7.18.1.3 Fastest minimum-width integer types +typedef int8_t    int_fast8_t; +typedef int16_t   int_fast16_t; +typedef int32_t   int_fast32_t; +typedef int64_t   int_fast64_t; +typedef uint8_t   uint_fast8_t; +typedef uint16_t  uint_fast16_t; +typedef uint32_t  uint_fast32_t; +typedef uint64_t  uint_fast64_t; + +// 7.18.1.4 Integer types capable of holding object pointers +#ifdef _WIN64 // [ +   typedef __int64           intptr_t; +   typedef unsigned __int64  uintptr_t; +#else // _WIN64 ][ +   typedef int               intptr_t; +   typedef unsigned int      uintptr_t; +#endif // _WIN64 ] + +// 7.18.1.5 Greatest-width integer types +typedef int64_t   intmax_t; +typedef uint64_t  uintmax_t; + + +// 7.18.2 Limits of specified-width integer types + +#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [   See footnote 220 at page 257 and footnote 221 at page 259 + +// 7.18.2.1 Limits of exact-width integer types +#define INT8_MIN     ((int8_t)_I8_MIN) +#define INT8_MAX     _I8_MAX +#define INT16_MIN    ((int16_t)_I16_MIN) +#define INT16_MAX    _I16_MAX +#define INT32_MIN    ((int32_t)_I32_MIN) +#define INT32_MAX    _I32_MAX +#define INT64_MIN    ((int64_t)_I64_MIN) +#define INT64_MAX    _I64_MAX +#define UINT8_MAX    _UI8_MAX +#define UINT16_MAX   _UI16_MAX +#define UINT32_MAX   _UI32_MAX +#define UINT64_MAX   _UI64_MAX + +// 7.18.2.2 Limits of minimum-width integer types +#define INT_LEAST8_MIN    INT8_MIN +#define INT_LEAST8_MAX    INT8_MAX +#define INT_LEAST16_MIN   INT16_MIN +#define INT_LEAST16_MAX   INT16_MAX +#define INT_LEAST32_MIN   INT32_MIN +#define INT_LEAST32_MAX   INT32_MAX +#define INT_LEAST64_MIN   INT64_MIN +#define INT_LEAST64_MAX   INT64_MAX +#define UINT_LEAST8_MAX   UINT8_MAX +#define UINT_LEAST16_MAX  UINT16_MAX +#define UINT_LEAST32_MAX  UINT32_MAX +#define UINT_LEAST64_MAX  UINT64_MAX + +// 7.18.2.3 Limits of fastest minimum-width integer types +#define INT_FAST8_MIN    INT8_MIN +#define INT_FAST8_MAX    INT8_MAX +#define INT_FAST16_MIN   INT16_MIN +#define INT_FAST16_MAX   INT16_MAX +#define INT_FAST32_MIN   INT32_MIN +#define INT_FAST32_MAX   INT32_MAX +#define INT_FAST64_MIN   INT64_MIN +#define INT_FAST64_MAX   INT64_MAX +#define UINT_FAST8_MAX   UINT8_MAX +#define UINT_FAST16_MAX  UINT16_MAX +#define UINT_FAST32_MAX  UINT32_MAX +#define UINT_FAST64_MAX  UINT64_MAX + +// 7.18.2.4 Limits of integer types capable of holding object pointers +#ifdef _WIN64 // [ +#  define INTPTR_MIN   INT64_MIN +#  define INTPTR_MAX   INT64_MAX +#  define UINTPTR_MAX  UINT64_MAX +#else // _WIN64 ][ +#  define INTPTR_MIN   INT32_MIN +#  define INTPTR_MAX   INT32_MAX +#  define UINTPTR_MAX  UINT32_MAX +#endif // _WIN64 ] + +// 7.18.2.5 Limits of greatest-width integer types +#define INTMAX_MIN   INT64_MIN +#define INTMAX_MAX   INT64_MAX +#define UINTMAX_MAX  UINT64_MAX + +// 7.18.3 Limits of other integer types + +#ifdef _WIN64 // [ +#  define PTRDIFF_MIN  _I64_MIN +#  define PTRDIFF_MAX  _I64_MAX +#else  // _WIN64 ][ +#  define PTRDIFF_MIN  _I32_MIN +#  define PTRDIFF_MAX  _I32_MAX +#endif  // _WIN64 ] + +#define SIG_ATOMIC_MIN  INT_MIN +#define SIG_ATOMIC_MAX  INT_MAX + +#ifndef SIZE_MAX // [ +#  ifdef _WIN64 // [ +#     define SIZE_MAX  _UI64_MAX +#  else // _WIN64 ][ +#     define SIZE_MAX  _UI32_MAX +#  endif // _WIN64 ] +#endif // SIZE_MAX ] + +// WCHAR_MIN and WCHAR_MAX are also defined in <wchar.h> +#ifndef WCHAR_MIN // [ +#  define WCHAR_MIN  0 +#endif  // WCHAR_MIN ] +#ifndef WCHAR_MAX // [ +#  define WCHAR_MAX  _UI16_MAX +#endif  // WCHAR_MAX ] + +#define WINT_MIN  0 +#define WINT_MAX  _UI16_MAX + +#endif // __STDC_LIMIT_MACROS ] + + +// 7.18.4 Limits of other integer types + +#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [   See footnote 224 at page 260 + +// 7.18.4.1 Macros for minimum-width integer constants + +#define INT8_C(val)  val##i8 +#define INT16_C(val) val##i16 +#define INT32_C(val) val##i32 +#define INT64_C(val) val##i64 + +#define UINT8_C(val)  val##ui8 +#define UINT16_C(val) val##ui16 +#define UINT32_C(val) val##ui32 +#define UINT64_C(val) val##ui64 + +// 7.18.4.2 Macros for greatest-width integer constants +#ifndef INTMAX_C +#define INTMAX_C   INT64_C +#endif +#ifndef UINTMAX_C +#define UINTMAX_C  UINT64_C +#endif + +#endif // __STDC_CONSTANT_MACROS ] + + +#endif // _MSC_STDINT_H_ ] | 
