/* 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; }
//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; }