Example #1
0
    private void HandleMetaDirective(
        State state, SourcesFile file,
        string pathDirectory, string includeDirectory,
        bool asExclusionsList, string directive
        )
    {
        var include = "#include ";

        if (directive.StartsWith(include))
        {
            var includeName = directive.Substring(include.Length).Trim();
            var fileName    = Path.Combine(includeDirectory, includeName);
            if (!File.Exists(fileName))
            {
                Console.Error.WriteLine($"// Include does not exist: {fileName}");
                state.Result.ErrorCount++;
                return;
            }

            var newFile = ParseSingleFile(state, fileName, asExclusionsList, overrideDirectory: pathDirectory);
            if (newFile == null)
            {
                Console.Error.WriteLine($"// Failed to parse included file: {fileName}");
                state.Result.ErrorCount++;
                return;
            }

            file.Includes.Add(newFile);
        }
    }
Example #2
0
    private void HandleMetaDirective(
        State state, SourcesFile file,
        string pathDirectory, string includeDirectory,
        bool asExclusionsList, string directive
        )
    {
        var include = "#include ";
        var split   = "#split ";

        if (directive.StartsWith(include))
        {
            var includeName = directive.Substring(include.Length).Trim();
            var fileName    = Path.Combine(includeDirectory, includeName);
            if (!File.Exists(fileName))
            {
                Console.Error.WriteLine($"// Include does not exist: {fileName}");
                state.Result.ErrorCount++;
                return;
            }

            var newFile = ParseSingleFile(state, fileName, asExclusionsList);
            if (newFile == null)
            {
                Console.Error.WriteLine($"// Failed to parse included file: {fileName}");
                state.Result.ErrorCount++;
                return;
            }

            file.Includes.Add(newFile);
        }
        else if (directive.StartsWith(split))
        {
            if (asExclusionsList)
            {
                throw new InvalidOperationException("split directive is not valid for exclusion lists");
            }

            var profileName = directive.Substring(split.Length).Trim();

            if (profileName == TargetProfileName)
            {
                state.CurrentSplitNumber++;
            }
        }
    }
Example #3
0
    private void HandleMetaDirective(State state, SourcesFile file, string directory, bool asExclusionsList, string directive)
    {
        var include = "#include ";

        if (directive.StartsWith(include))
        {
            var fileName = Path.Combine(directory, directive.Substring(include.Length));
            var newFile  = ParseSingleFile(state, fileName, asExclusionsList);
            if (newFile == null)
            {
                Console.Error.WriteLine($"// Include not found: {fileName}");
                state.Result.ErrorCount++;
            }
            else
            {
                file.Includes.Add(newFile);
            }
        }
    }
Example #4
0
    private SourcesFile ParseSingleFile(State state, string fileName, bool asExclusionsList, string overrideDirectory = null)
    {
        var fileTable = asExclusionsList ? state.Result.ExclusionFiles : state.Result.SourcesFiles;

        var nullStr = "<none>";

        if (fileTable.ContainsKey(fileName))
        {
            if (TraceLevel >= 2)
            {
                Console.Error.WriteLine($"// {new String (' ', ParseDepth * 2)}{fileName}  (already parsed)");
            }

            return(fileTable[fileName]);
        }
        else
        {
            if (TraceLevel >= 2)
            {
                Console.Error.WriteLine($"// {new String (' ', ParseDepth * 2)}{fileName}  [{state.HostPlatform ?? nullStr}] [{state.ProfileName ?? nullStr}]");
            }
        }

        ParseDepth += 1;

        var includeDirectory = Path.GetDirectoryName(fileName);
        var pathDirectory    = overrideDirectory ?? includeDirectory;
        var result           = new SourcesFile(fileName, asExclusionsList);

        fileTable.Add(fileName, result);

        using (var sr = new StreamReader(fileName)) {
            if (asExclusionsList)
            {
                state.ExclusionsFilesParsed++;
            }
            else
            {
                state.SourcesFilesParsed++;
            }

            string line;
            while ((line = sr.ReadLine()) != null)
            {
                if (line.StartsWith("#"))
                {
                    HandleMetaDirective(state, result, pathDirectory, includeDirectory, asExclusionsList, line);
                    continue;
                }

                line = line.Trim();

                if (String.IsNullOrWhiteSpace(line))
                {
                    continue;
                }

                var parts = line.Split(':');

                if (parts.Length > 1)
                {
                    var explicitExclusions = parts[1].Split(',');

                    // gensources.sh implemented these explicit exclusions like so:
                    // ../foo/bar/*.cs:A.cs,B.cs
                    // This would generate exclusions for ../foo/bar/A.cs and ../foo/bar/B.cs,
                    //  not ./A.cs and ./B.cs as you might expect

                    var mainPatternDirectory = Path.GetDirectoryName(parts[0]);

                    foreach (var pattern in explicitExclusions)
                    {
                        result.Exclusions.Add(new ParseEntry {
                            Directory = pathDirectory,
                            Pattern   = Path.Combine(mainPatternDirectory, pattern)
                        });
                    }
                }

                (asExclusionsList ? result.Exclusions : result.Sources)
                .Add(new ParseEntry {
                    Directory = pathDirectory,
                    Pattern   = parts[0]
                });
            }
        }

        ParseDepth -= 1;
        return(result);
    }