Ejemplo n.º 1
0
 //  *
 //   * Prints out a sequences of statements on separate lines. Correctly
 //   * informs the last statement that it is last in a block.
 //
 public static void printSequence(Output @out, List<Statement> stmts)
 {
     int n = stmts.Count;
     for(int i = 0; i < n; i++)
     {
       bool last = (i + 1 == n);
       Statement stmt = stmts[i];
       Statement next = last ? null : stmts[i + 1];
       if(last)
       {
     stmt.printTail(@out);
       }
       else
       {
     stmt.print(@out);
       }
       if(next != null && stmt is FunctionCallStatement && next.beginsWithParen())
       {
     @out.print(";");
       }
       if(!(stmt is IfThenElseBlock))
       {
     @out.println();
       }
     }
 }
Ejemplo n.º 2
0
        private void printMain(Output @out, Decompiler d, bool includeFirst)
        {
            @out.print("(");
            int Start = includeFirst ? 0 : 1;

            if (function.numParams > Start)
            {
                new VariableTarget(d.declList[Start]).print(@out);
                for (int i = Start + 1; i < function.numParams; i++)
                {
                    @out.print(", ");
                    new VariableTarget(d.declList[i]).print(@out);
                }
            }
            if ((function.vararg & 1) == 1)
            {
                if (function.numParams > Start)
                {
                    @out.print(", ...");
                }
                else
                {
                    @out.print("...");
                }
            }
            @out.print(")");
            @out.println();
            @out.indent();
            d.decompile();
            d.print(@out);
            @out.dedent();
            @out.print("end");
            //out.println(); //This is an extra space for formatting
        }
Ejemplo n.º 3
0
 public override void print(Output @out)
 {
     @out.print("repeat");
     @out.println();
     @out.indent();
     Statement.printSequence(@out, statements);
     @out.dedent();
     @out.print("until ");
     branch.asExpression(r).print(@out);
 }
Ejemplo n.º 4
0
 public override void print(Output @out)
 {
     @out.print("while ");
     branch.asExpression(r).print(@out);
     @out.print(" do");
     @out.println();
     @out.indent();
     Statement.printSequence(@out, statements);
     @out.dedent();
     @out.print("end");
 }
Ejemplo n.º 5
0
 public override void print(Output @out)
 {
     @out.print("for ");
     r.getTarget(register + 3, begin - 1).print(@out);
     @out.print(" = ");
     r.getValue(register, begin - 1).print(@out);
     @out.print(", ");
     r.getValue(register + 1, begin - 1).print(@out);
     Expression step = r.getValue(register + 2, begin - 1);
     if(!step.isInteger() || step.asInteger() != 1)
     {
       @out.print(", ");
       step.print(@out);
     }
     @out.print(" do");
     @out.println();
     @out.indent();
     Statement.printSequence(@out, statements);
     @out.dedent();
     @out.print("end");
 }
Ejemplo n.º 6
0
 public override void print(Output @out)
 {
     if(statements.Count == 1 && statements[0] is IfThenEndBlock)
     {
       @out.print("else");
       statements[0].print(@out);
     }
     else if(statements.Count == 2 && statements[0] is IfThenElseBlock && statements[1] is ElseEndBlock)
     {
       @out.print("else");
       statements[0].print(@out);
       statements[1].print(@out);
     }
     else
     {
       @out.print("else");
       @out.println();
       @out.indent();
       Statement.printSequence(@out, statements);
       @out.dedent();
       @out.print("end");
     }
 }
Ejemplo n.º 7
0
 public override void print(Output @out)
 {
     if(assign != null && assign.getFirstTarget() != null)
     {
       Assignment assignOut = new Assignment(assign.getFirstTarget(), Value);
       assignOut.print(@out);
     }
     else
     {
       @out.print("-- unhandled set block");
       @out.println();
     }
 }
Ejemplo n.º 8
0
 public override void print(Output @out)
 {
     @out.print("for ");
     r.getTarget(register + 3, begin - 1).print(@out);
     for(int r1 = register + 4; r1 <= register + 2 + length; r1++)
     {
       @out.print(", ");
       r.getTarget(r1, begin - 1).print(@out);
     }
     @out.print(" in ");
     Expression @value;
     @value = r.getValue(register, begin - 1);
     @value.print(@out);
     if([email protected]())
     {
       @out.print(", ");
       @value = r.getValue(register + 1, begin - 1);
       @value.print(@out);
       if([email protected]())
       {
     @out.print(", ");
     @value = r.getValue(register + 2, begin - 1);
     @value.print(@out);
       }
     }
     @out.print(" do");
     @out.println();
     @out.indent();
     Statement.printSequence(@out, statements);
     @out.dedent();
     @out.print("end");
 }
Ejemplo n.º 9
0
 public override void print(Output @out)
 {
     @out.print("if ");
     branch.asExpression(r).print(@out);
     @out.print(" then");
     @out.println();
     @out.indent();
     //Handle the case where the "then" is empty in if-then-else.
     //The jump over the else block is falsely detected as a break.
     if(statements.Count == 1 && statements[0] is Break)
     {
       Break b = (Break) statements[0];
       if(b.target == loopback)
       {
     @out.dedent();
     return;
       }
     }
     Statement.printSequence(@out, statements);
     @out.dedent();
     if(emptyElse)
     {
       @out.println("else");
       @out.println("end");
     }
 }
Ejemplo n.º 10
0
 private void printMain(Output @out, Decompiler d, bool includeFirst)
 {
     @out.print("(");
     int Start = includeFirst ? 0 : 1;
     if(function.numParams > Start)
     {
       new VariableTarget(d.declList[Start]).print(@out);
       for(int i = Start + 1; i < function.numParams; i++)
       {
     @out.print(", ");
     new VariableTarget(d.declList[i]).print(@out);
       }
     }
     if((function.vararg & 1) == 1)
     {
       if(function.numParams > Start)
       {
     @out.print(", ...");
       }
       else
       {
     @out.print("...");
       }
     }
     @out.print(")");
     @out.println();
     @out.indent();
     d.decompile();
     d.print(@out);
     @out.dedent();
     @out.print("end");
     //out.println(); //This is an extra space for formatting
 }
Ejemplo n.º 11
0
 //  *
 //   * Prints out a sequences of expressions with commas, and optionally
 //   * handling multiple expressions and return value adjustment.
 //
 public static void printSequence(Output @out, List<Expression> exprs, bool linebreak, bool multiple)
 {
     int n = exprs.Count;
     int i = 1;
     foreach(Expression expr in exprs)
     {
       bool last = (i == n);
       if(expr.isMultiple())
       {
     last = true;
       }
       if(last)
       {
     if(multiple)
     {
       expr.printMultiple(@out);
     }
     else
     {
       expr.print(@out);
     }
     break;
     }
       else
       {
     expr.print(@out);
     @out.print(",");
     if(linebreak)
     {
       @out.println();
     }
     else
     {
       @out.print(" ");
     }
       }
       i++;
     }
 }