// получить все элементы уровня 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); }
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); }