char *cg_net_uri_escapestring(char *buf, int bufSize, CgString *retBuf) { #if defined(CG_HTTP_CURL) char *tmp; #else int n; unsigned char c; char hexChar[4]; #endif cg_log_debug_l4("Entering...\n"); if (!retBuf) return NULL; #if defined(CG_HTTP_CURL) tmp = (bufSize < 1)?curl_escape(buf, 0):curl_escape(buf, bufSize); if (tmp == NULL) { cg_log_debug_s("Memory allocation problem!\n"); return NULL; } cg_string_addvalue(retBuf, tmp); curl_free(tmp); #else if (bufSize < 1) bufSize = cg_strlen(buf) + 1; for (n=0; n<bufSize; n++) { c = (unsigned char)buf[n]; if (!cg_net_uri_isalphanumchar(c)) { #if defined(HAVE_SNPRINTF) snprintf(hexChar, sizeof(hexChar), "%%%02X", c); #else sprintf(hexChar, "%%%02X", c); #endif cg_string_naddvalue(retBuf, hexChar, 3); } else cg_string_naddvalue(retBuf, buf+n, 1); } #endif cg_log_debug_l4("Leaving...\n"); return cg_string_getvalue(retBuf); }
char *cg_string_replace(CgString *str, char *fromStr[], char *toStr[], size_t fromStrCnt) { char *orgValue = NULL; size_t orgValueLen = 0; int n = 0; int copyPos = 0; size_t *fromStrLen = NULL; CgString *repValue = NULL; BOOL isReplaced = FALSE; cg_log_debug_l5("Entering...\n"); if (NULL == str ) return NULL; repValue = cg_string_new(); fromStrLen = (size_t *)malloc(sizeof(size_t) * fromStrCnt); if ( NULL == fromStrLen ) { cg_string_delete(repValue); cg_log_debug_s("Memory allocation failure!\n"); return NULL; } for (n=0; n<fromStrCnt; n++) fromStrLen[n] = cg_strlen(fromStr[n]); orgValue = cg_string_getvalue(str); orgValueLen = cg_string_length(str); copyPos = 0; while (copyPos<orgValueLen) { isReplaced = FALSE; for (n=0; n<fromStrCnt; n++) { if (strncmp(fromStr[n], orgValue + copyPos, fromStrLen[n]) == 0) { cg_string_addvalue(repValue, toStr[n]); copyPos += fromStrLen[n]; isReplaced = TRUE; continue; } } if (isReplaced == TRUE) continue; cg_string_naddvalue(repValue, orgValue + copyPos, 1); copyPos++; } free(fromStrLen); cg_string_setvalue(str, cg_string_getvalue(repValue)); cg_string_delete(repValue); cg_log_debug_l5("Leaving...\n"); return cg_string_getvalue(str); }
char *cg_string_addvalue(CgString *str, const char *value) { cg_log_debug_l5("Entering...\n"); cg_log_debug_l5("Leaving...\n"); return cg_string_naddvalue(str, value, cg_strlen(value)); }
char *cg_string_naddrepvalue(CgString *str, const char *value, size_t valueLen, size_t repeatCnt) { int n; cg_log_debug_l5("Entering...\n"); for (n = 0; n < repeatCnt; n++) cg_string_naddvalue(str, value, valueLen); cg_log_debug_l5("Leaving...\n"); return cg_string_getvalue(str); }
static char *cg_xml_node_attribute_tostring(CgXmlNode *node, CgString *str) { CgXmlAttribute *attr; char *name; char *value; CgString *valueStr; cg_log_debug_l4("Entering...\n"); valueStr = cg_string_new(); if (valueStr == NULL) return NULL; for (attr = cg_xml_node_getattributes(node); attr != NULL; attr = cg_xml_attribute_next(attr)) { name = cg_xml_attribute_getname(attr); value = cg_xml_attribute_getvalue(attr); cg_string_setvalue(valueStr, value); cg_xml_escapechars(valueStr); /* All the following functions return NULL only when memory allocation fails, so we can check them all */ if (!cg_string_naddvalue(str, " ", 1) || !cg_string_addvalue(str, name) || !cg_string_naddvalue(str, "=\"", 2) || !cg_string_addvalue(str, cg_string_getvalue(valueStr)) || !cg_string_naddvalue(str, "\"", 1)) { /* Memory allocation failed */ cg_string_delete(valueStr); return NULL; } } cg_string_delete(valueStr); cg_log_debug_l4("Leaving...\n"); return cg_string_getvalue(str); }
static char *cg_xml_node_tostring_indent(CgXmlNode *node, int indentLevel, BOOL withChildNode, CgString *str) { char *name; char *value; CgString *valueStr; CgXmlNode *childNode; cg_log_debug_l4("Entering...\n"); name = cg_xml_node_getname(node); value = cg_xml_node_getvalue(node); if (cg_xml_node_haschildnodes(node) == FALSE || withChildNode == FALSE) { cg_string_addrepvalue(str, CG_XML_INDENT_STRING, indentLevel); if (!cg_string_naddvalue(str, "<", 1) || !cg_string_addvalue(str, name) || !cg_xml_node_attribute_tostring(node, str)) /* Memory allocation failed */ return NULL; valueStr = cg_string_new(); if (!valueStr) /* Memory allocation failed */ return NULL; cg_string_setvalue(valueStr, value); cg_xml_escapechars(valueStr); if (!cg_string_naddvalue(str, ">", 1) || !cg_string_addvalue(str, cg_string_getvalue(valueStr)) || !cg_string_naddvalue(str, "</", 2) || !cg_string_addvalue(str, name) || !cg_string_naddvalue(str, ">", 1) || !cg_string_addvalue(str, "\n")) { /* Memory allocation failed */ cg_string_delete(valueStr); return NULL; } cg_string_delete(valueStr); return cg_string_getvalue(str); } cg_string_addrepvalue(str, CG_XML_INDENT_STRING, indentLevel); if (!cg_string_naddvalue(str, "<", 1) || !cg_string_addvalue(str, name) || !cg_xml_node_attribute_tostring(node, str) || !cg_string_naddvalue(str, ">", 1) || !cg_string_addvalue(str, "\n")) /* Memory allocation failed */ return NULL; for (childNode = cg_xml_node_getchildnodes(node); childNode != NULL; childNode = cg_xml_node_next(childNode)) if (!cg_xml_node_tostring_indent(childNode, indentLevel+1, TRUE, str)) /* Memory allocation failed */ return NULL; cg_string_addrepvalue(str, CG_XML_INDENT_STRING, indentLevel); if (!cg_string_naddvalue(str, "</", 2) || !cg_string_addvalue(str, name) || !cg_string_naddvalue(str, ">", 1) || !cg_string_addvalue(str, "\n")) /* Memory allocation failed */ return NULL; cg_log_debug_l4("Leaving...\n"); return cg_string_getvalue(str); }
char *cg_net_uri_unescapestring(char *buf, int bufSize, CgString *retBuf) { #if defined(CG_HTTP_CURL) char *tmp; #else int n; char hexStr[3]; long hex; unsigned char c; #endif int idx = 0; #if defined(CG_USE_NET_URI_ESCAPESTRING_SKIP) int tmpIdx = 0; #endif cg_log_debug_l4("Entering...\n"); if (!retBuf) return NULL; /* Check if URI is already escaped */ if (cg_net_uri_isescapedstring(buf + idx, bufSize) == TRUE) return buf; /* We can safely assume that the non-path part is already escaped */ #if defined(CG_USE_NET_URI_ESCAPESTRING_SKIP) idx = cg_strstr(buf, CG_NET_URI_PROTOCOL_DELIM); if (idx > 0) { idx = idx + cg_strlen(CG_NET_URI_PROTOCOL_DELIM); tmpIdx = cg_strstr(buf + idx, CG_NET_URI_SLASH_DELIM); if (tmpIdx > 0) idx += tmpIdx + cg_strlen(CG_NET_URI_SLASH_DELIM); } else { idx = 0; } #endif if (bufSize < 1) bufSize = cg_strlen(buf) + 1; #if defined(CG_HTTP_CURL) tmp = curl_unescape(buf + idx, 0); if (tmp == NULL) return NULL; cg_string_addvalue(retBuf, tmp); cg_log_debug_s("%s ==> %s\n", buf + idx, tmp); curl_free(tmp); #else for (n=0; n<bufSize;) { c = (unsigned char)buf[n]; if (buf[n] == '%' && cg_net_uri_isalphanumchar(buf[n+1]) && cg_net_uri_isalphanumchar(buf[n+2])) { hexStr[0] = buf[n+1]; hexStr[1] = buf[n+2]; hexStr[2] = '\0'; hex = strtol(hexStr, NULL, 16); c = (unsigned char)hex; n += 3; } else n++; cg_string_naddvalue(retBuf, (char *)&c, 1); } #endif cg_log_debug_l4("Leaving...\n"); return cg_string_getvalue(retBuf); }
BOOL cg_xml_parse(CgXmlParser *parser, CgXmlNodeList *nodeList, const char *data, size_t len) { #if defined DEBUG_XML_RESULT CgString* resdata = NULL; #endif XML_Parser p; CgExpatData expatData; #ifdef CG_SHOW_TIMINGS struct timeval start_time, end_time, elapsed_time; #endif cg_log_debug_l4("Entering...\n"); #ifdef CG_SHOW_TIMINGS gettimeofday(&start_time, NULL); #endif if (!data || len <= 0) return FALSE; p = XML_ParserCreate(NULL); if (!p) return FALSE; /* Fix to get expat parser to work with DLink-routers */ if (data[len-1] == 0) len--; expatData.rootNode = NULL; expatData.currNode = NULL; XML_SetUserData(p, &expatData); XML_SetElementHandler(p, cg_expat_element_start, cg_expat_element_end); XML_SetCharacterDataHandler(p, cg_expat_character_data); parser->parseResult = XML_Parse(p, data, len, 1); XML_ParserFree(p); if (parser->parseResult == 0 /*XML_STATUS_ERROR*/) { if (expatData.rootNode != NULL) cg_xml_node_delete(expatData.rootNode); #if defined DEBUG_XML_RESULT resdata = cg_string_new(); cg_string_naddvalue(resdata,data,len); printf("XML parse Error on data %s\n time used = %ds\n", cg_string_getvalue(resdata), time(NULL)-startTime); cg_string_delete(resdata); #endif return FALSE; } cg_xml_nodelist_add(nodeList, expatData.rootNode); #ifdef CG_SHOW_TIMINGS gettimeofday(&end_time, NULL); timersub(&end_time, &start_time, &elapsed_time); cg_log_debug_s("Parsing XML completed. Elapsed time: " "%ld msec\n", ((elapsed_time.tv_sec*1000) + (elapsed_time.tv_usec/1000))); cg_total_elapsed_time += (elapsed_time.tv_sec*1000000)+ (elapsed_time.tv_usec); cg_log_debug_s("Total elapsed time: %ld msec\n", cg_total_elapsed_time / 1000); #endif #if defined DEBUG_XML_RESULT resdata = cg_string_new(); cg_string_naddvalue(resdata,data,len); printf("XML parse success - time used %ds\n",time(NULL)-startTime); cg_string_delete(resdata); #endif return TRUE; cg_log_debug_l4("Leaving...\n"); }