int URI::parseHierarchicalPart(int p0) { int p = p0; int ch; //# Authority field (host and port, for example) int p2 = match(p, "//"); if (p2 > p) { p = p2; portSpecified = false; DOMString portStr; while (p < parselen) { ch = peek(p); if (ch == '/') break; else if (ch == '&') //IRI entity { int val; p2 = parseEntity(p, val); if (p2<p) { return -1; } p = p2; authority.push_back((XMLCh)val); } else if (ch == '%') //ascii hex excape { int val; p2 = parseAsciiEntity(p, val); if (p2<p) { return -1; } p = p2; authority.push_back((XMLCh)val); } else if (ch == ':') { portSpecified = true; p++; } else if (portSpecified) { portStr.push_back((XMLCh)ch); p++; } else { authority.push_back((XMLCh)ch); p++; } } if (portStr.size() > 0) { char *pstr = (char *)portStr.c_str(); char *endStr; long val = strtol(pstr, &endStr, 10); if (endStr > pstr) //successful parse? port = val; } } //# Are we absolute? ch = peek(p); if (uni_is_letter(ch) && peek(p+1)==':') { absolute = true; path.push_back((XMLCh)'/'); } else if (ch == '/') { absolute = true; if (p>p0) //in other words, if '/' is not the first char opaque = true; path.push_back((XMLCh)ch); p++; } while (p < parselen) { ch = peek(p); if (ch == '?' || ch == '#') break; else if (ch == '&') //IRI entity { int val; p2 = parseEntity(p, val); if (p2<p) { return -1; } p = p2; path.push_back((XMLCh)val); } else if (ch == '%') //ascii hex excape { int val; p2 = parseAsciiEntity(p, val); if (p2<p) { return -1; } p = p2; path.push_back((XMLCh)val); } else { path.push_back((XMLCh)ch); p++; } } //trace("path:%s", toStr(path).c_str()); return p; }