/// <summary> /// Loads the Macro from a html tag /// </summary> private MacroValue LoadFromMarkup(string markup) { var attributes = GetMacroAttributes(markup); if (attributes.ContainsKey("macroAlias")) { var macroValue = new MacroValue() { macroAlias = attributes["macroAlias"], macroParamsDictionary = attributes .Where(x => x.Key != "macroAlias") .ToDictionary(k => k.Key, v => v.Value) }; return(macroValue); } return(null); }
private void ParseMacro() { StringBuilder s = new StringBuilder(); using (StringReader reader = new StringReader(m_text.ToString())) { string line; while ((line = reader.ReadLine()) != null) { if (line.StartsWith("#OCTAVE")) { if (line.Substring(7).TrimStart().StartsWith("REVERSE")) m_relativeDir = false; } else if (line.StartsWith("#WAV9")) { string[] wave = line.Substring(5).TrimStart().Split(",".ToCharArray()); if (wave.Length == 4) { int waveIndex = 0, intVol = 0, loopFlag = 0; int.TryParse(wave[0], out waveIndex); int.TryParse(wave[1], out intVol); int.TryParse(wave[2], out loopFlag); Modulators.FCDPCM.SetWave(waveIndex, intVol, loopFlag, wave[3]); } } else if (line.StartsWith("#WAV10")) { int waveNo = 0; string[] wave = line.Substring(6).TrimStart().Split(",".ToCharArray()); if (wave.Length == 2 && int.TryParse(wave[0], out waveNo)) { string waveString = wave[1] + "00000000000000000000000000000000"; Modulators.GBWave.SetWaveString(waveString, waveNo); } } else { s.Append(line); s.Append("\n"); } } } m_text = s; m_index = 0; bool top = true; int last = 0, textLength = m_text.Length; Dictionary<string, MacroValue> macros = new Dictionary<string, MacroValue>(); while (m_index < textLength) { char c = CharacterTokenAndNext(); switch (c) { case '$': if (top) { string chunk = m_text.ToString(); last = chunk.IndexOf(';', m_index, m_text.Length - m_index); if (last >= 0 && last > m_index) { string macro = chunk.Substring(m_index, last - m_index); string[] kv = macro.Split('='); if (kv.Length == 2 && kv[0].Length > 0) { int macroStartAt = m_index; int keyEndAt = m_text.ToString().IndexOf('='); string key = kv[0], name = key; if (ValidateMacroName(ref name)) { int keyLength = key.Length; List<MacroArgument> arguments; GetArgumentFromKey(key, out arguments); m_index = keyEndAt + 1; c = CharacterTokenAndNext(); while (m_index < last) { if (c == '$') { if (!ReplaceMacro(macros)) { if (m_text.ToString().Substring(m_index, keyLength).Equals(key)) { m_index--; m_text.Remove(m_index, key.Length); m_warnings.Add(CompilerWarning.RecursiveMacro); } } last = m_text.ToString().IndexOf(';', m_index); } c = CharacterTokenAndNext(); } int codeLength = last - keyEndAt - 1; MacroValue value = new MacroValue() { Code = new StringBuilder(m_text.ToString().Substring(keyEndAt + 1, codeLength)), Arguments = arguments }; macros[name] = value; SortMacros(ref macros); int from = macroStartAt - 1, to = last - from; m_text.Remove(from, to); m_index = macroStartAt - 1; textLength = m_text.Length; } } else { ReplaceMacro(macros); textLength = m_text.Length; top = false; } } else { ReplaceMacro(macros); textLength = m_text.Length; top = false; } } else { ReplaceMacro(macros); textLength = m_text.Length; top = false; } break; case ';': top = true; break; default: if (!char.IsWhiteSpace(c)) top = false; break; } } }