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(); }
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 }
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; }
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; }
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()); }
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; }
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; }
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); }
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 = ""; }
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; }
/// <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 = ""; }
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); }