コード例 #1
0
        public override void Execute(EpsInterpreter interpreter)
        {
            var operandStack = interpreter.OperandStack;

            var operand2 = operandStack.Pop();
            var operand1 = operandStack.Pop();

            var integer1 = operand1 as IntegerOperand;
            var integer2 = operand2 as IntegerOperand;

            if (integer1 != null && integer2 != null)
            {
                var res = new IntegerOperand();
                res.Value = integer1.Value / integer2.Value;
                operandStack.Push(res);
            }
            else
            {
                var double1 = OperandHelper.GetRealValue(operand1);
                var double2 = OperandHelper.GetRealValue(operand2);

                var res = new RealOperand();
                res.Value = double1 / double2;
                operandStack.Push(res);
            }
        }
コード例 #2
0
ファイル: CvrCmd.cs プロジェクト: Egaros/ShapeConverter
        public override void Execute(EpsInterpreter interpreter)
        {
            var operandStack = interpreter.OperandStack;

            var    operand = operandStack.Pop();
            double ret;

            switch (operand)
            {
            case StringOperand stringOperand:
            {
                ret = double.Parse(stringOperand.Value, CultureInfo.InvariantCulture);
                break;
            }

            case IntegerOperand intOperand:
            {
                ret = intOperand.Value;
                break;
            }

            case RealOperand realOperand:
            {
                ret = realOperand.Value;
                break;
            }

            default:
                throw new Exception("illegal operator");
            }

            var real = new RealOperand(ret);

            operandStack.Push(real);
        }
コード例 #3
0
        public override void Execute(EpsInterpreter interpreter)
        {
            var operandStack = interpreter.OperandStack;

            var res = new RealOperand();

            res.Value = RandomHelper.Rrand();
            operandStack.Push(res);
        }
コード例 #4
0
ファイル: SqrtCmd.cs プロジェクト: Egaros/ShapeConverter
        public override void Execute(EpsInterpreter interpreter)
        {
            var operandStack = interpreter.OperandStack;
            var real         = operandStack.PopRealValue();

            var res = new RealOperand();

            res.Value = Math.Sqrt(real);
            operandStack.Push(res);
        }
コード例 #5
0
        public override void Execute(EpsInterpreter interpreter)
        {
            var operandStack = interpreter.OperandStack;
            var intOp        = operandStack.PopInteger();

            var res = new RealOperand();

            RandomHelper.Srand(intOp.Value);
            operandStack.Push(res);
        }
コード例 #6
0
        public override void Execute(EpsInterpreter interpreter)
        {
            var operandStack = interpreter.OperandStack;

            GraphicsState graphicState = interpreter.GraphicState;
            var           currentPoint = graphicState.CurrentPoint;

            var realOp = new RealOperand(currentPoint.X);

            operandStack.Push(realOp);

            realOp = new RealOperand(currentPoint.Y);
            operandStack.Push(realOp);
        }
コード例 #7
0
        public override void Execute(EpsInterpreter interpreter)
        {
            var operandStack = interpreter.OperandStack;
            var operand      = operandStack.Pop();

            if (operand is IntegerOperand integer)
            {
                operandStack.Push(operand);
            }
            else
            {
                var real = (RealOperand)operand;
                var res  = new RealOperand();
                res.Value = Math.Round(real.Value);
                operandStack.Push(res);
            }
        }
コード例 #8
0
ファイル: Parser.cs プロジェクト: Egaros/ShapeConverter
        /// <summary>
        /// Gets the next operand
        /// </summary>
        public Operand GetNextOperand()
        {
            var symbol = lexer.ScanNextToken(reader);

            switch (symbol)
            {
            case LexerToken.Eof:
            {
                return(null);
            }

            case LexerToken.DscComment:
            {
                // We handle each comment that starts at the beginning of a
                // line as a dsc comment. That enables us to handle some
                // special Illustrator comments.

                DscCommentOperand dscOp = new DscCommentOperand();
                dscOp.LineNumber = reader.LineNumber;
                dscOp.Name       = lexer.StringToken;

                if (!reader.IsAtEndOfLine)
                {
                    // The number and types and syntax of the parameters depend
                    // on the dsc comment and vary pretty much. That's why we
                    // cannot scan and parse the parameters here. Just pass the
                    // pure rest of the line to the dsc comment, it needs to do
                    // the rest :-(

                    var restOfLine = reader.ReadLine();
                    dscOp.Parameters = restOfLine.Trim();
                }

                return(dscOp);
            }

            case LexerToken.Integer:
            {
                IntegerOperand n = new IntegerOperand();
                n.LineNumber = reader.LineNumber;
                n.Value      = lexer.IntegerToken;
                return(n);
            }

            case LexerToken.Real:
            {
                RealOperand r = new RealOperand();
                r.LineNumber = reader.LineNumber;
                r.Value      = lexer.RealToken;
                return(r);
            }

            case LexerToken.String:
            {
                var s = new StringOperand();
                s.LineNumber = reader.LineNumber;
                s.Value      = lexer.StringToken;
                s.Type       = StringType.Standard;
                return(s);
            }

            case LexerToken.HexString:
            {
                var s = new StringOperand();
                s.LineNumber = reader.LineNumber;
                s.Value      = lexer.StringToken;
                s.Type       = StringType.Hex;
                return(s);
            }

            case LexerToken.AsciiBase85String:
            {
                var s = new StringOperand();
                s.LineNumber = reader.LineNumber;
                s.Value      = lexer.StringToken;
                s.Type       = StringType.AsciiBase85;
                return(s);
            }

            case LexerToken.Name:
            {
                NameOperand name = new NameOperand();
                name.LineNumber = reader.LineNumber;
                name.Value      = lexer.StringToken;
                return(name);
            }

            case LexerToken.Operator:
            {
                var op = new OperatorOperand();
                op.LineNumber = reader.LineNumber;
                op.Name       = lexer.StringToken;
                return(op);
            }

            case LexerToken.ImmediateOperator:
            {
                var op = new ImmediateOperand();
                op.LineNumber = reader.LineNumber;
                op.Name       = lexer.StringToken;
                return(op);
            }

            case LexerToken.BeginDictionary:
            {
                var op = new MarkOperand();
                op.LineNumber = reader.LineNumber;
                return(op);
            }

            case LexerToken.EndDictionary:
            {
                var op = new EndDictionaryOperand();
                op.LineNumber = reader.LineNumber;
                return(op);
            }

            case LexerToken.BeginArray:
            {
                var op = new MarkOperand();
                op.LineNumber = reader.LineNumber;
                return(op);
            }

            case LexerToken.EndArray:
            {
                var op = new EndArrayOperand();
                op.LineNumber = reader.LineNumber;
                return(op);
            }

            case LexerToken.BeginProcedure:
            {
                var op = new BeginProcedureOperand();
                op.LineNumber = reader.LineNumber;
                return(op);
            }

            case LexerToken.EndProcedure:
            {
                var op = new EndProcedureOperand();
                op.LineNumber = reader.LineNumber;
                return(op);
            }

            default:
                throw new Exception("unhandled token");
            }
        }