singrdk/base/Kernel/Native/csformat.inc

129 lines
3.8 KiB
PHP
Raw Permalink Normal View History

2008-11-17 18:29:00 -05:00
/////////////////////////////////////////////////////////////////////////////
//
// 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';
}