]> Creatis software - gdcm.git/blobdiff - src/gdcmUtil.cxx
ENH:
[gdcm.git] / src / gdcmUtil.cxx
index 0b1b14a831a1ca9e0c38b61571afe26ebb834284..a9900f468c231bb9e68ae8902e5112835b298da6 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmUtil.cxx,v $
   Language:  C++
-  Date:      $Date: 2004/10/08 04:43:38 $
-  Version:   $Revision: 1.51 $
+  Date:      $Date: 2004/10/28 22:21:57 $
+  Version:   $Revision: 1.57 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
 #include "gdcmUtil.h"
 #include "gdcmDebug.h"
 
+#include <stdarg.h>  //only included in implementation file
+#include <stdio.h>   //only included in implementation file
+
+namespace gdcm 
+{
+
+/**
+ * \ingroup Globals
+ * \brief Provide a better 'c++' approach for sprintf
+ * For example c code is:
+ * sprintf(trash, "%04x|%04x", group , element);
+ *
+ * c++ is 
+ * std::ostringstream buf;
+ * buf << std::right << std::setw(4) << std::setfill('0') << std::hex
+ *     << group << "|" << std::right << std::setw(4) << std::setfill('0') 
+ *     << std::hex <<  element;
+ * buf.str();
+ */
+
+std::string Util::Format(const char* format, ...)
+{
+   char buffer[2048];
+   va_list args;
+   va_start(args, format);
+   vsprintf(buffer, format, args);  //might be a security flaw
+   return buffer;
+}
+
+
 /**
  * \ingroup Globals
  * \brief Because not available in C++ (?)
  */
-void Tokenize (const std::string& str,
-               std::vector<std::string>& tokens,
-               const std::string& delimiters)
+void Util::Tokenize (const std::string& str,
+                     std::vector<std::string>& tokens,
+                     const std::string& delimiters)
 {
    std::string::size_type lastPos = str.find_first_not_of(delimiters,0);
    std::string::size_type pos     = str.find_first_of    (delimiters,lastPos);
@@ -43,8 +73,8 @@ void Tokenize (const std::string& str,
  *        Counts the number of occurences of a substring within a string
  */
  
-int CountSubstring (const std::string& str,
-                    const std::string& subStr)
+int Util::CountSubstring (const std::string& str,
+                          const std::string& subStr)
 {
    int count = 0;   // counts how many times it appears
    unsigned int x = 0;       // The index position in the string
@@ -69,7 +99,7 @@ int CountSubstring (const std::string& str,
  *         to avoid corrupting the terminal of invocation when printing)
  * @param s string to remove non printable characters from
  */
-std::string CreateCleanString(std::string s)
+std::string Util::CreateCleanString(std::string const & s)
 {
    std::string str = s;
 
@@ -100,17 +130,19 @@ std::string CreateCleanString(std::string s)
  * \brief   Add a SEPARATOR to the end of the name is necessary
  * @param name file/directory name to normalize 
  */
-void NormalizePath(std::string &name)
+std::string Util::NormalizePath(std::string const & pathname)
 {
    const char SEPARATOR_X      = '/';
    const char SEPARATOR_WIN    = '\\';
    const std::string SEPARATOR = "/";
+   std::string name = pathname;
    int size = name.size();
 
-   if((name[size-1]!=SEPARATOR_X)&&(name[size-1]!=SEPARATOR_WIN))
+   if( name[size-1] != SEPARATOR_X && name[size-1] != SEPARATOR_WIN )
    {
-      name+=SEPARATOR;
+      name += SEPARATOR;
    }
+   return name;
 }
 
 /**
@@ -118,20 +150,21 @@ void NormalizePath(std::string &name)
  * \brief   Get the (directory) path from a full path file name
  * @param   fullName file/directory name to extract Path from
  */
-std::string GetPath(std::string &fullName)
+std::string Util::GetPath(std::string const & fullName)
 {
-   int pos1 = fullName.rfind("/");
-   int pos2 = fullName.rfind("\\");
+   std::string res = fullName;
+   int pos1 = res.rfind("/");
+   int pos2 = res.rfind("\\");
    if( pos1 > pos2)
    {
-      fullName.resize(pos1);
+      res.resize(pos1);
    }
    else
    {
-      fullName.resize(pos2);
+      res.resize(pos2);
    }
 
-   return fullName;
+   return res;
 }
 
 /**
@@ -139,29 +172,59 @@ std::string GetPath(std::string &fullName)
  * \brief   Get the (last) name of a full path file name
  * @param   fullName file/directory name to extract end name from
  */
-std::string GetName(std::string &fullName)
+std::string Util::GetName(std::string const & fullName)
 {   
-   int fin = fullName.length()-1;
-   char a =fullName.c_str()[fin];
-   if (a == '/' || a == '\\')
-   {
-      fin--;
-   }
-   int deb = 0;
-   for (int i=fin;i!=0;i--)
-   {
-      if (fullName.c_str()[i] == '/' || fullName.c_str()[i] == '\\')
-      {
-         break;
-      }
-      deb = i;
-   }
+  std::string filename = fullName;
+
+  std::string::size_type slash_pos = filename.rfind("/");
+  std::string::size_type backslash_pos = filename.rfind("\\");
+  slash_pos = slash_pos > backslash_pos ? slash_pos : backslash_pos;
+  if(slash_pos != std::string::npos)
+    {
+    return filename.substr(slash_pos + 1);
+    }
+  else
+    {
+    return filename;
+    }
+} 
 
-   std::string lastName;
-   for (int j=deb;j<fin+1;j++)
-   {
-      lastName=lastName+fullName.c_str()[j];
-   }
 
-  return lastName;
-} 
+template <class T>
+std::ostream& binary_write(std::ostream& os, const T& val)
+{
+    return os.write(reinterpret_cast<const char*>(&val), sizeof val);
+}
+
+std::ostream& binary_write(std::ostream& os, const uint16_t& val)
+{
+#ifdef GDCM_WORDS_BIGENDIAN
+    uint16_t *swap;
+    swap = (((*val>>8)&0xff) | ((*val&0xff)<<8));
+    return os.write(reinterpret_cast<const char*>(swap), 2);
+#else
+    return os.write(reinterpret_cast<const char*>(&val), 2);
+#endif //GDCM_WORDS_BIGENDIAN
+}
+
+std::ostream& binary_write(std::ostream& os, const uint32_t& val)
+{
+#ifdef GDCM_WORDS_BIGENDIAN
+    uint32_t *swap;
+    swap = ( ((val<<24) & 0xff000000) | ((val<<8)  & 0x00ff0000) | 
+             ((val>>8)  & 0x0000ff00) | ((val>>24) & 0x000000ff) );
+    return os.write(reinterpret_cast<const char*>(swap), 4);
+#else
+    return os.write(reinterpret_cast<const char*>(&val), 4);
+#endif //GDCM_WORDS_BIGENDIAN
+}
+
+//template <>
+std::ostream& binary_write(std::ostream& os, const char* val)
+{
+    return os.write(val, strlen(val));
+}
+
+
+} // end namespace gdcm
+