private string ResolveMacros(string source, IEnumerable <string> restrictedDefines, IEnumerable <PreprocessorDefine> args, FileContext serverContext, ContentType contentType) { var reader = new StringPreprocessorReader(source); var writer = new StringPreprocessorWriter(); var parms = new PreprocessorParams(reader, writer, string.Empty, null, serverContext, contentType, null); parms.restrictedDefines = restrictedDefines; parms.args = args; parms.resolvingMacros = true; var lastText = source; var counter = 32; // To prevent infinite loop with recursive define while (Preprocess(parms).DocumentAltered&& counter <= 32) { var newText = writer.Text; if (newText == lastText) { break; } lastText = newText; parms.result.DocumentAltered = false; parms.args = null; // Only apply the arguments to the first round parms.reader = new StringPreprocessorReader(newText); parms.writer = writer = new StringPreprocessorWriter(); counter++; } return(writer.Text); }
private ConditionResult EvaluateCondition(PreprocessorParams p, string conditionStr, string fileName, int pos) { // Run preprocessor on the condition string var reader = new StringPreprocessorReader(conditionStr); var writer = new StringPreprocessorWriter(); var parms = new PreprocessorParams(reader, writer, string.Empty, null, p.fileContext, ContentType.Condition, null); parms.allowDirectives = false; parms.args = p.args; Preprocess(parms); // Evaluate the condition string var parser = new CodeParser(writer.Text); var tokenGroup = PreprocessorTokens.GroupToken.Parse(null, parser, null); var finalValue = tokenGroup.Value; ConditionResult ret; if (finalValue.HasValue) { if (finalValue.Value != 0) { ret = ConditionResult.Positive; } else { ret = ConditionResult.Negative; } } else { #if DEBUG Log.Debug("Condition returned indeterminate: {0}\r\n File Name: {1}\r\n Position: {2}\r\n Resolved: {3}", conditionStr, fileName, pos, writer.Text); #endif ret = ConditionResult.Indeterminate; } return(ret); }