Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
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;
}
Пример #4
0
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;
}