Exemplo n.º 1
0
            // получить все элементы уровня
            public int ParseLev(byte[] b, ref int nOfs, DefOneLev xDLev, int nLev)
            {
                int i, j,
                    nRet = AppC.RC_OK;
                string sE;
                object x;

                for (i = 0; i < xDLev.aElems.Count; i++)
                {
                    sE = ParseOneEl(b, ref nOfs, xDLev.aElems[i], out x);
                    if (nLev == 0)
                    {// разбор служебного уровня
                        SetSerPars(xDLev.aElems[i].nTYPE, sE, x);
                        if (xDLev.aElems[i].bMAC == true)
                        {
                            j = xDLev.aElems[i].nMacInd;
                            xDLev.stLev.lMac[j].sVal = sE;
                            xDLev.stLev.lMac[j].xD   = x;
                        }
                    }
                }

                return(nRet);
            }
Exemplo n.º 2
0
        private List <DefOneLev> CreateArrOp(List <string> lD, ref int iL, int nCurLev)
        {
            int nLev, j,
                nEl;
            string s,
                   sField;

            string[]      aFields;
            DefOneLev     xLev;
            List <string> lM = new List <string>();

            List <DefOneLev> xRet = new List <DefOneLev>(0);

            while (iL < lD.Count)
            {
                nLev = GetLev(lD[iL], out aFields);
                if (nLev >= nCurLev)
                {
                    if (nLev == nCurLev)
                    {
                        xLev = new DefOneLev();

                        // 1-й массив пустой, иерархия закончилась (для последнего уровня)
                        xLev.xDeepLev = null;

                        // 2-й массив - описание элементов детальной строки
                        xLev.aElems = new List <ElemDef>(0);

                        // 3-й массив - таблиц уровня
                        // код уровня
                        // наименование уровня
                        xLev.stLev = new LevDef(nLev, aFields[1]);

                        // функция Skip для уровня
                        xLev.stLev.sFUNC = (aFields.Length >= 3)?aFields[2]:"";

                        // имя таблицы уровня
                        xLev.stLev.sTABLE = (aFields.Length >= 4)?aFields[3]:"";

                        // ID уровня

                        // MEMO уровня пока свободен и резервный

                        nEl = 0;

                        sField = "";

                        iL = iL + 1;
                        while (((iL < lD.Count) &&
                                (ParseOneEl(lD[iL], xLev.aElems, ref nEl, out sField, lM) == AppC.RC_OK)) == true)
                        {
                            if (nEl < 0)
                            {
                                throw new SystemException("Недостаточное описание, элемент " + lD[iL]);
                            }

                            if (sField != "")
                            {
                                // элементу присвоено имя
                                sField = "";
                            }

                            j = xLev.aElems.Count - 1;
                            s = xLev.aElems[j].sBC;
                            if (xLev.aElems[j].nTYPE == ELTYPES.TE_MACRO)
                            {// данные вычисляются на нижних уровнях
                                xLev.stLev.lMac.Add(new MacroDef(s));
                                xLev.aElems[j].nMacInd = xLev.stLev.lMac.Count - 1;
                                xLev.aElems[j].bMAC    = true;
                            }

                            iL++;
                        }

                        if (nEl > 0)
                        {
                            xRet.Add(xLev);
                        }
                    }
                    else
                    {
                        // начинается нижний уровень
                        nEl = xRet.Count - 1;
                        xRet[nEl].xDeepLev = CreateArrOp(lD, ref iL, nLev);
                    }
                }
                // iL увеличился в IF
            }

            return(xRet);
        }