129 lines
3.8 KiB
C++
129 lines
3.8 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// csformat - Shared output format utility between singularity and debugger extension
|
|
//
|
|
// Copyright Microsoft Corporation. All rights reserved.
|
|
//
|
|
|
|
|
|
void FormatCSOutput(void * context,
|
|
char * format,
|
|
char * buffer,
|
|
int bufferLen,
|
|
int (*pfprintField)(void * context, char *pszOut, int bufferSize, int aln, int wid, char fmt, int argIdx),
|
|
char * (*pfStringField)(void * context, int argIdx))
|
|
{
|
|
char * text = format;
|
|
char * pmsg = buffer;
|
|
char * ptxt = text;
|
|
char * endBuffer = buffer + bufferLen - 1;
|
|
while (*ptxt != '\0') {
|
|
|
|
if (*ptxt == '{') {
|
|
char * pbeg = ptxt;
|
|
bool bad = false;
|
|
ptxt++;
|
|
|
|
int ndx = 0;
|
|
int aln = 0;
|
|
int wid = 0;
|
|
char fmt = 'd';
|
|
|
|
if (*ptxt == '{') {
|
|
*pmsg++ = *ptxt++;
|
|
}
|
|
else if (*ptxt >= '0' && *ptxt <= '9') {
|
|
|
|
// {index,alignment:type width}
|
|
// Get Index
|
|
while (*ptxt >= '0' && *ptxt <= '9') {
|
|
ndx = ndx * 10 + (*ptxt++ - '0');
|
|
}
|
|
|
|
// Get Alignment
|
|
if (*ptxt == ',') {
|
|
ptxt++;
|
|
while (*ptxt >= '0' && *ptxt <= '9') {
|
|
aln = aln * 10 + (*ptxt++ - '0');
|
|
}
|
|
}
|
|
|
|
// Get FormatString
|
|
if (*ptxt == ':') {
|
|
ptxt++;
|
|
if (*ptxt >= 'a' && *ptxt <= 'z') {
|
|
fmt = *ptxt++;
|
|
}
|
|
else if (*ptxt >= 'A' && *ptxt <= 'Z') {
|
|
fmt = *ptxt++ - 'A' + 'a';
|
|
}
|
|
while (*ptxt >= '0' && *ptxt <= '9') {
|
|
wid = wid * 10 + (*ptxt++ - '0');
|
|
}
|
|
}
|
|
|
|
// indirect formatting
|
|
if (*ptxt == '*') {
|
|
ptxt++;
|
|
|
|
if (pfStringField != NULL) {
|
|
|
|
text = pfStringField(context, ndx);
|
|
if (text != NULL) {
|
|
|
|
ptxt = text;
|
|
continue;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
// Get closing brace.
|
|
if (*ptxt == '}') {
|
|
ptxt++;
|
|
}
|
|
else {
|
|
bad = true;
|
|
}
|
|
|
|
int printLength = pfprintField(context,
|
|
pmsg,
|
|
(int)(endBuffer - pmsg),
|
|
aln,
|
|
wid,
|
|
fmt,
|
|
ndx);
|
|
|
|
if (printLength >= 0) {
|
|
|
|
pmsg += printLength;
|
|
|
|
if (pmsg > endBuffer) {
|
|
pmsg = endBuffer;
|
|
}
|
|
}
|
|
// If the format was bad, then copy it.
|
|
if (bad) {
|
|
|
|
while (pbeg < ptxt) {
|
|
*pmsg++ = *pbeg++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else if (*ptxt == '}') {
|
|
ptxt++;
|
|
*pmsg++ = *ptxt++;
|
|
}
|
|
else if (*ptxt == '\n') {
|
|
ptxt++;
|
|
}
|
|
else {
|
|
*pmsg++ = *ptxt++;
|
|
}
|
|
}
|
|
*pmsg++ = '\0';
|
|
}
|
|
|
|
|