Example #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);
            }
        }
Example #2
0
        public override void Execute(EpsInterpreter interpreter)
        {
            var operandStack = interpreter.OperandStack;

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

            switch (operand1)
            {
            case BooleanOperand boolOperand1:
            {
                var boolOperand2 = (BooleanOperand)operand2;
                var boolean      = new BooleanOperand(boolOperand1.Value || boolOperand2.Value);
                operandStack.Push(boolean);
                break;
            }

            case IntegerOperand intOperand1:
            {
                var intOperand2 = (IntegerOperand)operand2;
                var boolean     = new IntegerOperand(intOperand1.Value | intOperand2.Value);
                operandStack.Push(boolean);
                break;
            }

            default:
                throw new Exception("illegal operator");
            }
        }
Example #3
0
        public override void Execute(EpsInterpreter interpreter)
        {
            var operandStack = interpreter.OperandStack;

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

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

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

            case RealOperand realOperand:
            {
                ret = (int)Math.Round(realOperand.Value);
                break;
            }

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

            var real = new IntegerOperand(ret);

            operandStack.Push(real);
        }
Example #4
0
        public override void Execute(EpsInterpreter interpreter)
        {
            var operandStack = interpreter.OperandStack;

            var count = new IntegerOperand {
                Value = operandStack.Count
            };

            operandStack.Push(count);
        }
Example #5
0
        public override void Execute(EpsInterpreter interpreter)
        {
            var operandStack = interpreter.OperandStack;

            var dict = (DictionaryOperand)operandStack.Pop();

            // there is no limit in the size of the dictionary
            // return any number bigger than the current size
            var counter = dict.Dictionary.Count * 2;

            var count = new IntegerOperand(counter);

            operandStack.Push(count);
        }
Example #6
0
        public override void Execute(EpsInterpreter interpreter)
        {
            var dict = new EpsDictionary();

            var name = new NameOperand {
                Value = "MaxPatternCache"
            };
            var someValue = new IntegerOperand {
                Value = 42
            };

            dict.Add(name, someValue);

            interpreter.OperandStack.Push(new DictionaryOperand(dict));
        }
Example #7
0
        public override void Execute(EpsInterpreter interpreter)
        {
            var operandStack = interpreter.OperandStack;

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

            var integer1 = (IntegerOperand)operand1;
            var integer2 = (IntegerOperand)operand2;

            var res = new IntegerOperand();

            res.Value = integer1.Value % integer2.Value;
            operandStack.Push(res);
        }
Example #8
0
        public static IOperand CreateDynamic(object value)
        {
            if (value == null)
            {
                return(new NullValueOperand());
            }

            Type     t = value.GetType();
            IOperand op;

            if (ReferenceEquals(t, typeof(double)))
            {
                op = new DoubleOperand((double)value);
            }
            else if (ReferenceEquals(t, typeof(string)))
            {
                op = new StringOperand((string)value);
            }
            else if (ReferenceEquals(t, typeof(bool)))
            {
                op = new BooleanOperand((bool)value);
            }
            else if (ReferenceEquals(t, typeof(int)))
            {
                op = new IntegerOperand((int)value);
            }
            else if ((value) is IReference)
            {
                op = (IOperand)value;
            }
            else if (ReferenceEquals(t, typeof(ErrorValueWrapper)))
            {
                op = new ErrorValueOperand((ErrorValueWrapper)value);
            }
            else if (ReferenceEquals(t, typeof(DateTime)))
            {
                op = new DateTimeOperand((DateTime)value);
            }
            else
            {
                throw new ArgumentException(String.Format("The type {0} is not supported as an operand", t.Name));
            }

            return(op);
        }
Example #9
0
        public override void Execute(EpsInterpreter interpreter)
        {
            var operandStack = interpreter.OperandStack;
            var operand      = operandStack.Pop();

            if (operand is IntegerOperand integer)
            {
                var res = new IntegerOperand();
                res.Value = -integer.Value;
                operandStack.Push(res);
            }
            else
            {
                var real = (RealOperand)operand;
                var res  = new RealOperand();
                res.Value = -real.Value;
                operandStack.Push(res);
            }
        }
Example #10
0
        public override void Execute(EpsInterpreter interpreter)
        {
            var operandStack = interpreter.OperandStack;

            var shiftVal = operandStack.PopIntegerValue();
            var intVal   = operandStack.PopIntegerValue();

            var res = new IntegerOperand();

            if (shiftVal >= 0)
            {
                res.Value = intVal << shiftVal;
            }
            else
            {
                res.Value = intVal >> shiftVal;
            }

            operandStack.Push(res);
        }
Example #11
0
        public override void Execute(EpsInterpreter interpreter)
        {
            int counter      = 0;
            var operandStack = interpreter.OperandStack;

            for (int i = operandStack.Count - 1; i >= 0; i--)
            {
                var mark = operandStack[i];

                if (mark is MarkOperand)
                {
                    var count = new IntegerOperand(counter);
                    operandStack.Push(count);

                    return;
                }

                counter++;
            }
        }
Example #12
0
        public override void Execute(EpsInterpreter interpreter)
        {
            var operandStack = interpreter.OperandStack;

            var operand = operandStack.Pop();
            int count   = 0;

            switch (operand)
            {
            case DictionaryOperand dictionaryOperand:
            {
                count = dictionaryOperand.Dictionary.Count;
                break;
            }

            case ArrayOperand arrayOperand:
            {
                count = arrayOperand.Values.Count;
                break;
            }

            case NameOperand nameOperand:
            {
                count = nameOperand.Value.Length;
                break;
            }

            case StringOperand stringOperand:
            {
                count = stringOperand.Length;
                break;
            }
            }

            var countOp = new IntegerOperand(count);

            operandStack.Push(countOp);
        }
Example #13
0
        /// <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");
            }
        }