예제 #1
0
        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);
        }
예제 #2
0
        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);
        }