fix compiler warning: conversion may lose significant bits
authorYang Tse <yangsita@gmail.com>
Sat, 4 Dec 2010 04:53:07 +0000 (05:53 +0100)
committerYang Tse <yangsita@gmail.com>
Sat, 4 Dec 2010 04:53:07 +0000 (05:53 +0100)
lib/ftp.c
lib/http.c
lib/ssh.c
lib/warnless.c
lib/warnless.h

index 00d60ea..49e1571 100644 (file)
--- a/lib/ftp.c
+++ b/lib/ftp.c
@@ -1366,18 +1366,16 @@ static CURLcode ftp_state_ul_setup(struct connectdata *conn,
       else {
         curl_off_t passed=0;
         do {
-          curl_off_t readthisamountnow = (data->state.resume_from - passed);
-          curl_off_t actuallyread;
+          size_t readthisamountnow =
+            (data->state.resume_from - passed > CURL_OFF_T_C(BUFSIZE)) ?
+            BUFSIZE : curlx_sotouz(data->state.resume_from - passed);
 
-          if(readthisamountnow > BUFSIZE)
-            readthisamountnow = BUFSIZE;
-
-          actuallyread = (curl_off_t)
-            conn->fread_func(data->state.buffer, 1, (size_t)readthisamountnow,
+          size_t actuallyread =
+            conn->fread_func(data->state.buffer, 1, readthisamountnow,
                              conn->fread_in);
 
           passed += actuallyread;
-          if((actuallyread <= 0) || (actuallyread > readthisamountnow)) {
+          if((actuallyread == 0) || (actuallyread > readthisamountnow)) {
             /* this checks for greater-than only to make sure that the
                CURL_READFUNC_ABORT return code still aborts */
             failf(data, "Failed to read data");
index ed0730c..e35437f 100644 (file)
@@ -98,6 +98,7 @@
 #include "rawstr.h"
 #include "content_encoding.h"
 #include "rtsp.h"
+#include "warnless.h"
 
 #define _MPRINTF_REPLACE /* use our functions only */
 #include <curl/mprintf.h>
@@ -2424,27 +2425,25 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
         /* when seekerr == CURL_SEEKFUNC_CANTSEEK (can't seek to offset) */
         else {
           curl_off_t passed=0;
-
           do {
-            size_t readthisamountnow = (size_t)(data->state.resume_from -
-                                                passed);
-            size_t actuallyread;
-
-            if(readthisamountnow > BUFSIZE)
-              readthisamountnow = BUFSIZE;
+            size_t readthisamountnow =
+              (data->state.resume_from - passed > CURL_OFF_T_C(BUFSIZE)) ?
+              BUFSIZE : curlx_sotouz(data->state.resume_from - passed);
 
-            actuallyread = data->set.fread_func(data->state.buffer, 1,
-                                                (size_t)readthisamountnow,
-                                                data->set.in);
+            size_t actuallyread =
+              data->set.fread_func(data->state.buffer, 1, readthisamountnow,
+                                   data->set.in);
 
             passed += actuallyread;
-            if(actuallyread != readthisamountnow) {
+            if((actuallyread == 0) || (actuallyread > readthisamountnow)) {
+              /* this checks for greater-than only to make sure that the
+                 CURL_READFUNC_ABORT return code still aborts */
               failf(data, "Could only read %" FORMAT_OFF_T
                     " bytes from the input",
                     passed);
               return CURLE_READ_ERROR;
             }
-          } while(passed != data->state.resume_from); /* loop until done */
+          } while(passed < data->state.resume_from);
         }
       }
 
index 52cf5ad..d432b4e 100644 (file)
--- a/lib/ssh.c
+++ b/lib/ssh.c
 #include "strtoofft.h"
 #include "multiif.h"
 #include "select.h"
+#include "warnless.h"
 
 #define _MPRINTF_REPLACE /* use our functions only */
 #include <curl/mprintf.h>
@@ -1541,21 +1542,17 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
           /* seekerr == CURL_SEEKFUNC_CANTSEEK (can't seek to offset) */
           else {
             curl_off_t passed=0;
-            curl_off_t readthisamountnow;
-            curl_off_t actuallyread;
             do {
-              readthisamountnow = (data->state.resume_from - passed);
+              size_t readthisamountnow =
+                (data->state.resume_from - passed > CURL_OFF_T_C(BUFSIZE)) ?
+                BUFSIZE : curlx_sotouz(data->state.resume_from - passed);
 
-              if(readthisamountnow > BUFSIZE)
-                readthisamountnow = BUFSIZE;
-
-              actuallyread =
-                (curl_off_t) conn->fread_func(data->state.buffer, 1,
-                                              (size_t)readthisamountnow,
-                                              conn->fread_in);
+              size_t actuallyread =
+                conn->fread_func(data->state.buffer, 1, readthisamountnow,
+                                 conn->fread_in);
 
               passed += actuallyread;
-              if((actuallyread <= 0) || (actuallyread > readthisamountnow)) {
+              if((actuallyread == 0) || (actuallyread > readthisamountnow)) {
                 /* this checks for greater-than only to make sure that the
                    CURL_READFUNC_ABORT return code still aborts */
                 failf(data, "Failed to read data");
index 3bd23df..bc29d28 100644 (file)
@@ -141,7 +141,7 @@ unsigned char curlx_ultouc(unsigned long ulnum)
 }
 
 /*
-** size_t to signed int
+** unsigned size_t to signed int
 */
 
 int curlx_uztosi(size_t uznum)
@@ -169,6 +169,7 @@ int curlx_sltosi(long slnum)
 #  pragma warning(disable:810) /* conversion may lose significant bits */
 #endif
 
+  DEBUGASSERT(slnum >= 0);
   return (int)(slnum & (long) CURL_MASK_SINT);
 
 #ifdef __INTEL_COMPILER
@@ -187,6 +188,7 @@ unsigned int curlx_sltoui(long slnum)
 #  pragma warning(disable:810) /* conversion may lose significant bits */
 #endif
 
+  DEBUGASSERT(slnum >= 0);
   return (unsigned int)(slnum & (long) CURL_MASK_UINT);
 
 #ifdef __INTEL_COMPILER
@@ -205,6 +207,7 @@ unsigned short curlx_sltous(long slnum)
 #  pragma warning(disable:810) /* conversion may lose significant bits */
 #endif
 
+  DEBUGASSERT(slnum >= 0);
   return (unsigned short)(slnum & (long) CURL_MASK_USHORT);
 
 #ifdef __INTEL_COMPILER
@@ -229,3 +232,22 @@ ssize_t curlx_uztosz(size_t uznum)
 #  pragma warning(pop)
 #endif
 }
+
+/*
+** signed curl_off_t to unsigned size_t
+*/
+
+size_t curlx_sotouz(curl_off_t sonum)
+{
+#ifdef __INTEL_COMPILER
+#  pragma warning(push)
+#  pragma warning(disable:810) /* conversion may lose significant bits */
+#endif
+
+  DEBUGASSERT(sonum >= 0);
+  return (size_t)(sonum & (curl_off_t) CURL_MASK_USIZE_T);
+
+#ifdef __INTEL_COMPILER
+#  pragma warning(pop)
+#endif
+}
index 7181a6e..7b9bd3c 100644 (file)
@@ -36,4 +36,6 @@ unsigned short curlx_sltous(long slnum);
 
 ssize_t curlx_uztosz(size_t uznum);
 
+size_t curlx_sotouz(curl_off_t sonum);
+
 #endif /* HEADER_CURL_WARNLESS_H */