21 |
#include "blop.h" |
#include "blop.h" |
22 |
#include "cuyointl.h" |
#include "cuyointl.h" |
23 |
#include "fehler.h" |
#include "fehler.h" |
24 |
|
#include "ort.h" |
25 |
|
|
26 |
|
|
27 |
/** Erzeugt eine Müll-Variable. Wird verwendet, wenn es einen Fehler |
/** Erzeugt eine Müll-Variable. Wird verwendet, wenn es einen Fehler |
36 |
|
|
37 |
Variable::Variable(//__String datna, int znr, |
Variable::Variable(//__String datna, int znr, |
38 |
VarDefinition * d, |
VarDefinition * d, |
39 |
int dx, int dy /*= 0*/): |
Ort * ort): |
40 |
//mDateiName(datna), mZeilenNr(znr), |
//mDateiName(datna), mZeilenNr(znr), |
41 |
mDeklaration(d), mDX(dx), mDY(dy) { |
mDeklaration(d), mOrt(ort) { |
42 |
|
|
43 |
} |
} |
44 |
|
|
45 |
|
|
46 |
|
|
47 |
__String Variable::toString() const { |
Variable::~Variable() { |
48 |
__String ret; |
if (mOrt) delete mOrt; |
49 |
if (mDX == variable_global) { |
}; |
|
ret.sprintf("%s@", getName().data()); |
|
|
} else if (mDX == variable_lokal) { |
|
|
ret.sprintf("%s", getName().data()); |
|
|
} else { |
|
|
ret.sprintf("%s@(%d,%d)", getName().data(), mDX, mDY); |
|
|
} |
|
|
return ret; |
|
|
/* __String ret2; |
|
|
ret2.sprintf("%s (%s:%d)", ret.data(), mDateiName.data(), mZeilenNr); |
|
|
return ret2;*/ |
|
|
} |
|
|
|
|
50 |
|
|
51 |
|
|
52 |
|
|
53 |
|
__String Variable::toString() const { |
54 |
|
__String ret, ret1; |
55 |
|
|
56 |
/** Liefert die absoluten Koordinaten, so wie sie intern gebraucht |
if (mOrt) |
57 |
werden (also ggf. gespiegelt und Hex-bereinigt). (y wird von |
ret1 = mOrt->toString(); |
58 |
getDX() zwar nicht gebraucht, aber so sieht's schöner aus.) */ |
else |
59 |
int Variable::getX(int x, int /*y*/) const { |
ret1.sprintf("%s",""); |
60 |
return x + mDX; |
ret.sprintf(_("%s%s"), getName().data(), ret1.data()); |
61 |
} |
return ret; |
|
|
|
|
int Variable::getY(int x, int y) const { |
|
|
/* Hier findet das Spiegeln der relativen Variablenkoordinaten |
|
|
für den Himmel-Level statt. (User will y nach unten eingeben; |
|
|
intern ist im Himmel-Level aber y nach oben.) */ |
|
|
y += (ld->mSpiegeln ? -mDY : mDY); |
|
|
|
|
|
/* Und jetzt ggf. die Anpassung an die Hex-Koordinaten. |
|
|
Intern sind die relativen Koordinaten bei ungeradem dx so gespeichert, |
|
|
dass dy = 0 leicht schräg nach oben bedeutet. D. h. Für die graden |
|
|
Spalten stimmts, für die ungeraden muss noch verschoben werden. |
|
|
*/ |
|
|
if (ld->mSechseck) { |
|
|
if ((x & 1) && (mDX & 1)) // Oder: x & mDX & 1... |
|
|
y--; |
|
|
} |
|
62 |
|
|
63 |
return y; |
/* __String ret2; |
64 |
|
ret2.sprintf("%s (%s:%d)", ret.data(), mDateiName.data(), mZeilenNr); |
65 |
|
return ret2;*/ |
66 |
} |
} |
67 |
|
|
68 |
|
|
69 |
|
|
|
/** Liefert bei variable_fall 0 oder 1, je nachdem welcher Fall-Blop |
|
|
gemeint ist. Das wurde dem Konstruktor über dy mitgeteilt. */ |
|
|
int Variable::getWelcherFall() const { |
|
|
CASSERT(mDX==variable_fall); |
|
|
CASSERT((mDY==0) || (mDY==1)); |
|
|
return mDY; |
|
|
} |
|
70 |
|
|
71 |
|
bool Variable::Ort_hier() const { |
72 |
|
if (mOrt) |
73 |
|
return mOrt->hier(); |
74 |
|
else |
75 |
|
return true; |
76 |
|
}; |
77 |
|
|
78 |
|
|
79 |
int Variable::getNummer() const { |
int Variable::getNummer() const { |
83 |
} |
} |
84 |
|
|
85 |
|
|
86 |
int Variable::getOrt() const { |
ort_absolut Variable::getOrt(ort_absolut vonhieraus, Blop & fuer_code) const { |
87 |
if (mDX == variable_global || mDX == variable_lokal || mDX == variable_fall) |
if (mOrt) |
88 |
return mDX; |
return mOrt->berechne(vonhieraus, fuer_code); |
89 |
else |
else |
90 |
return variable_relativ; |
return vonhieraus; |
91 |
} |
} |
92 |
|
|
93 |
|
|