cdbext: Generate values for QDate, QTime, QDateTime

... in the watchdata via flags.

Change-Id: I4664807713cc7747216de5abaabf30011921ab4c
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
This commit is contained in:
David Schulz
2013-03-19 01:42:40 -07:00
parent c172a12821
commit bee3cc3d63
2 changed files with 26 additions and 48 deletions

View File

@@ -364,7 +364,10 @@ enum DumpEncoding // WatchData encoding of GDBMI values
DumpEncodingHex_Ucs4_LittleEndian_WithQuotes = 3,
DumpEncodingBase64_Utf16 = 4,
DumpEncodingHex_Latin1_WithQuotes = 6,
DumpEncodingHex_Utf8_LittleEndian_WithQuotes = 9
DumpEncodingHex_Utf8_LittleEndian_WithQuotes = 9,
DumpEncodingJulianDate = 14,
DumpEncodingMillisecondsSinceMidnight = 15,
DumpEncodingJulianDateAndMillisecondsSinceMidnight = 16
};
/* Recode arrays/pointers of char*, wchar_t according to users
@@ -1110,7 +1113,20 @@ int SymbolGroupNode::dumpNode(std::ostream &str,
// Shall it be recoded?
int encoding = 0;
if (dumpParameters.recode(t, aFullIName, ctx, addr, &value, &encoding)) {
switch (knownType(t, 0)) {
case KT_QDate:
encoding = DumpEncodingJulianDate;
break;
case KT_QTime:
encoding = DumpEncodingMillisecondsSinceMidnight;
break;
case KT_QDateTime:
encoding = DumpEncodingJulianDateAndMillisecondsSinceMidnight;
break;
}
if (encoding) {
str << ",valueencoded=\"" << encoding << "\",value=\"" << gdbmiWStringFormat(value) <<'"';
} else if (dumpParameters.recode(t, aFullIName, ctx, addr, &value, &encoding)) {
str << ",valueencoded=\"" << encoding
<< "\",value=\"" << gdbmiWStringFormat(value) <<'"';
} else { // As is: ASCII or base64?

View File

@@ -972,31 +972,6 @@ static inline void getDateFromJulianDay(unsigned julianDay, int *year, int *mont
*day = d;
}
// Convert and format Julian Date as used in QDate
static inline void formatJulianDate(std::wostream &str, unsigned julianDate)
{
int y, m, d;
getDateFromJulianDay(julianDate, &y, &m, &d);
str << d << '.' << m << '.' << y;
}
// Format time in milliseconds as "hh:dd:ss:mmm"
static inline void formatMilliSeconds(std::wostream &str, int milliSecs)
{
const int hourFactor = 1000 * 3600;
const int hours = milliSecs / hourFactor;
milliSecs = milliSecs % hourFactor;
const int minFactor = 1000 * 60;
const int minutes = milliSecs / minFactor;
milliSecs = milliSecs % minFactor;
const int secs = milliSecs / 1000;
milliSecs = milliSecs % 1000;
str.fill('0');
str << std::setw(2) << hours << ':' << std::setw(2)
<< minutes << ':' << std::setw(2) << secs
<< '.' << std::setw(3) << milliSecs;
}
const char *stdStringTypeC = "std::basic_string<char,std::char_traits<char>,std::allocator<char> >";
const char *stdWStringTypeC = "std::basic_string<unsigned short,std::char_traits<unsigned short>,std::allocator<unsigned short> >";
// Compiler option: -Zc:wchar_t-:
@@ -2042,21 +2017,13 @@ static inline bool dumpQFlags(const SymbolGroupValue &v, std::wostream &str)
return false;
}
static bool dumpJulianDate(int julianDay, std::wostream &str)
{
if (julianDay < 0)
return false;
else if (!julianDay)
str << L"<null>";
else
formatJulianDate(str, julianDay);
return true;
}
static bool dumpQDate(const SymbolGroupValue &v, std::wostream &str)
{
if (const SymbolGroupValue julianDayV = v["jd"])
return dumpJulianDate(julianDayV.intValue(), str);
if (const SymbolGroupValue julianDayV = v["jd"]) {
if (julianDayV.intValue() > 0)
str << julianDayV.intValue();
return true;
}
return false;
}
@@ -2064,11 +2031,9 @@ static bool dumpQTime(const SymbolGroupValue &v, std::wostream &str)
{
if (const SymbolGroupValue milliSecsV = v["mds"]) {
const int milliSecs = milliSecsV.intValue();
if (milliSecs >= 0) {
formatMilliSeconds(str, milliSecs);
str << milliSecs;
return true;
}
}
return false;
}
@@ -2090,14 +2055,11 @@ static bool dumpQDateTime(const SymbolGroupValue &v, std::wostream &str)
str << L"<null>";
return true;
}
if (!dumpJulianDate(date, str))
return false;
const ULONG64 timeAddr = dateAddr + (qtVersion < 5 ? SymbolGroupValue::intSize() : 8);
const int time =
SymbolGroupValue::readIntValue(v.context().dataspaces,
timeAddr, SymbolGroupValue::intSize(), 0);
str << L' ';
formatMilliSeconds(str, time);
str << date << '/' << time;
return true;
}