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);
}