X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fdom%2Furi.cpp;h=13b76c413d3a962a685bd505cec1e5be3a842609;hb=723b4d8bde8ce8503d1d01ee0f2e3548ec0dc88c;hp=af808f40dfc99c508b6872d469d58ad818bea29e;hpb=eb273c67144b8e1690737756bddc8e008e89f784;p=inkscape.git diff --git a/src/dom/uri.cpp b/src/dom/uri.cpp index af808f40d..13b76c413 100644 --- a/src/dom/uri.cpp +++ b/src/dom/uri.cpp @@ -35,7 +35,7 @@ #include #include - +#include namespace org @@ -49,7 +49,7 @@ namespace dom typedef struct { int ival; - char *sval; + char const *sval; int port; } LookupEntry; @@ -142,14 +142,14 @@ void URI::init() parsebuf = NULL; parselen = 0; scheme = SCHEME_NONE; - schemeStr = ""; + schemeStr.clear(); port = 0; - authority = ""; - path = ""; + authority.clear(); + path.clear(); absolute = false; opaque = false; - query = ""; - fragment = ""; + query.clear(); + fragment.clear(); } @@ -173,6 +173,29 @@ void URI::assign(const URI &other) //######################################################################### //#A T T R I B U T E S //######################################################################### +static char *hexChars = "0123456789abcdef"; + +static DOMString toStr(const std::vector &arr) +{ + DOMString buf; + std::vector::const_iterator iter; + for (iter=arr.begin() ; iter!=arr.end() ; iter++) + { + int ch = *iter; + if (isprint(ch)) + buf.push_back((XMLCh)ch); + else + { + buf.push_back('%'); + int hi = ((ch>>4) & 0xf); + buf.push_back(hexChars[hi]); + int lo = ((ch ) & 0xf); + buf.push_back(hexChars[lo]); + } + } + return buf; +} + DOMString URI::toString() const { @@ -180,18 +203,18 @@ DOMString URI::toString() const if (authority.size() > 0) { str.append("//"); - str.append(authority); + str.append(toStr(authority)); } - str.append(path); + str.append(toStr(path)); if (query.size() > 0) { str.append("?"); - str.append(query); + str.append(toStr(query)); } if (fragment.size() > 0) { str.append("#"); - str.append(fragment); + str.append(toStr(fragment)); } return str; } @@ -210,7 +233,7 @@ DOMString URI::getSchemeStr() const DOMString URI::getAuthority() const { - DOMString ret = authority; + DOMString ret = toStr(authority); if (portSpecified && port>=0) { char buf[7]; @@ -222,7 +245,8 @@ DOMString URI::getAuthority() const DOMString URI::getHost() const { - return authority; + DOMString str = toStr(authority); + return str; } int URI::getPort() const @@ -233,31 +257,33 @@ int URI::getPort() const DOMString URI::getPath() const { - return path; + DOMString str = toStr(path); + return str; } DOMString URI::getNativePath() const { + DOMString pathStr = toStr(path); DOMString npath; #ifdef __WIN32__ unsigned int firstChar = 0; - if (path.size() >= 3) + if (pathStr.size() >= 3) { - if (path[0] == '/' && - isLetter(path[1]) && - path[2] == ':') + if (pathStr[0] == '/' && + isLetter(pathStr[1]) && + pathStr[2] == ':') firstChar++; } - for (unsigned int i=firstChar ; i &str, int ch, int startpos) +{ + for (unsigned int i = startpos ; i < str.size() ; i++) + { + if (ch == str[i]) + return i; + } + return -1; +} + + +static int findLast(const std::vector &str, int ch) +{ + // TODO FIXME BUGBUG + // This loop appears to be infinite, so it is probably not being called. + // Test for a problem, then fix after it has been observed locking up. + for (unsigned int i = str.size()-1 ; i>=0 ; i--) + { + if (ch == str[i]) + return i; + } + return -1; +} + + +static bool sequ(const std::vector &str, char *key) +{ + char *c = key; + for (unsigned int i=0 ; i substr(const std::vector &str, + int startpos, int len) +{ + std::vector buf; + unsigned int pos = startpos; + for (int i=0 ; i= str.size()) + break; + buf.push_back(str[pos++]); + } + return buf; } @@ -332,12 +416,16 @@ URI URI::resolve(const URI &other) const } else { - DOMString::size_type pos = path.find_last_of('/'); - if (pos != path.npos) + int pos = findLast(path, '/'); + if (pos >= 0) { - DOMString tpath = path.substr(0, pos+1); - tpath.append(other.path); - newUri.path = tpath; + newUri.path.clear(); + //# append my path up to and including the '/' + for (int i = 0; i<=pos ; i++) + newUri.path.push_back(path[i]); + //# append other path + for (unsigned int i = 0; i segments; + std::vector< std::vector > segments; //## Collect segments if (path.size()<2) return; bool abs = false; - unsigned int pos=0; + int pos=0; + int len = (int) path.size(); + if (path[0]=='/') { abs = true; pos++; } - while (pos < path.size()) + + while (pos < len) { - DOMString::size_type pos2 = path.find('/', pos); - if (pos2==path.npos) + int pos2 = find(path, '/', pos); + if (pos2 < 0) { - DOMString seg = path.substr(pos); - //printf("last segment:%s\n", seg.c_str()); + std::vector seg = substr(path, pos, path.size()-pos); + //printf("last segment:%s\n", toStr(seg).c_str()); segments.push_back(seg); break; } if (pos2>pos) { - DOMString seg = path.substr(pos, pos2-pos); - //printf("segment:%s\n", seg.c_str()); + std::vector seg = substr(path, pos, pos2-pos); + //printf("segment:%s\n", toStr(seg).c_str()); segments.push_back(seg); } pos = pos2; @@ -398,18 +490,17 @@ void URI::normalize() //## Clean up (normalize) segments bool edited = false; - std::vector::iterator iter; + std::vector< std::vector >::iterator iter; for (iter=segments.begin() ; iter!=segments.end() ; ) { - DOMString s = *iter; - if (s == ".") + std::vector s = *iter; + if (sequ(s,".")) { iter = segments.erase(iter); edited = true; } - else if (s == ".." && - iter != segments.begin() && - *(iter-1) != "..") + else if (sequ(s, "..") && iter != segments.begin() && + !sequ(*(iter-1), "..")) { iter--; //back up, then erase two entries iter = segments.erase(iter); @@ -426,14 +517,16 @@ void URI::normalize() path.clear(); if (abs) { - path.append("/"); + path.push_back('/'); } - std::vector::iterator iter; + std::vector< std::vector >::iterator iter; for (iter=segments.begin() ; iter!=segments.end() ; iter++) { if (iter != segments.begin()) - path.append("/"); - path.append(*iter); + path.push_back('/'); + std::vector seg = *iter; + for (unsigned int i = 0; i= '0' && ch <= '9') val += (ch - '0'); else if (ch >= 'a' && ch <= 'f') @@ -535,6 +628,7 @@ int URI::parseHex(int p0, int &result) error("parseHex : unexpected character : %c", ch); return -1; } + p++; result = val; return p; } @@ -544,7 +638,7 @@ int URI::parseHex(int p0, int &result) int URI::parseEntity(int p0, int &result) { int p = p0; - XMLCh ch = peek(p); + int ch = peek(p); if (ch != '&') return p0; p++; @@ -558,6 +652,13 @@ int URI::parseEntity(int p0, int &result) p = parseHex(p, val); if (p<0) return -1; + ch = peek(p); + if (ch != ';') + { + error("parseEntity: expected ';'"); + return -1; + } + p++; result = val; return p; } @@ -565,7 +666,7 @@ int URI::parseEntity(int p0, int &result) int URI::parseAsciiEntity(int p0, int &result) { int p = p0; - XMLCh ch = peek(p); + int ch = peek(p); if (ch != '%') return p0; p++; @@ -615,13 +716,43 @@ int URI::parseHierarchicalPart(int p0) ch = peek(p); if (ch == '/') break; + else if (ch == '&') //IRI entity + { + int val; + p2 = parseEntity(p, val); + if (p2 0) { @@ -682,7 +813,7 @@ int URI::parseHierarchicalPart(int p0) p++; } } - + //trace("path:%s", toStr(path).c_str()); return p; } @@ -721,7 +852,7 @@ int URI::parseFragment(int p0) ch = peek(p); if (ch == '?') break; - fragment.push_back((XMLCh)ch); + fragment.push_back(ch); p++; } @@ -779,22 +910,30 @@ bool URI::parse(const DOMString &str) { parselen = str.size(); + parsebuf = new int[str.size()]; + if (!parsebuf) + { + error("parse : could not allocate parsebuf"); + return false; + } - DOMString tmp; - for (unsigned int i=0 ; i