BLUESTACK.ORG : datei3

HomePage :: PageIndex :: RecentChanges :: RecentlyCommented :: UserSettings :: You are 38.103.63.60
//datei-name: baum1.C #include "baum.h" extern Baum* baum; extern Output* outputWindow; extern Fund* fundList; extern BMes* bMes; extern EditDialog* editDialog; void Baum::Cntrl0() { mes = 1; baumDat = new char[BDAT]; if (rTyp == 'w') { iStruct = 0; strcpy(edbox, w[root].st); if (rb()) { lexan(); locLoesch(OUTLOC); } } else mes = 2; delete [] baumDat; } void Baum::Alt0() { mes = 1; baumDat = new char[BDAT]; transMulti(10, baumDat); datLen = strlen(baumDat); edbox[0] = 0; lexan(); delete [] baumDat; locLoesch(OUTLOC); } void Baum::CntrlA(int k, unsigned char t, char lc) { if (neu[0]) { if (t == 'w') fallW(k); else fallS(k, lc); if (k != root) { tlz(k, root, t, rTyp); } } } // ersetzt kNr durch neu erstellte root void Baum::fallW(int kNr) { if (alt[0]) { ttrafo(w[kNr].st); root = wortI(tex); rTyp = 'w'; } else { strcpy(tex, neu); tScan(tex); } } void Baum::fallS(int kNr, char lc) { if (alt[0]) { loc = CPYLOC; kNr = copyShadow(kNr); ARek(kNr); loc = lc; KRoot(kNr); } //1 else { strcpy(tex, neu); tScan(tex); } } //1 shadowWurzel erhält lokalität OUTLOC void Baum::ARek(int kNr) { if (s[kNr].t1 == 's') ARek(s[kNr].sl); else { ttrafo(w[s[kNr].sl].st); s[kNr].sl = wortI(tex); } if (s[kNr].t2 == 's') ARek(s[kNr].sr); else { ttrafo(w[s[kNr].sr].st); s[kNr].sr = wortI(tex); } } // teilstring in shadowbaum ersetzen void Baum::ttrafo(char* txtAlt) { int a; char* txtNeu, * strAlt, * strNeu; txtNeu = tex; strAlt = alt; strNeu = neu; a = strlen(strAlt); loop: if (ttrafo1(txtAlt, strAlt)) *txtNeu++ = *txtAlt++; //1 else { while (*strNeu) *txtNeu++ = *strNeu++; txtAlt += a; strNeu = neu; } if (*txtAlt) goto loop; *txtNeu = 0; } // text mit eventuellen ersetzungen nach tex kopieren //1 wenn nicht suchtext, ein weiter //2 durch neu ersetzen char Baum::ttrafo1(char* txtAlt, char* strNeu) { char c; loop: c = *strNeu++; if (c && c == *txtAlt) { txtAlt++; goto loop; } return c; } // text und suchtext // !c: suchtext vollständig gefunden void Baum::CntrlAe() { typ = 's'; ast = root; o1baum(); } void Baum::AltA() { int kNr; if (rTyp == 's') { txt1 = alt; txt2 = neu; if (! *txt2) return; loc = CPYLOC; kNr = copyShadow(root); ARek(kNr); //1 root = CntrlW(kNr); } } //2 // kopieren und ersetzen //1 teilstring in shadowbaum ersetzen //2 shadowWurzel erhält lokalität OUTLOC int Baum::CntrlB(int alt) { int neu; if (s[alt].v == '"' && s[alt].t2 == 's') alt = s[alt].sr; v = s[alt].v; //1 tmpS = new tmp_t[10000]; iM = 0; BRek(alt, 's'); neu = BAusgleich(); delete [] tmpS; if (neu != alt) { Root = s[alt].h; tlz(alt, neu, 's', 's'); s[neu].h = Root; } return neu; } // setzt satz voraus //1 baumausgleich nur für dieses verb.zeichen void Baum::BRek(int alt, char t) { if (t == 's') { if (v == s[alt].v) { BRek(s[alt].sl, s[alt].t1); BRek(s[alt].sr, s[alt].t2); return; } } tmpS[iM].c = t; tmpS[iM].i = alt; ++iM; } //1 //1 endelement für baumausgleich int Baum::BAusgleich() { int i, j; while (iM > 1) { i = 2; j = 0; while (i <= iM) { tmpS[j].i = sBau(tmpS[i - 2].i, tmpS[i - 1].i, tmpS[i - 2].c, tmpS[i - 1].c, v); tmpS[j].c = 's'; i += 2; ++j; } if (i == iM + 1) { tmpS[j].i = tmpS[i - 2].i; tmpS[j].c = tmpS[i - 2].c; ++j; } iM = j; } return tmpS[0].i; } void Baum::AltB(int alt, char v) { Ast = alt; v0 = v; tmpS = new tmp_t[1000]; iM = 0; AltBRek(); if (iM > 1) AltBAusgleich(0); Ast = tmpS[0].i; if (alt != Ast) tlz(alt, Ast, 's', 's'); mes = 1; delete [] tmpS; } // setzt satz voraus. void Baum::AltBRek() { int sl, sr, n; unsigned char t1, t2, v; sl = s[Ast].sl; sr = s[Ast].sr; t1 = s[Ast].t1; t2 = s[Ast].t2; v = s[Ast].v; if (v == v0) { if (t1 == 's') { Ast = sl; AltBRek(); } else { tmpS[iM].c = t1; tmpS[iM].i = sl; ++iM; } if (t2 == 's') { Ast = sr; AltBRek(); } else { tmpS[iM].c = t2; tmpS[iM].i = sr; ++iM; } } else { n = iM; if (t1 == 's') { Ast = sl; AltBRek(); if (iM - 1 > 1) AltBAusgleich(n); } else { tmpS[iM].c = t1; tmpS[iM].i = sl; ++iM; } ++n; if (t2 == 's') { Ast = sr; AltBRek(); if (iM - 1 > 1) AltBAusgleich(n); } else { tmpS[iM].c = t2; tmpS[iM].i = sr; ++iM; } iM -= 2; tmpS[iM].i = sBau(tmpS[iM].i, tmpS[iM + 1].i, tmpS[iM].c, tmpS[iM + 1].c, v); tmpS[iM].c = 's'; ++iM; } } // setzt satz Ast, v0, tmpS u. iM voraus void Baum::AltBAusgleich(int iL) { int iJ, iK; iJ = iK = iL; iK += 2; while (iM > (iL + 1)) { while (iK <= iM) { tmpS[iJ].i = sBau(tmpS[iK - 2].i, tmpS[iK - 1].i, tmpS[iK - 2].c, tmpS[iK - 1].c, v0); tmpS[iJ].c = 's'; iK += 2; ++iJ; } if (iK == iM + 1) { tmpS[iJ].i = tmpS[iK - 2].i; tmpS[iJ].c = tmpS[iK - 2].c; ++iJ; } iM = iJ; iJ = iK = iL; iK += 2; } } void Baum::CntrlD() { time(&zeit); strcpy(edbox,ctime(&zeit)); tex[0] = edbox[22]; tex[1] = edbox[23]; if (strstr(edbox, "Jan")) { tex[2] = '0'; tex[3] = '1'; } else if (strstr(edbox, "Feb")) { tex[2] = '0'; tex[3] = '2'; } else if (strstr(edbox, "Mar")) { tex[2] = '0'; tex[3] = '3'; } else if (strstr(edbox, "Apr")) { tex[2] = '0'; tex[3] = '4'; } else if (strstr(edbox, "May")) { tex[2] = '0'; tex[3] = '5'; } else if (strstr(edbox, "Jun")) { tex[2] = '0'; tex[3] = '6'; } else if (strstr(edbox, "Jul")) { tex[2] = '0'; tex[3] = '7'; } else if (strstr(edbox, "Aug")) { tex[2] = '0'; tex[3] = '8'; } else if (strstr(edbox, "Sep")) { tex[2] = '0'; tex[3] = '9'; } else if (strstr(edbox, "Oct")) { tex[2] = '1'; tex[3] = '0'; } else if (strstr(edbox, "Nov")) { tex[2] = '1'; tex[3] = '1'; } else if (strstr(edbox, "Dec")) { tex[2] = '1'; tex[3] = '2'; } tex[4] = edbox[8]; tex[5] = edbox[9]; if (tex[4] == ' ') tex[4] = '0'; if (strstr(edbox, "Mon")) tex[6] = '1'; else if (strstr(edbox, "Tue")) tex[6] = '2'; else if (strstr(edbox, "Wed")) tex[6] = '3'; else if (strstr(edbox, "Thu")) tex[6] = '4'; else if (strstr(edbox, "Fri")) tex[6] = '5'; else if (strstr(edbox, "Sat")) tex[6] = '6'; else if (strstr(edbox, "Sun")) tex[6] = '7'; tex[7] = 0; tScan(tex); } void Baum::AltD() { int Root; if (rTyp == 'w' && ! w[root].b) { txt1 = w[root].st; if (isDay(txt1)) { worti = wortI("journal"); if (vLSatz(worti)) //1 { ast = s[rSatz].sr; Root = root; AltD1(); if (mes == 2) { rTyp = 's'; root = ast; return; } rTyp = 'w'; root = Root; F7(); return; } } } mes = 2; } // ordnet datum in baum ein //1 vLSatz setzt rSatz als journal-baum void Baum::AltD1() // langsame baum_iteration von rechts nach links mit abbruch, setzt txt1, ast u. root voraus { *stck0++ = 0; loop: if (s[ast].v == '"') //1 { holz = s[ast].sl; txt2 = w[holz].st; if (isDay(txt2)) { if (strlen(txt1) != strlen(txt2)) { mes = 2; return; } if (strcmp(txt1, txt2) > 0) { Ast = *--stck0; if (ast == s[Ast].sr) anbauRr(Ast, root, 'w', '.'); else anbauLr(Ast, root, 'w', '.'); DAusgleich (); return; } loop1: Ast = *--stck0; if (s[Ast].t1 == 's') { if (ast == s[Ast].sl) { ast = Ast; goto loop1; } *stck0++ = Ast; ast = s[Ast].sl; goto loop; } else { ast = Ast; mes = 2; } } else { if (s[ast].t2 != 's') { mes = 2; return; } *stck0++ = 0; ast = s[ast].sr; goto loop; } } else { if (s[ast].t2 != 's') { mes = 2; return; } *stck0++ = ast; ast = s[ast].sr; goto loop; } } //2 //1 look_for_todo //2 stack_up_right void Baum::DAusgleich() { int p, l, r, lSum, rSum; loop: p = *--stck0; if (p) { l = s[p].sl; r = s[p].sr; sum = 0; getLSum(l); lSum = sum; sum = 0; getLSum(r); rSum = sum; if (lSum <= rSum) goto loop; CntrlB(p); } else { ++stck0; p = *stck0; if (p) CntrlB(p); } } void Baum::getLSum(int l) { if (s[l].v == '.') { getLSum(s[l].sl); getLSum(s[l].sr); } ++sum; } void Baum::CntrlE() { if (rTyp == 's') { CntrlE1(root); strcpy(tex, editDialog->comboEBox->text(0)); nr = 0; //1 editDialog->line->setText(tex); } else mes = 2; } // baum editieren, legt alle Worte auf comboEBox //1 erstes wort in editierzeile void Baum::CntrlE1(int kNr) { if (s[kNr].t1 == 's') CntrlE1(s[kNr].sl); else editDialog->comboEBox->insertItem((QString) w[s[kNr].sl].st, -1); if (s[kNr].t2 == 's') CntrlE1(s[kNr].sr); else editDialog->comboEBox->insertItem((QString) w[s[kNr].sr].st, -1); } // kopiert worte in comboEBox void Baum::ERek1(int kNr) { if (s[kNr].t1 == 's') ERek1(s[kNr].sl); else { strcpy(tex, editDialog->comboEBox->text(nr)); s[kNr].sl = wortI(tex); ++nr; } //1 if (s[kNr].t2 == 's') ERek1(s[kNr].sr); else { strcpy(tex, editDialog->comboEBox->text(nr)); s[kNr].sr = wortI(tex); ++nr; } } //1 // worte aus comboEbox in shadowBaum einsetzen //1 eingabezeile in shadow einbauen void Baum::CntrlE2() { stck3 = stack + 3 * STCK1; cstck4 = cstack + CSTACK - CSTCK; stck4 = stack + STACK - STCK; typ = 's'; ast = Root; CntrlE2a(); root = *--stck3; rTyp = 's'; } // langsame rekursion, setzt root voraus, kopiert struktur mit stack als inhalt void Baum::CntrlE2a() { if (typ == 'w') { txt1 = w[ast].st; if (*txt1 == '¹') *stck3++ = *stck4++; // look for todo else *stck3++ = ast; *cstck3++ = 'w'; return; } *stck0++ = ast; typ = s[ast].t1; ast = s[ast].sl; CntrlE2a(); // links hoch ast = *--stck0; if (s[ast].v == '¹') { *cstck2++ = *cstck4++; stck4++; } else *cstck2++ = s[ast].v; *stck0++ = ast; typ = s[ast].t2; ast = s[ast].sr; CntrlE2a(); // rechts hoch ast = *--stck0; s0.t2 = *--cstck3; s0.t1 = *--cstck3; s0.sr = *--stck3; s0.sl = *--stck3; s0.v = *--cstck2; *cstck3++ = 's'; *stck3++ = makesatz(); } void Baum::AltE() { if (rTyp == 's') { iM = 0; AltE1(root); } else mes = 2; } void Baum::AltE1(int kNr) { if (s[kNr].t1 == 's') AltE1(s[kNr].sl); else { txt1 = w[s[kNr].sl].st; if (*txt1 == '¹') { mintM[iM] = s[kNr].sl; ++iM; } } if (s[kNr].t2 == 's') AltE1(s[kNr].sr); else { txt1 = w[s[kNr].sr].st; if (*txt1 == '¹') { mintM[iM] = s[kNr].sr; ++iM; } } } // eingabemaske für baumerzeugung verwenden void Baum::ERek(int kNr) { if (s[kNr].t1 == 's') ERek(s[kNr].sl); else { txt1 = w[s[kNr].sl].st; if (*txt1 == '¹') { s[kNr].sl = mintS[nr]; ++nr; } } //1 if (s[kNr].t2 == 's') ERek(s[kNr].sr); else { txt1 = w[s[kNr].sr].st; if (*txt1 == '¹') { s[kNr].sr = mintS[nr]; ++nr; } } } //1 eingabezeile in shadow einbauen void Baum::CntrlF(int kNr) { fundList->iFF = 0; FRek(kNr); if (fundList->iFF) { fundList->setCaption("fundListe lokal"); fundList->repaint(); } else AltF(); } void Baum::FRek(int kNr) { int sl, sr; unsigned char t1, t2; sl = s[kNr].sl; sr = s[kNr].sr; t1 = s[kNr].t1; t2 = s[kNr].t2; if (t1 == 's') FRek(sl); else { if (t1 == 'w') { if (strstr(w[sl].st, kette)) Cntrl1F(sl); } } if (t2 == 's') FRek(sr); else { if (t2 == 'w') { if (strstr(w[sr].st, kette)) Cntrl1F(sr); } } } void Baum::Cntrl1F(int in) { int i; char da; da = 0; for (i = 0; i < fundList->iFF; ++i) { if (tmpF[i].i == in) { da = 1; break; } } if (! da) { if (fundList->iFF < 1000) { tmpF[fundList->iFF].i = in; ++fundList->iFF; } } } void Baum::AltF() { worti = 255; while (worti < wort0) { worti++; if (w[worti].b) { kett1 = w[worti].st; if (strstr(kett1, kette)) Cntrl1F(worti); } } fundList->setCaption("fundListe global"); fundList->repaint(); } void Baum::CntrlG() { int sl, sr, rrSatz, rzSatz; unsigned char t1, t2; rzi = 0; if (! root || rTyp != 's') return; sl = s[root].sl; sr = s[root].sr; t1 = s[root].t1; t2 = s[root].t2; if (t1 == 'w' && sl == gW) rzi = w[sl].b; else if (t2 == 'w' && sr == gW) rzi = w[sr].b; if (! rzi) return; rSatz = r[rzi].zS; loop: rzi = r[rzi].zz; if (! rzi) return; rzSatz = r[rzi].zS; if (rSatz == root) { rrSatz = s[rSatz].h; if (rrSatz) { if (rSatz == s[rrSatz].sl) umbau(rrSatz, 'l', rzSatz, 's'); else umbau(rrSatz, 'r', rzSatz, 's'); s[rSatz].h = 0; s[rzSatz].h = rrSatz; } root = rzSatz; } else { rSatz = rzSatz; goto loop; } } //1 gW wird von vSatzN gesetzt void Baum::AltG(int kNr) { int sl, sr; unsigned char t1, t2; sl = s[kNr].sl; sr = s[kNr].sr; t1 = s[kNr].t1; t2 = s[kNr].t2; if (s[kNr].v == '"') { if (sl == worti) { if (! ast) { ast = sr; typ = t2; } else { ast = sBau(ast, sr, typ, t2, '.'); typ = 's'; } } else if (t2 == 's') AltG(sr); return; } else if (t1 == 's') AltG(sl); if (t2 == 's') AltG(sr); } void Baum::CntrlH() { int* rzp; int rzi, rzr, rzv, rSatz, rzSatz; if (rTyp == 's') { if (root == knot) { if (typJ == 's') rzp = & s[rootJ].b; else rzp = & w[rootJ].b; rzi = *rzp; rSatz = r[rzi].zS; if (root == rSatz) { rzr = r[rzi].zz; while (rzr) { rzv = rzr; rzr = r[rzr].zz; } root = r[rzv].zS; s[rSatz].s = rzv; } else { root = s[root].s; loop: rzSatz = r[rzi].zS; if (rzSatz != root) { rzi = r[rzi].zz; goto loop; } s[rSatz].s = rzi; } } else CntrlJ(); } else CntrlJ(); knot = root; } void Baum::CntrlI(int alt) { int neu, i; if (s[alt].v == '"' && s[alt].t2 == 's') alt = s[alt].sr; v = s[alt].v; //1 sortS = new sort_t[50000]; memset(sortS, 0, sizeof(sort_t) * 50000); iM = 0; sortVorList(alt, 's'); i = 1; while (i < iM) { txt1 = w[sortS[i].w].st; nr = i; if (sortZ) sortZBaum(0); else sortBaum(0); ++i; } tmpS = new tmp_t[50000]; nr = 0; sortList(0); delete [] sortS; neu = BAusgleich(); delete [] tmpS; if (neu != alt) tlz(alt, neu, 's', 's'); } // setzt satz voraus //1 baumsort nur für dieses verb.zeichen void Baum::sortVorList(int k, unsigned char t) { if (t == 's') { if (v == s[k].v) { sortVorList(s[k].sl, s[k].t1); sortVorList(s[k].sr, s[k].t2); } else { sortS[iM].s = k; while (s[k].t1 == 's') k = s[k].sl; sortS[iM].w = s[k].sl; ++iM; } } else { sortS[iM].w = k; ++iM; } } void Baum::sortBaum(int i) { txt2 = w[sortS[i].w].st; if (strcmp(txt1, txt2) < 0) { if (sortS[i].vor) sortBaum(sortS[i].vor); else sortS[i].vor = nr; } else { if (sortS[i].nach) sortBaum(sortS[i].nach); else sortS[i].nach = nr; } } // setzt nr und txt1 voraus void Baum::sortZBaum(int i) { txt2 = w[sortS[i].w].st; if (strlen(txt1) == strlen(txt2)) { if (strcmp(txt1, txt2) < 0) { if (sortS[i].vor) sortZBaum(sortS[i].vor); else sortS[i].vor = nr; } else { if (sortS[i].nach) sortZBaum(sortS[i].nach); else sortS[i].nach = nr; } } else if (strlen(txt1) < strlen(txt2)) { if (sortS[i].vor) sortZBaum(sortS[i].vor); else sortS[i].vor = nr; } else { if (sortS[i].nach) sortZBaum(sortS[i].nach); else sortS[i].nach = nr; } } void Baum::sortList(int k) { if (sortS[k].vor) sortList(sortS[k].vor); if (sortS[k].s) { tmpS[nr].i = sortS[k].s; tmpS[nr].c = 's'; } else { tmpS[nr].i = sortS[k].w; tmpS[nr].c = 'w'; } ++nr; if (sortS[k].nach) sortList(sortS[k].nach); } // arbeitet sortS_baum rekursiv ab u. überträgt alle knoten in tmpS_liste void Baum::CntrlJ() { int* rzp; int rzi, rzr, rzv, rSatz, rzSatz; if (rTyp == 's' && root == knot) { if (typJ == 's') rzp = & s[rootJ].b; else rzp = & w[rootJ].b; rzi = *rzp; rSatz = r[rzi].zS; rzr = r[rzi].zz; rzSatz = r[rzr].zS; rzv = s[rSatz].s; rzv = r[rzv].zz; if (rzv) { root = r[rzv].zS; s[rSatz].s = rzv; } else { root = rSatz; s[rSatz].s = rzi; } } else { rootJ = root; typJ = rTyp; if (rTyp == 's') rzp = & s[root].b; else rzp = & w[root].b; vSatzR(rzp); root = r[*rzp].zS; rTyp = 's'; } knot = root; } // setzt root und rTyp voraus // setzt beim 1. mal rootJ, typJ und knot und diese in der folge als gegeben voraus /* { int* rzp; int rzi, rzr, rzv, rSatz, rzSatz; if (rTyp == 's') { if (root == knot) { if (typJ == 's') rzp = & s[rootJ].b; else rzp = & w[rootJ].b; rzi = *rzp; rSatz = r[rzi].zS; rzr = r[rzi].zz; rzSatz = r[rzr].zS; rzv = s[rSatz].s; rzv = r[rzv].zz; if (rzv) { root = r[rzv].zS; s[rSatz].s = rzv; } else { root = rSatz; s[rSatz].s = rzi; } } else { rzp = & s[root].b; rootJ = root; typJ = rTyp; vSatzR(rzp); root = r[*rzp].zS; } } else { rzp = & w[root].b; rootJ = root; typJ = rTyp; vSatzR(rzp); root = r[*rzp].zS; rTyp = 's'; } knot = root; } */ void Baum::vSatzR(int* rzp) { int i, rzi, rzr, pre, per, prep, rSatz, rzSatz; i = rzi = *rzp; if (r[rzi].zz) { while (rzi) { querz = 0; rSatz = r[rzi].zS; rzr = s[rSatz].b; while (rzr) { ++querz; rzr = r[rzr].zz; } s[rSatz].s = querz; rzi = r[rzi].zz; } rzi = pre = prep = i; rzr = r[rzi].zz; while (rzr) { per = rzi; rzSatz = r[rzr].zS; sum = s[rzSatz].s; while (per != rzr) { rSatz = r[per].zS; querz = s[rSatz].s; if (querz < sum) { r[pre].zz = r[rzr].zz; r[rzr].zz = per; if (per == rzi) *rzp = rzi = rzr; else r[prep].zz = rzr; break; } else if (prep != per) prep = per; per = r[per].zz; } pre = per; rzr = r[pre].zz; } rSatz = r[rzi].zS; rzr = r[rzi].zz; rzSatz = r[rzr].zS; s[rSatz].s = rzi; loop: s[rzSatz].s = rSatz; rzi = rzr; rSatz = r[rzi].zS; rzr = r[rzr].zz; if (rzr) { rzSatz = r[rzr].zS; goto loop; } } } void Baum::CntrlOe() { knot = 0; mes = 11; } // (CntrlJ a CntrlH h knot) zurückgesetzt! void Baum::CntrlK(int k) { if (loc == STDLOC) { loc = EDLOC; histWrzl = s[k].h; if (!histWrzl) { rzi = s[k].b; wrzl = r[rzi].zS; if (k == s[wrzl].sl) kFall = 1; else kFall = 2; } else { if (s[histWrzl].v == '"' && lflag) histWrzl = s[histWrzl].sr; if (k == s[histWrzl].sl) kFall = 3; else if (k == s[histWrzl].sr) kFall = 4; } } else loc = STDLOC; KRoot(k); if (loc == EDLOC) return; switch(kFall) { case 1: umbau(wrzl, 'l', root, 's'); break; case 2: umbau(wrzl, 'r', root, 's'); break; case 3: umbau(histWrzl, 'l', root, 's'); break; case 4: umbau(histWrzl, 'r', root, 's'); } } // setzt satz voraus und toggelt loc void Baum::KRoot(int k) { if (! s[k].b) s[k].lc = OUTLOC; root = KRek(k); } // setzt neue root und bereitet gegebenenfalls alte zum löschen vor int Baum::KRek(int k) { int sl, sr; char t1, t2; sl = s[k].sl; sr = s[k].sr; t1 = s[k].t1; t2 = s[k].t2; if (t1 == 's') sl = KRek(sl); if (t2 == 's') sr = KRek(sr); return sBau(sl, sr, t1, t2, s[k].v); } // kopiert bäume (in neue lokalität) int Baum::CntrlL(int wrzl, char *txt) { char zweig; zweig = zzweig(wrzl); if (! zweig) { if (s[wrzl].v == '"') wrzl = rootAbbau(wrzl, 'l'); if (! *txt) return wrzl; wrzl = sBau(wortI(txt), wrzl, 'w', 's', '"'); } else { if (lflag && s[wrzl].v == '"') { lflag = 0; wrzl = rootAbbau(wrzl, 'l'); lflag = 1; } else wrzl = rSatz; if (! *txt) return wrzl; if (zweig == '\\') { anbauLl(wrzl, wortI(txt), 'w', '"'); wrzl = s[wrzl].sl; } else { anbauRl(wrzl, wortI(txt), 'w', '"'); wrzl = s[wrzl].sr; } } lflag = 1; return wrzl; } // setzt label (neu) char Baum::zzweig(int wrzl) { int rzi; char zweig; zweig = 0; rzi = s[wrzl].b; //1 if (rzi) { rSatz = r[rzi].zS; //2 if (wrzl == s[rSatz].sl) zweig = '\\'; else zweig = '/'; } return zweig; } // wrzl bezüglich rSatz in zweig als links oder rechts merken. //1 liste der rückzeiger //2 wenn rzi, dann rückzeigersatz void Baum::CntrlM() { int k; if (rTyp == 's') { k = root; tScan(edbox); muster(k, 's'); musterung(); F6(re, 's'); } } void Baum::AltM() { int k; if (rTyp == 's') { k = root; tScan(edbox); muster(k, 's'); musterung(); bildneu(); if (Muster()) { stckrset(); re1 = re; //1 if (rTyp == 's') { k = root; tScan(edbox); muster(k, 's'); transform(root); F6(re1, 's'); } } F6(re, 's'); } } //1 re bleibt erhalten void Baum::CntrlN() { unsigned char v1; int k; if (rTyp == 's') { v = s[root].v; if (v == '"') { root = s[root].sr; v = s[root].v; } if (s[root].t2 == 's') { k = s[root].sr; v1 = s[k].v; s0.sl = s[root].sl; s0.t1 = s[root].t1; s0.sr = s[k].sl; s0.t2 = s[k].t1; s0.v = v; s0.sl = makesatz(); s0.t1 = 's'; s0.v = v1; s0.sr = s[k].sr; s0.t2 = s[k].t2; k = makesatz(); tlz(root, k, 's', 's'); F7(); } } } void Baum::AltN() { unsigned char v1; int k; if (rTyp == 's') { v = s[root].v; if (v == '"') { root = s[root].sr; v = s[root].v; } if (s[root].t1 == 's') { k = s[root].sl; v1 = s[k].v; s0.sr = s[root].sr; s0.t2 = s[root].t2; s0.sl = s[k].sr; s0.t1 = s[k].t2; s0.v = v; s0.sr = makesatz(); s0.t2 = 's'; s0.v = v1; s0.sl = s[k].sl; s0.t1 = s[k].t1; k = makesatz(); tlz(root, k, 's', 's'); F7(); } } } void Baum::CntrlO() { int header, ascisp, wortsp, satzsp, i; delete [] ascii; delete [] w; delete [] s; delete [] r; //1 ascii = new char[ENDC+1]; w = new wort[ENDW+1]; //1 s = new satz[ENDS+1]; r = new kett[ENDRL+1]; //1 header = 16; memcpy(mint, baumDat, header); ascisp = mint[1] - header; wortsp = mint[2] - mint[1]; satzsp = mint[3] - mint[2]; memcpy(ascii, baumDat + header, ascisp); memcpy(w, baumDat + mint[1], wortsp); memcpy(s, baumDat + mint[2], satzsp); memcpy(r, baumDat + mint[3], satzsp); asci0 = ascii + ascisp; while (! *asci0) asci0--; asci0++; asci0++; wort0 = wortsp / sizeof(wort) - 1; for (i = 0; i <= wort0; i++) w[i].st += int(ascii); // relocieren der einzelnen textzeiger sMax = satzsp / sizeof(satz); rMax = 2 * sMax; satz0 = 1; while (s[satz0].v) satz0++; rzl0 = 1; while (r[rzl0].zS) rzl0++; keyList(); rTyp = 's'; root = sMax; stck1 = stack + STCK1; for(i = 1; i < 256; i++) { worti = w[i].wl; // suchbaum_anker if (worti) { wBSort(worti); *stck1 = 0; stck1 = stack + STCK1; wBAusgleich(); w[i].wl = *stck1; } } bLinks(); } // umkehr_funktion von CntrlS //1 alte puffer durch neue ersetzen void Baum::O0() { baumdat = baumDat + 3; loc = *baumdat++; //1 stck0 = stack; ORek(); typ = 's'; rTyp = typ; root = s0.sl; } // liest klammer_ausdrücke als baum_struktur ein // lokalität einlesen void Baum::ORek() { if (*++baumdat == 1) { ORek(); // rekursion loop: s0.v = *baumdat++; if (*baumdat == 1) { *cstck0++ = s0.v; *stck0++ = s0.sl; *cstck0++ = s0.t1; ORek(); // rekursion s0.t2 = s0.t1; s0.sr = s0.sl; s0.t1 = *--cstck0; s0.sl = *--stck0; s0.v = *--cstck0; s0.sl = makesatz(); s0.t1 = 's'; baumdat++; return; } if (*baumdat == 20) { ++baumdat; s0.t2 = *baumdat++; } else s0.t2 = 'w'; if (s0.t2 == 'w' || s0.t2 == '?') { s0.sr = wortI(baumdat); loop2: if (*baumdat++) goto loop2; } else { s0.sr = *(int*)baumdat; baumdat += 4; } s0.sl = makesatz(); s0.t1 = 's'; baumdat++; return; } if (*baumdat == 20) { ++baumdat; s0.t1 = *baumdat++; } else s0.t1 = 'w'; if (s0.t1 == 'w' || s0.t1 == '?') { s0.sl = wortI(baumdat); loop1: if (*baumdat++) goto loop1; } else { s0.sl = *(int*)baumdat; baumdat += 4; } goto loop; } void Baum::CntrlP() { mes = 2; Ast = root; Typ = rTyp; if (Typ == 's' && s[Ast].v == '"' && s[Ast].t2 == 's' && s[s[Ast].sr].v == 'f') { loc = EDLOC; PRek(); root = Ast; rTyp = Typ; loc = STDLOC; mes = 1; } } void Baum::PRek() { int sl, sr; unsigned char t1, t2, v; sl = s[Ast].sl; sr = s[Ast].sr; t1 = s[Ast].t1; t2 = s[Ast].t2; v = s[Ast].v; if (v == '"') { if (t2 == 's') { if (s[sr].v == 'f') { Ast = s[sr].sr; PRek(); if (Ast) { if (Typ == 's') AltB(Ast, '.'); Ast = sBau(sl, Ast, 'w', Typ, '"'); Typ = 's'; } else { Ast = sl; Typ = 'w'; } return; } Ast = sr; PRek(); return; } Ast = 0; return; } if (v == '}') { if (t2 == 's') { Ast = sr; PRek(); return; } if (sr == '}') Ast = 0; else { Ast = sr; Typ = 'w'; } return; } if(t1 == 's') { Ast = sl; PRek(); sl = Ast; t1 = Typ; } else if (v == '.') { if (sl == '}' || sl == break_ || sl == continue_) sl = 0; } else sl = 0; if(t2 == 's') { Ast = sr; Typ = 's'; PRek(); sr = Ast; t2 = Typ; } else if (v == '.') { if (sr == '}' || sr == break_ || sr == continue_) sr = 0; } else sr = 0; if (sl && sr) { Ast = sBau(sl, sr, t1, t2, '.'); Typ = 's'; } else if (sl) { Ast = sl; Typ = t1; } else if (sr) { Ast = sr; Typ = t2; } else Ast = 0; } void Baum::AltP() { int k, kNr; if (clip[0] && clipTyp[0] == 's' && rTyp == 's') { k = clip[0]; //1 kNr = root; iM = 0; AltE1(k); //2 if (!iM) { mes = 2; return; } iG = 0; rekFlag = 0; AltP1(k, kNr); //3 if (rekFlag) { mes = 2; return; } } else { mes = 2; return; } } //4 // übernehme werte aus baum in eingabemaske //1 k = eingabemaske //2 ¹worte der eingabemaske merken in mintM //3 baumvergleich + datensatzübernahme in mintG //4 baum nicht strukturgleich void Baum::AltP1(int k, int kNr) { if (s[k].t1 != s[kNr].t1 || s[k].v != s[kNr].v) rekFlag = 1; if (rekFlag) return; if (s[k].t1 == 's') AltP1(s[k].sl, s[kNr].sl); else { txt1 = w[s[k].sl].st; if (*txt1 == '¹') { mintG[iG] = s[kNr].sl; ++iG; } } if (s[k].t2 != s[kNr].t2 || s[k].t2 != s[kNr].t2) rekFlag = 1; if (rekFlag) return; if (s[kNr].t2 == 's') AltP1(s[k].sr, s[kNr].sr); else { txt1 = w[s[k].sr].st; if (*txt1 == '¹') { mintG[iG] = s[kNr].sr; ++iG; } } } void Baum::AltP2(int k, int kNr) { if (s[k].t1 == 's') AltP2(s[k].sl, s[kNr].sl); else { txt1 = w[s[k].sl].st; if (*txt1 == '¹') { s[kNr].sl = mintS[iG]; ++iG; } } if (s[kNr].t2 == 's') AltP2(s[k].sr, s[kNr].sr); else { txt1 = w[s[k].sr].st; if (*txt1 == '¹') { s[kNr].sr = mintS[iG]; ++iG; } } } void Baum::CntrlR() { if (rTyp == 's') { if (s[root].v == '"' && s[s[root].sr].v == 'f') //1 { if (s[s[root].sr].t2 == 'w') return; err = 0; makeShadow(root); if (err) { root = err; cout << endl; return; } Run(); } else AltRun(); } else AltRun(); if (err) { root = err; cout << endl; return; } } //1 übersetzbare funktion void Baum::Run() { runStack = new int[RUN]; tStack = new char[RUN]; rekStack = new int[REK]; varWert = new int[CALC]; varTyp = new char[CALC]; if (shadowRoot) delete outputWindow; //1 outputWindow = new Output(baum); loc = STDLOC; run(shadowRoot); delete [] varWert; delete [] varTyp; delete [] runStack; delete [] tStack; delete [] rekStack; } //1 wird (außer beim start) immer ausgeführt void Baum::makeShadow(int fctRoot) { err = 0; gBaum0(fctRoot); if (err) root = err; if (gStack != NULL) delete [] gStack; gStack = new char[GSTACK]; mes = 1; clrRunLoc(); loc = RUNLOC; if (! err) { gBaum(fctRoot); if (err) root = err; } F7(); loc = STDLOC; } void Baum::AltR() { if (rTyp == 's') { if (s[root].v == '"' && s[s[root].sr].v == 'f') { err = 0; makeShadow(root); //1 if (err) cout << endl; } else mes = 2; } else mes = 2; } //1 übersetzbare funktion void Baum::clrRunLoc() { holz = sMax; while (holz) { if (! s[holz].b) { if(s[holz].lc == RUNLOC) runLocRek(holz, 's'); } holz--; } } void Baum::runLocRek(int i, char t) { if (t != 's') return; if (! s[i].v) return; *stck0++ = s[i].sr; *cstck0++ = s[i].t2; *stck0++ = s[i].sl; *cstck0++ = s[i].t1; s[i] = s[ENDS]; //1 i = *--stck0; t = *--cstck0; runLocRek(i, t); i = *--stck0; t = *--cstck0; runLocRek(i, t); } //1 leeren satzblock kopieren void Baum::AltRun() { int k; bool ok; QString z; ok = false; z = QInputDialog::getText("Programmstart:", "Programmname:", QLineEdit::Normal, "", &ok, this); if (ok) { strcpy(neu, z); if (*neu) { worti = wortI(neu); k = vLSatz(worti); if (k) { if (s[s[k].sr].v == 'f') { Run(); return; } } } } mes = 2; } void Baum::CntrlS() { int i, header, ascisp, wortsp, satzsp; if (shadowRoot) { clrRunLoc(); shadowRoot = 0; } header = 16; ascisp = asci0 - ascii; wortsp = (wort0 + 1) * sizeof(wort); satzsp = (sMax + 1) * sizeof(satz); for (i = 0; i <= wort0; i++) w[i].st -= int(ascii); //1 mint[0] = MAGIC; mint[1] = header + ascisp - ascisp % 16 + 16; //2 mint[2] = mint[1] + wortsp; mint[3] = mint[2] + satzsp; datLen = mint[3] + satzsp; memcpy(baumDat, mint, header); memcpy(baumDat + header, ascii, ascisp); memcpy(baumDat + mint[1], w, wortsp); memcpy(baumDat + mint[2], s, satzsp); memcpy(baumDat + mint[3], r, satzsp); } // umkehr_funktion von CntrlO //1 delocieren der einzelnen textzeiger //2 bounding auf 16 (auch bei !(% 16)) void Baum::S0() { if (rTyp != 's') return; txt0 = baumDat; *txt0++ = 0; *txt0++ = 0; *txt0++ = 0; *txt0++ = loc; //1 SRek(root); datLen = int(txt0 - baumDat); } // baum als klammer_ausdruck speichern //1 header mit lokalität void Baum::SRek(int k) { *txt0++ = 1; //1 if (s[k].t1 == 's') SRek(s[k].sl); else { if (s[k].t1 == 'w') copytext(s[k].sl); else { *txt0++ = 20; *txt0++ = s[k].t1; //3 if (s[k].t1 == '?') copytext(s[k].sl); else { txt1 = (char*)&s[k].sl; *txt0++ = *txt1++; *txt0++ = *txt1++; *txt0++ = *txt1++; *txt0++ = *txt1++; } } } *txt0++ = s[k].v; if (s[k].t2 == 's') { SRek(s[k].sr); *txt0++ = 2; } //2 else { if (s[k].t2 == 'w') copytext(s[k].sr); else { *txt0++ = 20; *txt0++ = s[k].t2; //3 if (s[k].t2 == '?') copytext(s[k].sr); else { txt1 = (char*)(& s[k].sr); *txt0++ = *txt1++; *txt0++ = *txt1++; *txt0++ = *txt1++; *txt0++ = *txt1++; } } *txt0++ = 2; } } //2 //1 klammer auf //2 klammer zu //3 20: achtung typ folgt void Baum::copytext(int k) { int i = 0; txt1 = w[k].st; while (txt1[i]) *txt0++ = txt1[i++]; *txt0++ = 0; } void Baum::CntrlT() // zeit holen { time(&zeit); strcpy(edbox,ctime(&zeit)); tex[0] = edbox[11]; tex[1] = edbox[12]; tex[2] = edbox[13]; tex[3] = edbox[14]; tex[4] = edbox[15]; tex[5] = 0; tScan(tex); } void Baum::CntrlU(int k) { int kTausch; unsigned char t; if (labTest(k)) k = s[k].sr; kTausch = s[k].sl; t = s[k].t1; s[k].sl = s[k].sr; s[k].t1 = s[k].t2; s[k].sr = kTausch; s[k].t2 = t; } void Baum::AltU(int k) { mes = 2; } void Baum::CntrlV(int k) { bool ok; QString z; ok = false; z = QInputDialog::getText("steuerZeichen:", "neu:", QLineEdit::Normal, "abbruch", &ok, this); if (ok) { strcpy (neu, z); if (strcmp (neu, "abbruch") == 0) return; if (labTest(k)) k = s[k].sr; s[k].v = *neu; } } void Baum::AltV(int kNr) { int k; bool ok; QString z; char lc; k = kNr; ok = false; z = QInputDialog::getText("steuerZeichen:", "alt neu:", QLineEdit::Normal, "abbruch", &ok, this); if (ok) { strcpy (neu, z); if (strcmp (neu, "abbruch") == 0) return; lc = loc; if (! s[kNr].b) s[kNr].lc = OUTLOC; loc = CPYLOC; kNr = copyShadow(kNr); v0 = *neu; v = *(neu + 2); VRek(kNr); //1 loc = lc; if (! s[kNr].b) s[kNr].lc = OUTLOC; //2 kNr = KRek(kNr); if (kNr != k) { tlz(k, kNr, 's', 's'); } } } // steuerzeichen pro ast ersetzen. setzt satz voraus //1 alt: *neu neu: *(neu + 2) //2 shadowWurzel erhält lokalität OUTLOC void Baum::VRek(int k) { if (s[k].v == v0) s[k].v = v; if (s[k].t1 == 's') VRek(s[k].sl); if (s[k].t2 == 's') VRek(s[k].sr); } int Baum::CntrlW(int k) { if (! loc) loc = EDLOC; else loc = STDLOC; if (! s[k].b) s[k].lc = OUTLOC; return KRek(k); } // loc_toggle. setzt root : satz voraus void Baum::CntrlX() { if (! dbgFlag) { dbgFlag = 1; if (rTyp == 's') { if (s[root].v == '"' && s[s[root].sr].v == 'f') //1 { err = 0; makeShadow(root); cout << endl; if (err) return; CntrlX1(); } else CntrlX2(); } else CntrlX2(); } else { if (dbgFlag == 1) { loc = RUNLOC; fWertDbg(); loc = STDLOC; delete outputWindow; outputWindow = new Output(baum); } //1 if (! dbgFlag) deleteX(); } } //1 wird (außer beim start) immer ausgeführt void Baum:: CntrlX1() { runStack = new int[RUN]; tStack = new char[RUN]; rekStack = new int[REK]; varWert = new int[CALC]; varTyp = new char[CALC]; if (! err) runDbg(shadowRoot); } void Baum::CntrlX2() { int k; bool ok; QString z; ok = false; z = QInputDialog::getText("Programmstart:", "Programmname:", QLineEdit::Normal, "", &ok, this); if (ok) { strcpy(neu, z); if (*neu) { worti = wortI(neu); k = vLSatz(worti); if (k) { if (s[s[k].sr].v == 'f') { makeShadow(k); CntrlX1(); return; } } } } mes = 2; } void Baum::deleteX() { if (gStack != NULL) { delete [] gStack; gStack = 0; } delete [] varWert; delete [] varTyp; delete [] runStack; delete [] tStack; delete [] rekStack; cout << "programmEnde" << endl; clrRunLoc(); F7(); loc = STDLOC; bLinks(); } void Baum::CntrlY() { stck3 = stck2; worti = wortI("journal"); if (vLSatz(worti)) //1 { baumi = root; typ = rTyp; CntrlY1(s[rSatz].sr); stck1 = stck2; YNeu(); rTyp = 's'; root = *stck1; } else mes = 2; } //1 vLSatz setzt rSatz als journal-baum void Baum::CntrlY1(int i) { if (s[i].v == '"') { ast = s[i].sl; txt1 = w[ast].st; if (isDay(txt1)) { if (hatMember(s[i].sr, s[i].t2)) *stck2++ = i; return; } } if (s[i].t2 == 's') CntrlY1(s[i].sr); if (s[i].t1 == 's') CntrlY1(s[i].sl); } // schnelle rekursion, setzt typ und baumi voraus // sucht im d·baum nach baumi . legt ausgewählte knoten nach stck2 char Baum::isDay(char* date) { char c; if (strlen(date) == 7) { c = *date++; if (c < '0' || c > '9') return 0; c = *date++; if (c < '0' || c > '9') return 0; c = *date++; if (c < '0' || c > '1') return 0; c = *date++; if (c < '0' || c > '9') return 0; c = *date++; if (c < '0' || c > '3') return 0; c = *date++; if (c < '0' || c > '9') return 0; c = *date++; if (c < '1' || c > '7') return 0; return 1; } if (strlen(date) == 8) { c = *date++; if (c < '0' || c > '2') return 0; c = *date++; if (c < '0' || c > '9') return 0; c = *date++; if (c < '0' || c > '9') return 0; c = *date++; if (c < '0' || c > '9') return 0; c = *date++; if (c < '0' || c > '1') return 0; c = *date++; if (c < '0' || c > '9') return 0; c = *date++; if (c < '0' || c > '3') return 0; c = *date++; if (c < '0' || c > '9') return 0; return 1; } return 0; } char Baum::hatMember(int k, char t) { if (t == typ && k == baumi) return 1; if (t == 's') { if (hatMember(s[k].sl, s[k].t1)) return 1; if (hatMember(s[k].sr, s[k].t2)) return 1; } return 0; } // setzt baumi und typ voraus. setzt flag void Baum::YNeu() { loc = OUTLOC; lcmod = 0; s0.v = '.'; s0.t1 = 's'; s0.t2 = 's'; loop: *stck1 = 0; stck1 = stck2 = stck3; //1 if (! *(stck2 + 1)) return; loop1: if (*stck2) { s0.sl = *stck2++; if (*stck2) { s0.sr = *stck2++; *stck1++ = makesatz(); goto loop1; } else *stck1++ = s0.sl; } goto loop; } //1 stck1 abschließen und zurücksetzen void Baum::CntrlZ() { int k, rzb; baumi = sMax; while (baumi) { if (! s[baumi].b && s[baumi].lc == OUTLOC) loeschRek(baumi, 's'); baumi--; } baumi = root; typ = rTyp; *stck0 = 0; stck1 = stck0; stck3 = stck2; if (rTyp == 's') rzi = s[root].b; else rzi = w[root].b; if (! rzi) return; rzb = rzi; pick: k = r[rzb].zS; if (s[k].v == '"') { if (isDay(w[s[k].sl].st)) rTyp = 'd'; else if (s[s[k].sr].v == 'f') rTyp = 'f'; else { if ((rzb = s[k].b)) goto pick; mes = 2; return; } } else { if ((rzb = s[k].b)) goto pick; mes = 2; return; } loop: *stck3++ = rzi; k = r[rzi].zS; if (s[k].v == '"') { if (rTyp == 'd') { if (isDay(w[s[k].sl].st)) { k = ZRahmen(k); *stck1++ = k; loop1: rzi = *--stck3; rzi = r[rzi].zz; if (rzi) goto loop; if (stck3 > stck2) goto loop1; } else { rzi = s[k].b; if (rzi) goto loop; } } else if (s[k].t2 == 's' && s[s[k].sr].v == 'f') { k = ZRahmen(k); *stck1++ = k; goto loop1; } else { rzi = s[k].b; if (rzi) goto loop; } } else { rzi = s[k].b; if (rzi) goto loop; } if (*stck0) ZBaum(); root = *stck0; rTyp = 's'; } void Baum::AltZ() { int k, rzb; typ = rTyp; baumi = root; if (typ == 's') rzi = s[baumi].b; else rzi = w[baumi].b; if (! rzi) return; rzb = rzi; k = baumi; while (rzb) { k = r[rzb].zS; rzb = s[k].b; } root = ZRahmen(k); rTyp = 's'; } int Baum::ZRahmen(int k) { int sl, sr; char t1, t2; sl = s[k].sl; sr = s[k].sr; t1 = s[k].t1; t2 = s[k].t2; if (t1 == 's') { if (hatMember(sl, t1)) { sl = ZRahmen(sl); t1 = 's'; } else { sl = '.'; t1 = 'w'; } } else { sl = '.'; t1 = 'w'; } if (t2 == 's') { if (hatMember(sr, t2)) { sr = ZRahmen(sr); t2 = 's'; } else { sr = '.'; t2 = 'w'; } } else { sr = '.'; t2 = 'w'; } return sBau(sl, sr, t1, t2, s[k].v); } // setzt baumi und typ voraus. gibt rahmenBaum zurück void Baum::ZBaum() { loc = STDLOC; lcmod = 0; s0.v = '·'; s0.t1 = 's'; s0.t2 = 's'; loop: *stck1 = 0; stck2 = stck1 = stck0; if (! *(stck2 + 1)) return; loop1: if (*stck2) { s0.sl = *stck2++; if (*stck2) { s0.sr = *stck2++; *stck1++ = makesatz(); goto loop1; } else *stck1++ = s0.sl; } goto loop; } // stck0 = anfang. stck1 = ende. void Baum::lcLinks() { if (rTyp == 'w' || ! root) { if (s[sMax].v) sMax++; rTyp = 's'; root = sMax; } do root--; while(root && ((! s[root].v || s[root].b) || (loc != s[root].lc))); if (! root) flag0 = 1; } void Baum::bLinks() { if (lcmod) { lcLinks(); return; } // ? if (rTyp == 'w' || ! root) { if (s[sMax].v) sMax++; rTyp = 's'; root = sMax; } do root--; while(root && (! s[root].v || s[root].b)); if (! root) flag0 = 1; } void Baum::lcRechts() { if (rTyp == 'w' || root >= sMax) { if (s[sMax].v) sMax++; rTyp = 's'; root = 0; } do root++; while(root < sMax && ((! s[root].v || s[root].b) || (loc != s[root].lc))); if (! root) flag0 = 1; } void Baum::bRechts() { if (lcmod) { lcRechts(); return; } if (rTyp == 'w' || root >= sMax) { if (s[sMax].v) sMax++; rTyp = 's'; root = 0; } do root++; while(root < sMax && (! s[root].v || s[root].b)); if (! root) flag0 = 1; } void Baum::rzLinks(int i, unsigned char t) { int eins, vor, end; if (t == 'w') rzp = &w[i].b; else rzp = &s[i].b; if (!(*rzp)) return; eins = vor = *rzp; end = r[eins].zz; if (! end) return; rzi = end; while ((rzi = r[rzi].zz)) { vor = end; end = rzi; } *rzp = end; r[vor].zz = 0; r[end].zz = eins; loc = s[r[end].zS].lc; if (t == 'w') histor = r[end].zS; else s[i].h = r[end].zS; } void Baum::rzRechts(int i, unsigned char t) { int eins, zwei, end; if (t == 'w') rzp = &w[i].b; else rzp = &s[i].b; if (!(*rzp)) return; eins = *rzp; zwei = r[eins].zz; if (! zwei) return; rzi = zwei; do { end = rzi; rzi = r[rzi].zz; } while (rzi); *rzp = zwei; r[eins].zz = 0; r[end].zz = eins; loc = s[r[zwei].zS].lc; if (t == 'w') histor = r[zwei].zS; else s[i].h = r[zwei].zS; } void Baum::fallvRek() { if (typ != 's') return; if (s[holz].v == v) *stck1++ = holz; *stck0++ = holz; typ = s[holz].t1; holz = s[holz].sl; fallvRek(); holz = *--stck0; typ = s[holz].t2; holz = s[holz].sr; fallvRek(); } void Baum::fallV() { if (clipTyp[0] != 's') return; holz = clip[0]; typ = 's'; if (s[holz].v == '"') holz = s[holz].sr; fallvRek(); YNeu(); rTyp = 's'; root = *stck1; } void Baum::lastEntry() { lastEntry1(); s0.v = '.'; root = BAusgleich(); } void Baum::lastEntry1() { int i; char typ1 = clipTyp[0]; i = 0; baumi = clip[0]; *stck0++ = 0; typ = rTyp = 's'; ast = s[root].sr; loop: if (typ == 's') // if (satz) { if (s[ast].v == '.') { *stck0++ = ast; *cstck0++ = 'r'; typ = s[ast].t2; ast = s[ast].sr; goto loop; } // stack_up_right if (s[ast].v == '"') // look_for_todo { holz = s[ast].sl; txt1 = w[holz].st; } if (isDay(txt1)) { if (isInAst(baumi, typ1)) { tmpS[i].i = ast; tmpS[i].c = 's'; ++i; stck2 = stack + 2 * STCK1; } goto stack_down; } ast = s[ast].sr; goto loop; root = *--stck0; return; } stack_down: ast = *--stck0; lrflag = *--cstck0; if (! ast) return; if (lrflag == 'r') { *stck0++ = ast; *cstck0++ = 'l'; typ = s[ast].t1; ast = s[ast].sl; goto loop; } goto stack_down; } // langsame baum_iteration von rechts nach links mit abbruch char Baum::isInAst(int i, char t) { *stck2++ = 0; typ = 's'; Ast = s[ast].sr; loop: if (typ == 'w') { if (t == 'w') if (Ast == i) return 1; } else { if (typ == 's') { if (t == 's') if (Ast == i) return 1; typ = s[Ast].t1; *stck2++ = Ast; Ast = s[Ast].sl; goto loop; } } Ast = *--stck2; if (Ast) { typ = s[Ast].t2; Ast = s[Ast].sr; goto loop; } return 0; } // schnelle iteration, setzt s[ast] voraus, prüft ob i in baum (ast) void Baum::dbfBau() { int i, j, k, k1, k2, iRec, dataStart, iFeld, offset; unsigned char t1, t2; char* txt1; unsigned char uc, uc1; unsigned char feldBreite[100]; dP = (int*) (baumDat + 4); iRec = *dP; uc = *(baumDat + 8); uc1 = *(baumDat + 9); dataStart = int(uc1)*256 + int(uc); iFeld = 0; k = 0; offset = 32; while (offset < dataStart - 32) //1 { *(baumDat + offset + 10) = 0; worti = wortI(baumDat + offset); if (!k) { k = worti; rTyp = 'w'; } else { k = sBau(k, worti, rTyp, 'w', ' '); rTyp = 's'; } feldBreite[iFeld] = *(baumDat + offset + 16); iFeld++; offset += 32; } offset = dataStart; i = 1; k2 = 0; while (i <= iRec) //2 { j = 0; ++offset; k1 = 0; while (j < iFeld) //3 { strncpy(tex, baumDat + offset, feldBreite[j] ); tex[feldBreite[j]] = 0; dp = tex; txt1 = &tex[feldBreite[j]]; --txt1; while (*dp == ' ') dp++; while (txt1 > dp && *txt1 == ' ') *txt1 = 0; if (*dp) worti = wortI(dp); else worti = 183; //4 if (! k1) { t1 = 'w'; k1 = worti; } else { k1 = sBau(k1, worti, t1, 'w', ' '); t1 = 's'; } offset += feldBreite[j]; ++j; } if (! k2) { k2 = k1; t2 = t1; } else { k2 = sBau(k2, k1, t1, t2, '.'); t2 = 's'; } ++i; } if (k2) root = sBau(k, k2, rTyp, t2, ':'); else root = sBau(k, 183, rTyp, 'w', ':'); rTyp = 's'; } //1 feldnamen zusammenbauen //2 datensätze zusammenbauen //3 feldinhalte extrahieren und blanks entfernen //4 dicker punkt = datenfeld ist leer void Baum::csvBau() { FILE* cvsHandle; char string[1000]; char ende; int kNr, k; char * txt1, * txt2; kNr = 0; cvsHandle = fopen(edbox, "rt"); if (cvsHandle) { do { fgets(string, 1000, cvsHandle); if (*string == 26) break; txt1 = txt2 = string; k = 0; ende = -1; while (ende != LF && ende != CR && ende) { if (*txt1 == '"') { ++txt1; txt2 = txt1; while (*txt2 != '"') ++txt2; *txt2 = 0; ++txt2; } else { txt2 = txt1; while (*txt2 != CR && *txt2 != LF && *txt2 != ',' && *txt2) ++txt2; } ende = *txt2; *txt2 = 0; if (ende == CR && *(txt2 + 1) == LF) ++txt2; ++txt2; worti = wortI(txt1); if (! k) { k = worti; typ = 'w'; } else { k = sBau(k, worti, typ, 'w', ' '); typ = 's'; } txt1 = txt2; } if (! kNr) kNr = k; else kNr = sBau(kNr, k, 's', 's', '.'); } while (! feof(cvsHandle)); } else mes = 2; fclose(cvsHandle); root = kNr; rTyp = 's'; }


back to baumC
There is no comment on this page. [Display comments/form]