// datei-name: baum.C
#include "baum.h"
extern Baum* baum;
extern KApplication* app;
extern BMes* bMes;
extern Fund* fundList;
extern Dump* dump;
extern InputDialog* eDialog;
extern EditDialog* editDialog;
extern Output* outputWindow;
extern char pfad[512];
//app->exec() ->
void Baum::paintEvent(QPaintEvent* e_)
{ int i; QPainter p;
QPointArray arrow(4);
p.begin(&buffer);
p.setBrush(QColor(250, 250, 200)); // gelb
p.drawRect(0, 0, BILDBR, LY2);
if (root && querzBaum()) p.setBrush(QColor(255, 183, 115)); // helleres braun
else p.setBrush(QColor(165,192,162)); // oliv
p.drawRect(0, LY2, BILDBR, 73);
// p.setPen//(QColor(0, 79, 0));
// p.drawLine(0, LY2, BILDBR, LY2);
p.setBrush(QColor(167, 255, 137)); // helleres grün
p.drawRect(0, CLPY, BILDBR, CLPH); // clpbox
p.setBrush(Qt::yellow);
if (root)
{ rzLabCheck();
if (rFlag)
{ switch (rFlag)
{ case 1: p.setBrush(Qt::cyan); break;
case 2: p.setBrush(Qt::red); break;
case 3: p.setBrush(Qt::magenta); }
p.drawRect(RZX, BOXY, BBR+24, BOXH);
p.setBrush(Qt::yellow); }
else p.drawRect(RZX, BOXY, BBR + 24, BOXH); // rzbox
p.drawRect(BOXX, BOXY, BOXBR, BOXH); // box
if (! lcmod) p.setBrush(QColor(250, 250, 200)); // helles gelb: F2-toggle ausführen
p.drawRect(1, BOXY, BBR, BOXH); // lcbox
p.setBrush(Qt::blue);
arrow.setPoint(0, BOXX + 2, BOXY + BOXH + 1);
arrow.setPoint(1, BOXX + BOXBR - 2, BOXY + BOXH + 1);
if (s[root].b && zweig == '\\')
{ if (lcTest()) p.setBrush(QColor(255, 50, 0)); //(248, 174, 167)); // helles braun
arrow.setPoint(2, BOXX + BOXBR + BOXBR/2 - 26, BOXY + BOXH + 11);
arrow.setPoint(3, BOXX + BOXBR/2 - 1, BOXY + BOXH + 11);
p.drawPolygon(arrow, false , 0, 4); }
if (s[root].b && zweig == '/')
{ if (lcTest()) p.setBrush(QColor(255, 50, 0)); //(248, 174, 167)); // helles braun
arrow.setPoint(2, BOXX + BOXBR/2 - 1, BOXY + BOXH + 11);
arrow.setPoint(3, BOXX - BOXBR/2 + 25, BOXY + BOXH + 11);
p.drawPolygon(arrow, false , 0, 4); }
p.setBrush(QColor(16,16,16)); // schwarz
p.drawRect(BILDBR/8, CLPY - 4, BILDBR/8, 4);
p.drawRect(3 * (BILDBR / 8), CLPY - 4, BILDBR/8 , 4);
p.drawRect(5 * (BILDBR / 8), CLPY - 4, BILDBR/8 , 4);
p.drawRect(7 * (BILDBR / 8), CLPY - 4, BILDBR/8 + 8 , 4);
p.setFont(QFont("courier", 12, QFont::Bold)); drawText(&p);
p.setPen(Qt::red);
tab = tabl; drawTab(&p, LGX);
tab = tabr; drawTab(&p, RGX); freeFlag = 1;
if (freeFlag)
{ p.setPen(Qt::red);
p.drawText(BILDBR/2 - 4, BOXY + BOXH - 1, 20, 20, Qt::AlignLeft,"*"); }
p.setPen(Qt::blue);
p.drawText(BILDM - 4, 30, LH, BOXH, Qt::AlignLeft, vbox);
p.drawText(BOXX + 4, BOXY, BOXBR - 4, BOXH, Qt::AlignLeft, box);
p.drawText(5, BOXY, BBR - 4, BOXH, Qt::AlignLeft, lcbox);
p.drawText(RZX + 4, BOXY, BBR + 16, BOXH, Qt::AlignLeft, rzbox);
for(i = 0; i < 8; ++i)
{ p.drawText(5 + i * BILDBR/8, CLPY + 2, BILDBR/8 - 10, LH, Qt::AlignLeft, clipString(i, clip, clipTyp, &p));
p.drawText(5 + i * BILDBR/8, CLPY + LH + 2, BILDBR/8 - 10, LH, Qt::AlignLeft, clipString(i, clap, clapTyp, &p)); }
p.setPen(Qt::white);
if (rTyp == 'w' && w[ root].st)
{ kett1 = w[ root].st;
if (strstr(kett1,".gif") || strstr(kett1,".jpg"))
{ strcpy(tex, pfad); strcat(tex,"bilder/"); strcat(tex, kett1);
if (pixmap.load(tex)) // load and draw image
{ p.drawPixmap((BILDBR - pixmap.width()) / 2, (LY2 - pixmap.height()) / 2, pixmap); } } }
else
{ p.setPen(QColor(0, 79, 0)); // p.setPen(SolidLine);
p.drawLine(BILDM, LH + 30, BILDM, LY2); } }
bitBlt(this, 0, 0, &buffer); p.end(); }
void Baum::drawTab(QPainter* p, int x2)
{ char i; int x1, y1, y2;
for(i = 0; i < LZAHL; i++)
{ x1 = tab[i].l;
if (x1)
{ x1 = x2 - x1 * 7; y2 = i * LH + 45;
if (y2 >= LY2 - LH/2) break;
if (x2 == RGX)
if (x1 <= BILDM) x1 = BILDM;
p->drawLine(x1, y2, x2, y2);
if (i)
{ y1 = graphtab(i);
if (y1)
{ y1 = y2 - y1 * LH;
if (x1 == BILDM) continue;
p->drawLine(x1, y1 , x1, y2); } } } } }
int Baum::graphtab(int n)
{ char nk = tab[n].l;
int m = n - 1;
while (nk > tab[m].l) m--;
return n - m; }
void Baum::editor1show()
{ bMes->show(); bMes->setFocus(); bmod = 1; }
void Baum::editor1hide()
{ bMes->hide(); setFocus(); }
/*
void Baum::editorAppend(char* text)
{ bMes->append(text); }
*/
void Baum::ifFlag()
{ if (mesFlag)
{ switch (mesFlag)
{ case 1: case 43:
if (inp == 2)
{ strcpy(alt, edbox); mes = 4; }
else
{ strcpy(neu, edbox); stckrset();
if (mesFlag == 1) CntrlA(root, rTyp, loc);
else if (mesFlag == 43) AltA(); }
inp--; break;
case 5:
if (*stck4 == 1)
{ *cstck4++ = *edbox; stck4++; }
else
{ strcpy(tex, edbox);
tScan(tex);
*stck4++ = root; }
if (*stck4)
{ mes = 17; root = Root; rTyp = 's'; }
else { CntrlE2(); mesFlag = 0; }
rpFlag = 1; bildneu(); return;
case 82:
if (inp == 1)
{ strcpy(alt, edbox); ShiftF2(); inp--; } }
if (! inp) mesFlag = 0; }
else lastInput(1);
rpFlag = 1; bildneu(); }
// setzt mesFlag, inp alt, neu, edbox, stck4, cstck4, tex, root. Root, rTyp, mes u. rpFlag voraus
void Baum::keyCase(int Key, int Ascii, int State)
{ if (State == Qt::ControlButton)
{ switch(Key)
{ //case Qt::Key_1: stckrset(); banking(); bildneu(); break;
case Qt::Key_2:
stckrset(); lastEntry(); bildneu(); break;
case Qt::Key_G:
stckrset(); CntrlG(); bildneu(); break;
case Qt::Key_adiaeresis:
CntrlAe(); bildneu(); break;
case Qt::Key_odiaeresis: //:65535
CntrlOe(); bildneu(); break; } }
else if (State == Qt::AltButton) //1
{ if (Key == Qt::Key_U)
{ stckrset(); AltU(root); }
else if (Key == Qt::Key_C)
{ stckrset(); toLower(); bildneu(); } }
else
{ switch (Key) //2
{ case Qt::Key_Left:
buttonLinks(); break;
case Qt::Key_Right:
buttonRechts(); break;
case Qt::Key_Down:
buttonTief(); break;
case Qt::Key_Up:
buttonHoch(); break;
case Qt::Key_F10:
F10(); bildneu(); break;
case Qt::Key_F11:
if (rTyp == 's') F11(root);
else mes = 2;
bildneu(); break;
case Qt::Key_F12:
F12(); bildneu(); break;
case Qt::Key_Prior:
bLinks(); bildneu(); break;
case Qt::Key_Next:
bRechts(); bildneu(); break;
case Qt::Key_Home:
rzLinks(root, rTyp); bildneu(); break;
case Qt::Key_End:
rzRechts(root, rTyp); bildneu(); break;
default:
if (Ascii)
{ bC[0] = char(Ascii); bC[1] = 0;
bInp->setText(bC); bInp->setFocus(); } } } } //3
//1 ALT ABCDEGIMNOPRVZ
//2 gross-/kleinschreibung und sondertasten (incl. SHFT) ohne CTRL/ALTER
//3 focus auf editfeld
void Baum::toLower()
{ QString datei; sync();
datei = fileDialog->getOpenFileName(pfad, "*", this);
if (datei.length())
{ strcpy(edbox, datei);
baumDat = new char[BDAT]; stckrset();
if (rb())
{ baumdat = baumDat;
while (*baumdat)
{ *baumdat = tolower(*baumdat); ++baumdat; }
wb(); }
else statusbar->message("es konnten keine daten geladen werden!");
delete [] baumDat; }
mes = 1; edbox[0] = 0; mesFlag = 0; }
void Baum::drawText(QPainter* p)
{ int i;
p->setFont(QFont("courier", 12, QFont::Bold));
p->setPen(QColor(0, 79, 0));
for (i = 0; i < LZAHL; i++)
{ if (btextl[i][0])
{ if (tabl[i].t == 'l') p->setPen(Qt::blue);
else if (tabl[i].t != 's' && tabl[i].t != 'w' && tabl[i].t != '?') p->setPen(Qt::red);
if (35 + i * LH < LY2 - LH)
{ p->drawText(TLX, 35 + i * LH, BILDM - 102, 20, Qt::AlignLeft, btextl[i], -1);
p->setPen(QColor(0, 79, 0)); }
else break; }
else break; }
p->setPen(QColor(0, 79, 0));
for (i = 0; i < LZAHL; i++)
{ if (btextr[i][0])
{ if (tabr[i].t == 'l') p->setPen(Qt::blue);
else if (tabr[i].t != 's' && tabr[i].t != 'w' && tabr[i].t != '?') p->setPen(Qt::red);
if (35 + i * LH < LY2 - LH)
{ p->drawText(TRX, 35 + i * LH, BILDM - 102, 20, Qt::AlignLeft, btextr[i], -1);
p->setPen(QColor(0, 79, 0)); }
else break; }
else break; } }
void Baum::mes0()
{ int a, b ,c;
switch (mes)
{ case 1:
sprintf(mespos, "okay sMax: %d", sMax); break;
case 2:
strcpy(mespos, "geht leider nicht!"); break;
case 3:
strcpy(mespos, "eingabe findet kein passendes muster"); break;
case 4:
strcpy(mespos, "neu:"); break;
case 5:
sprintf(mespos, "baum_fehler"); break;
case 6:
txt2 = ascii + 512;
for (int i = 0; i < 80; i++)
{ mespos[i] = txt2[i]; if (! txt2[i]) mespos[i] = ' '; }
break; // F5
case 8:
strcpy(mespos, "baum zu groß, max. 1000 worte editierbar"); break;
case 9:
strcpy(mespos, "verknüpfung (name : muster)"); break;
case 10:
a = int(ENDC - (asci0 - ascii));
b = ENDW - wort0; c = ENDS - satz0;
sprintf(mespos, "freie zeichen:%7u freie worte:%7u freie sätze:%7u", a, b, c); break;
case 11:
strcpy(mespos, "(CntrlJ a CntrlH h knot) zurückgesetzt!"); break;
case 13:
strcpy(mespos, "abbruch, seiteneffekt s.o. !"); break;
case 14:
strcpy(mespos, "mehrfachlabel!"); break;
case 15:
strcpy(mespos, "gespeichert!"); break;
case 17:
if (*(stck4) == 1) strcpy(mespos, "verb");
else strcpy(mespos, w[*(stck4)].st + 1); break;
default: return; }
statusbar->message(mespos); }
void Baum::keyPressEvent(QKeyEvent* e)
{ if (e->key() == Qt::Key_Control || e->key() == Qt::Key_Alt || e->key() == Qt::Key_Shift) return;
if (e->key() == Qt::Key_Enter || e->key() == Qt::Key_Return)
{ if (edFlag) edFlag = 2;
strcpy(edbox, bInp->text());
if (dbgFlag && *edbox == 'x')
{ dbgFlag = 0; *edbox = 0; deleteX(); }
ifFlag();
if (! mes3Flag) bInp->setText(0);
else mes3Flag = 0; }
else
{ keyCase(e->key(), e->ascii(), e->state());
if (mes) mes = 0;
else statusbar->message(""); } }
char Baum::querzBaum()
{ int rzi, rzz, rzSatz; char zzFlag; zzFlag = 0;
comboTief->clear();
if (rTyp == 's') rzi = rzz = s[root].b;
else rzi = rzz = w[root].b;
if (rTyp == 's') rSatz = s[root].h;
else rSatz = histor;
if (! rSatz)
{ loop: //1
while (rzi)
{ rSatz = r[rzi].zS;
if (s[rSatz].lc == loc)
{ if (s[rSatz].v == '"')
{ txt0 = w[s[rSatz].sl].st;
sprintf(tex,"%s %d", txt0, rSatz);
comboTief->insertItem(tex); } }
rzi = s[rSatz].b; rSatz = r[rzi].zS; } }
else
{ while (rSatz)
{ if (s[rSatz].lc == loc)
{ if (s[rSatz].v == '"')
{ txt0 = w[s[rSatz].sl].st;
sprintf(tex,"%s %d", txt0, rSatz);
comboTief->insertItem(tex); } }
rzSatz = rSatz; rSatz = s[rSatz].h; }
rSatz = rzSatz; rzi = s[rSatz].b; goto loop; }
rzi = rzz;
lLoop: //2
if (rzi)
{ rSatz = r[rzi].zS;
if (s[rSatz].lc == loc)
{ rzz = rzi;
zzLoop: //3
rzz = r[rzz].zz;
if (rzz)
{ rzSatz = r[rzz].zS;
if (s[rzSatz].lc == loc) zzFlag = 1;
else goto zzLoop; }
else
{ rzi = s[rSatz].b; goto lLoop; } }
rzi = r[rzi].zz; goto lLoop; }
return zzFlag; }
//1: lädt comboTief mit label-history
//2: lädt comboLBox rückzeigersätze
char Baum::lcTest()
{ int rzi;
if (rTyp == 's')
{ rzi = s[root].b;
if (rzi)
{ rSatz = r[rzi].zS;
if (loc != s[rSatz].lc) return 1; } }
return 0; }
char* Baum::clipString(int i, int* clp, char* clpTyp, QPainter* p)
{ p->setPen(QColor(0, 79, 0));
if (root && (rTyp == 'w' || s[root].v == '"')) comboload();
if (*(clpTyp + i) == 'w') return w[*(clp + i)].st;
if (*(clpTyp + i) == 's')
{ if (labTest(*(clp + i)))
{ p->setPen(QColor(0, 0, 255)); return w[s[*(clp + i)].sl].st; }
else
{ sprintf(tex, "%d", *(clp + i));
strcpy(kette, "*"); strcat(kette, tex);
return kette; } }
return NULL; }
void Baum::mousePressEvent(QMouseEvent* e)
{ int xp, yp, clpnr, e_nr, i; //1
char clipFlag;
QPoint clickedPos = e->pos(); //2
xp = clickedPos.x(); yp = clickedPos.y();
if (yp > 28 && yp < LY2) //3
{ e_nr = (yp - 28) / LH;
setFocus();
if (root)
{ if (xp < BILDM) //4
{ tab = tabl; holz = tab[e_nr].e; typ = tab[e_nr].t;
if (xp < LGX + 7) tiefe(0, e_nr, xp, LGX); }
else //5
{ tab = tabr; holz = tab[e_nr].e; typ = tab[e_nr].t;
if (xp < RGX + 7) tiefe(1, e_nr, xp, RGX); }
if (holz)
{ if (e->button() == LeftButton || e->button() == MidButton) // linke Maustaste
{ if (typ == 'l') typ = 's';
ast = 0; rI1 = holz; rC1 = typ; pfadH(root); //6
if (e->button() == LeftButton)
{ rTyp = typ; root = holz; }
else
{ if (rI1 == clip[7] && rC1 == clipTyp[7])
{ clip[7] = 0; clipTyp[7] = 0; clap[7] = 0; clapTyp[7] = 0;
strcpy(edbox, ""); bInp->setText(edbox); edFlag = 0; }
else
{ clip[7] = rI1; clipTyp[7] = rC1; clap[7] = tab[e_nr].h; clapTyp[7] = 's'; mausEdit(); } } }
else if (e->button() == RightButton) //7
{ if (typ == 'l') typ = 's';
clipFlag = 0; //8
for (i = 0; i <=7; i++)
{ if (holz == clip[i] && typ == clipTyp[i])
{ clip[i] = clip[0]; clipTyp[i] = clipTyp[0]; clipFlag = 1; break;} }
if (!clipFlag)
{ for (i = 7; i > 0; i--)
{ clip[i] = clip[i - 1];
clipTyp[i] = clipTyp[i - 1]; } }
clip[0] = holz; clipTyp[0] = typ; } } }
else return; }
else if (yp >= BOXY && yp <= BOXY + BOXH)
{ if (xp >= BOXX && xp <= BOXX + BOXBR)
{ if (e->button() == LeftButton && rTyp == 's') CntrlK(root);
else F9(); }
if (xp < BBR + 1 ) F2(); }
else if (xp >= BOXX && xp <= BOXX + BOXBR &&
yp >= BOXY + BOXH + 1 && yp <= BOXY + BOXH + 11) buttonTief();
else if (yp < CLPY + CLPH) //9
{ clpnr = xp / (BILDBR / 8);
if (yp <= (CLPY + CLPH/2))
{ if (clip[clpnr]) //10
{ rTyp = clipTyp[clpnr]; root = clip[clpnr]; } }
else if (clap[clpnr]) //11
{ rTyp = clapTyp[clpnr]; root = clap[clpnr]; } }
else return;
bildneu(); }
//1 e_nr : zeilen_nr.
//2 setzt QPoint clickedPos o (xp a yp)
//3 baum_fenster //4 linkes fenster //5 rechtes fenster
//6 verändert ast
//7 rechte Maustaste
//8 doppelte Einträge vermeiden
//9 clip_clap //10 clip //11 clap
void Baum::mausEdit()
{ char tempstr[2];
typ = clipTyp[7];
if (typ == 'w')
{ worti = clip[7];
strcpy(edbox, w[worti].st); }
else if (typ == 's')
{ satzi = clip[7];
if (s[satzi].t1 == 'w' && s[satzi].t2 == 'w')
{ worti = s[satzi].sl;
strcpy(edbox, w[worti].st);
strcat(edbox, " ");
tempstr[0] = s[satzi].v;
tempstr[1] = 0;
strcat(edbox, tempstr);
strcat(edbox, " ");
worti = s[satzi].sr;
strcat(edbox, w[worti].st); }
else if (s[satzi].t1 == 'w')
{ worti = s[satzi].sl;
strcpy(edbox, w[worti].st); }
else if (s[satzi].t2 == 'w')
{ worti = s[satzi].sr;
strcpy(edbox, w[worti].st); } }
clap[6] = root; clapTyp[6] = 's';
bInp->setText(edbox); bInp->setFocus(); edFlag = 1;}
void Baum::resizeEvent(QResizeEvent* event)
{ setMinimumSize(800, 703);
BILDBR = width(); BILDH = height();
BILDM = BILDBR / 2; LY2 = BILDH - 168;
BOXX = BILDM - 72; BOXY = BILDH - 158;
RBOXX = BILDBR - 266; RZX = BILDBR - 63;
CLPY = BILDH - 95;
RGX = BILDM + 92; EDY = BILDH - 55;
TRX = BILDM + 100;
linksButton->setGeometry(BILDM - 195, BILDH - 158, 80, 20);
rechtsButton->setGeometry(BILDM + 115, BILDH - 158, 80, 20);
blinksButton->setGeometry(BILDM - 255, BILDH - 158, 50, 20);
brechtsButton->setGeometry(BILDM + 205, BILDH - 158, 50, 20);
rzlinksButton->setGeometry(BILDM - 305, BILDH - 158, 40, 20);
rzrechtsButton->setGeometry(BILDM + 265, BILDH - 158, 40, 20);
labelButton->setGeometry(BILDM - 15, BILDH - 181, 30, 20);
comboLBox->setGeometry(20, BILDH - 131, 240, 24);
comboRBox->setGeometry(BILDBR - 260, BILDH - 131, 240, 24);
comboTief->setGeometry(BILDM - 120, BILDH - 125, 240, 24);
bMes->move(10, 35); bMes->resize(BILDBR - 20, BILDH - 223);
bInp->move(0, EDY); bInp->resize(BILDBR, 32);
buffer.resize(event->size()); }
void Baum::CntrlH1()
{ stckrset(); CntrlH(); bildneu(); }
void Baum::CntrlJ1()
{ stckrset(); CntrlJ(); bildneu(); }
void Baum::dateiLaden()
{ QString datei; sync();
datei = fileDialog->getOpenFileName(pfad, "*", this);
if (datei.length())
{ strcpy(edbox, datei);
ifRb(); }
else statusbar->message("es konnten keine daten geladen werden!");
bildneu(); }
void Baum::dateiSpeichern()
{ QString datei; sync();
datei = fileDialog->getSaveFileName(pfad, "*", this);
if (datei.length())
{ strcpy(edbox, datei);
ifWb(); }
if (mes != 15) statusbar->message("dateiSpeichern: dateiName?");
bildneu(); }
void Baum::ifWb()
{ char c, d; int i;
if (! edbox[0])
{ strcpy(edbox, "z.k");
if (rTyp == 's')
if (labTest(root))
{ kett1 = w[s[root].sl].st;
strcpy(edbox, kett1); } }
baumDat = new char[BDAT]; stckrset();
i = strlen(edbox); c = edbox[i - 1]; d = edbox[i - 2];
if (d == '.' && c == 'k' )
{ S0(); wb(); mesFlag = 0; mes = 15; }
else
{ if (d == '/' && ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z' )))
{ i = int(c);
if (vLSatz0(i))
{ delete [] baumDat; return; } }
CntrlS();
if (wb())
{ for (i = 0; i <= wort0; i++) w[i].st += int(ascii); // relocieren der textzeiger
mesFlag = 0; mes = 15; } }
delete [] baumDat; }
int Baum::wb()
{ strcpy(tex, pfad);
if (*edbox != '/') strcat(tex, edbox);
else strcpy(tex, edbox);
stream = fopen(tex, "wb");
if (! stream) return 0;
fwrite (baumDat, 1, datLen, stream); fclose(stream); sync(); return 1; }
void Baum::baumMerge()
{ QString datei;
stckrset(); sync();
datei = fileDialog->getOpenFileName(pfad, "*.a", this);
if (datei.length())
{ strcpy(edbox, datei);
if (strstr(edbox,".a"))
{ edbox[strlen(edbox)-2] = 0; }
F3(); }
else statusbar->message("es konnten keine daten geladen werden!");
bildneu(); }
void Baum::splitLaden()
{ QString datei; sync();
datei = fileDialog->getOpenFileName(pfad, "*.a", this);
if (datei.length())
{ strcpy(edbox, datei);
if (strstr(edbox,".a"))
{ edbox[strlen(edbox)-2] = 0; }
F8(); }
else statusbar->message("es konnten keine daten geladen werden!");
bildneu(); }
void Baum::splitSpeichern()
{ QString datei; sync();
datei = fileDialog->getSaveFileName(pfad, "*.a", this);
if (datei.length())
{ strcpy(edbox, datei);
if (strstr(edbox,".a"))
{ edbox[strlen(edbox)-2] = 0; } // entfernt endung .a
F4(); mes = 15; }
else statusbar->message("splitSpeichern: dateiName?");
bildneu(); }
void Baum::dbfImport()
{ QString datei; sync();
datei = fileDialog->getOpenFileName(pfad, "*.dbf", this);
if (datei.length())
{ strcpy(edbox, datei);
baumDat = new char[BDAT]; stckrset();
if (! rb()) mes = 2;
else dbfBau(); }
else statusbar->message("es konnten keine daten geladen werden!");
bildneu(); }
void Baum::csvImport()
{ QString datei; sync();
datei = fileDialog->getOpenFileName(pfad, "*.csv", this);
if (datei.length())
{ strcpy(edbox, datei);
csvBau(); }
else statusbar->message("es konnten keine daten geladen werden!");
bildneu(); }
void Baum::labelSetzen()
{ QString z; bool ok;
ok = false;
z = QInputDialog::getText("label:", "neuen label eingeben:", QLineEdit::Normal, "remove label", &ok, this);
if (ok)
{ strcpy (edbox, z);
if (rTyp == 's')
{ if (strcmp(edbox, "remove label") == 0) edbox[0] = 0;
root = CntrlL(root, edbox); bildneu(); }
else mes = 2; } }
/*
void Baum::programmEntfernen()
{ F11(); bildneu(); }
*/
void Baum::steuerzeichenSetzen()
{ if (rTyp == 's')
{ CntrlV(root); bildneu(); }
else mes = 2; }
void Baum::steuerzeichenAst()
{ if (rTyp == 's')
{ AltV(root); bildneu(); }
else mes = 2; }
void Baum::baumDrehen()
{ if (rTyp == 's')
{ CntrlU(root); bildneu(); }
else mes = 2; }
void Baum::teilstringErsetzen()
{ mesFlag = 1; inp = 2;
statusbar->message("alt:"); repaint(0, 0, BILDBR, CLPY + CLPH, FALSE); }
void Baum::kopierenErsetzen()
{ mesFlag = 43; inp = 2;
statusbar->message("alt:"); repaint(0, 0, BILDBR, CLPY + CLPH, FALSE); }
void Baum::locModus()
{ F2(); bildneu(); }
void Baum::locSetzen()
{ mesFlag = 82; inp = 1;
statusbar->message("lokalität:"); repaint(0, 0, BILDBR, CLPY + CLPH, FALSE); }
void Baum::rootClipboard()
{ F9(); repaint(0, 0, BILDBR, CLPY + CLPH, FALSE); }
void Baum::shiftClipboard()
{ ShiftF9(); repaint(0, 0, BILDBR, CLPY + CLPH, FALSE); }
void Baum::baumDump()
{ lflag = 0;
bildneu();
if (dump->isVisible()) dump->hide();
else dump->show();
setFocus(); }
void Baum::baumAusgleichen()
{ stckrset();
if (rTyp == 's') root = CntrlB(root);
else mes = 2;
bildneu(); }
void Baum::baumAusgleichR()
{ stckrset();
if (rTyp == 's')
{ AltB(root, '.'); root = Ast; }
else mes = 2;
bildneu(); }
void Baum::baumSortieren()
{ stckrset();
if (rTyp == 's') CntrlI(root);
else mes = 2;
bildneu(); }
void Baum::wertSortieren()
{ stckrset();
if (rTyp == 's')
{ sortZ = 1; CntrlI(root); sortZ = 0; }
else mes = 2;
bildneu(); }
void Baum::freieEingabe()
{ if (freeFlag)
{ freeFlag = 0;
struktur->setItemChecked(freeInput, FALSE); }
else
{ freeFlag = 1;
struktur->setItemChecked(freeInput, TRUE); }
repaint(); }
void Baum::baumKopie()
{ stckrset();
if (rTyp == 's')
{ root = CntrlW(root); }
else mes = 2;
bildneu(); }
void Baum::teilBaum()
{ stckrset();
if (rTyp == 's')
{ CntrlK(root); }
else mes = 2;
bildneu(); }
void Baum::baumReorg()
{ stckrset(); F7(); F5(); bildneu(); }
void Baum::clearBaum()
{ stckrset(); F6(root, rTyp); bildneu(); }
void Baum::papierKorb()
{ stckrset(); F7(); bildneu(); }
void Baum::labelMatch()
{ stckrset(); CntrlZ(); bildneu(); }
void Baum::astMatch()
{ stckrset(); AltZ(); bildneu(); }
void Baum::setSignal(int k)
{ if (fifoNr == FIFO) fifoNr = 0;
if (fifo[fifoNr]) cout << "knoten " << k << " verworfen" << endl; //1
else
{ cout << "knoten " << k << " gesendet" << endl;
fifo[fifoNr] = k;
if (! fifoTop) fifoTop = fifoNr;
++fifoNr;
signalSemaphor = 1; } } //2
// signal handler sendet knotenSignal
//1 fifo voll
//2 setzt globalen semaphor für runstack-Schleife
void Baum::addSlot(int k)
{ if (slotNr < SLOTS)
{ ++slotNr;
slotList[slotNr] = k; } }
// fügt funktionsknoten aus shadow in empfänger-slot-liste für signale ein
// im shadow werden eingebundene funktionen bei addSlot und delSlot in konstanten von typ ':' transformiert
// diese funktionsknoten werden von signalen aufgerufen
// dort steht ein baumC-programm das den gesandten signalbaum auswertet und
// per befehl signalSuccess, die brauchbarkeit des signalbaum meldet
// signalSuccess steht immer vor einem abschließenden return
void Baum::delSlot(int k)
{ int j;
j = 0;
while (j < slotNr && k != slotList[j]) j++;
if ( j < slotNr)
{ while ( j < slotNr)
{ slotList[j] = slotList[j+1]; ++j; }
--slotNr; } }
// entfernt funktionsknoten aus empfänger-slot-liste
// und schrumpft sloteinträge
void Baum::signalSuccess(char status)
{ signalCode = status; }
// damit sendet ein empfänger-slot, ob der signalbaum von ihm verwendet wurde
// signalcode ist globale status-variable
// status = 0 bedeutet (mit dem signalbaum kann ich nichts anfangen)
// status = 1 bedeutet (ich habe signalbaum verwendet, zusätzlich an andere slots weiterleiten)
// status = 2 bedeutet (ich habe signalbaum verwendet, nicht an andere slots weiterleiten)
// status = 3 bedeutet (signal war für mich, aber der inhalt war nicht korrekt)
void Baum::eingabeMaske()
{ int i;
maskFlag = 0;
AltE();
if (iM > 0) //1
{ eDialog->activ_line = 0;
if (iM >= 15) iM = 15;
for(i = 0; i < iM; i++)
{ eDialog->line[i]->setText(0); }
eDialog->resize(725, (iM + 2) * 30);
eDialog->okay->setGeometry(262, 10 + (iM + 1) * 30 - 20, 200, 30);
eDialog->show(); } }
// iM > 0, es liegen eingabefelder vor
void Baum::eingabeMaskeReplace()
{ int i;
maskFlag = 1;
AltP();
if (!mes)
{ eDialog->activ_line = 0;
if (iM >= 15) iM = 15;
for(i = 0; i < iM; i++)
{ eDialog->line[i]->setText(w[mintG[i]].st); }
eDialog->resize(725, (iM + 2) * 30);
eDialog->okay->setGeometry(262, 10 + (iM + 1) * 30 - 20, 200, 30);
eDialog->show(); } }
void Baum::baumE()
{ if (rTyp == 's' && root)
{ editDialog->comboEBox->clear();
CntrlE();
editDialog->line->setFocus();
editDialog->show(); return; }
bildneu(); }
void Baum::shadowEdit()
{ int k;
loc = CPYLOC;
k = copyShadow(root); //1
nr = 0;
ERek1(k);
loc = STDLOC;
root = KRek(k);
clrShadow(k); }
// erzeugt neuen baum aus altem Baum
//1 baum clonen nach loc = CPYLCOC
int Baum::copyShadow(int i)
{ int sl, sr;
if (s[i].t1 != 's') sl = s[i].sl;
else sl = copyShadow(s[i].sl);
if (s[i].t2 != 's') sr = s[i].sr;
else sr = copyShadow(s[i].sr);
if (loc == CPYLOC) return SBau(sl, sr, s[i].t1, s[i].t2, s[i].v);
else return sBau(sl, sr, s[i].t1, s[i].t2, s[i].v); }
// erzeugt zu einem gegebenen baum einen shadow_baum (rekursiv) u. gibt dessen wurzel zurück
void Baum::clrShadow(int i)
{ int sl, sr; char t1, t2;
if (! s[i].v) return;
sl = s[i].sl; sr = s[i].sr;
t1 = s[i].t1; t2 = s[i].t2;
if (! s[i].b) s[i] = s[ENDS]; //1
if (t1 == 's') clrShadow(sl);
if (t2 == 's') clrShadow(sr); }
// setzt i : satz voraus
//1: kopiert leeren satzblock
void Baum::labelGroup()
{ if (rTyp == 's')
{ worti = clip[0];
if (worti && clipTyp[0] == 'w')
{ ast = 0; AltG(root);
root = sBau(worti, ast, 'w', typ, '"'); rTyp = 's';
bildneu(); } } }
void Baum::baumMuster()
{ if (Muster())
{ stckrset(); CntrlM(); bildneu(); } }
char Baum::Muster()
{ QString z; bool ok;
ok = false;
z = QInputDialog::getText("muster:", "¹n: wort, ²n: satz, ³n: wort|satz",
QLineEdit::Normal, "muster | muster·name", &ok, this);
if (ok)
{ strcpy (edbox, z);
if (strcmp (edbox, "muster | muster·name") == 0)
{ bildneu(); return 0; } }
return 1; }
void Baum::baumTransform()
{ if (Muster())
{ stckrset(); AltM(); bildneu(); } }
void Baum::rechtsTransform()
{ stckrset(); CntrlN(); bildneu(); }
void Baum::linksTransform()
{ stckrset(); AltN(); bildneu(); }
void Baum::compProg()
{ stckrset(); AltR(); bildneu(); }
void Baum::progStart()
{ stckrset(); CntrlR(); bildneu(); }
void Baum::progDbg()
{ stckrset(); CntrlX(); bildneu(); }
void Baum::cBaum()
{ stckrset();
Cntrl0();
bildneu(); }
void Baum::editorC()
{ stckrset(); Alt0();
bmod = 0; editor1hide(); bildneu(); }
void Baum::functionTree()
{ stckrset(); CntrlP(); bildneu(); }
void Baum::datumHolen()
{ CntrlD(); bildneu(); }
void Baum::zeitHolen()
{ CntrlT(); bildneu(); }
void Baum::datumEinfuegen()
{ stckrset(); AltD(); bildneu(); }
void Baum::datumsBaum()
{ stckrset(); CntrlY(); bildneu(); }
void Baum::baumEdit()
{ F1(); }
void Baum::asciiLaden()
{ QString datei;
datei = fileDialog->getOpenFileName(pfad, "*", this);
if (datei.length())
{ strcpy(edbox, datei);
ShiftF8(); }
else statusbar->message("es konnten keine daten geladen werden!");
bildneu(); }
void Baum::asciiSpeichern()
{ QString datei;
datei = fileDialog->getSaveFileName(pfad, "*", this);
if (datei.length())
{ strcpy(edbox, datei);
ShiftF4(); }
else statusbar->message("asciiSpeichern: dateiName?");
bildneu(); }
void Baum::getEingabe()
{ int k, i;
iS = 0;
for(i = 0; i < 15; i++)
{ if (i < iM)
{ strcpy(tex, eDialog->line[i]->text()); //1
if (!tex[0]) mintS[iS] = '-';
else mintS[iS] = wortI(tex);
++iS; } }
loc = CPYLOC;
k = copyShadow( root);
if (maskFlag)
{ iG = 0; AltP2( clip[0], k);
loc = STDLOC;
k = KRek(k);
if (! s[ root].b) //2
{ loeschRek( root, 's');
root = k; }
else
{ tlz( root, k, 's', 's');
root = k; } }
else
{ nr = 0;
ERek(k);
loc = STDLOC;
root = KRek(k);
clrShadow(k); }
bildneu(); }
//1 einlesen der eingabezeilen (leerzeilen werden zu -)
//2 datenbaum war wurzel
void Baum::replaceBaum()
{ char kFall; int alt, histWrzl, wrzl, rzi;
alt = root;
histWrzl = s[alt].h;
if (!histWrzl)
{ rzi = s[alt].b; wrzl = r[rzi].zS;
if (alt == s[wrzl].sl) kFall = 1;
else kFall = 2; }
else
{ if (s[histWrzl].v == '"' && lflag) histWrzl = s[histWrzl].sr;
if (alt == s[histWrzl].sl) kFall = 3;
else if (alt == s[histWrzl].sr) kFall = 4; }
strcpy(tex, editDialog->line->text());
editDialog->comboEBox->removeItem(nr);
editDialog->comboEBox->insertItem((QString) tex, nr);
shadowEdit();
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'); }
editDialog->hide();
bildneu(); }
void Baum::focusA(const QString& s)
{ if (s.isEmpty()) setFocus(); }
void Baum::buttonTief()
{ history(); bildneu(); }
void Baum::buttonLinks()
{ histLR('<');
bildneu(); }
// finde_modus
void Baum::buttonRechts()
{ histLR('>');
bildneu(); }
// finde_modus
void Baum::buttonHoch()
{ if (lflag) lflag = 0; else lflag = 1; bildneu(); }
void Baum::buttonRzLinks()
{ rzLinks(root, rTyp); bildneu(); }
void Baum::buttonRzRechts()
{ rzRechts(root, rTyp); bildneu(); }
void Baum::buttonBLinks()
{ bLinks(); bildneu(); }
void Baum::buttonBRechts()
{ bRechts(); bildneu(); }
void Baum::comboIndL(int i)
{ strcpy(tex, comboLBox->text(i));
bInp->setText(tex); bInp->setFocus();
bildneu();}
void Baum::comboIndR(int i)
{ root = combo[i]; rTyp = comboTyp[i];
bildneu(); setFocus(); }
void Baum::comboRSatz(int index)
{ int len;
if (comboTief->count())
{ strcpy(tex, comboTief->text(index));
len = strlen(tex) - 1;
while (tex[len] != ' ') --len;
root = atoi(&tex[len + 1]);
rTyp = 's';
bildneu(); setFocus(); } }
//****************************************************************************
Fund::Fund(QWidget* parent, const char* name, WFlags f)
{ setGeometry(280, 100, 350, 500);
setMinimumSize(350, 500);
setMaximumSize(350, 500);
setFont(QFont("courier", 12, QFont::Bold));
setCaption("fundListe");
listBox = new QListBox(this);
listBox->setGeometry(10, 50, 330, 430);
suchEdit = new QLineEdit(this);
suchEdit->setGeometry(10, 10, 330, 30);
suchEdit->setFocus();
connect(listBox, SIGNAL(selected(int)), this, SLOT(listItemIndex(int)));
connect(suchEdit, SIGNAL(returnPressed()), SLOT(suchText())); }
void Fund::findeString()
{ iFF = 0;
suchEdit->setText(0);
suchEdit->setFocus();
setCaption("fundListe"); show(); }
// lokale stringsuche
void Fund::paintEvent(QPaintEvent*)
{ QPainter p;
char tmpstr[128];
int i;
p.begin(this);
listBox->clear();
for (i = 0; i < iFF; ++i)
{ sprintf(tmpstr,"%s", baum->w[baum->tmpF[i].i].st);
listBox->insertItem(tmpstr); }
listBox->sort(true);
listBox->setSelected(0,true);
p.end(); }
void Fund::listItemIndex(int index)
{ char tmpstr[128];
strcpy(tmpstr, listBox->text(index));
baum->root = baum->wortI(tmpstr);
baum->rTyp = 'w';
baum->bildneu();
fundList->hide();
baum->setFocus(); }
void Fund::suchText()
{ strcpy(baum->kette, suchEdit->text()); suchEdit->setText(0);
if (*baum->kette)
{ iFF = 0; baum->CntrlF(baum->root); } }
Dump::Dump(QWidget* parent, const char* name, WFlags f)
{ x = 470; y = 356; b = 210; h = 200;
bx = 40; by = 30; bb = 150; bh = 25;
fh = 30; tx = 15;
bKlick = zKlick = 0;
setGeometry(x, y, b, h);
setMinimumSize(b, h);
setMaximumSize(b, h);
setFont(QFont("courier", 12, QFont::Bold));
setCaption("dump"); }
void Dump::paintEvent(QPaintEvent*)
{ QPainter p; int x = bx; int y = by; int b = bb; int h = bh;
char tempstr[5];
p.begin(this);
p.setBrush(QColor(250, 250, 200));
p.setPen(QColor(250, 250, 200));
p.drawRect(0, 0, 210, 225);
p.setPen(Qt::black);
if (bKlick)
{ p.setBrush(QColor(167,255,137)); //grün
p.drawRect(x, y + h, b, h);
p.drawRect(x, y + 2 * h - 1, b, h);
p.drawLine(x, y + h - 1, x + b - 1, y + h - 1);
p.setPen(Qt::blue);
p.drawText(tx, y + h, 80, fh, Qt::AlignLeft, "sZ");
p.drawText(tx, y + 2 * h, 80, fh, Qt::AlignLeft, "zz");
sprintf(tempstr,"%d", dumpZS);
p.drawText(x + 7, y + h + 5, 130, 20, Qt::AlignLeft, tempstr);
sprintf(tex, "%d", dumpZz);
p.drawText(x + 7, y + 2 * h + 5, 130, fh, Qt::AlignLeft, tex);
bKlick = 0; }
else if (baum->rTyp == 's')
{ p.drawRect(x, y, b, h);
p.drawRect(x, y + h, b, h + 1);
p.drawRect(x, y + 2 * h, b, h + 1);
p.drawRect(x, y + 5 * h, b, h + 1);
p.setBrush(QColor(167,255,137)); //grün
p.drawRect(x, y + 3 * h, b, h + 1);
p.drawRect(x, y + 4 * h, b, h + 1);
p.drawLine(x, y - 1, x + b - 1, y - 1);
p.drawLine(x + 53, y, x + 53, y + h);
p.drawLine(x + 82, y, x + 82, y + h);
p.drawLine(x + 112, y, x + 112, y + h);
p.setPen(Qt::blue);
p.drawText(x + 5, y - 20, 20, 20, Qt::AlignLeft, "v");
p.drawText(x + 54, y - 20, 30, fh, Qt::AlignLeft, "t1");
p.drawText(x + 84, y - 20, 30, fh, Qt::AlignLeft, "t2");
p.drawText(x + 110, y - 20, 35, fh, Qt::AlignLeft, "loc");
p.drawText(tx, y + h, 80, fh, Qt::AlignLeft, "sl");
p.drawText(tx, y + 2 * h, 80, fh, Qt::AlignLeft, "sr");
p.drawText(tx, y + 3 * h, 80, fh, Qt::AlignLeft, "b");
p.drawText(tx, y + 4 * h, 80, fh, Qt::AlignLeft, "h");
p.drawText(tx, y + 5 * h, 80, fh, Qt::AlignLeft, "s");
sprintf(tempstr,"%d",int(baum->s[baum->root].v));
p.drawText(x + 7, y + 5, 40, 20, Qt::AlignLeft, tempstr);
sprintf(tex, "%d", baum->s[baum->root].sl);
p.drawText(x + 7, y + h + 5, 130, fh, Qt::AlignLeft, tex);
sprintf(tex, "%d", baum->s[baum->root].sr);
p.drawText(x + 7, y + 2 * h + 5, 130, fh, Qt::AlignLeft, tex);
sprintf(tex, "%d", baum->s[baum->root].b);
p.drawText(x + 7, y + 3 * h + 5, 130, fh, Qt::AlignLeft, tex);
sprintf(tex, "%d", baum->s[baum->root].h);
p.drawText(x + 7, y + 4 * h + 5, 130, fh, Qt::AlignLeft, tex);
sprintf(tex, "%d", baum->s[baum->root].s);
p.drawText(x + 7, y + 5 * h + 5, 130, fh, Qt::AlignLeft, tex);
tempstr[0] = baum->s[baum->root].t1; tempstr[1] = 0;
if (*tempstr != 'w' && *tempstr != 's') p.setPen(Qt::red);
else p.setPen(Qt::blue);
p.drawText(x + 60, y + 5, 30, 20, Qt::AlignLeft, tempstr);
tempstr[0] = baum->s[baum->root].t2; tempstr[1] = 0;
if (*tempstr != 'w' && *tempstr != 's') p.setPen(Qt::red);
else p.setPen(Qt::blue);
p.drawText(x + 92, y + 5, 30, 20, Qt::AlignLeft, tempstr);
sprintf(tex, "%d", int(baum->s[baum->root].lc));
if (baum->s[baum->root].lc) p.setPen(Qt::red);
else p.setPen(Qt::blue);
p.drawText(x + 117, y + 5, 50, fh, Qt::AlignLeft, tex); }
else if (baum->rTyp == 'w')
{ y += 10;
p.drawRect(x, y, b, h + 1);
p.drawRect(x, y + h, b, h + 1);
p.drawRect(x, y + 2 * h, b, h + 1);
p.drawLine(x, y - 1, x + b - 1, y - 1);
p.drawLine(x, y + 5 * h - 1, x + b - 1, y + 5 * h - 1);
p.setBrush(QColor(167, 255, 137)); //grün
p.drawRect(x, y + 3 * h, b, h + 1);
p.drawRect(x, y + 5 * h, b, h + 1);
p.setPen(Qt::blue); y += 5;
p.drawText(tx, y, 80, fh, Qt::AlignLeft, "st");
p.drawText(tx, y + h, 80, fh, Qt::AlignLeft, "wl");
p.drawText(tx, y + 2 * h, 80, fh, Qt::AlignLeft, "wr");
p.drawText(tx, y + 3 * h, 80, fh, Qt::AlignLeft, "b");
p.drawText(tx, y + 5 * h, 80, fh, Qt::AlignLeft, "h");
sprintf(tex, "%d", int(baum->w[baum->root].st));
p.drawText(x + 7, y, 130, fh, Qt::AlignLeft, tex);
sprintf(tex, "%d", baum->w[baum->root].wl);
p.drawText(x + 7, y + h, 130, fh, Qt::AlignLeft, tex);
sprintf(tex, "%d", baum->w[baum->root].wr);
p.drawText(x + 7, y + 2 * h, 130, fh, Qt::AlignLeft, tex);
sprintf(tex, "%d", baum->w[baum->root].b);
p.drawText(x + 7, y + 3 * h, 130, fh, Qt::AlignLeft, tex);
sprintf(tex, "%d", baum->histor);
p.drawText(x + 7, y + 5 * h, 130, fh, Qt::AlignLeft, tex);
p.setPen(Qt::red);
p.drawText(10, 10, 130, 20, Qt::AlignLeft, baum->w[baum->root].st); }
p.end(); }
void Dump::mousePressEvent(QMouseEvent* e)
{ int xp, yp;
QPoint clickedPos = e->pos();
xp = clickedPos.x(); yp = clickedPos.y();
if (zKlick)
{ zKlick = 0;
if (xp > bx && xp < bx + bb && yp > by + bh && yp < by + 2 * bh)
{ baum->root = dumpZS; baum->rTyp = 's'; baum->bildneu(); } //1
else if (xp > bx && xp < bx + bb && yp > by + 2 * bh && yp < by + 3 * bh)
{ dumpB = baum->r[dumpB].zz; dumpZS = baum->r[dumpB].zS; dumpZz = baum->r[dumpB].zz;
bKlick = 1; zKlick = 1; baum->bildneu(); }
return; }
if (baum->rTyp == 's')
{ if (xp > bx && xp < bx + bb && yp > by + 3 * bh && yp < by + 4 * bh) //1
{ dumpB = baum->s[baum->root].b; bKlick = 1; }
else if (xp > bx && xp < bx + bb && yp > by + 4 * bh && yp < by + 5 * bh) //3
{ baum->rTyp = 's'; baum->root = baum->s[baum->root].h; zKlick = 0; baum->bildneu(); } }
else
{ if (baum->rTyp == 'w')
{ if (xp > bx && xp < bx + bb && yp > by + 3 * bh + 10 && yp < by + 4 * bh + 10) //2
{ dumpB = baum->w[baum->root].b; bKlick = 1; }
else if (xp > bx && xp < bx + bb && yp > by + 5 * bh + 10 && yp < by + 6 * bh + 10) //3
{ baum->rTyp = 's'; baum->root = baum->histor; zKlick = 1; baum->bildneu(); return; } } }
if (bKlick == 1)
{ dumpZS = baum->r[dumpB].zS; dumpZz = baum->r[dumpB].zz; zKlick = 1; baum->bildneu(); } }
//1 s.b //2 w.b //3 histor
InputDialog::InputDialog(QWidget* parent, const char* name, WFlags f)
{ int i;
setGeometry(150, 150, 725, 500);
setFont(QFont("courier", 12, QFont::Bold));
setCaption("input dialog");
for(i = 0; i < 15; i++)
{ line[i] = new QLineEdit(this);
line[i]->setGeometry(160, 10 + i * 30, 550, 26);
connect(line[i], SIGNAL(returnPressed()), SLOT(nextLine())); }
okay = new QPushButton("Okay", this);
okay->setGeometry(210, 10 + 13 * 30, 200, 30);
connect(okay, SIGNAL(clicked()), SLOT(getEingabe()));
line[0]->setFocus(); }
void InputDialog::paintEvent(QPaintEvent*)
{ int i; char* txt0;
QPainter p;
p.begin(this);
p.setBrush(QColor(250, 250, 200));
p.setPen(Qt::black);
p.drawRect(0, 0, 725, 500);
for(i = 0; i < 15; i++)
{ if (i < baum->iM)
{ txt0 = baum->w[baum->mintM[i]].st; ++txt0;
p.drawText(10, 10 + i * 30, 200, 26, Qt::AlignLeft, txt0);
line[i]->show(); }
else line[i]->hide(); }
p.end(); }
void InputDialog::getEingabe()
{ hide();
baum->getEingabe(); }
void InputDialog::nextLine()
{ if (activ_line < baum->iM - 1)
{ ++activ_line;
line[activ_line]->setFocus(); }
else
{ activ_line = 0;
line[0]->setFocus(); } }
// wechselt mit return-taste eine zeile tiefer
void InputDialog::keyPressEvent(QKeyEvent* e)
{ int Key = 0;
Key = e->key();
if (Key == Qt::Key_Up)
{ if (activ_line > 0)
{ --activ_line;
line[activ_line]->setFocus(); }
else
{ activ_line = baum->iM - 1;
line[activ_line]->setFocus(); } }
if (Key == Qt::Key_Down)
{ if (activ_line < baum->iM - 1)
{ ++activ_line;
line[activ_line]->setFocus(); }
else
{ activ_line = 0;
line[0]->setFocus(); } }
if (Key == Qt::Key_Escape) line[activ_line]->setText(0);
repaint(); }
EditDialog::EditDialog(QWidget* parent, const char* name, WFlags f)
{ setGeometry(200, 550, 620, 170);
setFont(QFont("courier", 12, QFont::Bold));
setCaption("worte eines baums editieren");
comboEBox = new QComboBox(this);
comboEBox->setGeometry(10, 40, 600, 26);
connect(comboEBox, SIGNAL(activated(int)), SLOT(getEditWort(int)));
line = new QLineEdit(this);
line->setGeometry(10, 80, 600, 26);
connect(line, SIGNAL(returnPressed()), SLOT(wortInComboBox()));
neubaum = new QPushButton("Neuer Baum", this);
neubaum->setGeometry(30, 120, 240, 30);
connect(neubaum, SIGNAL(clicked()), SLOT(neuBaum()));
replacebaum = new QPushButton("Alten Baum umbauen", this);
replacebaum->setGeometry(355, 120, 240, 30);
connect(replacebaum, SIGNAL(clicked()), SLOT(replaceBaum()));
line->setFocus(); }
void EditDialog::paintEvent(QPaintEvent*)
{ QPainter p;
p.begin(this);
p.setBrush(QColor(250, 250, 200));
p.setPen(Qt::black);
p.drawRect(0, 0, 620, 170);
p.drawText(10, 10, 600, 26, Qt::AlignLeft, "wort aus combobox holen (return = übernehmen)");
p.end(); }
void EditDialog::keyPressEvent(QKeyEvent* e)
{ int Key = 0;
Key = e->key();
if (Key == Qt::Key_Return || Key == Qt::Key_Enter)
{ wortInComboBox();
editDialog->line->setFocus(); }
repaint(); }
void EditDialog::neuBaum()
{ strcpy(tex, line->text());
comboEBox->removeItem(nr);
comboEBox->insertItem((QString) tex);
baum->shadowEdit(); hide(); baum->bildneu(); }
void EditDialog::replaceBaum()
{ baum->replaceBaum(); }
void EditDialog::getEditWort(int index)
{ strcpy(tex, editDialog->comboEBox->text(index));
nr = index;
line->setText(tex);
line->setFocus(); }
void EditDialog::wortInComboBox()
{ strcpy(tex, line->text());
comboEBox->removeItem(nr);
comboEBox->insertItem((QString) tex, nr);
editDialog->line->setFocus(); }
Output::Output(QWidget* parent, const char* name, WFlags f)
{ int i;
start = 0;
command = line = 0;
ostring[0] = 0;
bred = bgreen = bblue = 255;
pred = pgreen = pblue = 0;
txt0 = ostring;
for (i = 0; i <= 9; ++i) param[i] = 0; //1
BILDH = 500; BILDBR = 650;
BILDX = 150; BILDY = 150;
setGeometry(BILDX, BILDY, BILDBR, BILDH);
strcpy(fontname,"courier");
fontsize = 14; fonttyp = QFont::Bold;
setFont(QFont(fontname, fontsize, fonttyp));
setCaption("output window"); }
//1 parameter array löschen
void Output::paintEvent(QPaintEvent* e_)
{ QPainter p;
p.begin(&buffer);
if (!start)
{ start = 1;
p.setBrush(Qt::white);
p.setPen(Qt::white);
p.drawRect(0, 0, BILDBR, BILDH);
p.setPen(Qt::black);}
else
{ if (command) drawCommand(&p, command, txt0); }
p.end();
bitBlt(this, 0, 0, &buffer); }
void Output::resizeEvent(QResizeEvent* event)
{ BILDBR = width(); BILDH = height();
buffer.resize(event->size()); }
void Output::outputShow()
{ outputWindow->show();
repaint(); }
// ausgabefenster zeigen
void Output::outputHide()
{ outputWindow->hide(); }
// ausgabefenster verstecken
void Output::outputResize(int x, int y, int breite, int hoehe)
{ BILDBR = breite; BILDH = hoehe;
BILDX = x; BILDY = y;
outputWindow->move(BILDX, BILDY);
outputWindow->resize(BILDBR, BILDH);
start = 0;
repaint(); }
// groesse des ausgabefenster ändern
void Output::outputClear()
{ start = 0; line = 0; repaint(); }
// ausgabefenster reinigen
void Output::drawCommand(QPainter* p, int befehl, char* string)
{ switch(befehl)
{ case 1:
p->setPen(QColor(pred, pgreen, pblue));
p->drawLine(param[0], param[1], param[2], param[3]); break; //1
case 2:
bred = param[0]; bgreen = param[1]; bblue = param[2]; break; //2
case 3:
pred = param[0]; pgreen = param[1]; pblue = param[2]; break; //3
case 4:
p->setPen(QColor(pred, pgreen, pblue));
p->setBrush(QColor(bred, bgreen, bblue));
p->drawRect(param[0], param[1], param[2], param[3]); break; //4
case 5:
p->setPen(QColor(pred, pgreen, pblue));
p->setFont(QFont(fontname, fontsize, fonttyp));
p->drawText(param[0], param[1], param[2], param[3], Qt::AlignLeft, string); break; //5
case 6:
p->setPen(QColor(pred, pgreen, pblue));
p->setBrush(QColor(bred, bgreen, bblue));
p->drawEllipse(param[0], param[1], param[2], param[3]); break; //6
case 7:
buffer.save(string, "BMP" ); break; // 7
case 8:
buffer.load(string); break; // 8
case 9:
outputWindow->setCaption(string); break; // 9
case 10:
p->setPen(QColor(pred, pgreen, pblue));
p->setFont(QFont("courier", 12, QFont::Bold));
p->drawText(10, line * 16, BILDBR, 20, Qt::AlignLeft, string);
++line; } //10
command = 0; }
// zeichenbefehle
//1 linie ziehen
//2 pinsel farbe
//3 stift farbe
//4 rechteck zeichnen
//5 text schreiben
//6 zeichne ellipse/kreis
//7 fensterinhalt speichern als JPG-datei
//8 fensterinhalt aus Datei laden
//9 fensterüberschrift
//10 print
//*************************************************************************
void Baum::F1()
{ if (bmod)
{ bmod = 0; asciiToBaum(); editor1hide(); bildneu(); }
else
{ bmod = 1;
if (root)
{ if (rTyp == 's' && s[root].v) baumToAscii(); }
editor1show(); } }
void Baum::F2()
{ if (lcmod) lcmod = 0;
else lcmod = 1; }
void Baum::ShiftF2()
{ char col;
int loc1;
col = loc; lcmod = 1; loc1 = atoi(alt); loc = char(loc1);
if (col != loc)
{ rzRechts(root, rTyp); rzi = *rzp;
if (! rzi) return;
rSatz = r[rzi].zS;
if (s[rSatz].lc != loc)
{ lcRechts();
if (! s[root].v) lcLinks(); }
else
{ root = rSatz; rTyp = 's'; } } }
void Baum::F3()
{ int i, w0, aLen, wLen, sLen; char* wp, * sp, * rp; //rLen
int* stck03; stck3 = stack + 3 * STCK1; stck03 = stck3;
baumDat = new char[BDAT];
asci_neu = baumDat;
blockRead(".a", asci_neu); aLen = datLen;
w_neu = (wort*)(baumDat + aLen); wp = (char*)w_neu;
blockRead(".w", wp); wLen = datLen;
s_neu = (satz*)(baumDat + aLen + wLen); sp = (char*)s_neu;
blockRead(".s", sp); sLen = datLen;
r_neu = (kett*)(baumDat + aLen + wLen + sLen); rp = (char*)r_neu;
blockRead(".r", rp);
// d_neu = baumDat + aLen + wLen + sLen + rLen; blockRead(".d", d_neu);
asci_tmp = asci_neu; w_tmp = w_neu; s_tmp = s_neu; r_tmp = r_neu;
asci_neu = ascii; w_neu = w; s_neu = s; r_neu = r;
ascii = asci_tmp; w = w_tmp; s = s_tmp; r = r_tmp;
w0 = wLen / sizeof(wort);
for (i = 1 ; i < w0; i++) w[i].st += int (ascii); //1
baumi = sLen / sizeof(satz);
while (baumi)
{ if (! s[baumi].b && s[baumi].v) *stck03++ = baumi; //1
--baumi; }
typ = 's';
while (stck03 != stck3) //5
{ holz = *--stck03; loc = s[holz].lc; holz = F5rek(holz); }
sMax = holz;
ascii = asci_neu; w = w_neu; s = s_neu; r = r_neu;
delete [] baumDat; }
//1 reloziert die textzeiger
void Baum::F4()
{ int i; char* wp, * sp, * rp;
wp = (char*)w; sp = (char*)s; rp = (char*)r;
for (i = 0 ; i <= wort0 ; i++) w[i].st -= int (ascii); // deloziert die textzeiger
blockWrite(".a", ascii, 1, asci0 - ascii);
blockWrite(".w", wp, sizeof(wort), wort0 + 1);
blockWrite(".s", sp, sizeof(satz), sMax + 1);
blockWrite(".r", rp, sizeof(kett), rMax + 1);
for (i = 0 ; i <= wort0 ; i++) w[i].st += int (ascii); // reloziert die textzeiger
mes = 1; }
void Baum::blockWrite(char* ext, char* start, int size, int anzahl)
{ strcpy (tex, edbox); strcat(tex, ext);
stream = fopen (tex, "wb"); // FILE* stream
fwrite (start, size, anzahl, stream);
fclose (stream); }
void Baum::ShiftF4()
{ if (! edbox[0]) strcpy(edbox, "noname");
baumDat = new char[BDAT];
transMulti(10, baumDat);
datLen = strlen(baumDat);
if (datLen)
{ if (wb()) mes = 1; }
else mes = 2;
delete [] baumDat; }
void Baum::transMulti(char c, char * feldadr)
{ int i; txt0 = feldadr;
sum = bMes->numLines(); // anzahl zeilen
for (i = 0; i < sum; i++) // aktuelle zeile
{ strcpy(txt0, bMes->textLine(i));
txt0 += strlen(txt0); *txt0++ = c; } // 0 oder LF
*txt0++ =0; *txt0 = 0; } // ende hat 2 nullen
// kopiert QMultiLineEdit nach feldadr
void Baum::F5()
{ int* stck03; stck3 = stack + 3 * STCK1; stck03 = stck3;
while (! s[sMax].v && sMax) sMax--;
baumi = sMax;
while (baumi)
{ if (! s[baumi].b && s[baumi].v) *stck03++ = baumi; //1
--baumi; }
asci_neu = new char[ENDC+1]; w_neu = new wort[ENDW+1]; //2
s_neu = new satz[ENDS+1]; r_neu = new kett[ENDRL+1]; //2
w_tmp = w; s_tmp = s; r_tmp = r; asci_tmp = ascii;
ascii = asci_neu; w = w_neu; asciinit(); //3
wort0 = 255; satz0 = 1; rzl0 = 1;
keyList(); //4
typ = 's';
while (stck03 != stck3) //5
{ holz = *--stck03; loc = s[holz].lc;
holz = F5rek(holz); s[holz].h = 0; s[holz].s = 0; }
w = w_tmp; s = s_tmp; r = r_tmp; ascii = asci_tmp;
delete [] ascii; delete [] w; delete [] s; delete [] r;
ascii = asci_neu; w = w_neu; s = s_neu; r = r_neu;
root = holz; sMax = holz;
int i;
for(i = 0; i < 8; i++)
{ clip[i] = 0; clipTyp[i] = 0; clap[i] = 0; clapTyp[i] = 0; }
mes = 6; }
//1 die einzelnen bäume werden aufgelistet:
//2 und über einen zweiten speicherbereich
//3 mit an dem neuen speicher angepassten w[0-255]
//4 und evtl. der keyList
//5 in einer schleife abgearbeitet:
int Baum::F5rek(int kNr)
{ int sl, sr;
unsigned char t1, t2, v;
s = s_tmp; r = r_tmp; //1:
sl = s[kNr].sl; sr = s[kNr].sr;
t1 = s[kNr].t1; t2 = s[kNr].t2;
v = s[kNr].v;
if (t1 == 's') sl = F5rek(sl);
else if (t1 == 'w')
{ w = w_tmp; txt0 = w[sl].st; w = w_neu; sl = wortI(txt0); } //2
if (t2 == 's') sr = F5rek(sr);
else if (t2 == 'w')
{ w = w_tmp; txt0 = w[sr].st; w = w_neu; sr = wortI(txt0); } //2
s = s_neu; r = r_neu; //3
return sBau(sl, sr, t1, t2, v); }
//1 s | r zurücksetzen
//2 alten wort_string holen und neues wort anlegen
//3 s | r an neuen speicher anpassen
void Baum::wBSort(int bZweig)
{ if (w[bZweig].wl) wBSort(w[bZweig].wl);
*stck1++ = bZweig;
if (w[bZweig].wr) wBSort(w[bZweig].wr);
w[bZweig].wl = 0; w[bZweig].wr = 0; }
// TK_rekursion
void Baum::wBAusgleich()
{ int vor, mitte; int* stckA, * stckB;
loop:
if (! *(stck1 + 1)) return;
stckA = stckB = stck1;
loop1:
if (*stckA)
{ vor = *stckA++;
if (*stckA)
{ mitte = *stckA++; w[mitte].wl = vor;
*stckB++ = mitte;
if (*stckA)
{ w[mitte].wr = *stckA++;
if (*stckA)
{ *stckB++ = *stckA++; goto loop1; } } }
else *stckB++ = vor; }
*stckB = 0;
goto loop; }
void Baum::F6(int k, char t)
{ if (t == 's')
{ if (! s[k].b)
{ loeschRek(k, t); mes = 1; } }
else mes = 2; }
void Baum::clearLOC()
{ int kNr;
F7();
kNr = sMax;
while (kNr)
{ if (! s[kNr].b && s[kNr].v != '"' && loc == STDLOC) s[kNr].lc = OUTLOC;
--kNr; } }
void Baum::F7()
{ int kNr;
mes = 1;
while (! s[sMax].v && sMax) --sMax;
kNr = sMax;
while (kNr)
{ if (! s[kNr].b && s[kNr].lc == OUTLOC) loeschRek(kNr, 's');
else
{ if (s[kNr].v) docS(kNr);
if (mes == 1) --kNr; else break; } }
if (loc == OUTLOC)
{ loc = STDLOC; bLinks(); } }
void Baum::docS(int i)
{ if (s[i].t1 == 'w' || s[i].t1 == 's')
{ rzp = getRzp(s[i].sl, s[i].t1);
if (rzp && *rzp)
{ docS1(i);
if (mes == 5) goto ret; } }
if (s[i].t2 == 'w' || s[i].t2 == 's')
{ rzp = getRzp(s[i].sr, s[i].t2);
if (rzp && *rzp)
{ docS1(i);
if (mes == 5) goto ret; } }
docS2(i);
if (mes == 5) goto ret;
return;
ret: root = i; }
void Baum::docS1(int i)
{ rzi = *rzp;
loop:
rSatz = r[rzi].zS;
if (rSatz != i)
{ rzi = r[rzi].zz;
if (rzi) goto loop;
else
{ mes = 5;
cout << i << endl; } } }
void Baum::docS2(int i)
{ rzi = s[i].b;
while (rzi)
{ rSatz = r[rzi].zS;
if (rSatz == i)
{ mes = 5; return; }
if (s[rSatz].sl != i && s[rSatz].sr != i)
{ mes = 5; return; }
rzi = r[rzi].zz; } }
void Baum::F8()
{ char* wp, * sp, * rp;
wp = (char*)w; sp = (char*)s; rp = (char*)r;
blockRead(".a", ascii); asci0 = ascii + datLen;
blockRead(".w", wp); wort0 = datLen / sizeof(wort);
blockRead(".s", sp); sMax = datLen / sizeof(satz) - 1; satz0 = 1;
while (s[satz0].v) satz0++;
blockRead(".r", rp); rMax = datLen / sizeof(kett); rzl0 = 1;
while (r[rzl0].zS) rzl0++;
for (int i = 0 ; i <= wort0 ; i++) w[i].st += int (ascii); // reloziert die textzeiger
root = 1; rTyp = 's';
bRechts();
edbox[0] = 0; mesFlag = 0; mes = 1; }
void Baum::blockRead(char* ext, char* start)
{ strcpy(tex, edbox); strcat(tex, ext);
stream = fopen (tex, "rb"); getDatLen();
fread (start, 1, datLen, stream);
fclose (stream); }
void Baum::getDatLen()
{ fseek (stream, 0, SEEK_END ); // dateiende + 0 suchen
datLen = ftell(stream); // länge bis gesuchte position
fseek (stream, 0, SEEK_SET ); } // dateianfang + 0 suchen
void Baum::ShiftF8()
{ char* p;
if (! edbox[0]) strcpy(edbox, "noname");
baumDat = new char[BDAT];
if (rb())
{ p = strstr(baumDat,"setText(baumDat);
editor1show(); bmod = 1; mes = 1; }
else mes = 2;
delete [] baumDat; }
//1 HTML/XML scan
void Baum::htm()
{ unsigned char zchn;
while (*baumdat)
{ zchn = (unsigned char) *baumdat++;
if (zchn == '<') htm1(); // html
else
{ if (zchn == LF || zchn == CR) zchn = ' ';
else if (zchn == '&') *dp++ = htm2();
else if (zchn == ' ' && (*(dp - 1) == LF || (*(dp - 1) == ' '))) continue; //1
else *dp++ = zchn; } }
*dp = 0; }
// setzt baumDat voraus, verwandelt htm_text in ascii_text
//1 verhindert LF' '|' '
void Baum::htm1()
{ unsigned char c; txt1 = tex;
if (baumdat == strstr(baumdat, "![CDATA[")) // XML CDATA
{ baumdat += 8; *dp++ = LF;
while (*baumdat != ']')
{ c = (unsigned char) *baumdat++;
if (c == '&')
{ if (baumdat == strstr(baumdat, "nbsp;"))
{ baumdat +=5; c = ' '; } } // Leerzeichen
if (c == 0xc3) // unicode
{ if (*baumdat == -97) c = 0xdf; // sz
else if (*baumdat == -74) c = 0xf6; // o-umlaut klein
else if (*baumdat == -92) c = 0xe4; // a-umlaut klein
else if (*baumdat == -68) c = 0xfc; // u-umlaut klein
baumdat++; }
*dp++ = c; }
while (*baumdat != '>') baumdat++;
baumdat++;
return; }
while ((c = (unsigned char) *baumdat++) != '>') // html
{ if (c >= 'a' && c <= 'z') c -= 0x20; //1
*txt1++ = c; }
*txt1 = 0;
if (strcmp(tex, "P") == 0)
{ if (*(dp - 2) != LF) *dp++ = LF; } //2
else if (strcmp(tex, "BR") == 0)
{ if (*(dp - 2) != LF) *dp++ = LF; } //2
if (strcmp(tex, "/H1") == 0)
{ if (*(dp - 2) != LF) *dp++ = LF; } //2
else if (strcmp(tex, "/H2") == 0)
{ if (*(dp - 2) != LF) *dp++ = LF; } //2
if (strcmp(tex, "/H3") == 0)
{ if (*(dp - 2) != LF) *dp++ = LF; } //2
else if (strcmp(tex, "/H4") == 0)
{ if (*(dp - 2) != LF) *dp++ = LF; } //2
while (*baumdat == LF || *baumdat == CR || *baumdat == ' ') baumdat++; }
//1 html-tags gross schreiben
//2 max. 1 leerzeile
unsigned char Baum::htm2() // umlaute konvertieren
{ txt1 = tex;
while (*baumdat != ';') *txt1++ = *baumdat++;
baumdat++; *txt1 = 0;
if (strcmp(tex, "Auml") == 0) return 0xc4;
else if (strcmp(tex, "Ouml") == 0) return 0xd6;
else if (strcmp(tex, "Uuml") == 0) return 0xdc;
else if (strcmp(tex, "auml") == 0) return 0xe4;
else if (strcmp(tex, "ouml") == 0) return 0xf6;
else if (strcmp(tex, "uuml") == 0) return 0xfc;
else if (strcmp(tex, "szlig") == 0) return 0xdf;
else if (strcmp(tex, "amp") == 0) return('&');
else if (strcmp(tex, "lt") == 0) return('<');
else if (strcmp(tex, "gt") == 0) return('>');
else if (strcmp(tex, "deg") == 0) return 0xb0;
else if (strcmp(tex, "nbsp") == 0) return(' ');
return(' '); }
void Baum::F9()
{ int i, j; j = 7;
for (i = 0; i < 8; ++i)
{ if (rTyp == clipTyp[i] && root == clip[i])
{ clipTyp[i] = 0; clip[i] = 0; j = i; } }
for (i = j; i > 0; --i)
{ clipTyp[i] = clipTyp[i - 1]; clip[i] = clip[i -1]; }
clipTyp[0] = rTyp; clip[0] = root; } //1
// //1
void Baum::ShiftF9()
{ int i;
for (i = 0; i < 7; i++)
{ clip[i] = clip[i + 1];
clipTyp[i] = clipTyp[i + 1]; }
clip[7] = 0; clipTyp[7] = 0; }
void Baum::F10()
{ int i, j; j = 7;
for (i = 0; i < 8; ++i)
{ if (rTyp == clapTyp[i] && root == clap[i])
{ clapTyp[i] = 0; clap[i] = 0; j = i; } }
for (i = j; i > 0; --i)
{ clapTyp[i] = clapTyp[i - 1]; clap[i] = clap[i -1]; }
clapTyp[0] = rTyp; clap[0] = root; }
void Baum::F11(int k)
{ s[root].b = 0; }
//{ Ast = 0; F11Rek(k); root = Ast; }
void Baum::F11Rek(int k)
{ if (s[k].t1 == 's') F11Rek(s[k].sl);
else if (! s[k].sl)
{ if (! Ast) Ast = k; //1
else Ast = sBau(Ast, k, 's', 's', '·'); }
if (s[k].t2 == 's') F11Rek(s[k].sr);
else if (! s[k].sr)
{ if (! Ast) Ast = k; //1
else Ast = sBau(Ast, k, 's', 's', '·'); } }
/*
void Baum::F11(int k)
{ baumi = wortI("rcs"); typ = 'w';
Ast = 0; F11Rek(k); root = Ast; }
void Baum::F11Rek(int k)
{ if (s[k].v == '"')
{ if (isDay (w[s[k].sl].st))
{ if (! vSatz(s[k].sl, 'w', '·'))
{ if (hatMember(s[k].sr, 's'))
{ if (! Ast) Ast = k; //1
else Ast = sBau(Ast, k, 's', 's', '·'); } } }
else F11Rek(s[k].sr); }
else
{ if (s[k].t1 == 's') F11Rek(s[k].sl);
if (s[k].t2 == 's') F11Rek(s[k].sr); } }
// sucht alle lab-knoten, die nicht im ·-baum sind . zeigt knoten als baum
//1 anfangs-knoten
*/
void Baum::F12()
{ if (rTyp == 's')
{ ifBau0(root); elseBau0(root);
bildneu(); } }
void Baum::ifBau0(int k)
{ if (s[k].v == 'f')
{ if (s[k].t2 == 's') k = s[k].sr;
else return; }
if (s[k].v == '"' && s[k].sl == switch_) k = s[s[k].sr].sr;
if (s[k].t1 == 's')
{ if (s[s[k].sl].v == ',')
{ ast = s[k].sl;
if (s[ast].t2 == 's')
{ ast = s[ast].sr;
if (s[ast].v == '"' && s[ast].sl == then_)
{ k = ast; ifBau0(k);
if (s[k].t2 == 's') ifBau0(s[k].sr);
return; } }
anbauLl(k, if_then, 'w', '"'); }
else if (s[s[k].sl].v == ';') anbauLl(k, do_while, 'w', '"');
else if (s[s[k].sl].v == '_')
{ if (forTest0(s[k].sl)) anbauLl(k, for_do, 'w', '"');
else anbauLl(k, while_do, 'w', '"'); }
else if (s[k].t2 == 's')
{ if (s[s[k].sr].v == ',')
{ ast = s[k].sr;
if (s[ast].t2 == 's')
{ ast = s[ast].sr;
if (s[ast].v == '"' && s[ast].sl == then_)
{ ifBau0(s[k].sl); ifBau0(s[s[k].sr].sr); return; } }
anbauRl(k, if_then, 'w', '"'); }
else if (s[s[k].sr].v == ';') anbauRl(k, do_while, 'w', '"');
else if (s[s[k].sr].v == '_')
{ if (forTest0(s[k].sr)) anbauRl(k, for_do, 'w', '"');
else anbauRl(k, while_do, 'w', '"'); } }
ifBau0(s[k].sl); }
else if (s[k].sl != if_then && s[k].sl != do_while && s[k].sl != while_do && s[k].sl != for_do)
{ if (s[k].t2 == 's')
{ if (s[s[k].sr].v == ',')
{ ast = s[k].sr;
if (s[ast].t2 == 's')
{ ast = s[ast].sr;
if (s[ast].v == '"' && s[ast].sl == then_)
{ ifBau0(ast); return; } }
anbauRl(k, if_then, 'w', '"'); }
else if (s[s[k].sr].v == ';') anbauRl(k, do_while, 'w', '"');
else if (s[s[k].sr].v == '_')
{ if (forTest0(s[k].sr)) anbauRl(k, for_do, 'w', '"');
else anbauRl(k, while_do, 'w', '"'); } } }
if (s[k].t2 == 's') ifBau0(s[k].sr); }
void Baum::elseBau0(int k)
{ if (s[k].v == 'f')
{ if (s[k].t2 == 's') k = s[k].sr;
else return; }
if (s[k].v == '·')
{ ast = s[k].sl; flag = 0;
if (s[ast].v == '"' && s[ast].sl == case_) flag = 1;
if (s[s[k].sr].v != '"' && !flag) anbauRl(k, else_, 'w', '"'); }
if (s[k].t1 == 's') elseBau0(s[k].sl);
if (s[k].t2 == 's') elseBau0(s[k].sr); }
char Baum::forTest0(int k)
{ return 0; }
int Baum::rbX()
{ strcpy(tex, "/baum/b/wiki.txt"); //home/internet2/baum/aktsent.txt");
stream = fopen(tex, "rb");
if (! stream) return 0;
fseek(stream, 0, SEEK_END); datLen = ftell(stream); fseek(stream, 0, SEEK_SET);
fread (baumDat, 1, datLen, stream); fclose(stream); return 1; }
int Baum::wbX()
{ strcpy(tex, "/baum/b/aktsent.txt"); //home/internet2/baum/aktsent.txt");
stream = fopen(tex, "wb");
if (! stream) return 0;
fwrite (baumDat, 1, datLen, stream); fclose(stream); sync(); return 1; }
/*
{ if (rTyp == 's')
{ dhSyntax(root); mes = 1; }
else mes = 2; }
{ if (rTyp == 's') zeitSyntax(root); }
void Baum::zeitSyntax(int k)
{ int li, re, rr;
li = s[k].sl; re = s[k].sr;
if (s[k].v == '"')
{ if (s[re].v == ':' || s[re].v == 'i')
{ if (s[re].t2 == 'w')
{ rr = s[re].sr;
if (isTime(w[rr].st))
{ worti = wortI(w[rr].st + 3);
Ast = s[k].sl;
umbau(k, 'l', worti, 'w'); umbau(re, 'r', Ast, 'w'); return; } } } }
if (s[k].t1 == 's') zeitSyntax(li);
if (s[k].t2 == 's') zeitSyntax(re); }
char Baum::isTime(char* date)
{ char c;
if (strlen(date) == 7)
{ c = *date++; if (c != 'e') return 0;
c = *date++; if (c != 'u') return 0;
c = *date++; if (c != '_') return 0;
c = *date++; if (c < '0' || c > '9') return 0;
c = *date++; if (c != '.') return 0;
c = *date++; if (c < '0' || c > '9') return 0;
c = *date++; if (c < '0' || c > '9') return 0;
return 1; }
if (strlen(date) == 8)
{ c = *date++; if (c != 'e') return 0;
c = *date++; if (c != 'u') return 0;
c = *date++; if (c != '_') return 0;
c = *date++; if (c < '1' || c > '9') return 0;
c = *date++; if (c < '0' || c > '9') return 0;
c = *date++; if (c != '.') return 0;
c = *date++; if (c < '0' || c > '9') return 0;
c = *date++; if (c < '0' || c > '9') return 0;
return 1; }
return 0; }
void Baum::dhSyntax(int k)
{ if (s[k].v == ',')
{ if (s[k].t2 == 'w')
{ re = s[k].sr;
if (atoi(w[re].st)) s[k].v = '*';
return; } }
if (s[k].t1 == 's') dhSyntax(s[k].sl);
if (s[k].t2 == 's') dhSyntax(s[k].sr); }
void Baum::dhSyntax(int k)
{ int li, re, A, B, C; char tA, tB, tC;
li = s[k].sl; re = s[k].sr;
if (s[li].v == 'h')
{ A = s[li].sl; tA = s[li].t1; B = s[re].sl; tB = s[re].t1; C = s[re].sr; tC = s[re].t2;
A = sBau(A, B, tA, tB, 'a'); umbau(k, 'l', A, 's'); s[k].v = 'h'; umbau(k, 'r', C, tC);
return; }
if (s[k].t1 == 's') dhSyntax(li);
if (s[k].t2 == 's') dhSyntax(re); }
void Baum::dhSyntax(int k)
{ int li, re, A, B; char tA, tB;
li = s[k].sl; re = s[k].sr;
if (s[k].v == 'd')
{ A = s[li].sl; tA = s[li].t1; B = s[re].sr; tB = s[re].t2;
A = sBau(A, '2', tA, 'w', '*'); umbau(k, 'l', A, 's'); s[k].v = 'i'; umbau(k, 'r', B, tB);
return; }
if (s[k].t1 == 's') dhSyntax(li);
if (s[k].t2 == 's') dhSyntax(re); }
void Baum::dhSyntax(int k)
{ int li, re, A, B, C; char tA, tB, tC;
li = s[k].sl; re = s[k].sr;
if (s[k].v == ':' && s[k].t1 == 's' && s[li].v == ',')
{ A = s[li].sl; tA = s[li].t1; B = s[li].sr; tB = s[li].t2; C = s[k].sr; tC = s[k].t2;
umbau(k, 'l', A, tA); s[k].v = 'd'; re = sBau(B, C, tB, tC, 'h'); umbau(k, 'r', re, 's'); }
if (s[k].t1 == 's') dhSyntax(li);
if (s[k].t2 == 's') dhSyntax(re); }
void Baum::zeitSyntax(int k)
{ int li, re;
li = s[k].sl; re = s[k].sr;
if (s[k].v == ',' && s[k].t1 == 'w' && s[k].t2 == 'w')
{ if (isTime(w[li].st) && isTime(w[re].st))
{ s[k].v = '_'; return; } }
if (s[k].t1 == 's') zeitSyntax(li);
if (s[k].t2 == 's') zeitSyntax(re); }
char Baum::isTime(char* date)
{ char c;
if (strlen(date) == 4)
{ c = *date++; if (c < '0' || c > '9') return 0;
c = *date++; if (c != ':') return 0;
c = *date++; if (c < '0' || c > '5') return 0;
c = *date++; if (c < '0' || c > '9') return 0;
return 1; }
if (strlen(date) == 5)
{ c = *date++; if (c < '0' || c > '2') return 0;
c = *date++; if (c < '0' || c > '9') return 0;
c = *date++; if (c != ':') return 0;
c = *date++; if (c < '0' || c > '5') return 0;
c = *date++; if (c < '0' || c > '9') return 0;
return 1; }
return 0; }
{ int i, j; char string[10]; char* bp;
baumDat = new char[0x10000];
bp = baumDat;
for (i = 1536; i <1791 ; ++i)
{ sprintf(string, "%d; ", i);
j = 0;
while (string[j]) *bp++ = string[j++]; }
*bp = 0;
stream = fopen("unicode", "wb");
if (! stream) return;
fwrite (baumDat, 1, strlen(baumDat), stream); fclose(stream);
delete [] baumDat; }
*/
back to
baumC