X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;ds=sidebyside;f=src%2FgdcmUtil.cxx;h=6d474c2e5c83b3584c00db80685ea166956e8f87;hb=57ec56658548c34052a1c1678ffcb6907c3faeec;hp=224c9d5d84df101fb044e01bb41a54569d4bbf02;hpb=04e8ab90af5ff69eb35e51d56177a4d4c487e300;p=gdcm.git diff --git a/src/gdcmUtil.cxx b/src/gdcmUtil.cxx index 224c9d5d..6d474c2e 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/08/31 16:24:19 $ - Version: $Revision: 1.162 $ + Date: $Date: 2006/02/16 20:06:15 $ + Version: $Revision: 1.183 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -18,7 +18,9 @@ #include "gdcmUtil.h" #include "gdcmDebug.h" + #include +#include // for va_list // For GetCurrentDate, GetCurrentTime #include @@ -95,7 +97,13 @@ namespace gdcm //------------------------------------------------------------------------- const std::string Util::GDCM_UID = "1.2.826.0.1.3680043.2.1143"; std::string Util::RootUID = GDCM_UID; -const uint16_t Util::FMIV = 0x0001; +/* + * File Meta Information Version (0002,0001) shall contain a two byte OB + * value consisting of a 0x00 byte, followed by 0x01 byte, and not the + * value 0x0001 encoded as a little endian 16 bit short value, + * which would be the other way around... + */ +const uint16_t Util::FMIV = 0x0100; uint8_t *Util::FileMetaInformationVersion = (uint8_t *)&FMIV; std::string Util::GDCM_MAC_ADRESS = GetMACAddress(); @@ -104,7 +112,7 @@ std::string Util::GDCM_MAC_ADRESS = GetMACAddress(); /** * \brief Provide a better 'c++' approach for sprintf * For example c code is: - * char result[200]; // hope 200 is enough + * char result[2048]; // hope 2048 is enough * sprintf(result, "%04x|%04x", group , elem); * * c++ code is @@ -120,7 +128,7 @@ std::string Util::GDCM_MAC_ADRESS = GetMACAddress(); */ std::string Util::Format(const char *format, ...) { - char buffer[2048]; + char buffer[2048]; // hope 2048 is enough va_list args; va_start(args, format); vsprintf(buffer, format, args); //might be a security flaw @@ -186,16 +194,14 @@ int Util::CountSubstring (const std::string &str, */ bool Util::IsCleanString(std::string const &s) { - std::cout<< std::endl << s << std::endl; for(unsigned int i=0; i pos2 ) @@ -307,7 +321,9 @@ std::string Util::GetPath(std::string const &fullName) { res.resize(pos2); } - +*/ + int pos = res.rfind(GDCM_FILESEPARATOR); + res.resize(pos); return res; } @@ -318,10 +334,14 @@ std::string Util::GetPath(std::string const &fullName) std::string Util::GetName(std::string const &fullName) { 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; + // At least with my gcc4.0.1, unfound char results in pos =4294967295 ... + //slash_pos = slash_pos > backslash_pos ? slash_pos : backslash_pos; + slash_pos = slash_pos < backslash_pos ? slash_pos : backslash_pos; +*/ + std::string::size_type slash_pos = filename.rfind(GDCM_FILESEPARATOR); if (slash_pos != std::string::npos ) { return filename.substr(slash_pos + 1); @@ -477,8 +497,8 @@ std::string Util::DicomString(const char *s) /** * \brief Safely check the equality of two Dicom String: * - Both strings should be of even length - * - We allow padding of even length string by either a null - * character of a space + * - 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) { @@ -495,8 +515,8 @@ bool Util::DicomStringEqual(const std::string &s1, const char *s2) /** * \brief Safely compare two Dicom String: * - Both strings should be of even length - * - We allow padding of even length string by either a null - * character of a space + * - We allow padding of even length string by either + * a null character of a space */ bool Util::CompareDicomString(const std::string &s1, const char *s2, int op) { @@ -550,6 +570,29 @@ bool Util::CompareDicomString(const std::string &s1, const char *s2, int op) OUT AsnObjectIdentifier * supportedView); #endif //_WIN32 +#ifdef __sgi +static int SGIGetMacAddress(unsigned char *addr) +{ + FILE *f = popen("/etc/nvram eaddr","r"); + if(f == 0) + { + return -1; + } + unsigned int x[6]; + if(fscanf(f,"%02x:%02x:%02x:%02x:%02x:%02x", + x,x+1,x+2,x+3,x+4,x+5) != 6) + { + pclose(f); + return -1; + } + for(unsigned int i = 0; i < 6; i++) + { + addr[i] = static_cast(x[i]); + } + return 0; +} +#endif + /// \brief gets current M.A.C adress (for internal use only) int GetMacAddrSys ( unsigned char *addr ); int GetMacAddrSys ( unsigned char *addr ) @@ -682,6 +725,10 @@ int GetMacAddrSys ( unsigned char *addr ) return 0; #endif //Win32 version +#if defined(__sgi) + return SGIGetMacAddress(addr); +#endif // __sgi + // implementation for POSIX system #if defined(CMAKE_HAVE_NET_IF_ARP_H) && defined(__sun) @@ -808,8 +855,8 @@ int GetMacAddrSys ( unsigned char *addr ) } close(sd); #endif - // Not implemented platforms - perror("in Get MAC Adress (internal) : There was a configuration problem on your plateform"); + // Not implemented platforms (or no cable !) + perror("in Get MAC Adress (internal) : There was a configuration problem (or no cable !) on your plateform"); memset(addr,0,6); return -1; #endif //__sun @@ -833,7 +880,7 @@ inline int getlastdigit(unsigned char *data) } /** - * \brief Encode the mac address on a fixed lenght string of 15 characters. + * \brief Encode the mac address on a fixed length string of 15 characters. * we save space this way. */ std::string Util::GetMACAddress() @@ -866,14 +913,14 @@ std::string Util::GetMACAddress() } else { - gdcmWarningMacro("Problem in finding the MAC Address"); + gdcmStaticWarningMacro("Problem in finding the MAC Address"); return ""; } } /** - * \brief Creates a new UID. As stipulate in the DICOM ref - * each time a DICOM image is create it should have + * \brief Creates a new UID. As stipulated in the DICOM ref + * each time a DICOM image is created it should have * a unique identifier (URI) * @param root is the DICOM prefix assigned by IOS group */ @@ -897,7 +944,7 @@ std::string Util::CreateUniqueUID(const std::string &root) append += Util::GDCM_MAC_ADRESS; append += "."; append += Util::GetCurrentDateTime(); - + append += "."; //Also add a mini random number just in case: char tmp[10]; int r = (int) (100.0*rand()/RAND_MAX); @@ -908,7 +955,7 @@ std::string Util::CreateUniqueUID(const std::string &root) // If append is too long we need to rehash it if ( (prefix + append).size() > 64 ) { - gdcmErrorMacro( "Size of UID is too long." ); + gdcmStaticErrorMacro( "Size of UID is too long." ); // we need a hash function to truncate this number // if only md5 was cross plateform // MD5(append); @@ -934,15 +981,13 @@ const std::string &Util::GetRootUID() /** * \brief binary_write binary_write * @param os ostream to write to - * @param val val + * @param val 16 bits value to write */ std::ostream &binary_write(std::ostream &os, const uint16_t &val) { #if defined(GDCM_WORDS_BIGENDIAN) || defined(GDCM_FORCE_BIGENDIAN_EMULATION) uint16_t swap; - //swap = ((( val << 8 ) & 0xff00 ) | (( val >> 8 ) & 0x00ff ) ); - //save CPU time - swap = ( val << 8 | val >> 8 ); + swap = ( val << 8 | val >> 8 ); return os.write(reinterpret_cast(&swap), 2); #else @@ -953,15 +998,12 @@ std::ostream &binary_write(std::ostream &os, const uint16_t &val) /** * \brief binary_write binary_write * @param os ostream to write to - * @param val val + * @param val 32 bits value to write */ std::ostream &binary_write(std::ostream &os, const uint32_t &val) { #if defined(GDCM_WORDS_BIGENDIAN) || defined(GDCM_FORCE_BIGENDIAN_EMULATION) uint32_t swap; -// swap = ( ((val<<24) & 0xff000000) | ((val<<8) & 0x00ff0000) | -// ((val>>8) & 0x0000ff00) | ((val>>24) & 0x000000ff) ); -// save CPU time swap = ( (val<<24) | ((val<<8) & 0x00ff0000) | ((val>>8) & 0x0000ff00) | (val>>24) ); return os.write(reinterpret_cast(&swap), 4); @@ -970,10 +1012,37 @@ std::ostream &binary_write(std::ostream &os, const uint32_t &val) #endif //GDCM_WORDS_BIGENDIAN } +/** + * \brief binary_write binary_write + * @param os ostream to write to + * @param val double (64 bits) value to write + */ +std::ostream &binary_write(std::ostream &os, const double &val) +{ +#if defined(GDCM_WORDS_BIGENDIAN) || defined(GDCM_FORCE_BIGENDIAN_EMULATION) + double swap = val; + + char *beg = (char *)&swap; + char *end = beg + 7; + char t; + for (unsigned int i = 0; i<7; i++) + { + t = *beg; + *beg = *end; + *end = t; + beg++, + end--; + } + return os.write(reinterpret_cast(&swap), 8); +#else + return os.write(reinterpret_cast(&val), 8); +#endif //GDCM_WORDS_BIGENDIAN +} + /** * \brief binary_write binary_write * @param os ostream to write to - * @param val val + * @param val 8 bits characters aray to write */ std::ostream &binary_write(std::ostream &os, const char *val) { @@ -981,9 +1050,9 @@ std::ostream &binary_write(std::ostream &os, const char *val) } /** - * \brief + * \brief binary_write binary_write * @param os ostream to write to - * @param val val + * @param val std::string value to write */ std::ostream &binary_write(std::ostream &os, std::string const &val) { @@ -993,7 +1062,7 @@ std::ostream &binary_write(std::ostream &os, std::string const &val) /** * \brief binary_write binary_write * @param os ostream to write to - * @param val value + * @param val 8 bits 'characters' aray to write * @param len length of the 'value' to be written */ std::ostream &binary_write(std::ostream &os, const uint8_t *val, size_t len) @@ -1005,8 +1074,8 @@ std::ostream &binary_write(std::ostream &os, const uint8_t *val, size_t len) /** * \brief binary_write binary_write * @param os ostream to write to - * @param val val - * @param len length of the 'value' to be written + * @param val 16 bits words aray to write + * @param len length (in bytes) of the 'value' to be written */ std::ostream &binary_write(std::ostream &os, const uint16_t *val, size_t len) { @@ -1117,6 +1186,14 @@ std::string Util::GetIPAddress() return str; } +void Util::hfpswap(double *a, double *b) +{ + double tmp; + tmp=*a; + *a=*b; + *b=tmp; +} + //------------------------------------------------------------------------- } // end namespace gdcm