Index: COLLADABaseUtils/src/COLLADABUURI.cpp
===================================================================
--- COLLADABaseUtils/src/COLLADABUURI.cpp	(revision 568)
+++ COLLADABaseUtils/src/COLLADABUURI.cpp	(working copy)
@@ -26,8 +26,52 @@
 	const String URI::SCHEME_HTTP = "http";
 	const String URI::SCHEME_HTTPS = "https";
 
+	// compiled on runtime but only once 
+	static pcre *re_matchURI = NULL;
+	static pcre *re_findDir = NULL;
+	static pcre *re_findExt = NULL;
 
+	enum RegexpType {
+		REGEXP_URI,
+		REGEXP_DIR,
+		REGEXP_EXT,
+	};
 
+	static void compileRegexps()
+	{
+		const char* error;
+		int erroffset;
+		re_matchURI = pcre_compile("^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?",
+								0, &error, &erroffset, NULL);
+		if (!re_matchURI)
+			fprintf(stderr, "Error compiling re_matchURI: %s\n", error);
+
+		re_findDir = pcre_compile("(.*/)?(.*)?", 0, &error, &erroffset, NULL);
+		if (!re_findDir)
+			fprintf(stderr, "Error compiling re_findDir: %s\n", error);
+
+		re_findExt = pcre_compile("([^.]*)?(\\.(.*))?", 0, &error, &erroffset, NULL);
+		if (!re_findExt)
+			fprintf(stderr, "Error compiling re_findExt: %s\n", error);
+	}
+
+	static pcre* getCompiledRegexp(RegexpType type)
+	{
+		if (!re_matchURI)
+			compileRegexps();
+
+		switch(type) {
+		case REGEXP_URI:
+			return re_matchURI;
+		case REGEXP_DIR:
+			return re_findDir;
+		case REGEXP_EXT:
+			return re_findExt;
+		}
+		
+		return NULL;
+	}
+
 	const char HEX2DEC[256] = 
 	{
 		/*       0  1  2  3   4  5  6  7   8  9  A  B   C  D  E  F */
@@ -266,15 +310,13 @@
 			// /tmp/se.3/file
 
 			// regular expression: "(.*/)?(.*)?"
-			static const char _findDir[71]={69,82,67,80,71,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,0,0,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,94,0,27,103,95,0,9,0,1,57,12,28,47,
-				85,0,9,103,95,0,7,0,2,57,12,85,0,7,85,0,27,0,};
-			pcre* findDir = (pcre*) _findDir;
+			// static const char _findDir[71]={69,82,67,80,71,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,0,0,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,94,0,27,103,95,0,9,0,1,57,12,28,47,85,0,9,103,95,0,7,0,2,57,12,85,0,7,85,0,27,0,};
+			pcre* findDir = getCompiledRegexp(REGEXP_DIR);
 
 
 			// regular expression: "([^.]*)?(\.(.*))?"
-			static const char _findExt[79]={69,82,67,80,79,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,0,0,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,94,0,35,103,95,0,7,0,1,44,46,85,0,7
-				,103,95,0,17,0,2,28,46,95,0,7,0,3,57,12,85,0,7,85,0,17,85,0,35,0,};
-			pcre* findExt = (pcre*) _findExt;
+			// static const char _findExt[79]={69,82,67,80,79,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,0,0,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,94,0,35,103,95,0,7,0,1,44,46,85,0,7,103,95,0,17,0,2,28,46,95,0,7,0,3,57,12,85,0,7,85,0,17,85,0,35,0,};
+			pcre* findExt = getCompiledRegexp(REGEXP_EXT);
 			
 			String tmpFile;
 			dir.clear();
@@ -473,7 +515,7 @@
 	namespace {
 		void normalize(String& path) {
 			URI::normalizeURIPath(const_cast<char*>(path.c_str()));
-			path = path.substr(0, strlen(path.c_str()));
+			// path = path.substr(0, strlen(path.c_str()));
 		}
 	}
 
@@ -871,8 +913,8 @@
 		// This regular expression for parsing URI references comes from the URI spec:
 		//   http://tools.ietf.org/html/rfc3986#appendix-B
 		// regular expression: "^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?"
-		static const char _matchUri[240]={69,82,67,80,-16,0,0,0,16,0,0,0,1,0,0,0,9,0,0,0,0,0,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,94,0,-60,26,103,95,0,49,0,1,95, 0,39,0,2,79,-1,-1,-1,-1,-9,127,-1,123,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,72,85,0,39,28,58,85,0,49,103,95,0,51,0,3,28,47,28,47,95,0,39,0,4,79,-1,-1,-1,-1,-9,127,-1,127,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,70,85,0,39,85,0,51,95,0,39,0,5,79,-1,-1,-1,-1,-9,-1,-1,127,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,70,85,0,39,103,95,0,17,0,6,28,63,95,0,7,0,7,44,35,85,0,7,85,0,17,103,95,0,17,0,8,28,35,95,0,7,0,9,57,12,85,0,7,85,0,17,85,0,-60,0,};
-		pcre* matchUri = (pcre*) _matchUri;
+		// static const char _matchUri[240]={69,82,67,80,-16,0,0,0,16,0,0,0,1,0,0,0,9,0,0,0,0,0,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,94,0,-60,26,103,95,0,49,0,1,95, 0,39,0,2,79,-1,-1,-1,-1,-9,127,-1,123,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,72,85,0,39,28,58,85,0,49,103,95,0,51,0,3,28,47,28,47,95,0,39,0,4,79,-1,-1,-1,-1,-9,127,-1,127,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,70,85,0,39,85,0,51,95,0,39,0,5,79,-1,-1,-1,-1,-9,-1,-1,127,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,70,85,0,39,103,95,0,17,0,6,28,63,95,0,7,0,7,44,35,85,0,7,85,0,17,103,95,0,17,0,8,28,35,95,0,7,0,9,57,12,85,0,7,85,0,17,85,0,-60,0,};
+		pcre* matchUri = getCompiledRegexp(REGEXP_URI);
 
 
 		int uriMatches[regExpMatchesVectorLength];
