Mercurial > foo_out_sdl
diff foosdk/sdk/pfc/guid.cpp @ 1:20d02a178406 default tip
*: check in everything else
yay
| author | Paper <paper@tflc.us> |
|---|---|
| date | Mon, 05 Jan 2026 02:15:46 -0500 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/foosdk/sdk/pfc/guid.cpp Mon Jan 05 02:15:46 2026 -0500 @@ -0,0 +1,208 @@ +#include "pfc-lite.h" +#include "guid.h" +#include "debug.h" // pfc::crash() +#include "string_base.h" + +#ifdef _WIN32 +#include <Objbase.h> +#else +#include "nix-objects.h" +#endif + +/* +6B29FC40-CA47-1067-B31D-00DD010662DA +. +typedef struct _GUID { // size is 16 + DWORD Data1; + WORD Data2; + WORD Data3; + BYTE Data4[8]; +} GUID; + +// {B296CF59-4D51-466f-8E0B-E57D3F91D908} +static const GUID <<name>> = +{ 0xb296cf59, 0x4d51, 0x466f, { 0x8e, 0xb, 0xe5, 0x7d, 0x3f, 0x91, 0xd9, 0x8 } }; + +*/ +namespace { + class _GUID_from_text + { + unsigned read_hex(char c); + unsigned read_byte(const char * ptr); + unsigned read_word(const char * ptr); + unsigned read_dword(const char * ptr); + void read_bytes(unsigned char * out,unsigned num,const char * ptr); + + public: + GUID m_val = pfc::guid_null; + _GUID_from_text(const char * text); + }; + + unsigned _GUID_from_text::read_hex(char c) + { + if (c>='0' && c<='9') return (unsigned)c - '0'; + else if (c>='a' && c<='f') return 0xa + (unsigned)c - 'a'; + else if (c>='A' && c<='F') return 0xa + (unsigned)c - 'A'; + else return 0; + } + + unsigned _GUID_from_text::read_byte(const char * ptr) + { + return (read_hex(ptr[0])<<4) | read_hex(ptr[1]); + } + unsigned _GUID_from_text::read_word(const char * ptr) + { + return (read_byte(ptr)<<8) | read_byte(ptr+2); + } + + unsigned _GUID_from_text::read_dword(const char * ptr) + { + return (read_word(ptr)<<16) | read_word(ptr+4); + } + + void _GUID_from_text::read_bytes(uint8_t * out,unsigned num,const char * ptr) + { + for(;num;num--) + { + *out = read_byte(ptr); + out++;ptr+=2; + } + } + + + _GUID_from_text::_GUID_from_text(const char * text) + { + if (*text=='{') text++; + const char * max; + + { + const char * t = strchr(text,'}'); + if (t) max = t; + else max = text + strlen(text); + } + + + bool OK = false; + + do { + if (text+8>max) break; + m_val.Data1 = read_dword(text); + text += 8; + while(*text=='-') text++; + if (text+4>max) break; + m_val.Data2 = read_word(text); + text += 4; + while(*text=='-') text++; + if (text+4>max) break; + m_val.Data3 = read_word(text); + text += 4; + while(*text=='-') text++; + if (text+4>max) break; + read_bytes(m_val.Data4,2,text); + text += 4; + while(*text=='-') text++; + if (text+12>max) break; + read_bytes(m_val.Data4+2,6,text); + OK = true; + } while(false); + + if (!OK) { + m_val= pfc::guid_null; + } + } +} + +namespace pfc { + +GUID GUID_from_text(const char * text) { + return _GUID_from_text( text ).m_val; +} + +static inline char print_hex_digit(unsigned val) +{ + static constexpr char table[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; + PFC_ASSERT((val & ~0xF) == 0); + return table[val]; +} + +static void print_hex(unsigned val,char * &out,unsigned bytes) +{ + unsigned n; + for(n=0;n<bytes;n++) + { + unsigned char c = (unsigned char)((val >> ((bytes - 1 - n) << 3)) & 0xFF); + *(out++) = print_hex_digit( c >> 4 ); + *(out++) = print_hex_digit( c & 0xF ); + } + *out = 0; +} + + +pfc::string8 print_guid(const GUID & p_guid) +{ + char data[64]; + char * out = data; + print_hex(p_guid.Data1,out,4); + *(out++) = '-'; + print_hex(p_guid.Data2,out,2); + *(out++) = '-'; + print_hex(p_guid.Data3,out,2); + *(out++) = '-'; + print_hex(p_guid.Data4[0],out,1); + print_hex(p_guid.Data4[1],out,1); + *(out++) = '-'; + print_hex(p_guid.Data4[2],out,1); + print_hex(p_guid.Data4[3],out,1); + print_hex(p_guid.Data4[4],out,1); + print_hex(p_guid.Data4[5],out,1); + print_hex(p_guid.Data4[6],out,1); + print_hex(p_guid.Data4[7],out,1); + *out = 0; + return data; +} + + +void print_hex_raw(const void * buffer,unsigned bytes,char * p_out) +{ + char * out = p_out; + const unsigned char * in = (const unsigned char *) buffer; + unsigned n; + for(n=0;n<bytes;n++) + print_hex(in[n],out,1); +} + + GUID createGUID() { + GUID out; +#ifdef _WIN32 + if (FAILED(CoCreateGuid( & out ) ) ) crash(); +#else + pfc::nixGetRandomData( &out, sizeof(out) ); +#endif + return out; + } + +} + + + +namespace pfc { + pfc::string8 format_guid_cpp(const GUID & guid) { + pfc::string8 s; + s << "{0x" << pfc::format_hex(guid.Data1,8) << ", 0x" << pfc::format_hex(guid.Data2, 4) << ", 0x" << pfc::format_hex(guid.Data3,4) << ", {0x" << pfc::format_hex(guid.Data4[0],2); + for(int n = 1; n < 8; ++n) { + s << ", 0x" << pfc::format_hex(guid.Data4[n],2); + } + s << "}}"; + return s; + } + + uint64_t halveGUID(const GUID & id) { + static_assert(sizeof(id) == 2 * sizeof(uint64_t), "sanity" ); + union { + GUID g; + uint64_t u[2]; + } u; + u.g = id; + return u.u[0] ^ u.u[1]; + } +}
