Exemple #1
0
 public PtgAreaErr3d(IStreamReader reader, PtgNumber ptgid)
     :
     base(reader, ptgid)
 {
     Debug.Assert(this.Id == ID);
     this.Length  = 11;
     this.Data    = "#REF!";
     this.type    = PtgType.Operand;
     this.ixti    = reader.ReadUInt16();
     this.unused1 = reader.ReadUInt16();
     this.unused2 = reader.ReadUInt16();
     this.unused3 = reader.ReadUInt16();
     this.unused4 = reader.ReadUInt16();
 }
Exemple #2
0
        public PtgStr(IStreamReader reader, PtgNumber ptgid)
            :
            base(reader, ptgid)
        {
            Debug.Assert(this.Id == ID);
            this.type    = PtgType.Operand;
            this.popSize = 1;

            var st = new ShortXLUnicodeString(this.Reader);

            // quotes need to be escaped
            this.Data = ExcelHelperClass.EscapeFormulaString(st.Value);

            this.Length = (uint)(3 + st.rgb.Length);   // length = 1 byte Ptgtype + 1byte cch + 1byte highbyte
        }
Exemple #3
0
        public PtgMemArea(IStreamReader reader, PtgNumber ptgid)
            :
            base(reader, ptgid)
        {
            Debug.Assert(this.Id == ID);

            this.Unused = this.Reader.ReadBytes(4);
            this.cce    = this.Reader.ReadUInt16();

            // ExtraMem = new PtgExtraMem(reader);

            this.Length = 7;

            this.type    = PtgType.Operand;
            this.popSize = 1;
        }
Exemple #4
0
        public PtgRef(IStreamReader reader, PtgNumber ptgid)
            :
            base(reader, ptgid)
        {
            Debug.Assert(this.Id == ID);
            this.Length      = 5;
            this.rw          = this.Reader.ReadUInt16();
            this.col         = this.Reader.ReadUInt16();
            this.colRelative = Utils.BitmaskToBool(this.col, 0x4000);
            this.rwRelative  = Utils.BitmaskToBool(this.col, 0x8000);

            this.col = (ushort)(this.col & 0x3FFF);


            this.type    = PtgType.Operand;
            this.popSize = 1;
        }
Exemple #5
0
        public static byte[] GetBytes(Stack <AbstractPtg> ptgStack)
        {
            //Reverse the order here since this is normally a stack
            List <AbstractPtg> ptgList = ptgStack.Reverse().ToList();

            MemoryStream ms = new MemoryStream();
            BinaryWriter bw = new BinaryWriter(ms);

            foreach (var ptg in ptgList)
            {
                bool isByte18PtgHeader = false;
                bool isByte19PtgHeader = false;

                isByte19PtgHeader = Byte19PtgTypes.Any(t => t == ptg.GetType());

                PtgNumber ptgNumber = (PtgNumber)ptg.Id;

                if (isByte19PtgHeader)
                {
                    bw.Write(Convert.ToByte(0x19));
                }
                else if (isByte18PtgHeader)
                {
                    bw.Write(Convert.ToByte(0x18));
                }
                else if ((int)ptgNumber >= 0x20)
                {
                    if (ptg.dataType == AbstractPtg.PtgDataType.VALUE)
                    {
                        ptgNumber += 0x20;
                    }
                    if (ptg.dataType == AbstractPtg.PtgDataType.ARRAY)
                    {
                        ptgNumber += 0x40;
                    }
                }

                bw.Write(Convert.ToByte(ptgNumber));
                bw.Write(GetByteDataFromPtg(ptg));
            }

            return(bw.GetBytesWritten());
        }
Exemple #6
0
        public PtgBool(IStreamReader reader, PtgNumber ptgid)
            :
            base(reader, ptgid)
        {
            Debug.Assert(this.Id == ID);
            byte value = this.Reader.ReadByte();

            if ((int)value == 0)
            {
                this.Data = "FALSE";
            }
            else
            {
                this.Data = "TRUE";
            }
            this.Length  = 2;
            this.type    = PtgType.Operator;
            this.popSize = 1;
        }
Exemple #7
0
        public PtgErr(IStreamReader reader, PtgNumber ptgid)
            : base(reader, ptgid)
        {
            Debug.Assert(this.Id == ID);
            this.Length = 2;

            byte err = reader.ReadByte();

            this.Data = "";
            switch (err)
            {
            case 0x00:
                this.Data = "#NULL!";
                break;

            case 0x07:
                this.Data = "#DIV/0!";
                break;

            case 0x0F:
                this.Data = "#VALUE!";
                break;

            case 0x17:
                this.Data = "#REF!";
                break;

            case 0x1D:
                this.Data = "#NAME?";
                break;

            case 0x24:
                this.Data = "#NUM!";
                break;

            case 0x2A:
                this.Data = "#N/A";
                break;
            }
            this.type    = PtgType.Operand;
            this.popSize = 1;
        }
