예제 #1
0
        public override TextSpan UncommentLines(TextSpan span, string lineComment)
        {
            // Remove line comments
            int clen    = lineComment.Length;
            var editMgr = new EditArray(this, null, true, "UncommentLines");

            for (int line = span.iStartLine; line <= span.iEndLine; line++)
            {
                int    i    = this.ScanToNonWhitespaceChar(line);
                string text = base.GetLine(line);

                if ((i + clen) <= text.Length && text.Substring(i, clen) == lineComment)
                {
                    var es = new EditSpan(new TextSpan()
                    {
                        iEndLine    = line,
                        iStartLine  = line,
                        iStartIndex = i,
                        iEndIndex   = i + clen
                    }, "");
                    editMgr.Add(es); // remove line comment.

                    if (line == span.iStartLine && span.iStartIndex != 0)
                    {
                        span.iStartIndex = i;
                    }
                }
            }

            editMgr.ApplyEdits();

            span.iStartIndex = 0;
            return(span);
        }
예제 #2
0
        /*
         * public class X86TextSpan
         * {
         *  public X86TextSpan(int start, int end)
         *  {
         *      Start = start;
         *      End = end;
         *  }
         *
         *  public int Start { get; set; }
         *  public int End { get; set; }
         * }
         *
         *
         * public class X86Instruction : X86TextSpan
         * {
         *  public X86Instruction(int start, int end, string name, AsmHighlighterToken type) : base(start, end)
         *  {
         *      Name = name;
         *      Type = type;
         *  }
         *
         *  public string Name { get; set; }
         *  public AsmHighlighterToken Type { get; set; }
         * }
         *
         * public class X86Code
         * {
         *  public X86Instruction Instruction { get; set; }
         *
         * }
         *
         * public X86Code Parse(Scanner lexer, string codeToParse)
         * {
         *  lexer.SetSource(codeToParse, 0);
         *  int state = 0;
         *  int start, end;
         *
         *  AsmHighlighterToken token = (AsmHighlighterToken)lexer.GetNext(ref state, out start, out end);
         *  List<EditSpan> changes = new List<EditSpan>();
         *  while (token != AsmHighlighterToken.EOF)
         *  {
         *      bool isToStrip = false;
         *      string stripReplace = "";
         *      string tokenStr = codeToParse.Substring(start, end - start + 1).ToLower();
         *      switch (token)
         *      {
         *          case AsmHighlighterToken.INSTRUCTION:
         *              if (tokenStr == "call" || tokenStr.StartsWith("j"))
         *              {
         *                  string restOfLine = codeToParse.Substring(end + 1, codeToParse.Length - (end + 1)).Trim();
         *                  // Default call|jmp dword
         *                  if (!restOfLine.StartsWith("dword") && !restOfLine.StartsWith("short"))
         *                  {
         *                      isToStrip = true;
         *                      stripReplace = tokenStr + " dword";
         *                  }
         *              }
         *              break;
         *          case AsmHighlighterToken.LEFT_SQUARE_BRACKET:
         *
         *
         *              break;
         *          case AsmHighlighterToken.RIGHT_SQUARE_BRACKET:
         *
         *
         *              break;
         *          case AsmHighlighterToken.REGISTER:
         *              if (tokenStr.StartsWith("st("))
         *              {
         *                  tokenStr = tokenStr.Replace("(", "");
         *                  tokenStr = tokenStr.Replace(")", "");
         *                  isToStrip = true;
         *                  stripReplace = tokenStr;
         *              }
         *              break;
         *          case AsmHighlighterToken.DIRECTIVE:
         *              // strip register
         *              if (tokenStr == "ptr")
         *              {
         *                  isToStrip = true;
         *                  stripReplace = "";
         *              }
         *              break;
         *
         *          case AsmHighlighterToken.IDENTIFIER:
         *              // Convert all identifiers to 0 in order to be able to compile the code
         *              isToStrip = true;
         *              stripReplace = "125125";
         *              break;
         *      }
         *      if (isToStrip)
         *      {
         *          TextSpan editTextSpan = new TextSpan();
         *          editTextSpan.iStartLine = 0;
         *          editTextSpan.iEndLine = 0;
         *          editTextSpan.iStartIndex = start;
         *          editTextSpan.iEndIndex = end + 1;
         *
         *          changes.Add(new EditSpan(editTextSpan, stripReplace));
         *      }
         *      token = (AsmHighlighterToken)lexer.GetNext(ref state, out start, out end);
         *  }
         *  return null;
         * }
         */

        public static string ConvertToFasm(Scanner lexer, string codeToFormat, Dictionary <string, string> defines)
        {
            lexer.SetSource(codeToFormat, 0);
            int state = 0;
            int start, end;

            bool isInBracket            = false;
            int  countRegisterInBracket = 0;
            AsmHighlighterToken token   = (AsmHighlighterToken)lexer.GetNext(ref state, out start, out end);
            List <EditSpan>     changes = new List <EditSpan>();

            while (token != AsmHighlighterToken.EOF)
            {
                bool   isToStrip    = false;
                string stripReplace = "";

                string tokenStr = codeToFormat.Substring(start, end - start + 1).ToLower();
                switch (token)
                {
                case AsmHighlighterToken.INSTRUCTION:
                    if (tokenStr == "call" || tokenStr.StartsWith("j"))
                    {
                        string restOfLine = codeToFormat.Substring(end + 1, codeToFormat.Length - (end + 1)).Trim();
                        // Set default call|jxx to dword
                        if (!restOfLine.StartsWith("dword") && !restOfLine.StartsWith("short") && !restOfLine.StartsWith("near") && !restOfLine.StartsWith("far"))
                        {
                            isToStrip    = true;
                            stripReplace = tokenStr + " dword";
                        }
                    }
                    break;

                case AsmHighlighterToken.LEFT_SQUARE_BRACKET:
                    isInBracket = true;
                    break;

                case AsmHighlighterToken.RIGHT_SQUARE_BRACKET:
                    isInBracket            = false;
                    countRegisterInBracket = 0;
                    break;

                case AsmHighlighterToken.REGISTER:
                case AsmHighlighterToken.REGISTER_FPU:
                case AsmHighlighterToken.REGISTER_MMXSSE:
                    if (isInBracket)
                    {
                        countRegisterInBracket++;
                    }
                    // Convert st(#) register to st#
                    if (token == AsmHighlighterToken.REGISTER_FPU)
                    {
                        tokenStr     = tokenStr.Replace("(", "");
                        tokenStr     = tokenStr.Replace(")", "");
                        isToStrip    = true;
                        stripReplace = tokenStr;
                    }
                    break;

                case AsmHighlighterToken.DIRECTIVE:
                    // strip register
                    if (tokenStr == "ptr")
                    {
                        isToStrip    = true;
                        stripReplace = "";
                    }
                    break;

                case AsmHighlighterToken.IDENTIFIER:
                    isToStrip    = true;
                    stripReplace = (defines.ContainsKey(tokenStr)) ? defines[tokenStr] : "4";
                    if (isInBracket)
                    {
                        if ((lexer.AsmHighlighterTokenProvider.GetTokenFromIdentifier(stripReplace) & AsmHighlighterToken.IS_REGISTER) != 0)
                        {
                            countRegisterInBracket++;
                        }
                        else if (stripReplace == "4")
                        {
                            // No register before 1st identifier
                            if (countRegisterInBracket == 0)
                            {
                                // Fake dword adress if we have mov [IDENTIFIER + ....]
                                stripReplace = "123123";
                            }
                        }
                    }
                    break;
                }
                if (isToStrip)
                {
                    TextSpan editTextSpan = new TextSpan();
                    editTextSpan.iStartLine  = 0;
                    editTextSpan.iEndLine    = 0;
                    editTextSpan.iStartIndex = start;
                    editTextSpan.iEndIndex   = end + 1;

                    changes.Add(new EditSpan(editTextSpan, stripReplace));
                }
                token = (AsmHighlighterToken)lexer.GetNext(ref state, out start, out end);
            }

            for (int i = changes.Count - 1; i >= 0; i--)
            {
                EditSpan editSpan = changes[i];
                codeToFormat = codeToFormat.Substring(0, editSpan.Span.iStartIndex) + editSpan.Text +
                               codeToFormat.Substring(editSpan.Span.iEndIndex, codeToFormat.Length - editSpan.Span.iEndIndex);
            }

            // Force the FASM code to 32 bit
            codeToFormat = "use32\r\n" + codeToFormat;
            return(codeToFormat);
        }
예제 #3
0
 /// <summary>
 /// Convert the SnapshotSpan into an EditSpan
 /// </summary>
 public static EditSpan ToEditSpan(this SnapshotSpan span)
 {
     return(EditSpan.NewSingle(span));
 }