From c71ac9ad83b1945760f695ce40ba3169d5467628 Mon Sep 17 00:00:00 2001 From: malaterre Date: Fri, 28 Jan 2005 00:02:15 +0000 Subject: [PATCH] ENH: Rewrite the base conversion from base 256 to base 10 using string operation only, this allows us to get rid of the problem with 64bits integer --- ChangeLog | 5 +++++ src/gdcmCommon.h | 6 ++---- src/gdcmUtil.cxx | 52 +++++++++++++++++++++++++++++++++--------------- 3 files changed, 43 insertions(+), 20 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3fa355a1..83b400af 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2005-01-27 Mathieu Malaterre + * Rewrite the base 256 to base 10 conversion, using string operation only. + This allos us to get rid of the problematic 64bits integer type (does not + alwyas exist on target platform). + 2005-01-27 Jean-Pierre Roux * Add construct and destructor to class gdcm::Debug to close the debug file automatically diff --git a/src/gdcmCommon.h b/src/gdcmCommon.h index ed76f8af..16af1928 100644 --- a/src/gdcmCommon.h +++ b/src/gdcmCommon.h @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmCommon.h,v $ Language: C++ - Date: $Date: 2005/01/23 01:00:17 $ - Version: $Revision: 1.57 $ + Date: $Date: 2005/01/28 00:02:15 $ + Version: $Revision: 1.58 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -59,11 +59,9 @@ typedef signed char int8_t; typedef signed short int16_t; typedef signed int int32_t; -typedef signed __int64 int64_t; typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; -typedef unsigned __int64 uint64_t; #define UINT32_MAX (4294967295U) #endif diff --git a/src/gdcmUtil.cxx b/src/gdcmUtil.cxx index d295c670..6880df0c 100644 --- a/src/gdcmUtil.cxx +++ b/src/gdcmUtil.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmUtil.cxx,v $ Language: C++ - Date: $Date: 2005/01/27 10:06:33 $ - Version: $Revision: 1.124 $ + Date: $Date: 2005/01/28 00:02:15 $ + Version: $Revision: 1.125 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -19,6 +19,7 @@ #include "gdcmUtil.h" #include "gdcmDebug.h" #include +#include // For GetCurrentDate, GetCurrentTime #include @@ -665,6 +666,23 @@ int GetMacAddrSys ( unsigned char *addr ) #endif //__sun } +/** + * Mini function to return the last digit from a number express in base 256 + * pre condition data contain an array of 6 unsigned char + * post condition carry contain the last digit + */ +inline int getlastdigit(unsigned char *data) +{ + int extended, carry = 0; + for(int i=0;i<6;i++) + { + extended = (carry << 8) + data[i]; + data[i] = extended / 10; + carry = extended % 10; + } + return carry; +} + /** * \brief Encode the mac address on a fixed lenght string of 15 characters. * we save space this way. @@ -677,24 +695,26 @@ std::string Util::GetMACAddress() // http://groups-beta.google.com/group/comp.unix.solaris/msg/ad36929d783d63be // http://bdn.borland.com/article/0,1410,26040,00.html unsigned char addr[6]; - uint64_t n = 0; int stat = GetMacAddrSys(addr); if (stat == 0) { - // Horner evaluation - for(int i=0; i<6; i++) - { - n *= 256; - n += addr[i]; - } - - // we fit on 15 bytes maximum < 256^6. -#if defined(_MSC_VER) || defined(__BORLANDC__) - return Format("%I64u", n); -#else - return Format("%llu", n); -#endif + // We need to convert a 6 digit number from base 256 to base 10, using integer + // would requires a 48bits one. To avoid this we have to reimplement the div + modulo + // with string only + bool zero = false; + int res; + std::string sres; + while(!zero) + { + res = getlastdigit(addr); + sres.push_back( '0' + res ); + zero = (addr[0] == 0) && (addr[1] == 0) && (addr[2] == 0) && (addr[3] == 0) && (addr[4] == 0) && (addr[5] == 0); + } + // Since we push back the proper number is reversed: + std::reverse(sres.begin(),sres.end()); + + return sres; } else { -- 2.48.1