📄 sdp-xml.c
字号:
{ struct conversion_data cd; cd.data = data; cd.appender = appender; if (rec && rec->attrlist) { appender(data, "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n\n"); appender(data, "<record>\n"); sdp_list_foreach(rec->attrlist, convert_raw_attr_to_xml_func, &cd); appender(data, "</record>\n"); }}static sdp_data_t *sdp_xml_parse_uuid128(const char *data){ uint128_t val; int i; int j; char buf[3]; memset(&val, 0, sizeof(val)); buf[2] = '\0'; for (j = 0, i = 0; i < strlen(data);) { if (data[i] == '-') { i++; continue; } buf[0] = data[i]; buf[1] = data[i + 1]; val.data[j++] = strtoul(buf, 0, 16); i += 2; } return sdp_data_alloc(SDP_UUID128, &val);}sdp_data_t *sdp_xml_parse_uuid(const char *data, sdp_record_t *record){ sdp_data_t *ret; char *endptr; uint32_t val; uint16_t val2; int len; len = strlen(data); if (len == 36) { ret = sdp_xml_parse_uuid128(data); goto result; } val = strtoll(data, &endptr, 16); /* Couldn't parse */ if (*endptr != '\0') return NULL; if (val > USHRT_MAX) { ret = sdp_data_alloc(SDP_UUID32, &val); goto result; } val2 = val; ret = sdp_data_alloc(SDP_UUID16, &val2);result: if (record && ret) sdp_pattern_add_uuid(record, &ret->val.uuid); return ret;}sdp_data_t *sdp_xml_parse_int(const char * data, uint8_t dtd){ char *endptr; sdp_data_t *ret = NULL; switch (dtd) { case SDP_BOOL: { uint8_t val = 0; if (!strcmp("true", data)) { val = 1; } else if (!strcmp("false", data)) { val = 0; } else { return NULL; } ret = sdp_data_alloc(dtd, &val); break; } case SDP_INT8: { int8_t val = strtoul(data, &endptr, 0); /* Failed to parse */ if ((endptr != data) && (*endptr != '\0')) return NULL; ret = sdp_data_alloc(dtd, &val); break; } case SDP_UINT8: { uint8_t val = strtoul(data, &endptr, 0); /* Failed to parse */ if ((endptr != data) && (*endptr != '\0')) return NULL; ret = sdp_data_alloc(dtd, &val); break; } case SDP_INT16: { int16_t val = strtoul(data, &endptr, 0); /* Failed to parse */ if ((endptr != data) && (*endptr != '\0')) return NULL; ret = sdp_data_alloc(dtd, &val); break; } case SDP_UINT16: { uint16_t val = strtoul(data, &endptr, 0); /* Failed to parse */ if ((endptr != data) && (*endptr != '\0')) return NULL; ret = sdp_data_alloc(dtd, &val); break; } case SDP_INT32: { int32_t val = strtoul(data, &endptr, 0); /* Failed to parse */ if ((endptr != data) && (*endptr != '\0')) return NULL; ret = sdp_data_alloc(dtd, &val); break; } case SDP_UINT32: { uint32_t val = strtoul(data, &endptr, 0); /* Failed to parse */ if ((endptr != data) && (*endptr != '\0')) return NULL; ret = sdp_data_alloc(dtd, &val); break; } case SDP_INT64: { int64_t val = strtoull(data, &endptr, 0); /* Failed to parse */ if ((endptr != data) && (*endptr != '\0')) return NULL; ret = sdp_data_alloc(dtd, &val); break; } case SDP_UINT64: { uint64_t val = strtoull(data, &endptr, 0); /* Failed to parse */ if ((endptr != data) && (*endptr != '\0')) return NULL; ret = sdp_data_alloc(dtd, &val); break; } case SDP_INT128: case SDP_UINT128: { uint128_t val; int i = 0; char buf[3]; buf[2] = '\0'; for (; i < 32; i += 2) { buf[0] = data[i]; buf[1] = data[i + 1]; val.data[i >> 1] = strtoul(buf, 0, 16); } ret = sdp_data_alloc(dtd, &val); break; } }; return ret;}static char *sdp_xml_parse_string_decode(const char *data, char encoding, uint32_t *length){ int len = strlen(data); char *text; if (encoding == SDP_XML_ENCODING_NORMAL) { text = strdup(data); *length = len; } else { char buf[3], *decoded; int i; decoded = malloc((len >> 1) + 1); /* Ensure the string is a power of 2 */ len = (len >> 1) << 1; buf[2] = '\0'; for (i = 0; i < len; i += 2) { buf[0] = data[i]; buf[1] = data[i + 1]; decoded[i >> 1] = strtoul(buf, 0, 16); } decoded[len >> 1] = '\0'; text = decoded; *length = len >> 1; } return text;}sdp_data_t *sdp_xml_parse_url(const char *data){ uint8_t dtd = SDP_URL_STR8; char *url; uint32_t length; sdp_data_t *ret; url = sdp_xml_parse_string_decode(data, SDP_XML_ENCODING_NORMAL, &length); if (length > UCHAR_MAX) dtd = SDP_URL_STR16; ret = sdp_data_alloc_with_length(dtd, url, length); debug("URL size %d length %d: -->%s<--", ret->unitSize, length, url); free(url); return ret;}sdp_data_t *sdp_xml_parse_text(const char *data, char encoding){ uint8_t dtd = SDP_TEXT_STR8; char *text; uint32_t length; sdp_data_t *ret; text = sdp_xml_parse_string_decode(data, encoding, &length); if (length > UCHAR_MAX) dtd = SDP_TEXT_STR16; ret = sdp_data_alloc_with_length(dtd, text, length); debug("Text size %d length %d: -->%s<--", ret->unitSize, length, text); free(text); return ret;}sdp_data_t *sdp_xml_parse_nil(const char *data){ return sdp_data_alloc(SDP_DATA_NIL, 0);}#define DEFAULT_XML_DATA_SIZE 1024struct sdp_xml_data *sdp_xml_data_alloc(){ struct sdp_xml_data *elem; elem = malloc(sizeof(struct sdp_xml_data)); if (!elem) return NULL; memset(elem, 0, sizeof(struct sdp_xml_data)); /* Null terminate the text */ elem->size = DEFAULT_XML_DATA_SIZE; elem->text = malloc(DEFAULT_XML_DATA_SIZE); elem->text[0] = '\0'; return elem;}void sdp_xml_data_free(struct sdp_xml_data *elem){ if (elem->data) sdp_data_free(elem->data); if (elem->name) free(elem->name); if (elem->text) free(elem->text); free(elem);}struct sdp_xml_data *sdp_xml_data_expand(struct sdp_xml_data *elem){ char *newbuf; newbuf = malloc(elem->size * 2); if (!newbuf) return NULL; memcpy(newbuf, elem->text, elem->size); elem->size *= 2; free(elem->text); elem->text = newbuf; return elem;}sdp_data_t *sdp_xml_parse_datatype(const char *el, struct sdp_xml_data *elem, sdp_record_t *record){ const char *data = elem->text; if (!strcmp(el, "boolean")) return sdp_xml_parse_int(data, SDP_BOOL); else if (!strcmp(el, "uint8")) return sdp_xml_parse_int(data, SDP_UINT8); else if (!strcmp(el, "uint16")) return sdp_xml_parse_int(data, SDP_UINT16); else if (!strcmp(el, "uint32")) return sdp_xml_parse_int(data, SDP_UINT32); else if (!strcmp(el, "uint64")) return sdp_xml_parse_int(data, SDP_UINT64); else if (!strcmp(el, "uint128")) return sdp_xml_parse_int(data, SDP_UINT128); else if (!strcmp(el, "int8")) return sdp_xml_parse_int(data, SDP_INT8); else if (!strcmp(el, "int16")) return sdp_xml_parse_int(data, SDP_INT16); else if (!strcmp(el, "int32")) return sdp_xml_parse_int(data, SDP_INT32); else if (!strcmp(el, "int64")) return sdp_xml_parse_int(data, SDP_INT64); else if (!strcmp(el, "int128")) return sdp_xml_parse_int(data, SDP_INT128); else if (!strcmp(el, "uuid")) return sdp_xml_parse_uuid(data, record); else if (!strcmp(el, "url")) return sdp_xml_parse_url(data); else if (!strcmp(el, "text")) return sdp_xml_parse_text(data, elem->type); else if (!strcmp(el, "nil")) return sdp_xml_parse_nil(data); return NULL;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -