public static String Preprocess(String text, MISP.Environment ScriptEngine) { var state = new ParseState { start = 0, end = text.Length, source = text }; var output = new StringBuilder(); var preprocessContext = new PreprocessContext(); preprocessContext.builder = output; var preprocessGlobals = new MISP.ScriptObject(); while (!state.AtEnd()) { while (!state.AtEnd() && !state.MatchNext("<<")) { if (state.MatchNext("\\<<")) //Skip escaped open brackets { output.Append("<<"); state.Advance(3); } else { output.Append(state.Next()); state.Advance(); } } if (!state.AtEnd()) { state.Advance(2); //skip << var script = new StringBuilder(); while (!state.AtEnd() && !state.MatchNext(">>")) { if (state.MatchNext("\\>>")) { script.Append(">>"); state.Advance(3); } else { script.Append(state.Next()); state.Advance(); } } if (!state.AtEnd()) state.Advance(2); //skip >> var scriptContext = ScriptEngine.CompileScript(script.ToString()); scriptContext.Tag = preprocessContext; ScriptEngine.RunScript(scriptContext); if (scriptContext.ExecutionState == MISP.ExecutionState.Error) { Console.WriteLine("Error in preprocessing"); Console.WriteLine(scriptContext.ErrorMessage); } } } return output.ToString(); }
public static void SetupScriptEngine(MISP.Environment ScriptEngine) { ScriptEngine.AddNativeFunction("import", (context, args) => { var filename = args[0].ToString(); var file = System.IO.File.ReadAllText(filename); (context.Tag as PreprocessContext).Append(Preprocess(file, ScriptEngine)); return null; }); ScriptEngine.AddNativeFunction("preprocess", (context, args) => { var text = args[0].ToString(); return Preprocess(text, ScriptEngine); }); ScriptEngine.AddNativeFunction("write", (context, args) => { var str = args[0].ToString(); (context.Tag as PreprocessContext).Append(UnescapeString(str)); return null; }); ScriptEngine.AddNativeFunction("capture", (context, args) => { var pcontext = context.Tag as PreprocessContext; var oldBuilder = pcontext.builder; pcontext.builder = new StringBuilder(); ScriptEngine.RunScript(args[0].ToString()); var r = pcontext.builder.ToString(); pcontext.builder = oldBuilder; return r; }); }