aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Prebuild
diff options
context:
space:
mode:
authorMelanie Thielker2009-07-06 23:53:47 +0000
committerMelanie Thielker2009-07-06 23:53:47 +0000
commit7d5b620e6ba9315a777d7c1b2dee370a3c3707df (patch)
tree349bbaa62183fd9ddf782a4d11c83959dbc34d8a /Prebuild
parentChange fields and methods in LSL API from private to protected, make some (diff)
downloadopensim-SC-7d5b620e6ba9315a777d7c1b2dee370a3c3707df.zip
opensim-SC-7d5b620e6ba9315a777d7c1b2dee370a3c3707df.tar.gz
opensim-SC-7d5b620e6ba9315a777d7c1b2dee370a3c3707df.tar.bz2
opensim-SC-7d5b620e6ba9315a777d7c1b2dee370a3c3707df.tar.xz
Thank you, mcortez, for a patch to prebuild to allow includes with wildcards.
Fixes Mantis #3860
Diffstat (limited to 'Prebuild')
-rw-r--r--Prebuild/src/Core/Parse/Preprocessor.cs97
1 files changed, 86 insertions, 11 deletions
diff --git a/Prebuild/src/Core/Parse/Preprocessor.cs b/Prebuild/src/Core/Parse/Preprocessor.cs
index 013f8e1..9ac07b9 100644
--- a/Prebuild/src/Core/Parse/Preprocessor.cs
+++ b/Prebuild/src/Core/Parse/Preprocessor.cs
@@ -449,22 +449,36 @@ namespace Prebuild.Core.Parse
449 throw new WarningException("An <?include ?> node was found, but it did not specify the file attribute."); 449 throw new WarningException("An <?include ?> node was found, but it did not specify the file attribute.");
450 } 450 }
451 451
452 // Push current reader back onto the stack.
453 readerStack.Push(reader);
454
452 // Pull the file out from the regex and make sure it is a valid file before using it. 455 // Pull the file out from the regex and make sure it is a valid file before using it.
453 string filename = matches[0].Groups[1].Value; 456 string filename = matches[0].Groups[1].Value;
454 FileInfo includeFile = new FileInfo(filename);
455 457
456 if(!includeFile.Exists) 458 filename = String.Join(Path.DirectorySeparatorChar.ToString(), filename.Split(new char[] { '/', '\\' }));
457 {
458 throw new WarningException("Cannot include file: " + includeFile.FullName);
459 }
460 459
461 // Create a new reader object for this file. Then put the old reader back on the stack and start 460 if (!filename.Contains("*"))
462 // processing using this new XML reader. 461 {
463 XmlReader newReader = new XmlTextReader(includeFile.Open(FileMode.Open, FileAccess.Read, FileShare.Read)); 462 FileInfo includeFile = new FileInfo(filename);
463
464 if (!includeFile.Exists)
465 {
466 throw new WarningException("Cannot include file: " + includeFile.FullName);
467 }
468
469 // Create a new reader object for this file, and push it onto the stack
470 XmlReader newReader = new XmlTextReader(includeFile.Open(FileMode.Open, FileAccess.Read, FileShare.Read));
471 readerStack.Push(newReader);
472 }
473 else
474 {
475 WildCardInclude(readerStack, filename);
476 }
477
478 // continue reading with whatever reader is on the top of the stack
479 reader = (XmlReader)readerStack.Pop();
480 ignore = true;
464 481
465 readerStack.Push(reader);
466 reader = newReader;
467 ignore = true;
468 break; 482 break;
469 483
470 case "if": 484 case "if":
@@ -577,6 +591,67 @@ namespace Prebuild.Core.Parse
577 return xmlText.ToString(); 591 return xmlText.ToString();
578 } 592 }
579 593
594 private static void WildCardInclude(Stack readerStack, string include)
595 {
596 if (!include.Contains("*"))
597 {
598 return;
599 }
600
601// Console.WriteLine("Processing {0}", include);
602
603 // Break up the include into pre and post wildcard sections
604 string preWildcard = include.Substring(0, include.IndexOf("*"));
605 string postWildcard = include.Substring(include.IndexOf("*") + 2);
606
607 // If preWildcard is a directory, recurse
608 if (Directory.Exists(preWildcard))
609 {
610 foreach (string dirPath in Directory.GetDirectories(preWildcard))
611 {
612 Console.WriteLine("Scanning : {0}", dirPath);
613
614 string includeFile = Path.Combine(dirPath, postWildcard);
615 if (includeFile.Contains("*"))
616 {
617 // postWildcard included another wildcard, recurse.
618 WildCardInclude(readerStack, includeFile);
619 }
620 else
621 {
622 FileInfo file = new FileInfo(includeFile);
623 if (file.Exists)
624 {
625 Console.WriteLine("Including File: {0}", includeFile);
626 XmlReader newReader = new XmlTextReader(file.Open(FileMode.Open, FileAccess.Read, FileShare.Read));
627 readerStack.Push(newReader);
628 }
629 }
630 }
631 }
632 else
633 {
634 // preWildcard is not a path to a directory, so the wildcard is in the filename
635 string searchFilename = Path.GetFileName(preWildcard.Substring(preWildcard.IndexOf("/") + 1) + "*" + postWildcard);
636 // Console.WriteLine("searchFilename: {0}", searchFilename);
637
638 string searchDirectory = Path.GetDirectoryName(preWildcard);
639 // Console.WriteLine("searchDirectory: {0}", searchDirectory);
640
641 foreach (string includeFile in Directory.GetFiles(searchDirectory, searchFilename))
642 {
643 FileInfo file = new FileInfo(includeFile);
644 if (file.Exists)
645 {
646 Console.WriteLine("Including File: {0}", includeFile);
647 XmlReader newReader = new XmlTextReader(file.Open(FileMode.Open, FileAccess.Read, FileShare.Read));
648 readerStack.Push(newReader);
649 }
650 }
651 }
652
653 }
654
580 #endregion 655 #endregion
581 } 656 }
582} 657}