/************************************************************************/ /* SISCO SOFTWARE MODULE HEADER *****************************************/ /************************************************************************/ /* (c) Copyright Systems Integration Specialists Company, Inc., */ /* 1999 - 2008, All Rights Reserved */ /* */ /* MODULE NAME : sx_enc.c */ /* PRODUCT(S) : */ /* */ /* MODULE DESCRIPTION : */ /* */ /* GLOBAL FUNCTIONS DEFINED IN THIS MODULE : */ /* */ /* MODIFICATION LOG : */ /* Date Who Rev Comments */ /* -------- --- ------ ------------------------------------------- */ /* 01/30/08 EJV 57 Corr slogs (fun names). */ /* 10/29/07 JRB 56 strncat_safe obsolete, use strncat_maxstrlen.*/ /* 10/17/06 MDE 55 Added support for unsigned hex ints (32 bit) */ /* 02/13/06 DSF 54 Migrate to VS.NET 2005 */ /* 08/09/05 DWL 53 Handle duration of zero. */ /* 01/31/05 DSF 52 Added sxLogOverrunAsFlow to control how */ /* encode overrun errors are logged */ /* 01/19/05 EJV 51 Replaced // comment. */ /* 07/14/04 DWL 50 Added handling for Duration type */ /* Added encode functions for struct tm type. */ /* 03/17/04 EJV 49 Use SISCO types in place of C types. */ /* 10/30/03 EJV 48 Added size param to UtcValueToXmlString */ /* 10/27/03 RWM 47 Added sx_format_nstring_enc for */ /* sx_wr_nstring */ /* 10/27/03 DSF 46 Don't format strings if bUnformattedStrings */ /* is set */ /* 10/24/03 DSF 45 Added missing functions */ /* Fixed SX_DATE_TIME functions */ /* 10/13/03 EJV 44 Replaced defined(QNX) with defined(__QNX__). */ /* 09/01/03 GLB 43 Added "sx_wr_xtime" */ /* 05/15/03 RWM 42 Added support for special characters when */ /* encoding */ /* 03/24/03 DSF 27 Added sx_wrx_nstring, sx_wrx_nstring_el */ /* 03/05/02 JRB 26 Add more SD_CONST. */ /* 02/25/02 EJV 25 _AIX: replace itoa, ltoa with ANSI sprintf */ /* sx_wr_double: repl non-ANSI '%le' with '%e'. */ /* 01/21/02 EJV 24 Added support for encoding into a file: */ /* New sx_start_encodeEx, sx_init_encodeEx. */ /* Added sx_add_buf and _SX_ADD_BUF. */ /* Added sx_wr_comment funcs. */ /* Changed sx_add_string and _SX_ADD_STRING. */ /* Eliminated _src, _xmlBufEnd ptrs from funs.*/ /* 11/15/01 DGE 23 Added sx_wr_float functions & changed type */ /* on sx_wr_double functions to ST_DOUBLE from */ /* double. */ /* 07/02/01 EJV 22 sx_init_encode: memset to 0 the sxEncCtrl. */ /* 02/28/01 EJV 21 _AIX: use itoa, ltoa instead of slow sprintf */ /* 02/28/01 MDE 20 Removed bEmptyTag from SX_ENC_CTRL */ /* 02/26/01 MDE 19 Make sx_add_string global */ /* 02/22/01 MDE 18 Allow QNX & Win32 to use itoa, ltoa */ /* 01/24/01 EJV 17 Replaced non-ANSI itoa, ltoa with sprintf. */ /* Replaced "%ud" with "%u". */ /* 01/22/01 DWL 16 Created global var sxUseFormatting */ /* 01/05/01 EJV 15 sx_wr_ulong: changed "%ul" to "%lu". */ /* 01/02/01 DWL 14 Removed UIB_DEFINED check */ /* 11/06/00 DWL 13 Modified sx_write_element and sx_end_element */ /* to handle data syntax */ /* 11/02/00 MDE 12 Changed attribute handling a bit */ /* 10/31/00 MDE 11 Significant rewrite */ /* 10/11/00 KCR 10 Fixed xmlBufLen calc. because of CDATA */ /* 09/01/00 MDE 09 Now handle large strings better */ /* 08/15/00 DWL 08 Added check for UIB_DEFINED, fixed support */ /* for multiple attributes */ /* 07/20/00 DWL 07 Added formatting option, code optimizations */ /* 04/12/00 MDE 06 Changes for V1.00P2 release */ /* 03/23/00 DWL 05 Format XML with CRLF and tabs */ /* 03/21/00 DWL 04 Removed includes already in sysincs */ /* 03/21/00 DWL 03 Changed sx_wr_string_el to accept attributes */ /* 03/17/00 DWL 02 Changed sx_wr_string_el to skip empty strings*/ /* 09/15/99 01 Module created */ /************************************************************************/ #if defined (_WIN32) #pragma warning(disable : 4996) #endif #include "glbtypes.h" #include "sysincs.h" #include "mem_chk.h" #include "time_str.h" #include "str_util.h" #include "sx_defs.h" #include "sx_log.h" /************************************************************************/ /* For debug version, use a static pointer to avoid duplication of */ /* __FILE__ strings. */ #ifdef DEBUG_SISCO SD_CONST static ST_CHAR *SD_CONST thisFileName = __FILE__; #endif /************************************************************************/ ST_BOOLEAN sxUseFormatting; ST_BOOLEAN sxLogOverrunAsFlow; /************************************************************************/ #if 0 /* to increase speed we prefer not to call functions */ #define _SX_ADD_BUF(_src, _srcLen) sx_add_buf (sxEncCtrl, _src, _srcLen, &_writePos) #define _SX_ADD_STRING(_src) sx_add_string (sxEncCtrl, _src, &_writePos) #else #define _SX_ADD_BUF(_src, _srcLen)\ {\ if (sxEncCtrl->useFp)\ {\ if (fwrite( _src, sizeof( ST_CHAR ), _srcLen, sxEncCtrl->fp) != (ST_UINT) _srcLen)\ {\ sxEncCtrl->errCode = SD_FAILURE;\ SXLOG_ERR0 ("XML encode file write error");\ return;\ }\ }\ else\ {\ if (_writePos + _srcLen >= sxEncCtrl->xmlBufEnd)\ {\ sxEncCtrl->errCode = SX_XML_BUFFER_OVER_MAX;\ if (sxLogOverrunAsFlow)\ SXLOG_FLOW0 ("XML encode buffer overrun");\ else\ SXLOG_ERR0 ("XML encode buffer overrun");\ return;\ }\ else\ {\ memcpy (_writePos, _src, _srcLen);\ _writePos += _srcLen;\ *_writePos = 0;\ }\ }\ } #define _SX_ADD_STRING(_src) _SX_ADD_BUF(_src, strlen(_src)) #endif /************************************************************************/ /* sx_add_string */ /************************************************************************/ ST_VOID sx_add_string (SX_ENC_CTRL *sxEncCtrl, SD_CONST ST_CHAR *_src, ST_CHAR **writePosIo) { sx_add_buf (sxEncCtrl, _src, strlen(_src), writePosIo); } /************************************************************************/ /* sx_add_buf */ /************************************************************************/ ST_RET sx_add_buf (SX_ENC_CTRL *sxEncCtrl, SD_CONST ST_CHAR *_src, ST_INT _srcLen, ST_CHAR **writePosIo) { ST_CHAR *_writePos; if (sxEncCtrl->useFp) { if (fwrite( _src, sizeof( ST_CHAR ), _srcLen, sxEncCtrl->fp) != (ST_UINT) _srcLen) { sxEncCtrl->errCode = SD_FAILURE; SXLOG_ERR0 ("XML encode file write error"); return (SD_FAILURE); } } else { _writePos = *writePosIo; if (_writePos + _srcLen >= sxEncCtrl->xmlBufEnd) { sxEncCtrl->errCode = SX_XML_BUFFER_OVER_MAX; if (sxLogOverrunAsFlow) SXLOG_FLOW0 ("XML encode buffer overrun"); else SXLOG_ERR0 ("XML encode buffer overrun"); return (SD_FAILURE); } else { memcpy (_writePos, _src, _srcLen); _writePos += _srcLen; *_writePos = 0; /* need string termination for logging */ } *writePosIo = _writePos; } return (SD_SUCCESS); } /************************************************************************/ /* sx_start_encode */ /************************************************************************/ SX_ENC_CTRL *sx_start_encode (ST_CHAR *xmlBuf, ST_INT xmlBufLen) { SX_ENC_CTRL *sxEncCtrl; sxEncCtrl = (SX_ENC_CTRL *) M_CALLOC (NULL, 1, sizeof (SX_ENC_CTRL)); sx_init_encode (sxEncCtrl, xmlBuf, xmlBufLen); return (sxEncCtrl); } /************************************************************************/ /* sx_start_encodeEx */ /************************************************************************/ SX_ENC_CTRL *sx_start_encodeEx (ST_CHAR *fileName) { SX_ENC_CTRL *sxEncCtrl; sxEncCtrl = (SX_ENC_CTRL *) M_CALLOC (NULL, 1, sizeof (SX_ENC_CTRL)); if (sx_init_encodeEx (sxEncCtrl, fileName) != SD_SUCCESS) { M_FREE (NULL, sxEncCtrl); sxEncCtrl = NULL; } return (sxEncCtrl); } /************************************************************************/ /* sx_init_encode */ /************************************************************************/ ST_VOID sx_init_encode (SX_ENC_CTRL *sxEncCtrl, ST_CHAR *xmlBuf, ST_INT xmlBufLen) { /* sxEncCtrl must be cleared before usage */ memset (sxEncCtrl, 0, sizeof(SX_ENC_CTRL)); sxEncCtrl->xmlBufLen = xmlBufLen; sxEncCtrl->xmlBuf = xmlBuf; sxEncCtrl->xmlBufEnd = xmlBuf + xmlBufLen; sxEncCtrl->useFp = SD_FALSE; sxEncCtrl->nextWritePos = xmlBuf; sxEncCtrl->currNestLevel = 0; sxEncCtrl->errCode = SD_SUCCESS; sxEncCtrl->bUseFormatting = sxUseFormatting; SXLOG_ENC0 ("Initialized XML Encode"); } /************************************************************************/ /* sx_init_encodeEx */ /************************************************************************/ ST_RET sx_init_encodeEx (SX_ENC_CTRL *sxEncCtrl, ST_CHAR *fileName) { FILE *fp; if ((fp = fopen (fileName, "w")) == NULL) { SXLOG_ERR2 ("XML File (%s) Open Error (errno=%d)", fileName, errno); return (SD_FAILURE); } /* sxEncCtrl must be cleared before usage */ memset (sxEncCtrl, 0, sizeof(SX_ENC_CTRL)); sxEncCtrl->xmlBufLen = 0; sxEncCtrl->xmlBuf = NULL; sxEncCtrl->xmlBufEnd = NULL; sxEncCtrl->useFp = SD_TRUE; sxEncCtrl->fp = fp; sxEncCtrl->nextWritePos = NULL; sxEncCtrl->currNestLevel = 0; sxEncCtrl->errCode = SD_SUCCESS; sxEncCtrl->bUseFormatting = sxUseFormatting; SXLOG_ENC1 ("Initialized XML Encode to file '%s'", fileName); return (SD_SUCCESS); } /************************************************************************/ /* sx_end_encode */ /************************************************************************/ ST_VOID sx_end_encode (SX_ENC_CTRL *sxEncCtrl) { ST_LONG xmlLen; if (sxEncCtrl->useFp) { if (sxEncCtrl->fp) fclose (sxEncCtrl->fp); if (sxEncCtrl->errCode == SD_SUCCESS) { SXLOG_FLOW0 ("Encode XML to file complete."); } } else { /* encoding into buffer */ if (sxEncCtrl->errCode == SD_SUCCESS) { xmlLen = sxEncCtrl->nextWritePos - sxEncCtrl->xmlBuf; SXLOG_FLOW0 ("Encode XML Complete:"); SXLOG_FLOWH (xmlLen, sxEncCtrl->xmlBuf); } } M_FREE (NULL, sxEncCtrl); } /************************************************************************/ /* sx_end_element */ /************************************************************************/ ST_VOID sx_end_element (SX_ENC_CTRL *sxEncCtrl) { ST_CHAR *tag; if (sxEncCtrl->errCode == 0) { --sxEncCtrl->currNestLevel; tag = sxEncCtrl->tags[sxEncCtrl->currNestLevel]; sx_write_element (sxEncCtrl, tag, 0, NULL, SD_TRUE, SD_FALSE); } } /************************************************************************/ /* sx_write_element */ /************************************************************************/ ST_VOID sx_write_element (SX_ENC_CTRL *sxEncCtrl, SD_CONST ST_CHAR *tag, ST_INT numAttr, SXE_ATTR_PAIR *attr, ST_BOOLEAN end, ST_BOOLEAN empty) { ST_INT i; ST_CHAR *_writePos; ST_CHAR tabBuf[SX_MAX_XML_NEST+1]; ST_CHAR attrValFormatted [8192]; if (sxEncCtrl->errCode == 0) { _writePos = sxEncCtrl->nextWritePos; if (sxEncCtrl->bUseFormatting) { if (!sxEncCtrl->bOneLineEl || (sxEncCtrl->bOneLineEl && !end)) { for (i = 0; i < sxEncCtrl->currNestLevel; i++) tabBuf[i] = '\t'; /* assemble all tabs in buffer */ _SX_ADD_BUF (tabBuf, sxEncCtrl->currNestLevel); } } _SX_ADD_BUF ("<", 1); if (end == SD_TRUE) _SX_ADD_BUF ("/", 1); _SX_ADD_STRING (tag); for (i = 0; i < numAttr; ++i, ++attr) { _SX_ADD_BUF (" ", 1); _SX_ADD_STRING (attr->name); _SX_ADD_BUF ("=", 1); _SX_ADD_BUF ("\"", 1); sx_format_string_enc (attrValFormatted, attr->value); _SX_ADD_STRING (attrValFormatted); _SX_ADD_BUF ("\"", 1); } if (empty == SD_TRUE) _SX_ADD_BUF ("/", 1); _SX_ADD_BUF (">", 1); if (sxEncCtrl->bUseFormatting) { if (!sxEncCtrl->bOneLineEl || (sxEncCtrl->bOneLineEl && end)) _SX_ADD_BUF ("\n", 1); } if (!sxEncCtrl->useFp && (sx_debug_sel & SX_LOG_ENC)) { SLOGCALWAYS1 ("sx_write_element: %s", sxEncCtrl->nextWritePos); } if (empty != SD_TRUE && end != SD_TRUE) { strcpy (sxEncCtrl->tags[sxEncCtrl->currNestLevel], tag); ++sxEncCtrl->currNestLevel; } sxEncCtrl->nextWritePos = _writePos; sxEncCtrl->bOneLineEl = SD_FALSE; } } /************************************************************************/ /* sx_wr_string */ /************************************************************************/ ST_VOID sx_wr_string (SX_ENC_CTRL *sxEncCtrl, ST_CHAR *str) { ST_CHAR *_writePos; ST_CHAR strFormatted [8192]; if (sxEncCtrl->errCode == 0) { _writePos = sxEncCtrl->nextWritePos; if (!sxEncCtrl->bUnformattedStrings) { sx_format_string_enc (strFormatted, str); _SX_ADD_STRING (strFormatted); } else _SX_ADD_STRING (str); if (!sxEncCtrl->useFp && (sx_debug_sel & SX_LOG_ENC)) { SLOGCALWAYS1 ("sx_wr_string: %s", sxEncCtrl->nextWritePos); } sxEncCtrl->nextWritePos = _writePos; } } /************************************************************************/ /* sx_wrx_string_el */ /************************************************************************/ ST_VOID sx_wrx_string_el (SX_ENC_CTRL *sxEncCtrl, SD_CONST ST_CHAR *tag, ST_CHAR *str, ST_INT numAttr, SXE_ATTR_PAIR *attr) { sxEncCtrl->bOneLineEl = SD_TRUE; sx_write_element (sxEncCtrl, tag, numAttr, attr, SD_FALSE, SD_FALSE); sx_wr_string (sxEncCtrl, str); sxEncCtrl->bOneLineEl = SD_TRUE; sx_end_element (sxEncCtrl); } /************************************************************************/ /* sx_wr_nstring */ /************************************************************************/ ST_VOID sx_wr_nstring (SX_ENC_CTRL *sxEncCtrl, ST_CHAR *str, ST_INT len) { ST_CHAR *_writePos; ST_CHAR strFormatted [8192]; ST_INT formattedLen; if (sxEncCtrl->errCode == 0) { _writePos = sxEncCtrl->nextWritePos; if (!sxEncCtrl->bUnformattedStrings) { sx_format_nstring_enc (strFormatted, str, len); formattedLen = strlen (strFormatted); _SX_ADD_BUF (strFormatted, formattedLen); } else _SX_ADD_BUF (str, len); if (!sxEncCtrl->useFp && (sx_debug_sel & SX_LOG_ENC)) { SLOGCALWAYS1 ("sx_wr_nstring: %s", sxEncCtrl->nextWritePos); } sxEncCtrl->nextWritePos = _writePos; } } /************************************************************************/ /* sx_wrx_string_el */ /************************************************************************/ ST_VOID sx_wrx_nstring_el (SX_ENC_CTRL *sxEncCtrl, SD_CONST ST_CHAR *tag, ST_CHAR *str, ST_INT len, ST_INT numAttr, SXE_ATTR_PAIR *attr) { sxEncCtrl->bOneLineEl = SD_TRUE; sx_write_element (sxEncCtrl, tag, numAttr, attr, SD_FALSE, SD_FALSE); sx_wr_nstring (sxEncCtrl, str, len); sxEncCtrl->bOneLineEl = SD_TRUE; sx_end_element (sxEncCtrl); } /************************************************************************/ /* sx_wr_bitstring */ /************************************************************************/ ST_VOID sx_wr_bitstring (SX_ENC_CTRL *sxEncCtrl, ST_INT numBits, ST_UINT8 *bitStr) { ST_CHAR *_writePos; ST_UINT8 bitMask; ST_UINT8 *bytePtr; ST_INT i; if (sxEncCtrl->errCode == 0) { _writePos = sxEncCtrl->nextWritePos; bitMask = 0x80; bytePtr = bitStr; for (i = 0; i < numBits; ++i) { if (*bytePtr & bitMask) { _SX_ADD_BUF ("1", 1); } else { _SX_ADD_BUF ("0", 1); } if (bitMask == 0x01) { bitMask = 0x80; ++bytePtr; } else bitMask = bitMask >> 1; } if (!sxEncCtrl->useFp && (sx_debug_sel & SX_LOG_ENC)) { SLOGCALWAYS1 ("sx_wr_bitstring: %s", sxEncCtrl->nextWritePos); } sxEncCtrl->nextWritePos = _writePos; } } /************************************************************************/ /* sx_wrx_bitstring_el */ /************************************************************************/ ST_VOID sx_wrx_bitstring_el (SX_ENC_CTRL *sxEncCtrl, ST_CHAR *tag, ST_INT numBits, ST_UINT8 *bitStr, ST_INT numAttr, SXE_ATTR_PAIR *attr) { sxEncCtrl->bOneLineEl = SD_TRUE; sx_write_element (sxEncCtrl, tag, numAttr, attr, SD_FALSE, SD_FALSE); sx_wr_bitstring (sxEncCtrl, numBits, bitStr); sxEncCtrl->bOneLineEl = SD_TRUE; sx_end_element (sxEncCtrl); } /************************************************************************/ /* sx_wr_int */ /************************************************************************/ ST_VOID sx_wr_int (SX_ENC_CTRL *sxEncCtrl, ST_INT val) { ST_CHAR *_writePos; ST_CHAR strVal[100]; if (sxEncCtrl->errCode == 0) { #if defined(_WIN32) || defined(__QNX__) itoa (val, strVal, 10); #else sprintf (strVal, "%d", val); #endif _writePos = sxEncCtrl->nextWritePos; _SX_ADD_STRING (strVal); if (!sxEncCtrl->useFp && (sx_debug_sel & SX_LOG_ENC)) { SLOGCALWAYS1 ("sx_wr_int: %s", sxEncCtrl->nextWritePos); } sxEncCtrl->nextWritePos = _writePos; } } /************************************************************************/ /* sx_wrx_int_el */ /************************************************************************/ ST_VOID sx_wrx_int_el (SX_ENC_CTRL *sxEncCtrl, ST_CHAR *tag, ST_INT val, ST_INT numAttr, SXE_ATTR_PAIR *attr) { sxEncCtrl->bOneLineEl = SD_TRUE; sx_write_element (sxEncCtrl, tag, numAttr, attr, SD_FALSE, SD_FALSE); sx_wr_int (sxEncCtrl, val); sxEncCtrl->bOneLineEl = SD_TRUE; sx_end_element (sxEncCtrl); } /************************************************************************/ /* sx_wr_uint */ /************************************************************************/ ST_VOID sx_wr_uint (SX_ENC_CTRL *sxEncCtrl, ST_UINT val) { ST_CHAR *_writePos; ST_CHAR strVal[100]; if (sxEncCtrl->errCode == 0) { _writePos = sxEncCtrl->nextWritePos; sprintf (strVal, "%u", val); _SX_ADD_STRING (strVal); if (!sxEncCtrl->useFp && (sx_debug_sel & SX_LOG_ENC)) { SLOGCALWAYS1 ("sx_wr_uint: %s", sxEncCtrl->nextWritePos); } sxEncCtrl->nextWritePos = _writePos; } } /************************************************************************/ /* sx_wrx_uint_el */ /************************************************************************/ ST_VOID sx_wrx_uint_el (SX_ENC_CTRL *sxEncCtrl, ST_CHAR *tag, ST_UINT val, ST_INT numAttr, SXE_ATTR_PAIR *attr) { sxEncCtrl->bOneLineEl = SD_TRUE; sx_write_element (sxEncCtrl, tag, numAttr, attr, SD_FALSE, SD_FALSE); sx_wr_uint (sxEncCtrl, val); sxEncCtrl->bOneLineEl = SD_TRUE; sx_end_element (sxEncCtrl); } /************************************************************************/ /* sx_wr_ulong */ /************************************************************************/ ST_VOID sx_wr_ulong (SX_ENC_CTRL *sxEncCtrl, ST_ULONG val) { ST_CHAR *_writePos; ST_CHAR strVal[100]; if (sxEncCtrl->errCode == 0) { _writePos = sxEncCtrl->nextWritePos; sprintf (strVal, "%lu", val); _SX_ADD_STRING (strVal); if (!sxEncCtrl->useFp && (sx_debug_sel & SX_LOG_ENC)) { SLOGCALWAYS1 ("sx_wr_ulong: %s", sxEncCtrl->nextWritePos); } sxEncCtrl->nextWritePos = _writePos; } } /************************************************************************/ /* sx_wrx_ulong_el */ /************************************************************************/ ST_VOID sx_wrx_ulong_el (SX_ENC_CTRL *sxEncCtrl, ST_CHAR *tag, ST_ULONG val, ST_INT numAttr, SXE_ATTR_PAIR *attr) { sxEncCtrl->bOneLineEl = SD_TRUE; sx_write_element (sxEncCtrl, tag, numAttr, attr, SD_FALSE, SD_FALSE); sx_wr_ulong (sxEncCtrl, val); sxEncCtrl->bOneLineEl = SD_TRUE; sx_end_element (sxEncCtrl); } /************************************************************************/ /* sx_wr_uint32_hex */ /************************************************************************/ ST_VOID sx_wr_uint32_hex (SX_ENC_CTRL *sxEncCtrl, ST_UINT32 val) { ST_CHAR *_writePos; ST_CHAR strVal[100]; if (sxEncCtrl->errCode == 0) { _writePos = sxEncCtrl->nextWritePos; sprintf (strVal, "0x%08lx", val); _SX_ADD_STRING (strVal); if (!sxEncCtrl->useFp && (sx_debug_sel & SX_LOG_ENC)) { SLOGCALWAYS1 ("sx_wr_uint32_hex: %s", sxEncCtrl->nextWritePos); } sxEncCtrl->nextWritePos = _writePos; } } /************************************************************************/ /* sx_wrx_uint32_hex_el */ /************************************************************************/ ST_VOID sx_wrx_uint32_hex_el (SX_ENC_CTRL *sxEncCtrl, ST_CHAR *tag, ST_UINT32 val, ST_INT numAttr, SXE_ATTR_PAIR *attr) { sxEncCtrl->bOneLineEl = SD_TRUE; sx_write_element (sxEncCtrl, tag, numAttr, attr, SD_FALSE, SD_FALSE); sx_wr_uint32_hex (sxEncCtrl, val); sxEncCtrl->bOneLineEl = SD_TRUE; sx_end_element (sxEncCtrl); } /************************************************************************/ /************************************************************************/ /* sx_wr_double */ /************************************************************************/ ST_VOID sx_wr_double (SX_ENC_CTRL *sxEncCtrl, ST_DOUBLE val) { ST_CHAR *_writePos; ST_CHAR strVal[100]; if (sxEncCtrl->errCode == 0) { _writePos = sxEncCtrl->nextWritePos; sprintf (strVal, "%e", val); _SX_ADD_STRING (strVal); if (!sxEncCtrl->useFp && (sx_debug_sel & SX_LOG_ENC)) { SLOGCALWAYS1 ("sx_wr_double: %s", sxEncCtrl->nextWritePos); } sxEncCtrl->nextWritePos = _writePos; } } /************************************************************************/ /* sx_wrx_double_el */ /************************************************************************/ ST_VOID sx_wrx_double_el (SX_ENC_CTRL *sxEncCtrl, ST_CHAR *tag, ST_DOUBLE val, ST_INT numAttr, SXE_ATTR_PAIR *attr) { sxEncCtrl->bOneLineEl = SD_TRUE; sx_write_element (sxEncCtrl, tag, numAttr, attr, SD_FALSE, SD_FALSE); sx_wr_double (sxEncCtrl, val); sxEncCtrl->bOneLineEl = SD_TRUE; sx_end_element (sxEncCtrl); } /************************************************************************/ /************************************************************************/ /* sx_wr_float */ /************************************************************************/ ST_VOID sx_wr_float (SX_ENC_CTRL *sxEncCtrl, ST_FLOAT val) { ST_CHAR *_writePos; ST_CHAR strVal[100]; if (sxEncCtrl->errCode == 0) { _writePos = sxEncCtrl->nextWritePos; sprintf (strVal, "%f", val); _SX_ADD_STRING (strVal); if (!sxEncCtrl->useFp && (sx_debug_sel & SX_LOG_ENC)) { SLOGCALWAYS1 ("sx_wr_float: %s", sxEncCtrl->nextWritePos); } sxEncCtrl->nextWritePos = _writePos; } } /************************************************************************/ /* sx_wrx_float_el */ /************************************************************************/ ST_VOID sx_wrx_float_el (SX_ENC_CTRL *sxEncCtrl, ST_CHAR *tag, ST_FLOAT val, ST_INT numAttr, SXE_ATTR_PAIR *attr) { sxEncCtrl->bOneLineEl = SD_TRUE; sx_write_element (sxEncCtrl, tag, numAttr, attr, SD_FALSE, SD_FALSE); sx_wr_float (sxEncCtrl, val); sxEncCtrl->bOneLineEl = SD_TRUE; sx_end_element (sxEncCtrl); } /************************************************************************/ /************************************************************************/ /* sx_wr_long */ /************************************************************************/ ST_VOID sx_wr_long (SX_ENC_CTRL *sxEncCtrl, ST_LONG val) { ST_CHAR *_writePos; ST_CHAR strVal[100]; if (sxEncCtrl->errCode == 0) { _writePos = sxEncCtrl->nextWritePos; #if defined(_WIN32) || defined(__QNX__) ltoa (val, strVal, 10); #else sprintf (strVal,"%ld", val); #endif _SX_ADD_STRING (strVal); if (!sxEncCtrl->useFp && (sx_debug_sel & SX_LOG_ENC)) { SLOGCALWAYS1 ("sx_wr_long: %s", sxEncCtrl->nextWritePos); } sxEncCtrl->nextWritePos = _writePos; } } /************************************************************************/ /* sx_wrx_long_el */ /************************************************************************/ ST_VOID sx_wrx_long_el (SX_ENC_CTRL *sxEncCtrl, ST_CHAR *tag, ST_LONG val, ST_INT numAttr, SXE_ATTR_PAIR *attr) { sxEncCtrl->bOneLineEl = SD_TRUE; sx_write_element (sxEncCtrl, tag, numAttr, attr, SD_FALSE, SD_FALSE); sx_wr_long (sxEncCtrl, val); sxEncCtrl->bOneLineEl = SD_TRUE; sx_end_element (sxEncCtrl); } /************************************************************************/ /************************************************************************/ /* sx_wr_bool */ /************************************************************************/ ST_VOID sx_wr_bool (SX_ENC_CTRL *sxEncCtrl, ST_BOOLEAN val) { ST_CHAR *_writePos; if (sxEncCtrl->errCode == 0) { _writePos = sxEncCtrl->nextWritePos; if (val != SD_FALSE) { _SX_ADD_BUF ("1", 1); } else { _SX_ADD_BUF ("0", 1); } if (!sxEncCtrl->useFp && (sx_debug_sel & SX_LOG_ENC)) { SLOGCALWAYS1 ("sx_wr_bool: %s", sxEncCtrl->nextWritePos); } sxEncCtrl->nextWritePos = _writePos; } } /************************************************************************/ /* sx_wrx_bool_el */ /************************************************************************/ ST_VOID sx_wrx_bool_el (SX_ENC_CTRL *sxEncCtrl, ST_CHAR *tag, ST_BOOLEAN val, ST_INT numAttr, SXE_ATTR_PAIR *attr) { sxEncCtrl->bOneLineEl = SD_TRUE; sx_write_element (sxEncCtrl, tag, numAttr, attr, SD_FALSE, SD_FALSE); sx_wr_bool (sxEncCtrl, val); sxEncCtrl->bOneLineEl = SD_TRUE; sx_end_element (sxEncCtrl); } /************************************************************************/ /************************************************************************/ /************************************************************************/ /* sx_wr_time */ /************************************************************************/ #define SX_MAX_TIME_STRING_LEN 30 ST_CHAR *sxTimeFormatStr = "%m-%d-%Y %H:%M:%S"; ST_VOID sx_wr_time (SX_ENC_CTRL *sxEncCtrl, time_t val) { ST_CHAR *_writePos; ST_CHAR timeStr[50]; if (sxEncCtrl->errCode == 0) { _writePos = sxEncCtrl->nextWritePos; strftime (timeStr, SX_MAX_TIME_STRING_LEN, sxTimeFormatStr, localtime (&val)); _SX_ADD_STRING (timeStr); if (!sxEncCtrl->useFp && (sx_debug_sel & SX_LOG_ENC)) { SLOGCALWAYS1 ("sx_wr_time: %s", sxEncCtrl->nextWritePos); } sxEncCtrl->nextWritePos = _writePos; } } /************************************************************************/ /* sx_wr_tm */ /************************************************************************/ ST_VOID sx_wr_tm (SX_ENC_CTRL *sxEncCtrl, struct tm *val) { ST_CHAR *_writePos; ST_CHAR timeStr[50]; if (sxEncCtrl->errCode == 0) { _writePos = sxEncCtrl->nextWritePos; strftime (timeStr, SX_MAX_TIME_STRING_LEN, sxTimeFormatStr, val); _SX_ADD_STRING (timeStr); if (!sxEncCtrl->useFp && (sx_debug_sel & SX_LOG_ENC)) { SLOGCALWAYS1 ("sx_wr_tm: %s", sxEncCtrl->nextWritePos); } sxEncCtrl->nextWritePos = _writePos; } } /************************************************************************/ /* XmlDurationToString */ /************************************************************************/ ST_RET XmlDurationToString (ST_CHAR *buffer, ST_LONG size, SX_DURATION *sxDuration) { ST_CHAR temp[256]; ST_BOOLEAN dateMemberFound = SD_FALSE; ST_BOOLEAN timeMemberFound = SD_FALSE; /* convert duration information stored in */ /* "SX_DURATION" structure to an xml string */ /* Use strncat_maxstrlen to avoid buffer overrun */ if (sxDuration->negative == SD_TRUE) strncpy_safe( buffer, "-P", size - 1 ); else strncpy_safe( buffer, "P", size - 1 ); if (sxDuration->years > 0 || sxDuration->months > 0 || sxDuration->days > 0) dateMemberFound = SD_TRUE; if (sxDuration->years > 0) { sprintf( temp, "%dY", sxDuration->years ); strncat_maxstrlen( buffer, temp, size - 1 ); } if (sxDuration->months > 0) { sprintf( temp, "%dM", sxDuration->months ); strncat_maxstrlen( buffer, temp, size - 1 ); } if (sxDuration->days > 0) { sprintf( temp, "%dD", sxDuration->days ); strncat_maxstrlen( buffer, temp, size - 1 ); } if (sxDuration->hours > 0 || sxDuration->minutes > 0 || sxDuration->seconds > 0 || sxDuration->microseconds > 0) { timeMemberFound = SD_TRUE; sprintf( temp, "T" ); strncat_maxstrlen( buffer, temp, size - 1 ); } if (sxDuration->hours > 0) { sprintf( temp, "%dH", sxDuration->hours ); strncat_maxstrlen( buffer, temp, size - 1 ); } if (sxDuration->minutes > 0) { sprintf( temp, "%dM", sxDuration->minutes ); strncat_maxstrlen( buffer, temp, size - 1 ); } if (sxDuration->seconds > 0) { sprintf( temp, "%d", sxDuration->seconds ); strncat_maxstrlen( buffer, temp, size - 1 ); } if (sxDuration->microseconds > 0) { if (sxDuration->seconds > 0) sprintf( temp, ".%06ld", sxDuration->microseconds ); else sprintf( temp, "0.%06ld", sxDuration->microseconds ); strncat_maxstrlen( buffer, temp, size - 1 ); } if (sxDuration->seconds > 0 || sxDuration->microseconds > 0) { sprintf( temp, "S" ); strncat_maxstrlen( buffer, temp, size - 1 ); } if (dateMemberFound == SD_FALSE && timeMemberFound == SD_FALSE) { sprintf( temp, "T0S" ); /* 0 seconds = duration of zero */ strncat_maxstrlen( buffer, temp, size - 1 ); } return (SD_SUCCESS); } /************************************************************************/ /* sx_wr_duration */ /************************************************************************/ /* Convert a SX_DURATION structure into a text string, and store it in */ /* control structure for output to an XML file. The string */ /* looks like the following: PnYnMnDTnHnMnS where n are the various */ /* values, P = period, Y = years, M = months, D = days, T = date/time */ /* seperator, H = hours, M = minutes, S = seconds. Seconds may be a */ /* decimal number of arbitrary precisions. */ /* Ex: P12Y10M2DT0H40M27.87S */ /* Ex: P12Y10M2DT40M27.87S */ /************************************************************************/ ST_VOID sx_wr_duration (SX_ENC_CTRL *sxEncCtrl, SX_DURATION *sxDuration) { ST_RET rc; ST_CHAR *_writePos; ST_CHAR buffer[100]; /* arbitrary size */ if (sxEncCtrl->errCode != 0) return; rc = XmlDurationToString (buffer, sizeof(buffer), sxDuration); /* place newly created date/time string in xml encode structure */ _writePos = sxEncCtrl->nextWritePos; _SX_ADD_STRING (buffer); if (!sxEncCtrl->useFp && (sx_debug_sel & SX_LOG_ENC)) { SLOGCALWAYS1 ("sx_wr_duration: %s", sxEncCtrl->nextWritePos); } sxEncCtrl->nextWritePos = _writePos; } /************************************************************************/ /* sx_wr_xtime */ /************************************************************************/ /* Using the date and time data in the "SX_DATE_TIME" structure convert */ /* the number of seconds from 1/1/1970 (UTC time), the decimal fraction */ /* of microseconds if specified and the number of minutes in the */ /* time zone offset if specified to a date and time string. */ /* The string is stored in an encode structure for output to an xml */ /* file. */ /************************************************************************/ ST_VOID sx_wr_xtime (SX_ENC_CTRL *sxEncCtrl, SX_DATE_TIME *sxDateTime) { ST_RET rc; ST_CHAR *_writePos; ST_CHAR dateTimeStr[MAX_TIME_STRING_LEN]; if (sxEncCtrl->errCode != 0) return; /* convert date and time information stored in */ /* "SX_DATE_TIME" structure to an xml string */ rc = UtcValueToXmlString (dateTimeStr, sizeof(dateTimeStr), sxDateTime); if (rc != SD_SUCCESS) { SXLOG_NERR0 ("ERROR: Value to String date/time conversion "); sxEncCtrl->errCode = SD_FAILURE; return; } /* place newly created date/time string in xml encode structure */ _writePos = sxEncCtrl->nextWritePos; _SX_ADD_STRING (dateTimeStr); if (!sxEncCtrl->useFp && (sx_debug_sel & SX_LOG_ENC)) { SLOGCALWAYS1 ("sx_wr_xtime: %s", sxEncCtrl->nextWritePos); } sxEncCtrl->nextWritePos = _writePos; } /************************************************************************/ /* sx_wrx_duration_el */ /************************************************************************/ ST_VOID sx_wrx_duration_el (SX_ENC_CTRL *sxEncCtrl, ST_CHAR *tag, SX_DURATION *val, ST_INT numAttr, SXE_ATTR_PAIR *attr) { sxEncCtrl->bOneLineEl = SD_TRUE; sx_write_element (sxEncCtrl, tag, numAttr, attr, SD_FALSE, SD_FALSE); sx_wr_duration (sxEncCtrl, val); sxEncCtrl->bOneLineEl = SD_TRUE; sx_end_element (sxEncCtrl); } /************************************************************************/ /* sx_wrx_xtime_el */ /************************************************************************/ ST_VOID sx_wrx_xtime_el (SX_ENC_CTRL *sxEncCtrl, ST_CHAR *tag, SX_DATE_TIME *val, ST_INT numAttr, SXE_ATTR_PAIR *attr) { sxEncCtrl->bOneLineEl = SD_TRUE; sx_write_element (sxEncCtrl, tag, numAttr, attr, SD_FALSE, SD_FALSE); sx_wr_xtime (sxEncCtrl, val); sxEncCtrl->bOneLineEl = SD_TRUE; sx_end_element (sxEncCtrl); } /************************************************************************/ /* sx_wrx_time_el */ /************************************************************************/ ST_VOID sx_wrx_time_el (SX_ENC_CTRL *sxEncCtrl, ST_CHAR *tag, time_t val, ST_INT numAttr, SXE_ATTR_PAIR *attr) { sxEncCtrl->bOneLineEl = SD_TRUE; sx_write_element (sxEncCtrl, tag, numAttr, attr, SD_FALSE, SD_FALSE); sx_wr_time (sxEncCtrl, val); sxEncCtrl->bOneLineEl = SD_TRUE; sx_end_element (sxEncCtrl); } /************************************************************************/ /* sx_wrx_tm_el */ /************************************************************************/ ST_VOID sx_wrx_tm_el (SX_ENC_CTRL *sxEncCtrl, ST_CHAR *tag, struct tm *val, ST_INT numAttr, SXE_ATTR_PAIR *attr) { sxEncCtrl->bOneLineEl = SD_TRUE; sx_write_element (sxEncCtrl, tag, numAttr, attr, SD_FALSE, SD_FALSE); sx_wr_tm (sxEncCtrl, val); sxEncCtrl->bOneLineEl = SD_TRUE; sx_end_element (sxEncCtrl); } /************************************************************************/ /* sx_wr_cdata */ /************************************************************************/ ST_VOID sx_wr_cdata (SX_ENC_CTRL *sxEncCtrl, ST_CHAR *str, ST_INT len) { ST_INT i; ST_CHAR *_writePos; ST_CHAR tabBuf[SX_MAX_XML_NEST+1]; if (sxEncCtrl->errCode == 0) { _writePos = sxEncCtrl->nextWritePos; if (sxEncCtrl->bUseFormatting) { for (i = 0; i < sxEncCtrl->currNestLevel; i++) tabBuf[i] = '\t'; /* assemble all tabs in buffer */ _SX_ADD_BUF (tabBuf, sxEncCtrl->currNestLevel); } _SX_ADD_BUF ("", 3); sxEncCtrl->nextWritePos = _writePos; } } /************************************************************************/ /* sx_wrx_cdata_el */ /************************************************************************/ ST_VOID sx_wrx_cdata_el (SX_ENC_CTRL *sxEncCtrl, ST_CHAR *tag, ST_CHAR *str, ST_INT len, ST_INT numAttr, SXE_ATTR_PAIR *attr) { sxEncCtrl->bOneLineEl = SD_TRUE; sx_write_element (sxEncCtrl, tag, numAttr, attr, SD_FALSE, SD_FALSE); sx_wr_cdata (sxEncCtrl, str, len); sxEncCtrl->bOneLineEl = SD_TRUE; sx_end_element (sxEncCtrl); } /************************************************************************/ /* sx_wr_comment */ /************************************************************************/ ST_VOID sx_wr_comment (SX_ENC_CTRL *sxEncCtrl, ST_CHAR *str) { ST_INT i; ST_CHAR *_writePos; ST_INT writeLen; ST_CHAR tabBuf[SX_MAX_XML_NEST+1]; if (sxEncCtrl->errCode == 0) { _writePos = sxEncCtrl->nextWritePos; if (sxEncCtrl->bUseFormatting) { for (i = 0; i < sxEncCtrl->currNestLevel; i++) tabBuf[i] = '\t'; /* assemble all tabs in buffer */ _SX_ADD_BUF (tabBuf, sxEncCtrl->currNestLevel); } _SX_ADD_BUF ("\n", 4); } else { _SX_ADD_BUF (str, writeLen); _SX_ADD_BUF ("-->", 3); } if (!sxEncCtrl->useFp && (sx_debug_sel & SX_LOG_ENC)) { SLOGCALWAYS1 ("sx_wr_comment: %s", sxEncCtrl->nextWritePos); } sxEncCtrl->nextWritePos = _writePos; } } /************************************************************************/ /* sx_format_string_enc */ /************************************************************************/ ST_VOID sx_format_string_enc (ST_CHAR *dest, ST_CHAR *src) { ST_CHAR *srcPtr = src; ST_CHAR *destPtr = dest; *destPtr = '\0'; while (*srcPtr != '\0') { switch (*srcPtr) { case CHAR_APOS: strcat (destPtr, CODE_APOS); destPtr += CODE_APOS_LEN; break; case CHAR_QUOT: strcat (destPtr, CODE_QUOT); destPtr += CODE_QUOT_LEN; break; case CHAR_AMP: strcat (destPtr, CODE_AMP); destPtr += CODE_AMP_LEN; break; case CHAR_LT: strcat (destPtr, CODE_LT); destPtr += CODE_LT_LEN; break; case CHAR_GT: strcat (destPtr, CODE_GT); destPtr += CODE_GT_LEN; break; default: *destPtr = *srcPtr; *(destPtr + 1) = '\0'; destPtr++; break; } srcPtr++; } } /************************************************************************/ /* sx_format_nstring_enc */ /************************************************************************/ ST_VOID sx_format_nstring_enc (ST_CHAR *dest, ST_CHAR *src, ST_INT len) { ST_CHAR *srcPtr = src; ST_CHAR *destPtr = dest; ST_INT i = 0; *destPtr = '\0'; while (i++ < len) { switch (*srcPtr) { case CHAR_APOS: strcat (destPtr, CODE_APOS); destPtr += CODE_APOS_LEN; break; case CHAR_QUOT: strcat (destPtr, CODE_QUOT); destPtr += CODE_QUOT_LEN; break; case CHAR_AMP: strcat (destPtr, CODE_AMP); destPtr += CODE_AMP_LEN; break; case CHAR_LT: strcat (destPtr, CODE_LT); destPtr += CODE_LT_LEN; break; case CHAR_GT: strcat (destPtr, CODE_GT); destPtr += CODE_GT_LEN; break; default: *destPtr = *srcPtr; *(destPtr + 1) = '\0'; destPtr++; break; } srcPtr++; } }