Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
 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;
         }
     }
 }