static char * qglsa_get_xml_tag_attribute(const char *xml_buf, const char *tag, const char *attribute) { static char tmp_buf[BUFSIZE]; char *start, *end, *start_attr, *end_attr; /* find the start of this tag */ sprintf(tmp_buf, "<%s ", tag); if ((start = strstr(xml_buf, tmp_buf)) == NULL) return NULL; /* find the end of this tag */ start += strlen(tmp_buf) - 1; if ((end = strchr(start, '>')) == NULL) return NULL; /* find the attribute in this tag */ sprintf(tmp_buf, " %s=", attribute); if ((start_attr = strstr(start, tmp_buf)) == NULL) return NULL; /* get the value */ start_attr += strlen(tmp_buf); if (*start_attr == '"') { end_attr = strchr(++start_attr, '"'); } else { end_attr = strchr(start_attr, ' '); } assert(end_attr - start_attr < sizeof(tmp_buf)); memcpy(tmp_buf, start_attr, end_attr-start_attr); tmp_buf[end_attr-start_attr] = '\0'; qglsa_decode_entities(tmp_buf, end-start); return tmp_buf; }
static char *qglsa_get_xml_tag(const char *xml_buf, const char *tag) { static char tmp_buf[BUFSIZE]; char *start, *end; sprintf(tmp_buf, "<%s>", tag); if ((start = strstr(xml_buf, tmp_buf)) == NULL) { sprintf(tmp_buf, "<%s ", tag); if ((start = strstr(xml_buf, tmp_buf)) == NULL) return NULL; } start += strlen(tmp_buf); sprintf(tmp_buf, "</%s>", tag); if ((end = strstr(start, tmp_buf)) == NULL) return NULL; assert(end - start < sizeof(tmp_buf)); memcpy(tmp_buf, start, end - start); tmp_buf[end - start] = '\0'; qglsa_decode_entities(tmp_buf, end-start); return tmp_buf; }