/* * Load the library with the file name 'name' residing in the same * directory as the reference library, whose pathname is 'referencePath'. */ static PRLibrary* loader_LoadLibInReferenceDir(const char* referencePath, const char* name) { PRLibrary* dlh = NULL; char* fullName = NULL; char* c; PRLibSpec libSpec; /* Remove the trailing filename from referencePath and add the new one */ c = strrchr(referencePath, PR_GetDirectorySeparator()); if (c) { size_t referencePathSize = 1 + c - referencePath; fullName = (char*)PORT_Alloc(strlen(name) + referencePathSize + 1); if (fullName) { memcpy(fullName, referencePath, referencePathSize); strcpy(fullName + referencePathSize, name); #ifdef DEBUG_LOADER PR_fprintf(PR_STDOUT, "\nAttempting to load fully-qualified %s\n", fullName); #endif libSpec.type = PR_LibSpec_Pathname; libSpec.value.pathname = fullName; dlh = PR_LoadLibraryWithFlags(libSpec, PR_LD_NOW | PR_LD_LOCAL #ifdef PR_LD_ALT_SEARCH_PATH /* allow library's dependencies to be found in the same directory * on Windows even if PATH is not set. Requires NSPR 4.8.1 . */ | PR_LD_ALT_SEARCH_PATH #endif ); PORT_Free(fullName); } } return dlh; }
/* * Load the library with the file name 'name' residing in the same * directory as the reference library, whose pathname is 'referencePath'. */ static PRLibrary* loader_LoadLibInReferenceDir(const char* referencePath, const char* name) { PRLibrary* dlh = NULL; char* fullName = NULL; char* c; PRLibSpec libSpec; /* Remove the trailing filename from referencePath and add the new one */ c = strrchr(referencePath, PR_GetDirectorySeparator()); if (c) { size_t referencePathSize = 1 + c - referencePath; fullName = (char*)PORT_Alloc(strlen(name) + referencePathSize + 1); if (fullName) { memcpy(fullName, referencePath, referencePathSize); strcpy(fullName + referencePathSize, name); #ifdef DEBUG_LOADER PR_fprintf(PR_STDOUT, "\nAttempting to load fully-qualified %s\n", fullName); #endif libSpec.type = PR_LibSpec_Pathname; libSpec.value.pathname = fullName; dlh = PR_LoadLibraryWithFlags(libSpec, PR_LD_NOW | PR_LD_LOCAL); PORT_Free(fullName); } } return dlh; }
static PRLibrary * sftkdb_LoadFromPath(const char *path, const char *libname) { char *c; int pathLen, nameLen, fullPathLen; char *fullPathName = NULL; PRLibSpec libSpec; PRLibrary *lib = NULL; /* strip of our parent's library name */ c = strrchr(path, PR_GetDirectorySeparator()); if (!c) { return NULL; /* invalid path */ } pathLen = (c-path)+1; nameLen = strlen(libname); fullPathLen = pathLen + nameLen +1; fullPathName = (char *)PORT_Alloc(fullPathLen); if (fullPathName == NULL) { return NULL; /* memory allocation error */ } PORT_Memcpy(fullPathName, path, pathLen); PORT_Memcpy(fullPathName+pathLen, libname, nameLen); fullPathName[fullPathLen-1] = 0; libSpec.type = PR_LibSpec_Pathname; libSpec.value.pathname = fullPathName; lib = PR_LoadLibraryWithFlags(libSpec, PR_LD_NOW | PR_LD_LOCAL); PORT_Free(fullPathName); return lib; }
/* ** OBSOLETE -- the function name is misspelled. */ PR_IMPLEMENT(char) PR_GetDirectorySepartor(void) { #if defined(DEBUG) static PRBool warn = PR_TRUE; if (warn) { warn = _PR_Obsolete("PR_GetDirectorySepartor()", "PR_GetDirectorySeparator()"); } #endif return PR_GetDirectorySeparator(); } /* PR_GetDirectorySepartor */
/** * Define OS-specific constants. * * This function creates or uses JS object |OS.Constants| to store * all its constants. */ bool DefineOSFileConstants(JSContext *cx, JSObject *global) { MOZ_ASSERT(gInitialized); if (gPaths == NULL) { // If an initialization error was ignored, we may end up with // |gInitialized == true| but |gPaths == NULL|. We cannot // |MOZ_ASSERT| this, as this would kill precompile_cache.js, // so we simply return an error. JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_CANT_OPEN, "OSFileConstants", "initialization has failed"); return false; } JSObject *objOS; if (!(objOS = GetOrCreateObjectProperty(cx, global, "OS"))) { return false; } JSObject *objConstants; if (!(objConstants = GetOrCreateObjectProperty(cx, objOS, "Constants"))) { return false; } // Build OS.Constants.libc JSObject *objLibc; if (!(objLibc = GetOrCreateObjectProperty(cx, objConstants, "libc"))) { return false; } if (!dom::DefineConstants(cx, objLibc, gLibcProperties)) { return false; } #if defined(XP_WIN) // Build OS.Constants.Win JSObject *objWin; if (!(objWin = GetOrCreateObjectProperty(cx, objConstants, "Win"))) { return false; } if (!dom::DefineConstants(cx, objWin, gWinProperties)) { return false; } #endif // defined(XP_WIN) // Build OS.Constants.Sys JSObject *objSys; if (!(objSys = GetOrCreateObjectProperty(cx, objConstants, "Sys"))) { return false; } nsCOMPtr<nsIXULRuntime> runtime = do_GetService(XULRUNTIME_SERVICE_CONTRACTID); if (runtime) { nsAutoCString os; DebugOnly<nsresult> rv = runtime->GetOS(os); MOZ_ASSERT(NS_SUCCEEDED(rv)); JSString* strVersion = JS_NewStringCopyZ(cx, os.get()); if (!strVersion) { return false; } jsval valVersion = STRING_TO_JSVAL(strVersion); if (!JS_SetProperty(cx, objSys, "Name", &valVersion)) { return false; } } // Build OS.Constants.Path JSObject *objPath; if (!(objPath = GetOrCreateObjectProperty(cx, objConstants, "Path"))) { return false; } // Locate libxul { nsAutoString xulPath(gPaths->libDir); xulPath.Append(PR_GetDirectorySeparator()); #if defined(XP_MACOSX) // Under MacOS X, for some reason, libxul is called simply "XUL" xulPath.Append(NS_LITERAL_STRING("XUL")); #else // On other platforms, libxul is a library "xul" with regular // library prefix/suffix xulPath.Append(NS_LITERAL_STRING(DLL_PREFIX)); xulPath.Append(NS_LITERAL_STRING("xul")); xulPath.Append(NS_LITERAL_STRING(DLL_SUFFIX)); #endif // defined(XP_MACOSX) if (!SetStringProperty(cx, objPath, "libxul", xulPath)) { return false; } } if (!SetStringProperty(cx, objPath, "libDir", gPaths->libDir)) { return false; } if (!SetStringProperty(cx, objPath, "tmpDir", gPaths->tmpDir)) { return false; } // Configure profileDir only if it is available at this stage if (!gPaths->profileDir.IsVoid() && !SetStringProperty(cx, objPath, "profileDir", gPaths->profileDir)) { return false; } // Configure localProfileDir only if it is available at this stage if (!gPaths->localProfileDir.IsVoid() && !SetStringProperty(cx, objPath, "localProfileDir", gPaths->localProfileDir)) { return false; } return true; }
/** * Run a category of Xalan tests */ void runCategory(nsIFile* aConfCat, nsIFile* aGoldCat, nsIFile* aRefTmp, txRDFOut* aOut) { nsresult rv; //clone the nsIFiles, so that we can return easily nsCOMPtr<nsIFile> conf, gold; aConfCat->Clone(getter_AddRefs(conf)); aGoldCat->Clone(getter_AddRefs(gold)); nsCAutoString catName, refTmp; conf->GetNativeLeafName(catName); aRefTmp->GetNativePath(refTmp); txRDFOut results(catName, aOut); nsCOMPtr<nsISimpleEnumerator> tests; rv = conf->GetDirectoryEntries(getter_AddRefs(tests)); if (NS_FAILED(rv)) return; PRBool hasMore, isFile; nsCAutoString leaf; NS_NAMED_LITERAL_CSTRING(xsl, ".xsl"); while (NS_SUCCEEDED(tests->HasMoreElements(&hasMore)) && hasMore) { nsCOMPtr<nsILocalFile> test; tests->GetNext(getter_AddRefs(test)); test->GetNativeLeafName(leaf); if (xsl.Equals(Substring(leaf, leaf.Length()-4, 4))) { // we have a stylesheet, let's look for source and reference nsAFlatCString::char_iterator start, ext; leaf.BeginWriting(start); leaf.EndWriting(ext); ext -= 2; // overwrite extension with .xml *ext = 'm'; // this one was easy nsCOMPtr<nsIFile> source; conf->Clone(getter_AddRefs(source)); rv = source->AppendNative(leaf); if (NS_SUCCEEDED(rv) && NS_SUCCEEDED(source->IsFile(&isFile)) && isFile) { nsCOMPtr<nsIFile> reference; gold->Clone(getter_AddRefs(reference)); // overwrite extension with .out --ext; nsCharTraits<char>::copy(ext, "out", 3); rv = reference->AppendNative(leaf); if (NS_SUCCEEDED(rv) && NS_SUCCEEDED(reference->IsFile(&isFile)) && isFile) { nsCAutoString src, style, refPath; test->GetNativePath(style); source->GetNativePath(src); reference->GetNativePath(refPath); if (PR_GetDirectorySeparator() =='\\') { src.ReplaceChar('\\','/'); style.ReplaceChar('\\','/'); refPath.ReplaceChar('\\','/'); } SimpleErrorObserver obs; txStandaloneXSLTProcessor proc; fstream result(refTmp.get(), ios::in | ios::out | ios::trunc); rv = proc.transform(src, style, result, obs); PRBool success = PR_FALSE; if (NS_SUCCEEDED(rv)) { result.flush(); PRInt64 resultSize, refSize; aRefTmp->GetFileSize(&resultSize); reference->GetFileSize(&refSize); result.seekg(0); int toread = (int)resultSize; nsCString resContent, refContent; resContent.SetCapacity(toread); readToString(result, resContent); result.close(); ifstream refStream(refPath.get()); toread = (int)refSize; refContent.SetCapacity(toread); readToString(refStream, refContent); refStream.close(); success = resContent.Equals(refContent); } ext--; results.feed(Substring(start, ext), success); } } } } }