1 // Copyright (c) 1998-1999 Matra Datavision
2 // Copyright (c) 1999-2014 OPEN CASCADE SAS
4 // This file is part of Open CASCADE Technology software library.
6 // This library is free software; you can redistribute it and/or modify it under
7 // the terms of the GNU Lesser General Public License version 2.1 as published
8 // by the Free Software Foundation, with special exception defined in the file
9 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
10 // distribution for complete text of the license and disclaimer of any warranty.
12 // Alternatively, this file may be used under the terms of Open CASCADE
13 // commercial license or contractual agreement.
16 #include <Standard_GUID.hxx>
17 #include <Standard_IStream.hxx>
18 #include <Standard_RangeError.hxx>
22 //Fixes incorrect treatment of GUID given as a string with invalid format
24 //=======================================================================
25 //function : Standard_GUID_MatchChar
27 //=======================================================================
28 Standard_Integer Standard_GUID_MatchChar(const Standard_CString buffer,
29 const Standard_Character aChar)
31 Standard_CString tmpbuffer = buffer;
32 Standard_Integer result = -1;
34 while(*tmpbuffer != '\0' && *tmpbuffer != aChar) {tmpbuffer++; result++;}
36 if(*tmpbuffer == '\0') return -1; //The searched symbol wasn't found
38 if (result >= 0) result++;
42 //=======================================================================
43 //function : Standard_GUID_GetValue32
45 //=======================================================================
46 Standard_PCharacter Standard_GUID_GetValue32(Standard_PCharacter tmpBuffer,
47 Standard_Integer& my32b)
49 Standard_Character strtmp[Standard_GUID_SIZE_ALLOC];
50 Standard_Integer pos = 0;
52 pos = Standard_GUID_MatchChar(tmpBuffer,'-');
54 strncpy(strtmp,tmpBuffer,pos);
56 my32b = (Standard_Integer) strtoul(strtmp, (char **)NULL, 16);
59 return &tmpBuffer[pos+1];
61 //=======================================================================
62 //function : Standard_GUID_GetValue16
64 //=======================================================================
65 Standard_PCharacter Standard_GUID_GetValue16(Standard_PCharacter tmpBuffer,
66 Standard_ExtCharacter& my32b)
68 Standard_Character strtmp[Standard_GUID_SIZE_ALLOC];
69 Standard_Integer pos = 0;
71 pos = Standard_GUID_MatchChar(tmpBuffer,'-');
73 strncpy(strtmp,tmpBuffer,pos);
75 my32b = (Standard_ExtCharacter) strtoul(strtmp, (char **)NULL, 16);
78 // cout << "V16 :" << hex(my32b) << endl;
79 return &tmpBuffer[pos+1];
81 //=======================================================================
82 //function : Standard_GUID_GetValue8
84 //=======================================================================
85 Standard_PCharacter Standard_GUID_GetValue8(Standard_PCharacter tmpBuffer,
88 Standard_Character strtmp[Standard_GUID_SIZE_ALLOC];
90 strncpy(strtmp,tmpBuffer,2);
92 my32b = (Standard_Byte) strtoul(strtmp, (char **)NULL, 16);
93 // cout << "V8 :" << hex(my32b) << endl;
96 //=======================================================================
97 //function : CheckGUIDFormat
99 //=======================================================================
100 Standard_Boolean Standard_GUID::CheckGUIDFormat(const Standard_CString aGuid)
102 Standard_Boolean result = Standard_True;
104 if (aGuid == NULL) return Standard_False;
106 if (strlen(aGuid) == Standard_GUID_SIZE) {
109 for (i = 0; i < 8 && result; i++) {
110 if (!IsXDigit(aGuid[i])) {
111 return Standard_False;
115 if (aGuid[8] != '-') return Standard_False;
117 for (i = 9; i < 13 && result; i++) {
118 if (!IsXDigit(aGuid[i])) {
119 return Standard_False;
123 if (aGuid[13] != '-') return Standard_False;
125 for (i = 14; i < 18 && result; i++) {
126 if (!IsXDigit(aGuid[i])) {
127 return Standard_False;
131 if (aGuid[18] != '-') return Standard_False;
133 for (i = 19; i < 23; i++) {
134 if (!IsXDigit(aGuid[i])) {
135 return Standard_False;
139 if (aGuid[23] != '-') return Standard_False;
141 for (i = 24; i < 36; i++) {
142 if (!IsXDigit(aGuid[i])) {
143 return Standard_False;
147 else result = Standard_False;
152 Standard_GUID::Standard_GUID()
166 Standard_GUID::Standard_GUID(const Standard_CString aGuid)
178 char* tmpBuffer =(char*) aGuid;
180 if(!CheckGUIDFormat(tmpBuffer)) Standard_RangeError::Raise("Invalid format of GUID");
182 if((tmpBuffer = Standard_GUID_GetValue32(tmpBuffer,my32b)) == NULL)
183 Standard_RangeError::Raise("Invalid format of GUID");
184 if((tmpBuffer = Standard_GUID_GetValue16(tmpBuffer,my16b1)) == NULL)
185 Standard_RangeError::Raise("Invalid format of GUID");
186 if((tmpBuffer = Standard_GUID_GetValue16(tmpBuffer,my16b2)) == NULL)
187 Standard_RangeError::Raise("Invalid format of GUID");
188 if((tmpBuffer = Standard_GUID_GetValue16(tmpBuffer,my16b3)) == NULL)
189 Standard_RangeError::Raise("Invalid format of GUID");
190 tmpBuffer = Standard_GUID_GetValue8(tmpBuffer,my8b1);
191 tmpBuffer = Standard_GUID_GetValue8(tmpBuffer,my8b2);
192 tmpBuffer = Standard_GUID_GetValue8(tmpBuffer,my8b3);
193 tmpBuffer = Standard_GUID_GetValue8(tmpBuffer,my8b4);
194 tmpBuffer = Standard_GUID_GetValue8(tmpBuffer,my8b5);
195 tmpBuffer = Standard_GUID_GetValue8(tmpBuffer,my8b6);
198 Standard_GUID::Standard_GUID(const Standard_ExtString aGuid)
210 char tpb[Standard_GUID_SIZE_ALLOC];
211 char *tmpBuffer = tpb;
212 Standard_Integer i = 0;
213 while(i < Standard_GUID_SIZE) {
214 tmpBuffer[i] = (char ) aGuid[i];
220 if(!CheckGUIDFormat(tmpBuffer)) Standard_RangeError::Raise("Invalid format of GUID");
222 if((tmpBuffer = Standard_GUID_GetValue32(tmpBuffer,my32b)) == NULL)
223 Standard_RangeError::Raise("Invalid format of GUID");
224 if((tmpBuffer = Standard_GUID_GetValue16(tmpBuffer,my16b1)) == NULL)
225 Standard_RangeError::Raise("Invalid format of GUID");
226 if((tmpBuffer = Standard_GUID_GetValue16(tmpBuffer,my16b2)) == NULL)
227 Standard_RangeError::Raise("Invalid format of GUID");
228 if((tmpBuffer = Standard_GUID_GetValue16(tmpBuffer,my16b3)) == NULL)
229 Standard_RangeError::Raise("Invalid format of GUID");
230 tmpBuffer = Standard_GUID_GetValue8(tmpBuffer,my8b1);
231 tmpBuffer = Standard_GUID_GetValue8(tmpBuffer,my8b2);
232 tmpBuffer = Standard_GUID_GetValue8(tmpBuffer,my8b3);
233 tmpBuffer = Standard_GUID_GetValue8(tmpBuffer,my8b4);
234 tmpBuffer = Standard_GUID_GetValue8(tmpBuffer,my8b5);
235 tmpBuffer = Standard_GUID_GetValue8(tmpBuffer,my8b6);
238 Standard_GUID::Standard_GUID(const Standard_Integer a32b,
239 const Standard_ExtCharacter a16b1,
240 const Standard_ExtCharacter a16b2,
241 const Standard_ExtCharacter a16b3,
242 const Standard_Byte a8b1,
243 const Standard_Byte a8b2,
244 const Standard_Byte a8b3,
245 const Standard_Byte a8b4,
246 const Standard_Byte a8b5,
247 const Standard_Byte a8b6)
261 Standard_GUID::Standard_GUID(const Standard_GUID& aGuid)
264 my16b1 = aGuid.my16b1;
265 my16b2 = aGuid.my16b2;
266 my16b3 = aGuid.my16b3;
274 Standard_GUID::Standard_GUID(const Standard_UUID& aWntGuid)
276 my32b = aWntGuid.Data1;
277 my16b1 = aWntGuid.Data2;
278 my16b2 = aWntGuid.Data3;
279 my16b3 = (aWntGuid.Data4[0] << 8) | (aWntGuid.Data4[1]) ;
280 my8b1 = aWntGuid.Data4[2] ;
281 my8b2 = aWntGuid.Data4[3] ;
282 my8b3 = aWntGuid.Data4[4] ;
283 my8b4 = aWntGuid.Data4[5] ;
284 my8b5 = aWntGuid.Data4[6] ;
285 my8b6 = aWntGuid.Data4[7] ;
288 //=======================================================================
289 //function : ToCString
291 //=======================================================================
292 void Standard_GUID::ToCString(const Standard_PCharacter aStrGuid) const
294 sprintf(aStrGuid,"%.8x-%.4x-%.4x-%.4x-%.2x%.2x%.2x%.2x%.2x%.2x",
296 (unsigned short) my16b1,
297 (unsigned short) my16b2,
298 (unsigned short) my16b3,
299 (unsigned char)my8b1,
300 (unsigned char)my8b2,
301 (unsigned char)my8b3,
302 (unsigned char)my8b4,
303 (unsigned char)my8b5,
304 (unsigned char)my8b6);
307 //=======================================================================
308 //function : ToExtString
310 //=======================================================================
311 void Standard_GUID::ToExtString(const Standard_PExtCharacter aStrGuid) const
313 Standard_Character sguid[Standard_GUID_SIZE_ALLOC];
316 for(Standard_Integer i = 0; i < Standard_GUID_SIZE; i++) {
317 aStrGuid[i] = (Standard_ExtCharacter)sguid[i];
320 aStrGuid[Standard_GUID_SIZE] = (Standard_ExtCharacter)0;
323 Standard_UUID Standard_GUID::ToUUID() const
325 Standard_UUID result ;
327 result.Data1 = my32b ;
328 result.Data2 = my16b1 ;
329 result.Data3 = my16b2 ;
330 result.Data4[0] = (unsigned char)(my16b3 >> 8);
331 result.Data4[1] = (char) my16b3;
332 result.Data4[2] = my8b1 ;
333 result.Data4[3] = my8b2 ;
334 result.Data4[4] = my8b3 ;
335 result.Data4[5] = my8b4 ;
336 result.Data4[6] = my8b5 ;
337 result.Data4[7] = my8b6 ;
341 Standard_Boolean Standard_GUID::IsSame(const Standard_GUID& uid) const
343 Standard_Boolean result = Standard_True;
345 if (my32b != uid.my32b) result = Standard_False;
346 else if (my16b1 != uid.my16b1) result = Standard_False;
347 else if (my16b2 != uid.my16b2) result = Standard_False;
348 else if (my16b3 != uid.my16b3) result = Standard_False;
349 else if (my8b1 != uid.my8b1) result = Standard_False;
350 else if (my8b2 != uid.my8b2) result = Standard_False;
351 else if (my8b3 != uid.my8b3) result = Standard_False;
352 else if (my8b4 != uid.my8b4) result = Standard_False;
353 else if (my8b5 != uid.my8b5) result = Standard_False;
354 else if (my8b6 != uid.my8b6) result = Standard_False;
359 Standard_Boolean Standard_GUID::IsNotSame(const Standard_GUID& uid) const
364 void Standard_GUID::Assign(const Standard_GUID& uid)
378 void Standard_GUID::ShallowDump(Standard_OStream& aStream) const
380 Standard_Character sguid[Standard_GUID_SIZE_ALLOC];
385 Standard_Integer Standard_GUID::HashCode(const Standard_GUID& aGuid,const Standard_Integer Upper)
387 return aGuid.Hash(Upper);
390 Standard_Integer Standard_GUID::Hash(const Standard_Integer Upper) const
393 Standard_RangeError::
394 Raise("Standard_GUID::Hash: Try to apply HashCode method with negative or null argument.");
397 char sguid[Standard_GUID_SIZE_ALLOC];
400 return ::HashCode(sguid,Upper);
403 Standard_Boolean Standard_GUID::IsEqual(const Standard_GUID& aGuid1,const Standard_GUID& aGuid2)
405 return (aGuid1 == aGuid2);