Exemple #8
0
        public PtgFuncVar(IStreamReader reader, PtgNumber ptgid)
            :
            base(reader, ptgid)
        {
            Debug.Assert(this.Id == ID);
            this.Length  = 4;
            this.Data    = "";
            this.type    = PtgType.Operator;
            this.cparams = this.Reader.ReadByte();
            this.tab     = this.Reader.ReadUInt16();

            this.fCelFunc = false;
            if ((this.tab & 0xF000) == 1)
            {
                this.fCelFunc = true;
            }
            this.tab = (ushort)(this.tab & 0x7FFF);

            this.popSize = (uint)(this.cparams);
        }
Exemple #9
0
        public AbstractPtg(PtgNumber ptgid, PtgDataType dt = PtgDataType.REFERENCE)
        {
            if ((int)ptgid > 0x5D)
            {
                this.dataType = PtgDataType.ARRAY;
                this._id      = ptgid - 0x40;
            }

            else if ((int)ptgid > 0x3D)
            {
                this.dataType = PtgDataType.VALUE;
                this._id      = ptgid - 0x20;
            }
            else
            {
                this.dataType = dt;
                this._id      = ptgid;
            }

            this.data = "";
        }
Exemple #10
0
        public PtgAreaN(IStreamReader reader, PtgNumber ptgid)
            :
            base(reader, ptgid)
        {
            Debug.Assert(this.Id == ID);
            this.Length   = 9;
            this.rwFirst  = this.Reader.ReadUInt16();
            this.rwLast   = this.Reader.ReadUInt16();
            this.colFirst = this.Reader.ReadInt16();
            this.colLast  = this.Reader.ReadInt16();

            this.colFirstRelative = Utils.BitmaskToBool(this.colFirst, 0x4000);
            this.rwFirstRelative  = Utils.BitmaskToBool(this.colFirst, 0x8000);
            this.colLastRelative  = Utils.BitmaskToBool(this.colLast, 0x4000);
            this.rwLastRelative   = Utils.BitmaskToBool(this.colLast, 0x8000);

            this.colLast  = (short)(this.colLast & 0x3FFF);
            this.colFirst = (short)(this.colFirst & 0x3FFF);

            this.type    = PtgType.Operand;
            this.popSize = 1;
        }
Exemple #11
0
        /// <summary>
        /// Ctor
        /// </summary>
        /// <param name="reader">Streamreader</param>
        /// <param name="id">Ptg Id</param>
        /// <param name="length">The recordlength</param>
        public AbstractPtg(IStreamReader reader, PtgNumber ptgid)
        {
            this._reader = reader;
            this._offset = this._reader.BaseStream.Position;

            if ((int)ptgid > 0x5D)
            {
                this.dataType = PtgDataType.ARRAY;
                this._id      = ptgid - 0x40;
            }

            else if ((int)ptgid > 0x3D)
            {
                this.dataType = PtgDataType.VALUE;
                this._id      = ptgid - 0x20;
            }
            else
            {
                this.dataType = PtgDataType.REFERENCE;
                this._id      = ptgid;
            }

            this.data = "";
        }
