]> Creatis software - gdcm.git/blobdiff - src/gdcmUtil.cxx
Some normalizations :
[gdcm.git] / src / gdcmUtil.cxx
index cbaa71b6de46ff00220bba5c3cf7cd53727c3022..14b4d52e7622843e2e5a944a81234ed75f9809ea 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmUtil.cxx,v $
   Language:  C++
-  Date:      $Date: 2005/01/21 20:02:46 $
-  Version:   $Revision: 1.116 $
+  Date:      $Date: 2005/01/23 10:12:34 $
+  Version:   $Revision: 1.122 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -25,7 +25,7 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 
-#ifdef _MSC_VER
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__MINGW32__)
 #include <sys/timeb.h>
 #else
 #include <sys/time.h>
@@ -284,23 +284,23 @@ std::string Util::GetCurrentDateTime()
 {
    char tmp[40];
    long milliseconds;
-   time_t *timep;
+   time_t timep;
   
    // We need implementation specific functions to obtain millisecond precision
 #if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__MINGW32__)
    struct timeb tb;
    ::ftime(&tb);
-   timep = &tb.time;
+   timep = tb.time;
    milliseconds = tb.millitm;
 #else
    struct timeval tv;
    gettimeofday (&tv, NULL);
-   timep = &tv.tv_sec;
+   timep = tv.tv_sec;
    // Compute milliseconds from microseconds.
    milliseconds = tv.tv_usec / 1000;
 #endif
    // Obtain the time of day, and convert it to a tm struct.
-   struct tm *ptm = localtime (timep);
+   struct tm *ptm = localtime (&timep);
    // Format the date and time, down to a single second.
    strftime (tmp, sizeof (tmp), "%Y%m%d%H%M%S", ptm);
 
@@ -328,13 +328,13 @@ std::string Util::DicomString(const char *s, size_t l)
 
 /**
  * \brief Create a /DICOM/ string:
- * It should a of even lenght (no odd length ever)
+ * It should a of even length (no odd length ever)
  * It can contain as many (if you are reading this from your
  * editor the following character is is backslash followed by zero
  * that needed to be escaped with an extra backslash for doxygen) \\0
  * as you want.
  * This function is similar to DicomString(const char*), 
- * except it doesn't take a lenght
+ * except it doesn't take a length
  * It only pad with a null character if length is odd
  */
 std::string Util::DicomString(const char *s)
@@ -351,8 +351,8 @@ std::string Util::DicomString(const char *s)
 
 /**
  * \brief Safely compare two Dicom String:
- *        - Both string should be of even lenght
- *        - We allow padding of even lenght string by either a null 
+ *        - Both string should be of even length
+ *        - We allow padding of even length string by either a null 
  *          character of a space
  */
 bool Util::DicomStringEqual(const std::string &s1, const char *s2)
@@ -367,8 +367,6 @@ bool Util::DicomStringEqual(const std::string &s1, const char *s2)
   return s1_even == s2_even;
 }
 
-
-
 /**
  * \brief   tells us if the processor we are working with is BigEndian or not
  */
@@ -678,15 +676,25 @@ std::string Util::GetMACAddress()
    // 3 OS: Win32, SunOS and 'real' POSIX
    // http://groups-beta.google.com/group/comp.unix.solaris/msg/ad36929d783d63be
    // http://bdn.borland.com/article/0,1410,26040,00.html
-   union dual { uint64_t n; unsigned char addr[6];  };
+   unsigned char addr[6];
+   uint64_t n = 0;
  
-   // zero-initialize the whole thing first:
-   dual d = { 0 };
-   int stat = GetMacAddrSys(d.addr);
+   int stat = GetMacAddrSys(addr);
    if (stat == 0)
    {
-      // fill with zero to fit on 15 bytes.
-      return Format("%015llu", d.n);
+      // 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
    }
    else
    {
@@ -810,6 +818,9 @@ unsigned int Util::GetCurrentThreadID()
 #endif
 #ifdef __sun
    return (unsigned int)thr_self();
+#else
+   //default implementation
+   return 0;
 #endif
 }