]> granicus.if.org Git - php/commitdiff
Implement a glob() function for use by win32 configure.
authorWez Furlong <wez@php.net>
Tue, 23 Dec 2003 01:55:33 +0000 (01:55 +0000)
committerWez Furlong <wez@php.net>
Tue, 23 Dec 2003 01:55:33 +0000 (01:55 +0000)
win32/build/confutils.js

index a9237168dd3687009e70e8434f4562589f60b4c9..2854651980efaf6a2899b1a5285b3e20628ce9ab 100644 (file)
@@ -17,7 +17,7 @@
   +----------------------------------------------------------------------+
 */
 
-// $Id: confutils.js,v 1.27 2003-12-23 00:36:32 fmk Exp $
+// $Id: confutils.js,v 1.28 2003-12-23 01:55:33 wez Exp $
 
 var STDOUT = WScript.StdOut;
 var STDERR = WScript.StdErr;
@@ -28,7 +28,7 @@ var SYSTEM_DRIVE = WshShell.Environment("Process").Item("SystemDrive");
 var PROGRAM_FILES = WshShell.Environment("Process").Item("ProgramFiles");
 
 if (PROGRAM_FILES == null) {
-       PROGRAM_FILES = "C:\\Program Files\\";
+       PROGRAM_FILES = "C:\\Program Files";
 }
 
 if (!FSO.FileExists("README.CVS-RULES")) {
@@ -624,7 +624,7 @@ function SAPI(sapiname, file_list, makefiletarget, cflags)
        
        MFO.WriteLine(makefiletarget + ": $(BUILD_DIR)\\" + makefiletarget);
        MFO.WriteLine("\t@echo SAPI " + configure_module_dirname + " build complete");
-       MFO.WriteLine("$(BUILD_DIR)\\" + makefiletarget + ": $(" + SAPI + "_GLOBAL_OBJS) $(BUILD_DIR)\\$(PHPLIB) $(BUILD_DIR)\\" + resname);
+       MFO.WriteLine("$(BUILD_DIR)\\" + makefiletarget + ": $(DEPS_" + SAPI + ") $(" + SAPI + "_GLOBAL_OBJS) $(BUILD_DIR)\\$(PHPLIB) $(BUILD_DIR)\\" + resname);
 
        if (makefiletarget.match(new RegExp("\\.dll$"))) {
                ldflags = "/dll $(LDFLAGS)";
@@ -1059,6 +1059,98 @@ function copy_and_subst(srcname, destname, subst_array)
        f.Close();
 }
 
+// glob using simple filename wildcards
+// returns an array of matches that are found
+// in the filesystem
+function glob(path_pattern)
+{
+       var path_parts = path_pattern.replace(new RegExp("/", "g"), "\\").split("\\");
+       var p;
+       var base = "";
+       var is_pat_re = /\*/;
+       
+       // first, build as much as possible that doesn't have a pattern
+       for (p = 0; p < path_parts.length; p++) {
+               if (path_parts[p].match(is_pat_re))
+                       break;
+               if (p)
+                       base += "\\";
+               base += path_parts[p];  
+       }
+
+       return _inner_glob(base, p, path_parts);
+}
+
+function _inner_glob(base, p, parts)
+{
+       var pat = parts[p];
+       var full_name = base + "\\" + pat;
+       var re = null;
+       var items = null;
+
+//STDOUT.WriteLine("inner: base=" + base + " p=" + p + " pat=" + pat);
+
+       if (FSO.FileExists(full_name)) {
+               if (p < parts.length - 1) {
+                       // we didn't reach the full extent of the pattern
+                       return false;
+               }
+               return new Array(full_name);
+       }
+
+       if (FSO.FolderExists(full_name) && p == parts.length - 1) {
+               // we have reached the end of the pattern; no need to recurse
+               return new Array(full_name);
+       }
+
+       // Convert the pattern into a regexp
+       re = new RegExp("^" + pat.replace(/\./g, '\\.').replace(/\*/g, '.*') + "$");
+
+       items = new Array();
+
+       var folder = FSO.GetFolder(base);
+       var fc = null;
+       var subitems = null;
+       var item_name = null;
+       var j;
+
+       fc = new Enumerator(folder.SubFolders);
+       for (; !fc.atEnd(); fc.moveNext()) {
+               item_name = FSO.GetFileName(fc.item());
+
+               if (item_name.match(re)) {
+                       // got a match; if we are at the end of the pattern, just add these
+                       // things to the items array
+                       if (p == parts.length - 1) {
+                               items[items.length] = fc.item();
+                       } else {
+                               // we should recurse and do more matches
+                               subitems = _inner_glob(base + "\\" + item_name, p + 1, parts);
+                               if (subitems) {
+                                       for (j = 0; j < subitems.length; j++) {
+                                               items[items.length] = subitems[j];
+                                       }
+                               }
+                       }
+               }
+       }
+
+       // if we are at the end of the pattern, we should match
+       // files too
+       if (p == parts.length - 1) {
+               fc = new Enumerator(folder.Files);
+               for (; !fc.atEnd(); fc.moveNext()) {
+                       item_name = FSO.GetFileName(fc.item());
+                       if (item_name.match(re)) {
+                               items[items.length] = fc.item();
+                       }
+               }
+       }
+
+       return items;
+}
+
+
 // for snapshot builders, this option will attempt to enable everything
 // and you can then build everything, ignoring fatal errors within a module
 // by running "nmake snap"