char * ROXML_API roxml_get_name(node_t *n, char * buffer, int size) { int offset = 0; int count = 0; char tmp_name[INTERNAL_BUF_SIZE]; memset(tmp_name, 0, INTERNAL_BUF_SIZE*sizeof(char)); if(buffer) { memset(buffer, 0, size*sizeof(char)); } if(n == NULL) { if(buffer) { strcpy(buffer, ""); } return buffer; } if(n->prnt == NULL) { strcpy(tmp_name, "documentRoot"); } else if(n->type & ROXML_NS_NODE) { roxml_ns_t * ns = (roxml_ns_t*)n->priv; if(ns) { strcpy(tmp_name, ns->alias); } else { tmp_name[0] ='\0'; } } else if((n->type & ROXML_TXT_NODE) || (n->type & ROXML_CMT_NODE)) { if(buffer) { strcpy(buffer, ""); return buffer; } return NULL; } else { int spec_offset = 0; if(n->type & ROXML_PI_NODE) { spec_offset = 2; } else if(n->type & ROXML_DOCTYPE_NODE) { spec_offset = 1; } roxml_read(n->pos+spec_offset, INTERNAL_BUF_SIZE, tmp_name, n); while(ROXML_WHITE(tmp_name[offset]) || tmp_name[offset] == '<') { offset++; } count = offset; if(n->type & ROXML_PI_NODE) { for(;count < INTERNAL_BUF_SIZE; count++) { if(ROXML_WHITE(tmp_name[count])) { break; } else if((tmp_name[count] == '?')&&(tmp_name[count+1] == '>')) { break; } } } else if(n->type & ROXML_ELM_NODE) { for(;count < INTERNAL_BUF_SIZE; count++) { if(ROXML_WHITE(tmp_name[count])) { break; } else if((tmp_name[count] == '/')&&(tmp_name[count+1] == '>')) { break; } else if(tmp_name[count] == '>') { break; } } } else if(n->type & ROXML_ATTR_NODE) { for(;count < INTERNAL_BUF_SIZE; count++) { if(ROXML_WHITE(tmp_name[count])) { break; } else if(tmp_name[count] == '=') { break; } else if(tmp_name[count] == '>') { break; } else if((tmp_name[count] == '/')&&(tmp_name[count+1] == '>')) { break; } } } else if(n->type & ROXML_DOCTYPE_NODE) { for(;count < INTERNAL_BUF_SIZE; count++) { if(ROXML_WHITE(tmp_name[count])) { break; } else if(tmp_name[count] == '>') { break; } } } tmp_name[count] = '\0'; } if(buffer == NULL) { buffer = (char*)roxml_malloc(sizeof(char), strlen(tmp_name)-offset+1, PTR_CHAR); strcpy(buffer, tmp_name+offset); } else { if(strlen(tmp_name)-offset < (unsigned int)size) { size = strlen(tmp_name)-offset; } strncpy(buffer, tmp_name+offset, size); } return buffer; }
char * ROXML_API roxml_get_name(node_t *n, char * buffer, int size) { int count = 0; char tmp_name[INTERNAL_BUF_SIZE]; memset(tmp_name, 0, INTERNAL_BUF_SIZE*sizeof(char)); if(buffer) { memset(buffer, 0, size*sizeof(char)); } if(n == NULL) { if(buffer) { strcpy(buffer, ""); } return buffer; } if(n->prnt == NULL) { strcpy(tmp_name, "documentRoot"); } else if(n->type & ROXML_ATTR_NODE) { int offset = 0; char *internal_ptr; char internal_buf[INTERNAL_BUF_SIZE]; roxml_read(n->pos, INTERNAL_BUF_SIZE, internal_buf, n); internal_ptr = internal_buf; while(ROXML_WHITE(internal_ptr[offset])) { offset++; } while(count<INTERNAL_BUF_SIZE) { if(internal_ptr[offset] == '=') { break; } if(internal_ptr[offset] == '/') { break; } if(internal_ptr[offset] == '>') { break; } tmp_name[count] = internal_ptr[offset]; offset++; count++; } } else if(n->type & ROXML_ELM_NODE) { int offset = 0; char *internal_ptr; char internal_buf[INTERNAL_BUF_SIZE]; roxml_read(n->pos, INTERNAL_BUF_SIZE, internal_buf, n); internal_ptr = internal_buf; while((internal_ptr[offset] == '<')||(ROXML_WHITE(internal_ptr[offset]))) { offset++; } while(count<INTERNAL_BUF_SIZE) { if(internal_ptr[offset] == '/') { break; } if(internal_ptr[offset] == '>') { break; } if(ROXML_WHITE(internal_ptr[offset])) { break; } tmp_name[count] = internal_ptr[offset]; offset++; count++; } } else if(n->type & ROXML_TXT_NODE) { if(buffer) { strcpy(buffer, ""); return buffer; } return NULL; } else if(n->type & ROXML_CMT_NODE) { if(buffer) { strcpy(buffer, ""); return buffer; } return NULL; } else if(n->type & ROXML_PI_NODE) { if(buffer) { strcpy(buffer, ""); return buffer; } return NULL; } if(buffer == NULL) { buffer = (char*)roxml_malloc(sizeof(char), strlen(tmp_name)+1, PTR_CHAR); strcpy(buffer, tmp_name); } else { if(strlen(tmp_name) < (unsigned int)size) { size = strlen(tmp_name); } strncpy(buffer, tmp_name, size); } return buffer; }
char * ROXML_API roxml_get_content(node_t *n, char * buffer, int bufsize, int *size) { int total = 0; char * content = buffer; if(n == NULL) { if(size) { *size = 0; } if(buffer) { strcpy(buffer, ""); return buffer; } return NULL; } else if(n->type & ROXML_ELM_NODE) { node_t *ptr = n->chld; while(ptr) { if((ptr->type & ROXML_NODE_TYPES) == ROXML_TXT_NODE) { total += ptr->end - ptr->pos; } ptr = ptr->sibl; } if(content == NULL) { content = roxml_malloc(sizeof(char), total+1, PTR_CHAR); bufsize = total+1; } if(content == NULL) { return NULL; } total = 0; ptr = n->chld; while(ptr) { if((ptr->type & ROXML_NODE_TYPES) == ROXML_TXT_NODE) { int ret_len = 0; int read_size = ptr->end - ptr->pos; if(total+read_size > bufsize-1) { read_size = bufsize - total - 1; } ret_len += roxml_read(ptr->pos, read_size, content+total, ptr); total += ret_len; } ptr = ptr->sibl; } } else { node_t *target = n; char name[ROXML_BASE_LEN]; int read_size = 0; int name_len = 0; int spec_offset = 0; roxml_get_name(n, name, ROXML_BASE_LEN); name_len = strlen(name); if(n->type & ROXML_DOCTYPE_NODE) { total = target->end - target->pos - name_len - 2; spec_offset = target->pos + name_len + 2; } else if(n->type & ROXML_TXT_NODE) { total = target->end - target->pos; spec_offset = target->pos; } else if(n->type & ROXML_CMT_NODE) { total = target->end - target->pos - 4; spec_offset = target->pos + 4; } else if(n->type & ROXML_PI_NODE) { total = target->end - target->pos - name_len - 3; spec_offset = target->pos + name_len + 3; } else if(n->type & ROXML_ATTR_NODE) { target = n->chld; if(target) { spec_offset = target->pos; total = target->end - target->pos; } else { spec_offset = 0; total = 0; } } if(content == NULL) { content = roxml_malloc(sizeof(char), total+1, PTR_CHAR); bufsize = total+1; } if(content == NULL) { return NULL; } read_size = total; if(read_size > bufsize-1) { read_size = bufsize-1; } total = roxml_read(spec_offset, read_size, content, target); } content[total] = '\0'; if(size) { *size = total+1; } return content; }
char * ROXML_API roxml_get_content(node_t *n, char * buffer, int bufsize, int *size) { node_t * ptr; int total = 0; char * content = buffer; if(n == NULL) { if(size) { *size = 0; } if(buffer) { strcpy(buffer, ""); return buffer; } return NULL; } if(n->type & ROXML_ELM_NODE) { ptr = n->text; while(ptr) { total += ptr->end - ptr->pos; ptr = ptr->sibl; } if(content == NULL) { content = roxml_malloc(sizeof(char), total+1, PTR_CHAR); bufsize = total+1; } if(content == NULL) { return NULL; } total = 0; ptr = n->text; while(ptr) { int ret_len = 0; int read_size = ptr->end - ptr->pos; if(total+read_size > bufsize-1) { read_size = bufsize - total - 1; } ret_len += roxml_read(ptr->pos, read_size, content+total, ptr); total += ret_len; ptr = ptr->sibl; } } else if(n->type & ROXML_TXT_NODE) { int read_size = 0; total = n->end - n->pos; if(content == NULL) { content = roxml_malloc(sizeof(char), total+1, PTR_CHAR); bufsize = total+1; } if(content == NULL) { return NULL; } read_size = total; if(read_size > bufsize-1) { read_size = bufsize-1; } total = roxml_read(n->pos, read_size, content, n); } else if(n->type & ROXML_CMT_NODE) { int read_size = 0; total = n->end - n->pos - 4; if(content == NULL) { content = roxml_malloc(sizeof(char), total+1, PTR_CHAR); bufsize = total+1; } if(content == NULL) { return NULL; } read_size = total; if(read_size > bufsize-1) { read_size = bufsize-1; } total = roxml_read(n->pos+4, read_size, content, n); } else if(n->type & ROXML_PI_NODE) { int read_size = 0; total = n->end - n->pos - 2; if(content == NULL) { content = roxml_malloc(sizeof(char), total+2, PTR_CHAR); bufsize = total+2; } if(content == NULL) { return NULL; } read_size = total; if(read_size > bufsize-1) { read_size = bufsize-1; } total = roxml_read(n->pos+2, read_size, content, n); } else if(n->type & ROXML_ATTR_NODE) { int read_size = 0; node_t *ptr = n->text; total = ptr->end - ptr->pos; if(content == NULL) { content = roxml_malloc(sizeof(char), total+1, PTR_CHAR); bufsize = total+1; } if(content == NULL) { return NULL; } read_size = total; if(read_size > bufsize-1) { read_size = bufsize-1; } total = roxml_read(ptr->pos, read_size, content, ptr); } content[total] = '\0'; if(size) { *size = total+1; } return content; }