Exemple #12
0
        public AbstractPtg(PtgNumber ptgid, PtgDataType dt = PtgDataType.REFERENCE, bool fPtgNumberHighBit = false)
        {
            if ((int)ptgid > 0x5D)
            {
                this.dataType = PtgDataType.ARRAY;
                this._id      = ptgid - 0x40;
            }

            else if ((int)ptgid > 0x3D)
            {
                this.dataType = PtgDataType.VALUE;
                this._id      = ptgid - 0x20;
            }
            else
            {
                this.dataType = dt;
                this._id      = ptgid;
            }

            //Looks like whenever this is true the formula is corrupted, probably worth ignoring
            this.fPtgNumberHighBit = fPtgNumberHighBit;

            this.data = "";
        }
        public static Stack <AbstractPtg> getFormulaStack(IStreamReader reader, UInt16 cce)
        {
            Stack <AbstractPtg> ptgStack = new Stack <AbstractPtg>();

            try
            {
                for (uint i = 0; i < cce; i++)
                {
                    PtgNumber ptgtype = (PtgNumber)reader.ReadByte();

                    if ((int)ptgtype > 0x5D)
                    {
                        ptgtype -= 0x40;
                    }

                    else if ((int)ptgtype > 0x3D)
                    {
                        ptgtype -= 0x20;
                    }
                    AbstractPtg ptg = null;
                    if (ptgtype == PtgNumber.Ptg0x19Sub)
                    {
                        Ptg0x19Sub ptgtype2 = (Ptg0x19Sub)reader.ReadByte();
                        switch (ptgtype2)
                        {
                        case Ptg0x19Sub.PtgAttrSum: ptg = new PtgAttrSum(reader, ptgtype2); break;

                        case Ptg0x19Sub.PtgAttrIf: ptg = new PtgAttrIf(reader, ptgtype2); break;

                        case Ptg0x19Sub.PtgAttrGoto: ptg = new PtgAttrGoto(reader, ptgtype2); break;

                        case Ptg0x19Sub.PtgAttrSemi: ptg = new PtgAttrSemi(reader, ptgtype2); break;

                        case Ptg0x19Sub.PtgAttrChoose: ptg = new PtgAttrChoose(reader, ptgtype2); break;

                        case Ptg0x19Sub.PtgAttrSpace: ptg = new PtgAttrSpace(reader, ptgtype2); break;

                        case Ptg0x19Sub.PtgNotDocumented: ptg = new PtgNotDocumented(reader, ptgtype2); break;

                        default: break;
                        }
                    }
                    else if (ptgtype == PtgNumber.Ptg0x18Sub)
                    {
                    }
                    else
                    {
                        switch (ptgtype)
                        {
                        case PtgNumber.PtgInt: ptg = new PtgInt(reader, ptgtype); break;

                        case PtgNumber.PtgAdd: ptg = new PtgAdd(reader, ptgtype); break;

                        case PtgNumber.PtgSub: ptg = new PtgSub(reader, ptgtype); break;

                        case PtgNumber.PtgMul: ptg = new PtgMul(reader, ptgtype); break;

                        case PtgNumber.PtgDiv: ptg = new PtgDiv(reader, ptgtype); break;

                        case PtgNumber.PtgParen: ptg = new PtgParen(reader, ptgtype); break;

                        case PtgNumber.PtgNum: ptg = new PtgNum(reader, ptgtype); break;

                        case PtgNumber.PtgRef: ptg = new PtgRef(reader, ptgtype); break;

                        case PtgNumber.PtgRefN: ptg = new PtgRefN(reader, ptgtype); break;

                        case PtgNumber.PtgPower: ptg = new PtgPower(reader, ptgtype); break;

                        case PtgNumber.PtgPercent: ptg = new PtgPercent(reader, ptgtype); break;

                        case PtgNumber.PtgBool: ptg = new PtgBool(reader, ptgtype); break;

                        case PtgNumber.PtgGt: ptg = new PtgGt(reader, ptgtype); break;

                        case PtgNumber.PtgGe: ptg = new PtgGe(reader, ptgtype); break;

                        case PtgNumber.PtgLt: ptg = new PtgLt(reader, ptgtype); break;

                        case PtgNumber.PtgLe: ptg = new PtgLe(reader, ptgtype); break;

                        case PtgNumber.PtgEq: ptg = new PtgEq(reader, ptgtype); break;

                        case PtgNumber.PtgNe: ptg = new PtgNe(reader, ptgtype); break;

                        case PtgNumber.PtgUminus: ptg = new PtgUminus(reader, ptgtype); break;

                        case PtgNumber.PtgUplus: ptg = new PtgUplus(reader, ptgtype); break;

                        case PtgNumber.PtgStr: ptg = new PtgStr(reader, ptgtype); break;

                        case PtgNumber.PtgConcat: ptg = new PtgConcat(reader, ptgtype); break;

                        case PtgNumber.PtgUnion: ptg = new PtgUnion(reader, ptgtype); break;

                        case PtgNumber.PtgIsect: ptg = new PtgIsect(reader, ptgtype); break;

                        case PtgNumber.PtgMemErr: ptg = new PtgMemErr(reader, ptgtype); break;

                        case PtgNumber.PtgArea: ptg = new PtgArea(reader, ptgtype); break;

                        case PtgNumber.PtgAreaN: ptg = new PtgAreaN(reader, ptgtype); break;

                        case PtgNumber.PtgFuncVar: ptg = new PtgFuncVar(reader, ptgtype); break;

                        case PtgNumber.PtgFunc: ptg = new PtgFunc(reader, ptgtype); break;

                        case PtgNumber.PtgExp: ptg = new PtgExp(reader, ptgtype); break;

                        case PtgNumber.PtgRef3d: ptg = new PtgRef3d(reader, ptgtype); break;

                        case PtgNumber.PtgArea3d: ptg = new PtgArea3d(reader, ptgtype); break;

                        case PtgNumber.PtgNameX: ptg = new PtgNameX(reader, ptgtype); break;

                        case PtgNumber.PtgName: ptg = new PtgName(reader, ptgtype); break;

                        case PtgNumber.PtgMissArg: ptg = new PtgMissArg(reader, ptgtype); break;

                        case PtgNumber.PtgRefErr: ptg = new PtgRefErr(reader, ptgtype); break;

                        case PtgNumber.PtgRefErr3d: ptg = new PtgRefErr3d(reader, ptgtype); break;

                        case PtgNumber.PtgAreaErr: ptg = new PtgAreaErr(reader, ptgtype); break;

                        case PtgNumber.PtgAreaErr3d: ptg = new PtgAreaErr3d(reader, ptgtype); break;

                        case PtgNumber.PtgMemFunc: ptg = new PtgMemFunc(reader, ptgtype); break;

                        case PtgNumber.PtgErr: ptg = new PtgErr(reader, ptgtype); break;

                        default: break;
                        }
                    }
                    i += ptg.getLength() - 1;
                    ptgStack.Push(ptg);
                }
            }
            catch (Exception ex)
            {
                throw new ExtractorException(ExtractorException.PARSEDFORMULAEXCEPTION, ex);
            }

            return(ptgStack);
        }