diff options
Diffstat (limited to '')
-rw-r--r-- | src/uuid.cpp | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/src/uuid.cpp b/src/uuid.cpp index b8de9e1..c064d78 100644 --- a/src/uuid.cpp +++ b/src/uuid.cpp | |||
@@ -6,16 +6,45 @@ | |||
6 | */ | 6 | */ |
7 | 7 | ||
8 | #include "bu/uuid.h" | 8 | #include "bu/uuid.h" |
9 | #include "bu/file.h" | ||
10 | #include "bu/formatter.h" | ||
11 | #include "bu/membuf.h" | ||
12 | #include <string.h> | ||
9 | 13 | ||
10 | Bu::Uuid::Uuid() | 14 | Bu::Uuid::Uuid() |
11 | { | 15 | { |
12 | clear(); | 16 | clear(); |
13 | } | 17 | } |
14 | 18 | ||
19 | Bu::Uuid::Uuid( const Uuid &src ) | ||
20 | { | ||
21 | memcpy( data, src.data, 16 ); | ||
22 | } | ||
23 | |||
15 | Bu::Uuid::~Uuid() | 24 | Bu::Uuid::~Uuid() |
16 | { | 25 | { |
17 | } | 26 | } |
18 | 27 | ||
28 | Bu::FString Bu::Uuid::toRawString() | ||
29 | { | ||
30 | return Bu::FString( (char *)data, 16 ); | ||
31 | } | ||
32 | |||
33 | Bu::FString Bu::Uuid::toString() | ||
34 | { | ||
35 | Bu::MemBuf mb; | ||
36 | Bu::Formatter f( mb ); | ||
37 | |||
38 | for( int j = 0; j < 16; j++ ) | ||
39 | { | ||
40 | if( j == 4 || j == 6 || j == 8 || j == 10 ) | ||
41 | f << '-'; | ||
42 | f << Bu::Fmt::hex(2).caps(false) << (unsigned int)data[j]; | ||
43 | } | ||
44 | |||
45 | return mb.getString(); | ||
46 | } | ||
47 | |||
19 | #define msb( i ) (1<<(7-i)) | 48 | #define msb( i ) (1<<(7-i)) |
20 | 49 | ||
21 | void Bu::Uuid::clear() | 50 | void Bu::Uuid::clear() |
@@ -23,3 +52,23 @@ void Bu::Uuid::clear() | |||
23 | data[7] = msb(0); | 52 | data[7] = msb(0); |
24 | } | 53 | } |
25 | 54 | ||
55 | Bu::Uuid Bu::Uuid::gen() | ||
56 | { | ||
57 | Bu::File fIn( "/proc/sys/kernel/random/uuid", Bu::File::Read ); | ||
58 | char dat[36]; | ||
59 | fIn.read( dat, 36 ); | ||
60 | int iNibble = 0; | ||
61 | Uuid id; | ||
62 | memset( id.data, 0, 16 ); | ||
63 | for( int j = 0; j < 36; j++ ) | ||
64 | { | ||
65 | if( dat[j] == '-' ) | ||
66 | continue; | ||
67 | unsigned char c = (dat[j]>='0'&&dat[j]<='9')?(dat[j]-'0'):(dat[j]-'a'+10); | ||
68 | id.data[iNibble/2] |= (iNibble%2==0)?(c<<4):(c); | ||
69 | iNibble++; | ||
70 | } | ||
71 | |||
72 | return id; | ||
73 | } | ||
74 | |||