public static Formula ConvertStringToMacroFormula(string formula, int frmRow, int frmCol) { Stack <AbstractPtg> ptgStack = new Stack <AbstractPtg>(); int charactersPushed = 0; foreach (char c in formula) { PtgConcat ptgConcat = new PtgConcat(); Stack <AbstractPtg> charStack = GetCharSubroutineWithArgsForInt(Convert.ToUInt16(c), 1); charStack.Reverse().ToList().ForEach(item => ptgStack.Push(item)); charactersPushed += 1; if (charactersPushed > 1) { ptgStack.Push(ptgConcat); } } Formula f = new Formula(new Cell(frmRow, frmCol), FormulaValue.GetEmptyStringFormulaValue(), true, new CellParsedFormula(ptgStack)); return(f); }
public static Formula BuildConcatCellsFormula(List <Cell> cells, int frmRow, int frmCol, int ixfe = 15) { Stack <AbstractPtg> ptgStack = new Stack <AbstractPtg>(); Cell firstCell = cells.First(); List <Cell> remainingCells = cells.TakeLast(cells.Count - 1).ToList(); PtgRef cellRef = new PtgRef(firstCell.Rw, firstCell.Col, false, false, AbstractPtg.PtgDataType.VALUE); ptgStack.Push(cellRef); //TODO [Stealth] Use alternate concat methods beyond PtgConcat, for example CONCATENATE via PtgFuncVar foreach (Cell cell in remainingCells) { PtgConcat ptgConcat = new PtgConcat(); PtgRef appendedCellRef = new PtgRef(cell.Rw, cell.Col, false, false, AbstractPtg.PtgDataType.VALUE); ptgStack.Push(appendedCellRef); ptgStack.Push(ptgConcat); } Formula f = new Formula(new Cell(frmRow, frmCol, ixfe), FormulaValue.GetEmptyStringFormulaValue(), true, new CellParsedFormula(ptgStack)); return(f); }
public static Stack <AbstractPtg> getFormulaStack(IStreamReader reader, ushort cce) { var ptgStack = new Stack <AbstractPtg>(); try { for (uint i = 0; i < cce; i++) { var ptgtype = (PtgNumber)reader.ReadByte(); AbstractPtg.PtgDataType dt = AbstractPtg.PtgDataType.REFERENCE; if ((int)ptgtype > 0x5D) { ptgtype -= 0x40; dt = AbstractPtg.PtgDataType.ARRAY; } else if ((int)ptgtype > 0x3D) { ptgtype -= 0x20; dt = AbstractPtg.PtgDataType.VALUE; } AbstractPtg ptg = null; if (ptgtype == PtgNumber.Ptg0x19Sub) { var 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.PtgAttrBaxcel1: ptg = new PtgAttrBaxcel(reader, ptgtype2, false); break; case Ptg0x19Sub.PtgAttrBaxcel2: ptg = new PtgAttrBaxcel(reader, ptgtype2, true); 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.PtgArray: ptg = new PtgArray(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; ptg.dataType = dt; ptgStack.Push(ptg); } } catch (Exception ex) { throw new ExtractorException(ExtractorException.PARSEDFORMULAEXCEPTION, ex); } return(ptgStack); }