Example Callback Functions
These are sample callback functions:
/* callbacks for display of SAX parser events */
XRCS_CallbackStatus cb_startDoc_Display(void *pContext)
{
PCALLBACK_VALUES pCbValues = (PCALLBACK_VALUES) pContext;
indentNewLine(pCbValues);
jdeFprintf(pCbValues->fp, _J("START DOCUMENT"));
return( XRCS_CB_CONTINUE);
}
XRCS_CallbackStatus cb_endDoc_Display(void *pContext)
{
PCALLBACK_VALUES pCbValues = (PCALLBACK_VALUES) pContext;
indentNewLine(pCbValues);
jdeFprintf(pCbValues->fp, _J("END DOCUMENT"));
indentNewLine(pCbValues);
return( XRCS_CB_CONTINUE);
}
XRCS_CallbackStatus cb_startElement_Display(void *pContext,
const JCHAR *szUri,
const JCHAR *szLocalname,
const JCHAR *szQname,
unsigned int nNumAttrs,
const XRCS_ATTR_INFO *pAttributes)
{
PCALLBACK_VALUES pCbValues = (PCALLBACK_VALUES) pContext;
unsigned int nAttrNum;
const XRCS_ATTR_INFO * thisAttr = NULL;
pCbValues->nIndentLevel++;
/* display element name */
indentNewLine(pCbValues);
jdeFprintf(pCbValues->fp, _J("ELEMENT: "));
if (jdeStrlen( szLocalname) != 0)
{
jdeFprintf(pCbValues->fp, _J("<%ls"), szLocalname);
}
else
{
jdeFprintf(pCbValues->fp, _J("<%ls"), szQname);
}
/* display attributes */
if (nNumAttrs > 0U)
{
for (nAttrNum = 0U; nAttrNum < nNumAttrs; nAttrNum++)
{
thisAttr = &pAttributes[nAttrNum];
/* display attrribute name */
indentNewLine(pCbValues);
jdeFprintf(pCbValues->fp, _J(" ATTR: "));
if (jdeStrlen( thisAttr->szAttrLocalname) != 0)
{
jdeFprintf(pCbValues->fp, _J("%ls"),
thisAttr->szAttrLocalname);
}
else
{
jdeFprintf(pCbValues->fp, _J("%ls"), thisAttr->szAttrQname);
}
/* display attribute value */
jdeFprintf(pCbValues->fp, _J(" \""));
jdeFprintf(pCbValues->fp, _J("%ls"), thisAttr->szAttrValue);
jdeFprintf(pCbValues->fp, _J("\""));
}
indentNewLine(pCbValues);
}
/* display close of element name */
jdeFprintf(pCbValues->fp, _J(">"));
return( XRCS_CB_CONTINUE);
}
XRCS_CallbackStatus cb_endElement_Display_Terminate(void *pContext,
const JCHAR *szUri,
const JCHAR *szLocalname,
const JCHAR *szQname)
{
PCALLBACK_VALUES pCbValues = (PCALLBACK_VALUES) pContext;
indentNewLine(pCbValues);
jdeFprintf(pCbValues->fp, _J("END_ELM: "));
if (jdeStrlen( szLocalname) != 0)
{
jdeFprintf(pCbValues->fp, _J("</%ls>"), szLocalname);
}
else
{
jdeFprintf(pCbValues->fp, _J("</%ls>"), szQname);
}
pCbValues->nIndentLevel--;
return( XRCS_CB_TERMINATE);
}
XRCS_CallbackStatus cb_endElement_Display(void *pContext,
const JCHAR *szUri,
const JCHAR *szLocalname,
const JCHAR *szQname)
{
PCALLBACK_VALUES pCbValues = (PCALLBACK_VALUES) pContext;
indentNewLine(pCbValues);
jdeFprintf(pCbValues->fp, _J("END_ELM: "));
if (jdeStrlen( szLocalname) != 0)
{
jdeFprintf(pCbValues->fp, _J("</%ls>"), szLocalname);
}
else
{
jdeFprintf(pCbValues->fp, _J("</%ls>"), szQname);
}
pCbValues->nIndentLevel--;
return( XRCS_CB_CONTINUE);
}
XRCS_CallbackStatus cb_warning_Display(void *pContext,
XRCS_CallbackType eCallbackType,
int nLineNum,
int nColNum,
const JCHAR *szPublicId,
const JCHAR *szSystemId,
const JCHAR *szMessage)
{
PCALLBACK_VALUES pCbValues = (PCALLBACK_VALUES) pContext;
indentNewLine(pCbValues);
jdeFprintf(pCbValues->fp, _J("Warning: "));
jdeFprintf(pCbValues->fp, _J(" %ls (%ls) - %ls found at Column %d
Line %d"), szSystemId, szPublicId, szMessage, nColNum, nLineNum);
return( XRCS_CB_CONTINUE);
}
XRCS_CallbackStatus cb_error_Display(void *pContext,
XRCS_CallbackType eCallbackType,
int nLineNum,
int nColNum,
const JCHAR *szPublicId,
const JCHAR *szSystemId,
const JCHAR *szMessage)
{
PCALLBACK_VALUES pCbValues = (PCALLBACK_VALUES) pContext;
indentNewLine(pCbValues);
jdeFprintf(pCbValues->fp, _J("Error: "));
jdeFprintf(pCbValues->fp, _J(" %ls (%ls) - %ls found at Column %d
Line %d"), szSystemId, szPublicId, szMessage, nColNum, nLineNum);
return( XRCS_CB_CONTINUE);
}
XRCS_CallbackStatus cb_fatalError_Display(void *pContext,
XRCS_CallbackType eCallbackType,
int nLineNum,
int nColNum,
const JCHAR *szPublicId,
const JCHAR *szSystemId,
const JCHAR *szMessage)
{
PCALLBACK_VALUES pCbValues = (PCALLBACK_VALUES) pContext;
indentNewLine(pCbValues);
jdeFprintf(pCbValues->fp, _J("Fatal Error: "));
jdeFprintf(pCbValues->fp, _J(" %ls (%ls) - %ls found at Column %d Line %d"),
szSystemId, szPublicId, szMessage, nColNum, nLineNum);
return( XRCS_CB_TERMINATE);
}
XRCS_CallbackStatus cb_characters_Display(void *pContext,
const JCHAR *szText)
{
PCALLBACK_VALUES pCbValues = (PCALLBACK_VALUES) pContext;
int nTextLen;
int nTextRemaining;
int nTextPieceLen;
int nTextStartPosition;
nTextLen = jdeStrlen( szText);
indentNewLine(pCbValues);
jdeFprintf(pCbValues->fp, _J("CHARS: "));
if (hasPrintingChars( szText, nTextLen) == TRUE)
{
/* initial quote */
jdeFprintf(pCbValues->fp, _J("\""), szText);
/* actual text, output in blocks of 10000 characters */
/* jdeFprintf will not work with very large strings */
nTextRemaining = nTextLen;
nTextStartPosition = 0;
while (nTextRemaining > 0)
{
if (nTextRemaining > 10000)
{
nTextPieceLen = 10000;
}
else
{
nTextPieceLen = nTextRemaining;
}
jdeFprintf(pCbValues->fp, _J("%.*ls"), nTextPieceLen,
(JCHAR *) &(szText[nTextStartPosition]));
nTextRemaining -= nTextPieceLen;
nTextStartPosition += nTextPieceLen;
}
/* trailing quote */
jdeFprintf(pCbValues->fp, _J("\""), szText);
}
return( XRCS_CB_CONTINUE);
}
XRCS_CallbackStatus cb_ignorableWhitespace_Display(void *pContext,
const JCHAR *szText)
{
PCALLBACK_VALUES pCbValues = (PCALLBACK_VALUES) pContext;
int nTextLen;
nTextLen = jdeStrlen( szText);
indentNewLine(pCbValues);
jdeFprintf(pCbValues->fp, _J("IGNORABLE WHITESPACE: "));
if (hasPrintingChars( szText, nTextLen) == TRUE)
{
jdeFprintf(pCbValues->fp, _J("\"%ls\""), szText);
}
return( XRCS_CB_CONTINUE);
}
void indentNewLine(PCALLBACK_VALUES pCbValues)
{
int nIndent = 0;
jdeFprintf(pCbValues->fp,
_J("\n"));
while (nIndent < pCbValues->nIndentLevel)
{
jdeFprintf(pCbValues->fp, _J("%ls"), pCbValues->szIndentString);
nIndent++;
}
}
BOOL hasPrintingChars( const JCHAR *szText, int nTextLen)
{
BOOL bHasPrinting = FALSE;
int nText = 0;
/* true if contains any printing characters */
/* false if all blanks or control characters */
while (nText < nTextLen)
{
if (szText[nText] > _J(' '))
{
bHasPrinting = TRUE;
break;
}
nText++;
}
return( bHasPrinting);
}