// // $Id: utilities.js 580483 2007-09-28 20:55:52Z sebor $ // // defines different utility functions // ////////////////////////////////////////////////////////////////////// // // Licensed to the Apache Software Foundation (ASF) under one or more // contributor license agreements. See the NOTICE file distributed // with this work for additional information regarding copyright // ownership. The ASF licenses this file to you under the Apache // License, Version 2.0 (the "License"); you may not use this file // except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or // implied. See the License for the specific language governing // permissions and limitations under the License. // ////////////////////////////////////////////////////////////////////// var VERSION = ""; var DEVENV = ""; var DEVENVFLAGS = ""; var CPPFLAGS = ""; var LDFLAGS = ""; var LIBS = ""; var CONVERT = false; var CXX = ""; var LD = ""; var AR = ""; var AS = ""; var SLNVER=""; var SLNCOMMENT=""; var UNICODELOG = false; var NOSTCRT = false; var WINDIFF = ""; var ICCCONVERT = ""; var PLATFORM = ""; var CLVARSBAT = ""; var ICCVER=""; // timeout for exec utility in seconds var EXEC_TIMEOUT = 300; // expand system macros function expandSysMacro(str) { var env = null; var pos = 0; while (true) { pos = str.indexOf("%", pos); if (0 > pos) break; ++pos; var pos2 = str.indexOf("%", pos); if (0 > pos2) break; if (null == env) env = WshShell.Environment("PROCESS"); var macro = str.substring(pos, pos2); pos = pos2 + 1; var value = env.Item(macro); if ("undefined" != typeof(value) && "" != value) str = str.replace("%" + macro + "%", value); } return str; } // read and parse compiler configuration file // config - name of the compiler configuration function parseConfig(config) { var scriptDir = getParentFolder(WScript.ScriptFullName); var configFileName = scriptDir + "\\" + config + ".config"; var ForReading = 1; var configFile = null; try { configFile = fso.OpenTextFile(configFileName, ForReading); } catch (e) {} if (null == configFile) { WScript.StdErr.WriteLine("Cannot open configuration file: " + configFileName); WScript.Quit(3); } var rx = /^\s*([A-Z]+)\s*=\s*(\S.*)$/; while (!configFile.AtEndOfStream) { var line = configFile.ReadLine(); if (0 == line.length || 0 == line.indexOf("//")) continue; var inc = "#include "; var pos = line.indexOf(inc); if (0 == pos) parseConfig(line.substr(pos + inc.length)); var arr = rx.exec(line); if (null == arr || 0 == arr[2].length) continue; arr[2] = expandSysMacro(arr[2]); switch (arr[1]) { case "VERSION": VERSION = arr[2]; break; case "DEVENV": DEVENV = arr[2]; break; case "DEVENVFLAGS": DEVENVFLAGS = arr[2]; break; case "CPPFLAGS": CPPFLAGS = arr[2]; break; case "LDFLAGS": LDFLAGS = arr[2]; break; case "LIBS": LIBS = arr[2]; break; case "CONVERT": CONVERT = parseInt(arr[2]) != 0; break; case "CXX": CXX = arr[2]; break; case "LD": LD = arr[2]; break; case "AR": AR = arr[2]; break; case "AS": AS = arr[2]; break; case "SLNVER": SLNVER = arr[2]; break; case "SLNCOMMENT": SLNCOMMENT = arr[2]; break; case "UNICODELOG": UNICODELOG = parseInt(arr[2]) != 0; break; case "NOSTCRT": NOSTCRT = parseInt(arr[2]) != 0; break; case "WINDIFF": WINDIFF = arr[2]; break; case "ICCCONVERT": ICCCONVERT = arr[2]; break; case "PLATFORM": PLATFORM = arr[2]; break; case "CLVARSBAT": CLVARSBAT = arr[2]; break; case "ICCVER": ICCVER = arr[2]; break; } } } // init script variables for specified compiler configuration function getCompilerOpts(config) { // set vars to initial state VERSION = ""; DEVENV = ""; DEVENVFLAGS = ""; CPPFLAGS = ""; LDFLAGS = ""; LIBS = ""; CONVERT = false; CXX = ""; LD = ""; AR = ""; AS = ""; SLNVER=""; SLNCOMMENT=""; UNICODELOG = false; NOSTCRT = false; WINDIFF = ""; ICCCONVERT = ""; PLATFORM = ""; CLVARSBAT = ""; ICCVER = ""; parseConfig(config); if (0 == WINDIFF.length) { if (VERSION.length) { var ver = ""; if (0 <= VERSION.indexOf(".")) ver = VERSION.replace(".", ""); var path = WshShell.Environment.Item("VS" + ver + "COMNTOOLS"); if (path.length) { WINDIFF = "\"" + fso.BuildPath(path.replace(/\"/g, ""), "bin\\windiff") + "\""; } } if (0 == WINDIFF.length) WINDIFF = "windiff"; } } // out variables and their values to the stream function PrintVars(stream) { stream.WriteLine("Variables:"); stream.WriteLine(" VERSION=" + VERSION); stream.WriteLine(" DEVENV=" + DEVENV); stream.WriteLine(" DEVENVFLAGS=" + DEVENVFLAGS); stream.WriteLine(" CPPFLAGS=" + CPPFLAGS); stream.WriteLine(" LDFLAGS=" + LDFLAGS); stream.WriteLine(" LIBS=" + LIBS); stream.WriteLine(" CONVERT=" + CONVERT); stream.WriteLine(" CXX=" + CXX); stream.WriteLine(" LD=" + LD); stream.WriteLine(" AR=" + AR); stream.WriteLine(" AS=" + AS); stream.WriteLine(" SLNVER=" + SLNVER); stream.WriteLine(" SLNCOMMENT=" + SLNCOMMENT); stream.WriteLine(" UNICODELOG=" + UNICODELOG); stream.WriteLine(" NOSTCRT=" + NOSTCRT); stream.WriteLine(" WINDIFF=" + WINDIFF); stream.WriteLine(" ICCCONVERT=" + ICCCONVERT); stream.WriteLine(" PLATFORM=" + PLATFORM); stream.WriteLine(" CLVARSBAT=" + CLVARSBAT); stream.WriteLine(" ICCVER=" + ICCVER); stream.WriteLine(""); } // returns parent folder for a path function getParentFolder(path) { var idx = path.lastIndexOf('\\'); return path.substr(0, idx); } // returns filename from a path function getFileName(path) { var idx = path.lastIndexOf('\\'); return path.substr(idx + 1); } // returns extension of the file name (with dot at first character) function getExtension(filename) { var idx = filename.lastIndexOf('.'); return 0 <= idx ? filename.substr(idx) : "."; } ///////////////////////////////////////////////////////////////////////// // get differences using WinDiff utility function getWinDiffDifferences(src1, src2, flags) { try { // first create two temporary files var tfolder, TemporaryFolder = 2; tfolder = fso.GetSpecialFolder(TemporaryFolder); if (! tfolder) return "unknown"; var tname1 = fso.GetTempName(); var tfile1 = tfolder.CreateTextFile(tname1); var tpath1 = tfolder.Path + "\\" + tname1; tfile1.Write(src1); tfile1.Close(); var tname2 = fso.GetTempName(); var tfile2 = tfolder.CreateTextFile(tname2); var tpath2 = tfolder.Path + "\\" + tname2; tfile2.Write(src2); tfile2.Close(); var tResName = fso.GetTempName(); var tResPath = tfolder.Path + "\\" + tResName; // second run windiff var cmd = WINDIFF + " -F" + flags + " " + tResPath; cmd += " " + tpath1; cmd += " " + tpath2; var result = WshShell.Run(cmd, 7, true); if (result != 0) { WScript.StdErr.WriteLine( "getWinDiffDifferences: Fatal error: windiff" + " failed"); return "unknown"; } // third read the results var tResFile = fso.OpenTextFile(tfolder.Path + "\\" + tResName); var res = tResFile.ReadAll(); tResFile.Close(); fso.DeleteFile(tpath1); fso.DeleteFile(tpath2); fso.DeleteFile(tResPath); return res; } catch(e) { return "Information about differences is not available"; } } // create temporary file and return path to this file function makeTempFile() { var tfolder, TemporaryFolder = 2; tfolder = fso.GetSpecialFolder(TemporaryFolder); var tname = fso.GetTempName(); var tfile = tfolder.CreateTextFile(tname); tfile.Close(); return tfolder.Path + "\\" + tname; } // encode symbols within string with escaped analog // srcString - source string function encodeHTML(srcString) { var res = srcString; var srcS = new Array ( "&", "<", ">", "\"" ); var destS = new Array ( "&", "<", ">", """ ); for (var t = 0; t < srcS.length; t++) { var reRep = new RegExp(srcS[t], "g"); res = res.replace(reRep, destS[t]); } return res; } // decode escaped symbols within string with analog // srcString - source string function decodeHTML(srcString) { var res = srcString; var srcS = new Array ( "&", "<", ">", """, " " ); var destS = new Array ( "&", "<", ">", "\"", " " ); for (var t = 0; t < srcS.length; t++) { var reRep = new RegExp(srcS[t], "g"); res = res.replace(reRep, destS[t]); } return res; } // remove all tags within string // srcString - source string function stripTags(srcString) { return decodeHTML(srcString).replace(new RegExp("> <", "g"), "><") .replace(new RegExp("><", "g"), ">\r\n<") .replace(new RegExp("(^<[\\s\\S]+?>)", "gm"), "") .replace(new RegExp("\r", "g"), "") .replace(new RegExp("\n{2,}", "g"), "\n\n") .replace(new RegExp("", "g"), "") .replace(new RegExp("", "g"), "") .replace(new RegExp("", "g"), ""); } // returns source string without first character if it equal to symbol // dotName - source string // symbol - symbol to remove function removeLeadingSymbol(dotName, symbol) { var index = dotName.indexOf(symbol); if (0 != index) return dotName; var resName = dotName.substr(symbol.length); return resName; } // returns source string without first character is is a dot function removeLeadingDot(dotName) { var index = dotName.indexOf("."); if (0 != index) return dotName; var resName = dotName.substr(1); return resName; } // returns the source filename with replaced extension to new one // filename - source filename // ext - new extension function changeFileExt(filename, ext) { var arr = filename.split("."); arr[arr.length - 1] = ext; return arr.join("."); } // returns new UUID function createUUID() { return WScript.CreateObject("scriptlet.typelib").guid; } // returns index of value in array or -1 function arrayIndexOf(array, value) { for (var i = 0; i < array.length; ++i) if (array[i] == value) return i; return -1; } // create MSVS solution file // projects - array of the projects // path - output folder // name - name of the solutuion file function generateSolution(projects, path, name) { path += "\\"; var sln = fso.CreateTextFile(path + name, true, false); // header sln.WriteLine("Microsoft Visual Studio Solution File, Format Version " + SLNVER); if (0 < SLNCOMMENT.length) sln.WriteLine("# " + SLNCOMMENT); for (var i = 0; i < projects.length; ++i) { // project section header var Project = projects[i]; var VCProject = Project.VSProject; sln.Write("Project(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = "); sln.Write("\"" + VCProject.Name + "\""); var projectFile = VCProject.ProjectFile; var pos = projectFile.indexOf(path); if (0 == pos) projectFile = projectFile.substr(path.length); sln.Write(", \"" + projectFile + "\""); sln.WriteLine(", \"" + VCProject.ProjectGUID + "\""); if (SLNVER != "7.00") { // project dependencies sln.WriteLine( "\tProjectSection(ProjectDependencies) = postProject"); var deps = Project.PrjRefs.concat(Project.PrjDeps); for (var j = 0; j < deps.length; ++j) { var depGUID = deps[j].VSProject.ProjectGUID; sln.WriteLine("\t\t" + depGUID + " = " + depGUID); } sln.WriteLine("\tEndProjectSection"); } // project section end sln.WriteLine("EndProject"); } // Global section sln.WriteLine("Global"); // solution configurations sln.WriteLine("\tGlobalSection(SolutionConfiguration) = preSolution"); for (var i = 0; i < confNames.length; ++i) { var confName = confNames[i]; var confKey = (SLNVER == "7.00" ? "ConfigName." + i : confName); sln.WriteLine("\t\t" + confKey + " = " + confName); } sln.WriteLine("\tEndGlobalSection"); // project dependencies for MSVC 7.0 if (SLNVER == "7.00") { sln.WriteLine("\tGlobalSection(ProjectDependencies) = postSolution"); for (var i = 0; i < projects.length; ++i) { var Project = projects[i]; var VCProject = Project.VSProject; var prjGUID = VCProject.ProjectGUID; var deps = Project.PrjRefs.concat(Project.PrjDeps); for (var j = 0; j < deps.length; ++j) { var depGUID = deps[j].VSProject.ProjectGUID; sln.WriteLine("\t\t" + prjGUID + "." + j + " = " + depGUID); } } sln.WriteLine("\tEndGlobalSection"); } // project configurations sln.WriteLine("\tGlobalSection(ProjectConfiguration) = postSolution"); for (var i = 0; i < projects.length; ++i) { var Project = projects[i]; var VCProject = Project.VSProject; var prjGUID = VCProject.ProjectGUID; var cfgs = VCProject.Configurations; for (var j = 1; j <= cfgs.Count; ++j) { var cfg = cfgs.Item(j); sln.WriteLine("\t\t" + prjGUID + "." + cfg.ConfigurationName + ".ActiveCfg = " + cfg.Name); sln.WriteLine("\t\t" + prjGUID + "." + cfg.ConfigurationName + ".Build.0 = " + cfg.Name); } } sln.WriteLine("\tEndGlobalSection"); // some unknown stuff sln.WriteLine("\tGlobalSection(ExtensibilityGlobals) = postSolution"); sln.WriteLine("\tEndGlobalSection"); sln.WriteLine("\tGlobalSection(ExtensibilityAddIns) = postSolution"); sln.WriteLine("\tEndGlobalSection"); sln.WriteLine("EndGlobal"); sln.Close(); }