X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmUtil.cxx;h=a99f5068516a8a37be907ad6f20e1460cd15fb1f;hb=3d5d93041db5d0e11cef63ea1ec069bb0e65b013;hp=b78ddcb3feef2e156593d21706894bdb0bf78241;hpb=59b4f38954b2fba0dbf5ecfd816ea3b3fcead535;p=gdcm.git diff --git a/src/gdcmUtil.cxx b/src/gdcmUtil.cxx index b78ddcb3..a99f5068 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/07/05 23:50:19 $ - Version: $Revision: 1.156 $ + Date: $Date: 2005/11/07 09:51:35 $ + Version: $Revision: 1.175 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -95,7 +95,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 +110,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 +126,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 @@ -179,10 +185,45 @@ int Util::CountSubstring (const std::string &str, return count; } +/** + * \brief Checks whether a 'string' is printable or not (in order + * to avoid corrupting the terminal of invocation when printing) + * @param s string to check + */ +bool Util::IsCleanString(std::string const &s) +{ + //std::cout<< std::endl << s << std::endl; + for(unsigned int i=0; i s2_even; + case GDCM_GREATEROREQUAL : + return s1_even >= s2_even; + case GDCM_LESS : + return s1_even < s2_even; + case GDCM_LESSOREQUAL : + return s1_even <= s2_even; + default : + gdcmDebugMacro(" Wrong operator : " << op); + return false; + } +} + #ifdef _WIN32 typedef BOOL(WINAPI * pSnmpExtensionInit) ( IN DWORD dwTimeZeroReference, @@ -460,9 +560,10 @@ int GetMacAddrSys ( unsigned char *addr ) { #ifdef _WIN32 WSADATA WinsockData; - if ( (WSAStartup(MAKEWORD(2, 0), &WinsockData)) != 0) + if ( (WSAStartup(MAKEWORD(2, 0), &WinsockData)) != 0 ) { - std::cerr << "This program requires Winsock 2.x!" << std::endl; + std::cerr << "in Get MAC Adress (internal) : This program requires Winsock 2.x!" + << std::endl; return -1; } @@ -556,7 +657,8 @@ int GetMacAddrSys ( unsigned char *addr ) && (varBind[1].value.asnValue.address.stream[4] == 0x00) ) { // Ignore all dial-up networking adapters - std::cerr << "Interface #" << j << " is a DUN adapter\n"; + std::cerr << "in Get MAC Adress (internal) : Interface #" + << j << " is a DUN adapter\n"; continue; } if ( (varBind[1].value.asnValue.address.stream[0] == 0x00) @@ -568,7 +670,8 @@ int GetMacAddrSys ( unsigned char *addr ) { // Ignore NULL addresses returned by other network // interfaces - std::cerr << "Interface #" << j << " is a NULL address\n"; + std::cerr << "in Get MAC Adress (internal) : Interface #" + << j << " is a NULL address\n"; continue; } memcpy( addr, varBind[1].value.asnValue.address.stream, 6); @@ -597,7 +700,7 @@ int GetMacAddrSys ( unsigned char *addr ) if (gethostname(hostname, MAXHOSTNAMELEN) != 0 ) { - perror("gethostname"); + perror("in Get MAC Adress (internal) : gethostname"); return -1; } phost = gethostbyname(hostname); @@ -606,7 +709,7 @@ int GetMacAddrSys ( unsigned char *addr ) sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (sock == -1 ) { - perror("sock"); + perror("in Get MAC Adress (internal) : sock"); return -1; } memset(&parpreq, 0, sizeof(struct arpreq)); @@ -619,7 +722,7 @@ int GetMacAddrSys ( unsigned char *addr ) status = ioctl(sock, SIOCGARP, &parpreq); if (status == -1 ) { - perror("SIOCGARP"); + perror("in Get MAC Adress (internal) : SIOCGARP"); return -1; } memcpy(addr, parpreq.arp_ha.sa_data, 6); @@ -642,7 +745,7 @@ int GetMacAddrSys ( unsigned char *addr ) // max(sizeof(ifreq), sizeof(ifreq.ifr_name)+ifreq.ifr_addr.sa_len // However, under earlier systems, sa_len isn't present, so the size is // just sizeof(struct ifreq) -// We should investiage the use of SIZEOF_ADDR_IFREQ +// We should investigate the use of SIZEOF_ADDR_IFREQ // #ifdef HAVE_SA_LEN #ifndef max @@ -692,7 +795,7 @@ int GetMacAddrSys ( unsigned char *addr ) continue; a = (unsigned char *) &sdlp->sdl_data[sdlp->sdl_nlen]; #else - perror("No way to access hardware"); + perror("in Get MAC Adress (internal) : No way to access hardware"); close(sd); return -1; #endif // AF_LINK @@ -709,8 +812,8 @@ int GetMacAddrSys ( unsigned char *addr ) } close(sd); #endif - // Not implemented platforms - perror("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 @@ -773,8 +876,8 @@ std::string Util::GetMACAddress() } /** - * \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 */ @@ -798,7 +901,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); @@ -835,15 +938,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 @@ -854,15 +955,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); @@ -871,10 +969,39 @@ 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) { @@ -882,9 +1009,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) { @@ -894,7 +1021,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) @@ -906,8 +1033,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) {