Exemplo n.º 1
0
/* parse execution range *RSTR to *RANGE */
char * /* error string, or NULL */
range_parse_range(char *rstr, /* execution range string */
struct range_range_t *range) /* range return buffer */
{
	char *pos1, *pos2, *p, buf[512], *errstr;

	/* make a copy of the execution range */
	strcpy(buf, rstr);
	pos1 = buf;

	/* find mid-point */
	p = buf;
	while (*p != ':' && *p != '\0') {
		p++;
	}
	if (*p != ':')
		return "badly formed execution range";
	*p = '\0';

	/* this is where the second position will start */
	pos2 = p + 1;

	/* parse start position */
	if (*pos1 && *pos1 != ':') {
		errstr = range_parse_pos(pos1, &range->start);
		if (errstr)
			return errstr;
	} else {
		/* default start range */
		range->start.ptype = pt_inst;
		range->start.pos = 0;
	}

	/* parse end position */
	if (*pos2) {
		if (*pos2 == '+') {
			int delta;
			char *endp;

			/* get delta value */
			errno = 0;
			delta = strtol(pos2 + 1, &endp, /* parse base */0);
			if (!errno && !*endp) {
				/* good conversion */
				range->end.ptype = range->start.ptype;
				range->end.pos = range->start.pos + delta;
			} else {
				/* bad conversion */
				return "badly formed execution range delta";
			}
		} else {
			errstr = range_parse_pos(pos2, &range->end);
			if (errstr)
				return errstr;
		}
	} else {
		/* default end range */
		range->end.ptype = range->start.ptype;
#ifdef HOST_HAS_QWORD
		range->end.pos = ULL(0x7fffffffffffffff);
#else /* !__GNUC__ */
		range->end.pos = 281474976645120.0;
#endif /* __GNUC__ */
	}

	/* no error */
	return NULL;
}
Exemplo n.º 2
0
//parse execution range *RSTR to *RANGE, returns error string or NULL
const char * range_parse_range(const char *rstr,	//execution range string
	range_range_t *range,				//range return buffer
	mem_t* my_mem)
{
	const char *errstr;

	//make a copy of the execution range
	std::string buf(rstr);

	//find mid-point
	std::size_t findcolon = buf.find(":");
	if(findcolon==std::string::npos)
		return "Badly formed execution range";

	buf[findcolon] = static_cast<char>(NULL);

	//this is where the second position will start
	findcolon++;

	//parse start position
	if((buf[0]!=static_cast<char>(NULL)) && (buf[0]!=':'))
	{
		errstr = range_parse_pos(&buf[0], &range->start, my_mem);
		if(errstr)
			return errstr;
	}
	else
	{
		//default start range
		range->start.ptype = pt_inst;
		range->start.pos = 0;
	}

	//parse end position
	if(buf[findcolon]!=static_cast<char>(NULL))
	{
		if(buf[findcolon] == '+')
		{
			char *endp;

			//get delta value
			errno = 0;
			int delta = strtol(&buf[findcolon+1], &endp, /*parse base*/0);
			if(!errno && !*endp)
			{
				//good conversion
				range->end.ptype = range->start.ptype;
				range->end.pos = range->start.pos + delta;
			}
			else
			{
				//bad conversion
				return "badly formed execution range delta";
			}
		}
		else
		{
			errstr = range_parse_pos(&buf[findcolon], &range->end, my_mem);
			if(errstr)
				return errstr;
		}
	}
	else
	{
		//default end range
		range->end.ptype = range->start.ptype;
		range->end.pos = ULL(0x7fffffffffffffff);
	}

	//no error
	return NULL;
}