TDateTime::TDateTime(const char* src, TDateTimeFlag flag) { unsigned int year = 0; unsigned int month = 0; unsigned int day = 0; unsigned int hour = 0; unsigned int min = 0; unsigned int sec = 0; int result=0; Val = 0; if(flag == DATE_POS) { result=DecodeDateString(src,year,month,day); if(result == 0 ) { Val = INVALID_DATE_VALUE; } else { Val = ComposeDate(year, month, day); } } else if(flag == TIME_POS ) { result=DecodeTimeString(src,hour,min,sec); if(result == 0 ) { Val = INVALID_DATE_VALUE; } else { Val = ComposeTime(hour, min, sec); } } else if(flag == DATETIME_POS ) { result=DecodeDateTimeString(src,year,month,day,hour,min,sec); if(result == 0 ) { Val = INVALID_DATE_VALUE; } else { Val = ComposeDate(year, month, day); Val += ComposeTime(hour, min, sec); } } }
int TDateTime::DecodeDateTimeString(const char *src, unsigned int &year, unsigned int &month, unsigned int &day, unsigned int &hour, unsigned int &min, unsigned int &sec) { if(strlen(src) < 14 ) { return 0; } int offset=DecodeDateString(src,year,month,day); if(offset == 0 ) { return 0; } return DecodeTimeString(src+offset,hour,min,sec); }
/* Returns an error if there was something wrong with the optional item or it couldn't be handled. */ static QCBORError GetNext_TaggedItem(QCBORDecodeContext *me, QCBORItem *pDecodedItem, QCBORTagListOut *pTags) { // Stack usage: int/ptr: 3 -- 24 QCBORError nReturn; uint64_t uTagBits = 0; if(pTags) { pTags->uNumUsed = 0; } for(;;) { nReturn = GetNext_FullItem(me, pDecodedItem); if(nReturn) { goto Done; // Error out of the loop } if(pDecodedItem->uDataType != QCBOR_TYPE_OPTTAG) { // Successful exit from loop; maybe got some tags, maybe not pDecodedItem->uTagBits = uTagBits; break; } uint8_t uTagBitIndex; // Tag was mapped, tag was not mapped, error with tag list switch(TagMapper_Lookup(me->pCallerConfiguredTagList, pDecodedItem->val.uTagV, &uTagBitIndex)) { case QCBOR_SUCCESS: // Successfully mapped the tag uTagBits |= 0x01ULL << uTagBitIndex; break; case QCBOR_ERR_BAD_OPT_TAG: // Tag is not recognized. Do nothing break; default: // Error Condition goto Done; } if(pTags) { // Caller wants all tags recorded in the provided buffer if(pTags->uNumUsed >= pTags->uNumAllocated) { nReturn = QCBOR_ERR_TOO_MANY_TAGS; goto Done; } pTags->puTags[pTags->uNumUsed] = pDecodedItem->val.uTagV; pTags->uNumUsed++; } } switch(pDecodedItem->uTagBits & TAG_MAPPER_FIRST_FOUR) { case 0: // No tags at all or none we know about. Nothing to do. // This is part of the pass-through path of this function // that will mostly be taken when decoding any item. break; case QCBOR_TAGFLAG_DATE_STRING: nReturn = DecodeDateString(pDecodedItem); break; case QCBOR_TAGFLAG_DATE_EPOCH: nReturn = DecodeDateEpoch(pDecodedItem); break; case QCBOR_TAGFLAG_POS_BIGNUM: case QCBOR_TAGFLAG_NEG_BIGNUM: nReturn = DecodeBigNum(pDecodedItem); break; default: // Encountering some mixed up CBOR like something that // is tagged as both a string and integer date. nReturn = QCBOR_ERR_BAD_OPT_TAG; } Done: return nReturn; }