Home | History | Annotate | Download | only in lib
      1 /***************************************************************************
      2  *                                  _   _ ____  _
      3  *  Project                     ___| | | |  _ \| |
      4  *                             / __| | | | |_) | |
      5  *                            | (__| |_| |  _ <| |___
      6  *                             \___|\___/|_| \_\_____|
      7  *
      8  * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel (at) haxx.se>, et al.
      9  *
     10  * This software is licensed as described in the file COPYING, which
     11  * you should have received as part of this distribution. The terms
     12  * are also available at https://curl.haxx.se/docs/copyright.html.
     13  *
     14  * You may opt to use, copy, modify, merge, publish, distribute and/or sell
     15  * copies of the Software, and permit persons to whom the Software is
     16  * furnished to do so, under the terms of the COPYING file.
     17  *
     18  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
     19  * KIND, either express or implied.
     20  *
     21  ***************************************************************************/
     22 
     23 #include "curl_setup.h"
     24 #include "stdint.h"
     25 #include "limits.h"
     26 
     27 #if defined(__INTEL_COMPILER) && defined(__unix__)
     28 
     29 #ifdef HAVE_NETINET_IN_H
     30 #  include <netinet/in.h>
     31 #endif
     32 #ifdef HAVE_ARPA_INET_H
     33 #  include <arpa/inet.h>
     34 #endif
     35 
     36 #endif /* __INTEL_COMPILER && __unix__ */
     37 
     38 #define BUILDING_WARNLESS_C 1
     39 
     40 #include "warnless.h"
     41 
     42 #define CURL_MASK_SCHAR  0x7F
     43 #define CURL_MASK_UCHAR  0xFF
     44 
     45 #define CURL_MASK_USHORT  USHRT_MAX
     46 #define CURL_MASK_SSHORT  SHRT_MAX
     47 
     48 #define CURL_MASK_SINT  INT_MAX
     49 #define CURL_MASK_UINT  UINT_MAX
     50 
     51 #define CURL_MASK_SLONG  LONG_MAX
     52 #define CURL_MASK_ULONG  ULONG_MAX
     53 
     54 #define CURL_MASK_UCOFFT  UINT64_MAX
     55 #define CURL_MASK_SCOFFT  INT64_MAX
     56 
     57 /*
     58 ** unsigned long to unsigned short
     59 */
     60 
     61 unsigned short curlx_ultous(unsigned long ulnum)
     62 {
     63 #ifdef __INTEL_COMPILER
     64 #  pragma warning(push)
     65 #  pragma warning(disable:810) /* conversion may lose significant bits */
     66 #endif
     67 
     68   DEBUGASSERT(ulnum <= (unsigned long) CURL_MASK_USHORT);
     69   return (unsigned short)(ulnum & (unsigned long) CURL_MASK_USHORT);
     70 
     71 #ifdef __INTEL_COMPILER
     72 #  pragma warning(pop)
     73 #endif
     74 }
     75 
     76 /*
     77 ** unsigned long to unsigned char
     78 */
     79 
     80 unsigned char curlx_ultouc(unsigned long ulnum)
     81 {
     82 #ifdef __INTEL_COMPILER
     83 #  pragma warning(push)
     84 #  pragma warning(disable:810) /* conversion may lose significant bits */
     85 #endif
     86 
     87   DEBUGASSERT(ulnum <= (unsigned long) CURL_MASK_UCHAR);
     88   return (unsigned char)(ulnum & (unsigned long) CURL_MASK_UCHAR);
     89 
     90 #ifdef __INTEL_COMPILER
     91 #  pragma warning(pop)
     92 #endif
     93 }
     94 
     95 /*
     96 ** unsigned long to signed int
     97 */
     98 
     99 int curlx_ultosi(unsigned long ulnum)
    100 {
    101 #ifdef __INTEL_COMPILER
    102 #  pragma warning(push)
    103 #  pragma warning(disable:810) /* conversion may lose significant bits */
    104 #endif
    105 
    106   DEBUGASSERT(ulnum <= (unsigned long) CURL_MASK_SINT);
    107   return (int)(ulnum & (unsigned long) CURL_MASK_SINT);
    108 
    109 #ifdef __INTEL_COMPILER
    110 #  pragma warning(pop)
    111 #endif
    112 }
    113 
    114 /*
    115 ** unsigned size_t to signed curl_off_t
    116 */
    117 
    118 curl_off_t curlx_uztoso(size_t uznum)
    119 {
    120 #ifdef __INTEL_COMPILER
    121 #  pragma warning(push)
    122 #  pragma warning(disable:810) /* conversion may lose significant bits */
    123 #endif
    124 
    125   DEBUGASSERT(uznum <= (size_t) CURL_MASK_SCOFFT);
    126   return (curl_off_t)(uznum & (size_t) CURL_MASK_SCOFFT);
    127 
    128 #ifdef __INTEL_COMPILER
    129 #  pragma warning(pop)
    130 #endif
    131 }
    132 
    133 /*
    134 ** unsigned size_t to signed int
    135 */
    136 
    137 int curlx_uztosi(size_t uznum)
    138 {
    139 #ifdef __INTEL_COMPILER
    140 #  pragma warning(push)
    141 #  pragma warning(disable:810) /* conversion may lose significant bits */
    142 #endif
    143 
    144   DEBUGASSERT(uznum <= (size_t) CURL_MASK_SINT);
    145   return (int)(uznum & (size_t) CURL_MASK_SINT);
    146 
    147 #ifdef __INTEL_COMPILER
    148 #  pragma warning(pop)
    149 #endif
    150 }
    151 
    152 /*
    153 ** unsigned size_t to unsigned long
    154 */
    155 
    156 unsigned long curlx_uztoul(size_t uznum)
    157 {
    158 #ifdef __INTEL_COMPILER
    159 # pragma warning(push)
    160 # pragma warning(disable:810) /* conversion may lose significant bits */
    161 #endif
    162 
    163 #if (CURL_SIZEOF_LONG < SIZEOF_SIZE_T)
    164   DEBUGASSERT(uznum <= (size_t) CURL_MASK_ULONG);
    165 #endif
    166   return (unsigned long)(uznum & (size_t) CURL_MASK_ULONG);
    167 
    168 #ifdef __INTEL_COMPILER
    169 # pragma warning(pop)
    170 #endif
    171 }
    172 
    173 /*
    174 ** unsigned size_t to unsigned int
    175 */
    176 
    177 unsigned int curlx_uztoui(size_t uznum)
    178 {
    179 #ifdef __INTEL_COMPILER
    180 # pragma warning(push)
    181 # pragma warning(disable:810) /* conversion may lose significant bits */
    182 #endif
    183 
    184 #if (SIZEOF_INT < SIZEOF_SIZE_T)
    185   DEBUGASSERT(uznum <= (size_t) CURL_MASK_UINT);
    186 #endif
    187   return (unsigned int)(uznum & (size_t) CURL_MASK_UINT);
    188 
    189 #ifdef __INTEL_COMPILER
    190 # pragma warning(pop)
    191 #endif
    192 }
    193 
    194 /*
    195 ** signed long to signed int
    196 */
    197 
    198 int curlx_sltosi(long slnum)
    199 {
    200 #ifdef __INTEL_COMPILER
    201 #  pragma warning(push)
    202 #  pragma warning(disable:810) /* conversion may lose significant bits */
    203 #endif
    204 
    205   DEBUGASSERT(slnum >= 0);
    206 #if (SIZEOF_INT < CURL_SIZEOF_LONG)
    207   DEBUGASSERT((unsigned long) slnum <= (unsigned long) CURL_MASK_SINT);
    208 #endif
    209   return (int)(slnum & (long) CURL_MASK_SINT);
    210 
    211 #ifdef __INTEL_COMPILER
    212 #  pragma warning(pop)
    213 #endif
    214 }
    215 
    216 /*
    217 ** signed long to unsigned int
    218 */
    219 
    220 unsigned int curlx_sltoui(long slnum)
    221 {
    222 #ifdef __INTEL_COMPILER
    223 #  pragma warning(push)
    224 #  pragma warning(disable:810) /* conversion may lose significant bits */
    225 #endif
    226 
    227   DEBUGASSERT(slnum >= 0);
    228 #if (SIZEOF_INT < CURL_SIZEOF_LONG)
    229   DEBUGASSERT((unsigned long) slnum <= (unsigned long) CURL_MASK_UINT);
    230 #endif
    231   return (unsigned int)(slnum & (long) CURL_MASK_UINT);
    232 
    233 #ifdef __INTEL_COMPILER
    234 #  pragma warning(pop)
    235 #endif
    236 }
    237 
    238 /*
    239 ** signed long to unsigned short
    240 */
    241 
    242 unsigned short curlx_sltous(long slnum)
    243 {
    244 #ifdef __INTEL_COMPILER
    245 #  pragma warning(push)
    246 #  pragma warning(disable:810) /* conversion may lose significant bits */
    247 #endif
    248 
    249   DEBUGASSERT(slnum >= 0);
    250   DEBUGASSERT((unsigned long) slnum <= (unsigned long) CURL_MASK_USHORT);
    251   return (unsigned short)(slnum & (long) CURL_MASK_USHORT);
    252 
    253 #ifdef __INTEL_COMPILER
    254 #  pragma warning(pop)
    255 #endif
    256 }
    257 
    258 /*
    259 ** unsigned size_t to signed ssize_t
    260 */
    261 
    262 ssize_t curlx_uztosz(size_t uznum)
    263 {
    264 #ifdef __INTEL_COMPILER
    265 #  pragma warning(push)
    266 #  pragma warning(disable:810) /* conversion may lose significant bits */
    267 #endif
    268 
    269   DEBUGASSERT(uznum <= (size_t) SSIZE_MAX);
    270   return (ssize_t)(uznum & (size_t) SSIZE_MAX);
    271 
    272 #ifdef __INTEL_COMPILER
    273 #  pragma warning(pop)
    274 #endif
    275 }
    276 
    277 /*
    278 ** signed curl_off_t to unsigned size_t
    279 */
    280 
    281 size_t curlx_sotouz(curl_off_t sonum)
    282 {
    283 #ifdef __INTEL_COMPILER
    284 #  pragma warning(push)
    285 #  pragma warning(disable:810) /* conversion may lose significant bits */
    286 #endif
    287 
    288   DEBUGASSERT(sonum >= 0);
    289   return (size_t)(sonum & (curl_off_t) SIZE_MAX);
    290 
    291 #ifdef __INTEL_COMPILER
    292 #  pragma warning(pop)
    293 #endif
    294 }
    295 
    296 /*
    297 ** signed ssize_t to signed int
    298 */
    299 
    300 int curlx_sztosi(ssize_t sznum)
    301 {
    302 #ifdef __INTEL_COMPILER
    303 #  pragma warning(push)
    304 #  pragma warning(disable:810) /* conversion may lose significant bits */
    305 #endif
    306 
    307   DEBUGASSERT(sznum >= 0);
    308 #if (SIZEOF_INT < SIZEOF_SIZE_T)
    309   DEBUGASSERT((size_t) sznum <= (size_t) CURL_MASK_SINT);
    310 #endif
    311   return (int)(sznum & (ssize_t) CURL_MASK_SINT);
    312 
    313 #ifdef __INTEL_COMPILER
    314 #  pragma warning(pop)
    315 #endif
    316 }
    317 
    318 /*
    319 ** unsigned int to unsigned short
    320 */
    321 
    322 unsigned short curlx_uitous(unsigned int uinum)
    323 {
    324 #ifdef __INTEL_COMPILER
    325 #  pragma warning(push)
    326 #  pragma warning(disable:810) /* conversion may lose significant bits */
    327 #endif
    328 
    329   DEBUGASSERT(uinum <= (unsigned int) CURL_MASK_USHORT);
    330   return (unsigned short) (uinum & (unsigned int) CURL_MASK_USHORT);
    331 
    332 #ifdef __INTEL_COMPILER
    333 #  pragma warning(pop)
    334 #endif
    335 }
    336 
    337 /*
    338 ** unsigned int to unsigned char
    339 */
    340 
    341 unsigned char curlx_uitouc(unsigned int uinum)
    342 {
    343 #ifdef __INTEL_COMPILER
    344 #  pragma warning(push)
    345 #  pragma warning(disable:810) /* conversion may lose significant bits */
    346 #endif
    347 
    348   DEBUGASSERT(uinum <= (unsigned int) CURL_MASK_UCHAR);
    349   return (unsigned char) (uinum & (unsigned int) CURL_MASK_UCHAR);
    350 
    351 #ifdef __INTEL_COMPILER
    352 #  pragma warning(pop)
    353 #endif
    354 }
    355 
    356 /*
    357 ** unsigned int to signed int
    358 */
    359 
    360 int curlx_uitosi(unsigned int uinum)
    361 {
    362 #ifdef __INTEL_COMPILER
    363 #  pragma warning(push)
    364 #  pragma warning(disable:810) /* conversion may lose significant bits */
    365 #endif
    366 
    367   DEBUGASSERT(uinum <= (unsigned int) CURL_MASK_SINT);
    368   return (int) (uinum & (unsigned int) CURL_MASK_SINT);
    369 
    370 #ifdef __INTEL_COMPILER
    371 #  pragma warning(pop)
    372 #endif
    373 }
    374 
    375 /*
    376 ** signed int to unsigned size_t
    377 */
    378 
    379 size_t curlx_sitouz(int sinum)
    380 {
    381 #ifdef __INTEL_COMPILER
    382 #  pragma warning(push)
    383 #  pragma warning(disable:810) /* conversion may lose significant bits */
    384 #endif
    385 
    386   DEBUGASSERT(sinum >= 0);
    387   return (size_t) sinum;
    388 
    389 #ifdef __INTEL_COMPILER
    390 #  pragma warning(pop)
    391 #endif
    392 }
    393 
    394 #ifdef USE_WINSOCK
    395 
    396 /*
    397 ** curl_socket_t to signed int
    398 */
    399 
    400 int curlx_sktosi(curl_socket_t s)
    401 {
    402   return (int)((ssize_t) s);
    403 }
    404 
    405 /*
    406 ** signed int to curl_socket_t
    407 */
    408 
    409 curl_socket_t curlx_sitosk(int i)
    410 {
    411   return (curl_socket_t)((ssize_t) i);
    412 }
    413 
    414 #endif /* USE_WINSOCK */
    415 
    416 #if defined(WIN32) || defined(_WIN32)
    417 
    418 ssize_t curlx_read(int fd, void *buf, size_t count)
    419 {
    420   return (ssize_t)read(fd, buf, curlx_uztoui(count));
    421 }
    422 
    423 ssize_t curlx_write(int fd, const void *buf, size_t count)
    424 {
    425   return (ssize_t)write(fd, buf, curlx_uztoui(count));
    426 }
    427 
    428 #endif /* WIN32 || _WIN32 */
    429 
    430 #if defined(__INTEL_COMPILER) && defined(__unix__)
    431 
    432 int curlx_FD_ISSET(int fd, fd_set *fdset)
    433 {
    434   #pragma warning(push)
    435   #pragma warning(disable:1469) /* clobber ignored */
    436   return FD_ISSET(fd, fdset);
    437   #pragma warning(pop)
    438 }
    439 
    440 void curlx_FD_SET(int fd, fd_set *fdset)
    441 {
    442   #pragma warning(push)
    443   #pragma warning(disable:1469) /* clobber ignored */
    444   FD_SET(fd, fdset);
    445   #pragma warning(pop)
    446 }
    447 
    448 void curlx_FD_ZERO(fd_set *fdset)
    449 {
    450   #pragma warning(push)
    451   #pragma warning(disable:593) /* variable was set but never used */
    452   FD_ZERO(fdset);
    453   #pragma warning(pop)
    454 }
    455 
    456 unsigned short curlx_htons(unsigned short usnum)
    457 {
    458 #if (__INTEL_COMPILER == 910) && defined(__i386__)
    459   return (unsigned short)(((usnum << 8) & 0xFF00) | ((usnum >> 8) & 0x00FF));
    460 #else
    461   #pragma warning(push)
    462   #pragma warning(disable:810) /* conversion may lose significant bits */
    463   return htons(usnum);
    464   #pragma warning(pop)
    465 #endif
    466 }
    467 
    468 unsigned short curlx_ntohs(unsigned short usnum)
    469 {
    470 #if (__INTEL_COMPILER == 910) && defined(__i386__)
    471   return (unsigned short)(((usnum << 8) & 0xFF00) | ((usnum >> 8) & 0x00FF));
    472 #else
    473   #pragma warning(push)
    474   #pragma warning(disable:810) /* conversion may lose significant bits */
    475   return ntohs(usnum);
    476   #pragma warning(pop)
    477 #endif
    478 }
    479 
    480 #endif /* __INTEL_COMPILER && __unix__ */
    481