⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chxuuid.cpp

📁 linux下的一款播放器
💻 CPP
📖 第 1 页 / 共 4 页
字号:
    if (pEnd == (pCur + 4) && *pEnd == '-') time_hi_and_version = curVal;    else return count;    pCur += 4; ++count;    curVal = strtoul(pCur, &pEnd, 16);    if (pEnd == (pCur + 4) && *pEnd == '-')    {        clock_seq_hi_and_reserved = (curVal & 0xff00) >> 8;        clock_seq_low = curVal & 0xff;    }    else return count;    pCur += 4; count += 2;    curVal = strtoul(pCur, &pEnd, 16);    if (pEnd == (pCur + 6) && *(pEnd+strspn(pEnd, " \t")) == 0)    {        for (int i = 5; i >= 0; ++i, curVal = curVal >> 8)        {            node[i] = curVal & 0xff;        }    }    else return count;    pCur += 4; count += 6;#else    count = sscanf(uuid_string, "%8lx-%4x-%4x-%2x%2x-%2x%2x%2x%2x%2x%2x",                   &time_low,                   &time_mid,                   &time_hi_and_version,                   &clock_seq_hi_and_reserved,                   &clock_seq_low,                   &node[0], &node[1], &node[2], &node[3], &node[4], &node[5]);#endif    return count;}HX_RESULT CHXuuid::HXUuidFromString(const char* uuid_string, uuid_tt* uuid){    HX_RESULT theErr = HXR_OK;    uuid_tt             uuid_new;       /* used for sscanf for new uuid's */    uuid_p_t            uuid_ptr=0;     /* pointer to correct uuid (old/new) */    int                 i;    /*     * If a NULL pointer or empty string, give the nil UUID.     */    if (uuid_string == NULL || *uuid_string == '\0')    {	memcpy (uuid, &uuid_g_nil_uuid, sizeof *uuid); /* Flawfinder: ignore */	return theErr;    }    /*     * check to see that the string length is right at least     */    if (strlen ((char *) uuid_string) != UUID_C_UUID_STRING_MAX - 1)    {        theErr = HXR_FAILED;        return theErr;    }    /*     * check for a new uuid     */    if (uuid_string[8] == '-')    {        long    time_low;        int     time_mid;        int     time_hi_and_version;        int     clock_seq_hi_and_reserved;        int     clock_seq_low;        int     node[6];	// VC1.5's runtime library(lddcew.lib) doesn't have sscanf()!!#if defined(_WIN16)	i = wsscanf((char *) uuid_string, "%8lx-%4x-%4x-%2x%2x-%2x%2x%2x%2x%2x%2x",	    (long FAR *)&time_low,	    (int FAR *)&time_mid,	    (int FAR *)&time_hi_and_version,	    (int FAR *)&clock_seq_hi_and_reserved,	    (int FAR *)&clock_seq_low,	    (int FAR *)&node[0], (int FAR *)&node[1], (int FAR *)&node[2], 	    (int FAR *)&node[3], (int FAR *)&node[4], (int FAR *)&node[5]);#else        i = ParseIIDString(            uuid_string,            time_low,            time_mid,            time_hi_and_version,            clock_seq_hi_and_reserved,            clock_seq_low,            node);#ifdef Commented_out_code_20030421_114057        i = sscanf((char *) uuid_string, "%8lx-%4x-%4x-%2x%2x-%2x%2x%2x%2x%2x%2x",            &time_low,            &time_mid,            &time_hi_and_version,            &clock_seq_hi_and_reserved,            &clock_seq_low,            &node[0], &node[1], &node[2], &node[3], &node[4], &node[5]);#endif /* Commented_out_code_20030421_114057 */#endif        /*         * check that sscanf worked         */        if (i != UUID_ELEMENTS_NUM)        {            theErr = HXR_FAILED;            return theErr;        }        /*         * note that we're going through this agony because scanf is defined to         * know only to scan into "int"s or "long"s.         */        uuid_new.time_low                   = time_low;        uuid_new.time_mid                   = time_mid;        uuid_new.time_hi_and_version        = time_hi_and_version;        uuid_new.clock_seq_hi_and_reserved  = clock_seq_hi_and_reserved;        uuid_new.clock_seq_low              = clock_seq_low;        uuid_new.node[0]                    = node[0];        uuid_new.node[1]                    = node[1];        uuid_new.node[2]                    = node[2];        uuid_new.node[3]                    = node[3];        uuid_new.node[4]                    = node[4];        uuid_new.node[5]                    = node[5];        /*         * point to the correct uuid         */        uuid_ptr = &uuid_new;    }    /*     * copy the uuid to user     */    memcpy(uuid, uuid_ptr, sizeof (uuid_tt)); /* Flawfinder: ignore */    return theErr;}/***++****  ROUTINE NAME:       uuid_from_string****--**/HX_RESULT CHXuuid::HXPack(UINT8* pBuffer, uuid_p_t uuid){    uuid_p_t uuidPacket = (uuid_p_t) pBuffer;    *uuidPacket = *uuid;    uuidPacket->time_low = DwToNet(uuid->time_low);    uuidPacket->time_mid = WToNet(uuid->time_mid);    uuidPacket->time_hi_and_version = WToNet(uuid->time_hi_and_version);    return HXR_OK;}/***++****  ROUTINE NAME:       uuid_from_string****--**/HX_RESULT CHXuuid::HXUnpack(uuid_p_t uuid, UINT8* pBuffer){    uuid_p_t uuidPacket = (uuid_p_t) pBuffer;    *uuid = *uuidPacket;    uuid->time_low = DwToHost(uuidPacket->time_low);    uuid->time_mid = WToHost(uuidPacket->time_mid);    uuid->time_hi_and_version = WToHost(uuidPacket->time_hi_and_version);    return HXR_OK;}/***++****  ROUTINE NAME:       uuid_equal****--**/BOOL CHXuuid::HXIsEqual(uuid_p_t uuid1, uuid_p_t uuid2){    /*     * Note: This used to be a memcmp(), but changed to a field-by-field compare     * because of portability problems with alignment and garbage in a UUID.     */    if ((uuid1->time_low == uuid2->time_low) && 	(uuid1->time_mid == uuid2->time_mid) &&	(uuid1->time_hi_and_version == uuid2->time_hi_and_version) && 	(uuid1->clock_seq_hi_and_reserved == uuid2->clock_seq_hi_and_reserved) &&	(uuid1->clock_seq_low == uuid2->clock_seq_low) &&	(memcmp(uuid1->node, uuid2->node, 6) == 0))    {	return ( TRUE );    }    else    {        return (FALSE);    }}/***************************************************************************** * *  LOCAL MATH PROCEDURES - math procedures used internally by the UUID module * ****************************************************************************//*** T I M E _ C M P**** Compares two UUID times (64-bit UTC values)**/uuid_compval_t CHXuuid::TimeCmp(uuid_ttime_p_t time1, uuid_ttime_p_t time2){    /*     * first check the hi parts     */    if (time1->hi < time2->hi) return (uuid_e_less_than);    if (time1->hi > time2->hi) return (uuid_e_greater_than);    /*     * hi parts are equal, check the lo parts     */    if (time1->lo < time2->lo) return (uuid_e_less_than);    if (time1->lo > time2->lo) return (uuid_e_greater_than);    return (uuid_e_equal_to);}/***  UnsignedExtendedMultiply****  Functional Description:**        32-bit unsigned quantity * 32-bit unsigned quantity**        producing 64-bit unsigned result. This routine assumes**        long's contain at least 32 bits. It makes no assumptions**        about byte orderings.****  Inputs:****        u, v       Are the numbers to be multiplied passed by value****  Outputs:****        prodPtr    is a pointer to the 64-bit result****  Note:**        This algorithm is taken from: "The Art of Computer**        Programming", by Donald E. Knuth. Vol 2. Section 4.3.1**        Pages: 253-255.**--**/void CHXuuid::UnsignedExtendedMultiply(ULONG32 u,ULONG32 v, unsigned64_t* prodPtr){    /*     * following the notation in Knuth, Vol. 2     */    ULONG32      uuid1, uuid2, v1, v2, temp;    uuid1 = u >> 16;    uuid2 = u & 0xffff;    v1 = v >> 16;    v2 = v & 0xffff;    temp = uuid2 * v2;    prodPtr->lo = temp & 0xffff;    temp = uuid1 * v2 + (temp >> 16);    prodPtr->hi = temp >> 16;    temp = uuid2 * v1 + (temp & 0xffff);    prodPtr->lo += (temp & 0xffff) << 16;    prodPtr->hi += uuid1 * v1 + (temp >> 16);}UINT16 CHXuuid::TrueRandom(){    ULONG32 nRand = m_pRand->GetRandomNumber();     return (UINT16)(HI_WORD(nRand) ^ (nRand & RAND_MASK));}/***************************************************************************** * *  LOCAL PROCEDURES - procedures used staticly by the UUID module * ****************************************************************************//*** N E W _ C L O C K _ S E Q**** Ensure *clkseq is up-to-date**** Note: clock_seq is architected to be 14-bits (unsigned) but**       I've put it in here as 16-bits since there isn't a**       14-bit unsigned integer type (yet)**/void CHXuuid::NewClockSeq(UINT16& clkseq){    /*     * A clkseq value of 0 indicates that it hasn't been initialized.     */    if (clkseq == 0)    {        /*         * with a volatile clock, we always init to a random number         */        clkseq = (UINT16) m_pRand->GetRandomNumber();    }    CLOCK_SEQ_BUMP (&clkseq);    if (clkseq == 0)    {        clkseq = clkseq + 1;    }}/* *  Define constant designation difference in Unix and DTSS base times: *  DTSS UTC base time is October 15, 1582. *  Unix base time is January 1, 1970. */#define uuid_c_os_base_time_diff_lo     0x13814000#define uuid_c_os_base_time_diff_hi     0x01B21DD2/* * U U I D _ _ G E T _ O S _ T I M E * * Get OS time - contains platform-specific code. */ void CHXuuid::GetOSTime(uuid_ttime_t * uuid_ttime){    HXTime		tv;    unsigned64_t        utc,                        usecs,                        os_basetime_diff;    /*     * Fill out the HXTime struct with the current time     */    gettimeofday(&tv, NULL);    /*     * Multiply the number of seconds by the number clunks      */    UnsignedExtendedMultiply ((long) tv.tv_sec, UUID_C_100NS_PER_SEC, &utc);    /*     * Multiply the number of milliseconds by the number clunks      * and add to the seconds     */    UnsignedExtendedMultiply ((long) tv.tv_usec / 1000, UUID_C_100NS_PER_MSEC, &usecs);    UADD_UVLW_2_UVLW (&usecs, &utc, &utc);    /*     * Offset between DTSS formatted times and Unix formatted times.     */    os_basetime_diff.lo = uuid_c_os_base_time_diff_lo;    os_basetime_diff.hi = uuid_c_os_base_time_diff_hi;    UADD_UVLW_2_UVLW (&utc, &os_basetime_diff, uuid_ttime);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -