diff options
Diffstat (limited to '')
-rw-r--r-- | lib/util/util_str_hex.c | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/lib/util/util_str_hex.c b/lib/util/util_str_hex.c new file mode 100644 index 0000000..553fb30 --- /dev/null +++ b/lib/util/util_str_hex.c @@ -0,0 +1,69 @@ +#include "replace.h" +#include "util_str_hex.h" +#include "lib/util/data_blob.h" +#include "librpc/gen_ndr/misc.h" + +static bool hex_uint16(const char *in, uint16_t *out) +{ + uint8_t hi=0, lo=0; + bool ok = hex_byte(in, &hi) && hex_byte(in+2, &lo); + *out = (((uint16_t)hi)<<8) + lo; + return ok; +} + +bool hex_uint32(const char *in, uint32_t *out) +{ + uint16_t hi=0, lo=0; + bool ok = hex_uint16(in, &hi) && hex_uint16(in+4, &lo); + *out = (((uint32_t)hi)<<16) + lo; + return ok; +} + +bool parse_guid_string(const char *s, struct GUID *guid) +{ + bool ok; + int i; + /* "e12b56b6-0a95-11d1-adbb-00c04fd8d5cd" + | | | | | + | | | | \ node[6] + | | | \_____ clock_seq[2] + | | \__________ time_hi_and_version + | \_______________ time_mid + \_____________________ time_low + */ + + ok = hex_uint32(s, &guid->time_low); + if (!ok || (s[8] != '-')) { + return false; + } + s += 9; + + ok = hex_uint16(s, &guid->time_mid); + if (!ok || (s[4] != '-')) { + return false; + } + s += 5; + + ok = hex_uint16(s, &guid->time_hi_and_version); + if (!ok || (s[4] != '-')) { + return false; + } + s += 5; + + ok = hex_byte(s, &guid->clock_seq[0]) && + hex_byte(s+2, &guid->clock_seq[1]); + if (!ok || (s[4] != '-')) { + return false; + } + s += 5; + + for (i = 0; i < 6; i++) { + ok = hex_byte(s, &guid->node[i]); + if (!ok) { + return false; + } + s += 2; + } + + return true; +} |