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