From 06652e579cb6ab241f01f1304aa447fbccafb8e4 Mon Sep 17 00:00:00 2001 From: Firleju Date: Wed, 29 Apr 2015 13:17:44 +0200 Subject: [PATCH 1/4] LCD Screens in python Merge with python branch --- .clang-format | 2 + AdvSound.cpp | 11 +- AdvSound.h | 2 +- AirCoupler.cpp | 9 +- AnimModel.cpp | 29 +- AnimModel.h | 19 +- Button.h | 10 +- Camera.cpp | 2 +- Camera.h | 5 +- Console.cpp | 15 +- Console/LPT.cpp | 5 +- Console/PoKeys55.cpp | 18 +- Console/PoKeys55.h | 3 +- Data.h | 3 +- Driver.cpp | 549 ++++++------ Driver.h | 52 +- DynObj.cpp | 202 ++--- DynObj.h | 79 +- EU07.bpr | 26 +- EU07.cpp | 131 ++- EU07.res | Bin 3152 -> 3180 bytes EvLaunch.cpp | 9 +- Event.cpp | 8 +- FadeSound.cpp | 14 +- FadeSound.h | 5 +- Float3d.h | 45 +- Gauge.cpp | 6 +- Gauge.h | 12 +- Geom.cpp | 16 +- Globals.cpp | 20 +- Globals.h | 14 +- Ground.cpp | 221 +++-- Ground.h | 24 +- Machajka.cpp | 24 +- MdlMngr.cpp | 9 +- MemCell.cpp | 22 +- MemCell.h | 36 +- Model3d.cpp | 72 +- Model3d.h | 109 ++- Mover.cpp | 53 +- Mover.h | 26 +- Names.h | 13 +- PyInt.cpp | 601 +++++++++++++ PyInt.h | 95 ++ RealSound.cpp | 31 +- RealSound.h | 8 +- ResourceManager.cpp | 10 +- ResourceManager.h | 15 +- Segment.cpp | 36 +- Segment.h | 66 +- Sound.cpp | 12 +- Sound.h | 6 +- Spline.cpp | 4 +- Spring.cpp | 10 +- Spring.h | 6 +- Texture.cpp | 13 +- TextureDDS.cpp | 4 +- Timer.cpp | 33 +- Track.cpp | 99 +-- Track.h | 51 +- Traction.cpp | 2 +- Traction.h | 2 +- TractionPower.cpp | 14 +- TractionPower.h | 5 +- Train.cpp | 129 ++- Train.h | 33 +- TrkFoll.cpp | 12 +- TrkFoll.h | 17 +- World.cpp | 44 +- dumb3d.cpp | 8 +- dumb3d.h | 102 ++- geometry.cpp | 25 +- parser.h | 26 +- python/include/Python-ast.h | 535 +++++++++++ python/include/Python.h | 178 ++++ python/include/abstract.h | 1396 +++++++++++++++++++++++++++++ python/include/asdl.h | 45 + python/include/ast.h | 13 + python/include/bitset.h | 32 + python/include/boolobject.h | 36 + python/include/bufferobject.h | 33 + python/include/bytearrayobject.h | 57 ++ python/include/bytes_methods.h | 75 ++ python/include/bytesobject.h | 27 + python/include/cStringIO.h | 73 ++ python/include/cellobject.h | 28 + python/include/ceval.h | 153 ++++ python/include/classobject.h | 83 ++ python/include/cobject.h | 89 ++ python/include/code.h | 107 +++ python/include/codecs.h | 167 ++++ python/include/compile.h | 40 + python/include/complexobject.h | 66 ++ python/include/datetime.h | 239 +++++ python/include/descrobject.h | 94 ++ python/include/dictobject.h | 156 ++++ python/include/dtoa.h | 15 + python/include/enumobject.h | 17 + python/include/errcode.h | 36 + python/include/eval.h | 25 + python/include/fileobject.h | 97 ++ python/include/floatobject.h | 140 +++ python/include/frameobject.h | 89 ++ python/include/funcobject.h | 76 ++ python/include/genobject.h | 40 + python/include/graminit.h | 87 ++ python/include/grammar.h | 93 ++ python/include/import.h | 71 ++ python/include/intobject.h | 80 ++ python/include/intrcheck.h | 15 + python/include/iterobject.h | 23 + python/include/listobject.h | 68 ++ python/include/longintrepr.h | 103 +++ python/include/longobject.h | 134 +++ python/include/marshal.h | 25 + python/include/memoryobject.h | 74 ++ python/include/metagrammar.h | 18 + python/include/methodobject.h | 93 ++ python/include/modsupport.h | 134 +++ python/include/moduleobject.h | 24 + python/include/node.h | 40 + python/include/object.h | 996 +++++++++++++++++++++ python/include/objimpl.h | 354 ++++++++ python/include/opcode.h | 162 ++++ python/include/osdefs.h | 55 ++ python/include/parsetok.h | 64 ++ python/include/patchlevel.h | 43 + python/include/pgen.h | 18 + python/include/pgenheaders.h | 42 + python/include/py_curses.h | 176 ++++ python/include/pyarena.h | 62 ++ python/include/pycapsule.h | 56 ++ python/include/pyconfig.h | 759 ++++++++++++++++ python/include/pyctype.h | 31 + python/include/pydebug.h | 41 + python/include/pyerrors.h | 328 +++++++ python/include/pyexpat.h | 48 + python/include/pyfpe.h | 176 ++++ python/include/pygetopt.h | 18 + python/include/pymacconfig.h | 102 +++ python/include/pymactoolbox.h | 217 +++++ python/include/pymath.h | 192 ++++ python/include/pymem.h | 122 +++ python/include/pyport.h | 904 +++++++++++++++++++ python/include/pystate.h | 197 +++++ python/include/pystrcmp.h | 23 + python/include/pystrtod.h | 45 + python/include/pythonrun.h | 181 ++++ python/include/pythread.h | 41 + python/include/rangeobject.h | 28 + python/include/setobject.h | 99 +++ python/include/sliceobject.h | 44 + python/include/stringobject.h | 210 +++++ python/include/structmember.h | 99 +++ python/include/structseq.h | 41 + python/include/symtable.h | 98 +++ python/include/sysmodule.h | 32 + python/include/timefuncs.h | 23 + python/include/token.h | 85 ++ python/include/traceback.h | 31 + python/include/tupleobject.h | 61 ++ python/include/ucnhash.h | 33 + python/include/unicodeobject.h | 1413 ++++++++++++++++++++++++++++++ python/include/warnings.h | 23 + python/include/weakrefobject.h | 75 ++ wavread.cpp | 12 +- wavread.h | 6 +- 167 files changed, 15534 insertions(+), 1120 deletions(-) create mode 100644 PyInt.cpp create mode 100644 PyInt.h create mode 100644 python/include/Python-ast.h create mode 100644 python/include/Python.h create mode 100644 python/include/abstract.h create mode 100644 python/include/asdl.h create mode 100644 python/include/ast.h create mode 100644 python/include/bitset.h create mode 100644 python/include/boolobject.h create mode 100644 python/include/bufferobject.h create mode 100644 python/include/bytearrayobject.h create mode 100644 python/include/bytes_methods.h create mode 100644 python/include/bytesobject.h create mode 100644 python/include/cStringIO.h create mode 100644 python/include/cellobject.h create mode 100644 python/include/ceval.h create mode 100644 python/include/classobject.h create mode 100644 python/include/cobject.h create mode 100644 python/include/code.h create mode 100644 python/include/codecs.h create mode 100644 python/include/compile.h create mode 100644 python/include/complexobject.h create mode 100644 python/include/datetime.h create mode 100644 python/include/descrobject.h create mode 100644 python/include/dictobject.h create mode 100644 python/include/dtoa.h create mode 100644 python/include/enumobject.h create mode 100644 python/include/errcode.h create mode 100644 python/include/eval.h create mode 100644 python/include/fileobject.h create mode 100644 python/include/floatobject.h create mode 100644 python/include/frameobject.h create mode 100644 python/include/funcobject.h create mode 100644 python/include/genobject.h create mode 100644 python/include/graminit.h create mode 100644 python/include/grammar.h create mode 100644 python/include/import.h create mode 100644 python/include/intobject.h create mode 100644 python/include/intrcheck.h create mode 100644 python/include/iterobject.h create mode 100644 python/include/listobject.h create mode 100644 python/include/longintrepr.h create mode 100644 python/include/longobject.h create mode 100644 python/include/marshal.h create mode 100644 python/include/memoryobject.h create mode 100644 python/include/metagrammar.h create mode 100644 python/include/methodobject.h create mode 100644 python/include/modsupport.h create mode 100644 python/include/moduleobject.h create mode 100644 python/include/node.h create mode 100644 python/include/object.h create mode 100644 python/include/objimpl.h create mode 100644 python/include/opcode.h create mode 100644 python/include/osdefs.h create mode 100644 python/include/parsetok.h create mode 100644 python/include/patchlevel.h create mode 100644 python/include/pgen.h create mode 100644 python/include/pgenheaders.h create mode 100644 python/include/py_curses.h create mode 100644 python/include/pyarena.h create mode 100644 python/include/pycapsule.h create mode 100644 python/include/pyconfig.h create mode 100644 python/include/pyctype.h create mode 100644 python/include/pydebug.h create mode 100644 python/include/pyerrors.h create mode 100644 python/include/pyexpat.h create mode 100644 python/include/pyfpe.h create mode 100644 python/include/pygetopt.h create mode 100644 python/include/pymacconfig.h create mode 100644 python/include/pymactoolbox.h create mode 100644 python/include/pymath.h create mode 100644 python/include/pymem.h create mode 100644 python/include/pyport.h create mode 100644 python/include/pystate.h create mode 100644 python/include/pystrcmp.h create mode 100644 python/include/pystrtod.h create mode 100644 python/include/pythonrun.h create mode 100644 python/include/pythread.h create mode 100644 python/include/rangeobject.h create mode 100644 python/include/setobject.h create mode 100644 python/include/sliceobject.h create mode 100644 python/include/stringobject.h create mode 100644 python/include/structmember.h create mode 100644 python/include/structseq.h create mode 100644 python/include/symtable.h create mode 100644 python/include/sysmodule.h create mode 100644 python/include/timefuncs.h create mode 100644 python/include/token.h create mode 100644 python/include/traceback.h create mode 100644 python/include/tupleobject.h create mode 100644 python/include/ucnhash.h create mode 100644 python/include/unicodeobject.h create mode 100644 python/include/warnings.h create mode 100644 python/include/weakrefobject.h diff --git a/.clang-format b/.clang-format index bc6a82db..88f88f48 100644 --- a/.clang-format +++ b/.clang-format @@ -4,9 +4,11 @@ IndentWidth: 4 --- Language: Cpp AlignEscapedNewlinesLeft: true +AlignTrailingComments: false BreakBeforeBraces: Allman BreakBeforeTernaryOperators: false AllowShortBlocksOnASingleLine: false AllowShortIfStatementsOnASingleLine: false +AllowShortFunctionsOnASingleLine: Empty ColumnLimit: 100 --- diff --git a/AdvSound.cpp b/AdvSound.cpp index af5c6374..6872b5e7 100644 --- a/AdvSound.cpp +++ b/AdvSound.cpp @@ -32,10 +32,12 @@ TAdvancedSound::~TAdvancedSound() // SoundShut.Stop(); } -void TAdvancedSound::Free() {} +void TAdvancedSound::Free() +{ +} -void TAdvancedSound::Init(char *NameOn, char *Name, char *NameOff, - double DistanceAttenuation, vector3 pPosition) +void TAdvancedSound::Init(char *NameOn, char *Name, char *NameOff, double DistanceAttenuation, + vector3 pPosition) { SoundStart.Init(NameOn, DistanceAttenuation, pPosition.x, pPosition.y, pPosition.z, true); SoundCommencing.Init(Name, DistanceAttenuation, pPosition.x, pPosition.y, pPosition.z, true); @@ -131,8 +133,7 @@ void TAdvancedSound::Update(bool ListenerInside, vector3 NewPosition) } } -void TAdvancedSound::UpdateAF(double A, double F, bool ListenerInside, - vector3 NewPosition) +void TAdvancedSound::UpdateAF(double A, double F, bool ListenerInside, vector3 NewPosition) { // update, ale z amplituda i czestotliwoscia if ((State == ss_Commencing) && (SoundCommencing.AM > 0)) { diff --git a/AdvSound.h b/AdvSound.h index 41d168bb..2eb97358 100644 --- a/AdvSound.h +++ b/AdvSound.h @@ -38,7 +38,7 @@ class TAdvancedSound TAdvancedSound(); ~TAdvancedSound(); void Init(char *NameOn, char *Name, char *NameOff, double DistanceAttenuation, - vector3 pPosition); + vector3 pPosition); void Load(TQueryParserComp *Parser, vector3 pPosition); void TurnOn(bool ListenerInside, vector3 NewPosition); void TurnOff(bool ListenerInside, vector3 NewPosition); diff --git a/AirCoupler.cpp b/AirCoupler.cpp index 76100d20..91a6c592 100644 --- a/AirCoupler.cpp +++ b/AirCoupler.cpp @@ -14,9 +14,14 @@ http://mozilla.org/MPL/2.0/. #include "AirCoupler.h" #include "Timer.h" -TAirCoupler::TAirCoupler() { Clear(); } +TAirCoupler::TAirCoupler() +{ + Clear(); +} -TAirCoupler::~TAirCoupler() {} +TAirCoupler::~TAirCoupler() +{ +} int TAirCoupler::GetStatus() { // zwraca 1, jeśli istnieje model prosty, 2 gdy skośny diff --git a/AnimModel.cpp b/AnimModel.cpp index c14327f5..0e744639 100644 --- a/AnimModel.cpp +++ b/AnimModel.cpp @@ -28,6 +28,7 @@ http://mozilla.org/MPL/2.0/. //--------------------------------------------------------------------------- TAnimAdvanced::TAnimAdvanced(){}; + TAnimAdvanced::~TAnimAdvanced(){ // delete[] pVocaloidMotionData; //plik został zmodyfikowany }; @@ -115,7 +116,7 @@ void TAnimContainer::SetRotateAnim(vector3 vNewRotateAngles, double fNewRotateSp */ if (evDone) { // dołączyć model do listy aniomowania, żeby animacje były przeliczane również bez - // wyświetlania + // wyświetlania if (iAnim >= 0) { // jeśli nie jest jeszcze na liście animacyjnej acAnimNext = TAnimModel::acAnimList; // pozostałe doklić sobie jako ogon @@ -138,7 +139,7 @@ void TAnimContainer::SetTranslateAnim(vector3 vNewTranslate, double fNewSpeed) */ if (evDone) { // dołączyć model do listy aniomowania, żeby animacje były przeliczane również bez - // wyświetlania + // wyświetlania if (iAnim >= 0) { // jeśli nie jest jeszcze na liście animacyjnej acAnimNext = TAnimModel::acAnimList; // pozostałe doklić sobie jako ogon @@ -179,7 +180,7 @@ void TAnimContainer::AnimSetVMD(double fNewSpeed) //-+-+ - dłoń ma w górze zamiast na pasie w pozycji początkowej //+--+ - głowa do tyłu (broda w górę) w pozycji początkowej //--++ - pozycja początkowa dobra, trąca u góry, ale z rękami jakoś nie tak, kółko w - //przeciwną stronę + // przeciwną stronę //++++ - kładzie się brzuchem do góry //-+++ - ręce w górze na początku, zamiast w dół, łokieć jakby w przeciwną stronę //+-++ - nie podnosi ręki do głowy @@ -223,7 +224,7 @@ void TAnimContainer::UpdateModel() vTranslation += s; else vTranslation = vTranslateTo; // koniec animacji, "koniec animowania" uruchomi - // się w następnej klatce + // się w następnej klatce } else { // koniec animowania @@ -233,7 +234,7 @@ void TAnimContainer::UpdateModel() iAnim &= ~2; // wyłączyć zmianę pozycji submodelu if (evDone) Global::AddToQuery(evDone, NULL); // wykonanie eventu informującego o - // zakończeniu + // zakończeniu } } if (fRotateSpeed != 0) @@ -300,7 +301,7 @@ void TAnimContainer::UpdateModel() fRotateSpeed = 0.0; if (evDone) Global::AddToQuery(evDone, NULL); // wykonanie eventu informującego o - // zakończeniu + // zakończeniu } } if (fAngleSpeed != 0.0) @@ -364,7 +365,7 @@ void TAnimContainer::UpdateModelIK() { case at_IK11: // stopa: ustawić w kierunku czubka (pierwszy potomny) d = ch->Translation1Get(); // wektor względem aktualnego układu (nie uwzględnia - // obrotu) + // obrotu) k = float3(RadToDeg(atan2(d.z, hypot(d.x, d.y))), 0.0, -RadToDeg(atan2(d.y, d.x))); // proste skierowanie na punkt pSubModel->SetRotateIK1(k); @@ -378,7 +379,7 @@ void TAnimContainer::UpdateModelIK() // potem wyliczyć ewentualne odchylenie w tej i następnej // w sumie to proste, jak wyznaczenie kątów w trójkącie o znanej długości boków... d = ch->Translation2Get(); // wektor względem aktualnego układu (nie uwzględnia - // obrotu) + // obrotu) // if () { // kość IK jest dalej niż pozycja spoczynkowa k = float3(RadToDeg(atan2(d.z, hypot(d.x, d.y))), 0.0, @@ -456,7 +457,7 @@ bool TAnimModel::Init(AnsiString asName, AnsiString asReplacableTexture) 0x31310031; // tekstura z kanałem alfa - nie renderować w cyklu nieprzezroczystych else iTexAlpha = 0x30300030; // tekstura nieprzezroczysta - nie renderować w cyklu - // przezroczystych + // przezroczystych return (Init(TModelsManager::GetModel(asName.c_str()))); } @@ -684,10 +685,12 @@ void TAnimModel::RenderAlphaVBO(vector3 *vPosition) //--------------------------------------------------------------------------- bool TAnimModel::TerrainLoaded() { // zliczanie kwadratów kilometrowych (główna linia po Next) do tworznia tablicy - return (this ? pModel != NULL : false); }; + return (this ? pModel != NULL : false); +}; int TAnimModel::TerrainCount() { // zliczanie kwadratów kilometrowych (główna linia po Next) do tworznia tablicy - return pModel ? pModel->TerrainCount() : 0; }; + return pModel ? pModel->TerrainCount() : 0; +}; TSubModel *__fastcall TAnimModel::TerrainSquare(int n) { // pobieranie wskaźników do pierwszego submodelu return pModel ? pModel->TerrainSquare(n) : 0; @@ -721,7 +724,7 @@ void TAnimModel::Advanced() if (!strcmp(pCurrent->pMovementData->cBone, (pCurrent->pMovementData + 1)->cBone)) { // jak kolejna ramka dotyczy tego samego submodelu, ustawić animację do - // kolejnej ramki + // kolejnej ramki ++pCurrent->pMovementData; // kolejna klatka pCurrent->AnimSetVMD( pAdvanced->fFrequency / @@ -773,7 +776,7 @@ void TAnimModel::AnimationVND(void *pData, double a, double b, double c, double { pSub->pMovementData = pAdvanced->pMovementData + i; // gotów do animowania pSub->AnimSetVMD(0.0); // usuawienie pozycji początkowej (powinna być zerowa, - // inaczej będzie skok) + // inaczej będzie skok) } name = AnsiString(pAdvanced->pMovementData[i].cBone); // nowa nazwa do pomijania } diff --git a/AnimModel.h b/AnimModel.h index 8f539e9f..adfe2c46 100644 --- a/AnimModel.h +++ b/AnimModel.h @@ -72,7 +72,7 @@ class TAnimContainer public: TAnimContainer *pNext; TAnimContainer *acAnimNext; // lista animacji z eventem, które muszą być przeliczane również bez - // wyświetlania + // wyświetlania TAnimContainer(); ~TAnimContainer(); bool Init(TSubModel *pNewSubModel); @@ -80,7 +80,10 @@ class TAnimContainer // std::string(pSubModel?pSubModel->asName.c_str():""); }; // std::string inline GetName() { return std::string(pSubModel?pSubModel->pName:""); // }; - char *__fastcall NameGet() { return (pSubModel ? pSubModel->pName : NULL); }; + char *__fastcall NameGet() + { + return (pSubModel ? pSubModel->pName : NULL); + }; // void SetRotateAnim(vector3 vNewRotateAxis, double fNewDesiredAngle, double // fNewRotateSpeed, bool bResetAngle=false); void SetRotateAnim(vector3 vNewRotateAngles, double fNewRotateSpeed); @@ -90,7 +93,10 @@ class TAnimContainer void UpdateModel(); void UpdateModelIK(); bool InMovement(); // czy w trakcie animacji? - double _fastcall AngleGet() { return vRotateAngles.z; }; // jednak ostatnia, T3D ma inny układ + double _fastcall AngleGet() + { + return vRotateAngles.z; + }; // jednak ostatnia, T3D ma inny układ vector3 _fastcall TransGet() { return vector3(-vTranslation.x, vTranslation.z, vTranslation.y); @@ -101,7 +107,10 @@ class TAnimContainer pSubModel->WillBeAnimated(); }; void EventAssign(TEvent *ev); - TEvent *__fastcall Event() { return evDone; }; + TEvent *__fastcall Event() + { + return evDone; + }; }; class TAnimAdvanced @@ -141,7 +150,7 @@ class TAnimModel public: GLuint ReplacableSkinId[5]; // McZapkie-020802: zmienialne skory static TAnimContainer *acAnimList; // lista animacji z eventem, które muszą być przeliczane - // również bez wyświetlania + // również bez wyświetlania TAnimModel(); ~TAnimModel(); bool Init(TModel3d *pNewModel); diff --git a/Button.h b/Button.h index cc54588d..013e0d61 100644 --- a/Button.h +++ b/Button.h @@ -25,7 +25,10 @@ class TButton TButton(); ~TButton(); void Clear(int i = -1); - inline void FeedbackBitSet(int i) { iFeedbackBit = 1 << i; }; + inline void FeedbackBitSet(int i) + { + iFeedbackBit = 1 << i; + }; inline void Turn(bool to) { bOn = to; @@ -46,7 +49,10 @@ class TButton bOn = !bOn; Update(); }; - inline bool Active() { return (pModelOn) || (pModelOff); }; + inline bool Active() + { + return (pModelOn) || (pModelOff); + }; void Init(AnsiString asName, TModel3d *pModel, bool bNewOn = false); void Load(TQueryParserComp *Parser, TModel3d *pModel1, TModel3d *pModel2 = NULL); }; diff --git a/Camera.cpp b/Camera.cpp index 596c2f82..c7e5daa1 100644 --- a/Camera.cpp +++ b/Camera.cpp @@ -157,7 +157,7 @@ vector3 TCamera::GetDirection() bool TCamera::SetMatrix() { glRotated(-Roll * 180.0f / M_PI, 0, 0, 1); // po wyłączeniu tego kręci się pojazd, a sceneria - // nie + // nie glRotated(-Pitch * 180.0f / M_PI, 1, 0, 0); glRotated(-Yaw * 180.0f / M_PI, 0, 1, 0); // w zewnętrznym widoku: kierunek patrzenia diff --git a/Camera.h b/Camera.h index c74c7ac8..cc666323 100644 --- a/Camera.h +++ b/Camera.h @@ -38,7 +38,10 @@ class TCamera vector3 CrossPos; double CrossDist; void Init(vector3 NPos, vector3 NAngle); - void Reset() { Pitch = Yaw = Roll = 0; }; + void Reset() + { + Pitch = Yaw = Roll = 0; + }; void OnCursorMove(double x, double y); void Update(); vector3 GetDirection(); diff --git a/Console.cpp b/Console.cpp index d2dc8fa2..0c9beee8 100644 --- a/Console.cpp +++ b/Console.cpp @@ -274,7 +274,10 @@ void Console::BitsUpdate(int mask) } }; -bool Console::Pressed(int x) { return Global::bActive && (GetKeyState(x) < 0); }; // na razie tak - czyta się tylko klawiatura +bool Console::Pressed(int x) +{ // na razie tak - czyta się tylko klawiatura + return Global::bActive && (GetKeyState(x) < 0); +}; void Console::ValueSet(int x, double y) { // ustawienie wartości (y) na kanale analogowym (x) @@ -353,5 +356,11 @@ void Console::OnKeyUp(int k) else iButton[char(k) >> 5] &= ~(1 << (k & 31)); // wyłącz monostabilny podstawowy }; -int Console::KeyDownConvert(int k) { return int(ktTable[k & 0x3FF].iDown); }; -int Console::KeyUpConvert(int k) { return int(ktTable[k & 0x3FF].iUp); }; +int Console::KeyDownConvert(int k) +{ + return int(ktTable[k & 0x3FF].iDown); +}; +int Console::KeyUpConvert(int k) +{ + return int(ktTable[k & 0x3FF].iUp); +}; diff --git a/Console/LPT.cpp b/Console/LPT.cpp index 95f59f8e..3cba85f8 100644 --- a/Console/LPT.cpp +++ b/Console/LPT.cpp @@ -48,4 +48,7 @@ bool TLPT::Connect(int port) return bool(OutPort); }; -void TLPT::Out(int x) { OutPort(address, x); }; // wysłanie bajtu do portu +void TLPT::Out(int x) +{ // wysłanie bajtu do portu + OutPort(address, x); +}; diff --git a/Console/PoKeys55.cpp b/Console/PoKeys55.cpp index 70c8214f..d816a7ee 100644 --- a/Console/PoKeys55.cpp +++ b/Console/PoKeys55.cpp @@ -39,7 +39,10 @@ TPoKeys55::TPoKeys55() bNoError = true; }; //--------------------------------------------------------------------------- -TPoKeys55::~TPoKeys55() { Close(); }; +TPoKeys55::~TPoKeys55() +{ + Close(); +}; //--------------------------------------------------------------------------- bool TPoKeys55::Close() { // rozłączenie komunikacji @@ -86,7 +89,7 @@ bool TPoKeys55::Connect() { ErrorStatus = GetLastError(); if (ERROR_NO_MORE_ITEMS == ErrorStatus) // Did we reach the end of the list of matching - // devices in the DeviceInfoTable? + // devices in the DeviceInfoTable? { // Cound not find the device. Must not have been attached. SetupDiDestroyDeviceInfoList( DeviceInfoTable); // Clean up the old structure we no longer need. @@ -138,7 +141,7 @@ bool TPoKeys55::Connect() // free(PropertyValueBuffer); //No longer need the PropertyValueBuffer,free the memory to // prevent potential memory leaks delete PropertyValueBuffer; // No longer need the PropertyValueBuffer,free the memory to - // prevent potential memory leaks + // prevent potential memory leaks // Convert both strings to lower case. This makes the code more robust/portable accross OS // Versions DeviceIDFromRegistry = DeviceIDFromRegistry.LowerCase(); @@ -202,12 +205,11 @@ bool TPoKeys55::Connect() return false; } //--------------------------------------------------------------------------- -bool TPoKeys55::Write(unsigned char c, unsigned char b3, unsigned char b4, - unsigned char b5) +bool TPoKeys55::Write(unsigned char c, unsigned char b3, unsigned char b4, unsigned char b5) { DWORD BytesWritten = 0; OutputBuffer[0] = 0; // The first byte is the "Report ID" and does not get transmitted over the - // USB bus. Always set=0. + // USB bus. Always set=0. OutputBuffer[1] = 0xBB; // 0xBB - bajt rozpoznawczy dla PoKeys55 OutputBuffer[2] = iLastCommand = c; // operacja: 0x31: blokowy odczyt wejść OutputBuffer[3] = b3; // np. numer pinu (o 1 mniej niż numer na płytce) @@ -233,7 +235,7 @@ bool TPoKeys55::Read() { DWORD BytesRead = 0; InputBuffer[0] = 0; // The first byte is the "Report ID" and does not get transmitted over the - // USB bus. Always set=0. + // USB bus. Always set=0. // Now get the response packet from the firmware. // The following call to ReadFIle() retrieves 64 bytes of data from the USB device. ReadFile(ReadHandle, &InputBuffer, 65, &BytesRead, @@ -361,7 +363,7 @@ bool TPoKeys55::Update(bool pause) if (!iRepeats) bNoError = true; // jest OK else if (iRepeats >= 10) // youBy 2014-07: przy 5 powtórzeniach sieje mi pauzą po 2 razy na - // sekundę, a przy 10 jest ok + // sekundę, a przy 10 jest ok { // przekroczenie liczby prób wymusza kolejną fazę ++iFaza; iRepeats = 1; // w nowej fazie nowe szanse, ale nie od 0! diff --git a/Console/PoKeys55.h b/Console/PoKeys55.h index 905e425c..9815dead 100644 --- a/Console/PoKeys55.h +++ b/Console/PoKeys55.h @@ -28,8 +28,7 @@ class TPoKeys55 ~TPoKeys55(); bool Connect(); bool Close(); - bool Write(unsigned char c, unsigned char b3, unsigned char b4 = 0, - unsigned char b5 = 0); + bool Write(unsigned char c, unsigned char b3, unsigned char b4 = 0, unsigned char b5 = 0); bool Read(); bool ReadLoop(int i); AnsiString Version(); diff --git a/Data.h b/Data.h index 969d41fa..2d002e7c 100644 --- a/Data.h +++ b/Data.h @@ -17,7 +17,8 @@ struct TDist { int x, y; }; -const TDist SectorOrder[] = { // tabela współrzędnych sektorów, posortowana wg odległości +const TDist SectorOrder[] = { + // tabela współrzędnych sektorów, posortowana wg odległości {0, 0}, // 0.00 {1, 0}, // 1.00 {0, 1}, // 1.00 diff --git a/Driver.cpp b/Driver.cpp index ee9a6275..024b6f4e 100644 --- a/Driver.cpp +++ b/Driver.cpp @@ -87,7 +87,8 @@ const double HardAcceleration = 0.9; const double PrepareTime = 2.0; //[s] przebłyski świadomości przy odpalaniu bool WriteLogFlag = false; -AnsiString StopReasonTable[] = { // przyczyny zatrzymania ruchu AI +AnsiString StopReasonTable[] = { + // przyczyny zatrzymania ruchu AI "", // stopNone, //nie ma powodu - powinien jechać "Off", // stopSleep, //nie został odpalony, to nie pojedzie "Semaphore", // stopSem, //semafor zamknięty @@ -153,7 +154,7 @@ void TSpeedPos::CommandCheck() } else if (command == cm_OutsideStation) { // w trybie manewrowym: skanować od niej wstecz i stanąć po wyjechaniu za sygnalizator i - // zmienić kierunek + // zmienić kierunek // w trybie pociągowym: można przyspieszyć do wskazanej prędkości (po zjechaniu z rozjazdów) fVelNext = -1; iFlags |= 0x2100; // W5 @@ -185,7 +186,7 @@ bool TSpeedPos::Update(vector3 *p, vector3 *dir, double &len) else { iFlags ^= 32; // 32-minięty - będziemy liczyć odległość względem przeciwnego końca - // toru (nadal może być z przodu i ogdaniczać) + // toru (nadal może być z przodu i ogdaniczać) if ((iFlags & 0x43) == 3) // tylko jeśli (istotny) tor, bo eventy są punktowe if (trTrack) // może być NULL, jeśli koniec toru (????) vPos = @@ -195,14 +196,14 @@ bool TSpeedPos::Update(vector3 *p, vector3 *dir, double &len) } } else if (fDist < 50.0) // przy dużym kącie łuku iloczyn skalarny bardziej zaniży odległość - // niż cięciwa + // niż cięciwa fDist = iska; // ale przy małych odległościach rzut na chwilową prostą ruchu da - // dokładniejsze wartości + // dokładniejsze wartości } if (fDist > 0.0) // nie może być 0.0, a przypadkiem mogło by się trafić i było by źle if ((iFlags & 32) == 0) // 32 ustawione, gdy obiekt już został minięty { // jeśli obiekt nie został minięty, można od niego zliczać narastająco (inaczej może być - // problem z wektorem kierunku) + // problem z wektorem kierunku) len = fDist = len + fDist; // zliczanie dlugości narastająco *p = vPos; // nowy punkt odniesienia *dir = Normalize(v); // nowy wektor kierunku od poprzedniego obiektu do aktualnego @@ -212,14 +213,14 @@ bool TSpeedPos::Update(vector3 *p, vector3 *dir, double &len) if (trTrack) // może być NULL, jeśli koniec toru (???) { fVelNext = trTrack->VelocityGet(); // aktualizacja prędkości (może być zmieniana - // eventem) + // eventem) int i; if ((i = iFlags & 0xF0000000) != 0) { // jeśli skrzyżowanie, ograniczyć prędkość przy skręcaniu if (abs(i) > 0x10000000) //±1 to jazda na wprost, ±2 nieby też, ale z przecięciem - //głównej drogi - chyba że jest równorzędne... + // głównej drogi - chyba że jest równorzędne... fVelNext = 30.0; // uzależnić prędkość od promienia; albo niech będzie - // ograniczona w skrzyżowaniu (velocity z ujemną wartością) + // ograniczona w skrzyżowaniu (velocity z ujemną wartością) if ((iFlags & 32) == 0) // jeśli nie wjechał if (trTrack->iNumDynamics > 0) // a skrzyżowanie zawiera pojazd fVelNext = @@ -249,7 +250,7 @@ bool TSpeedPos::Update(vector3 *p, vector3 *dir, double &len) } else if (iFlags & 0x100) // jeśli event { // odczyt komórki pamięci najlepiej by było zrobić jako notyfikację, czyli zmiana komórki - // wywoła jakąś podaną funkcję + // wywoła jakąś podaną funkcję CommandCheck(); // sprawdzenie typu komendy w evencie i określenie prędkości } return false; @@ -351,7 +352,7 @@ bool TController::TableNotFound(TEvent *e) void TController::TableTraceRoute(double fDistance, TDynamicObject *pVehicle) { // skanowanie trajektorii na odległość (fDistance) od (pVehicle) w kierunku przodu składu i - // uzupełnianie tabelki + // uzupełnianie tabelki if (!iDirection) // kierunek pojazdu z napędem { // jeśli kierunek jazdy nie jest okreslony iTableDirection = 0; // czekamy na ustawienie kierunku @@ -385,8 +386,8 @@ void TController::TableTraceRoute(double fDistance, TDynamicObject *pVehicle) if ((iLast + 1) % iSpeedTableSize == iFirst) // jeśli nadal jest zapełniona return; // nic się nie da zrobić if ((iLast + 2) % iSpeedTableSize == iFirst) // musi być jeszcze miejsce wolne na - // ewentualny event, bo tor jeszcze nie - // sprawdzony + // ewentualny event, bo tor jeszcze nie + // sprawdzony return; // już lepiej, ale jeszcze nie tym razem sSpeedTable[iLast].iFlags &= 0xBE; // kontynuować próby doskanowania } @@ -401,8 +402,8 @@ void TController::TableTraceRoute(double fDistance, TDynamicObject *pVehicle) fCurrentDistance = sSpeedTable[iLast].fDist; // aktualna odległość do jego Point1 fTrackLength = sSpeedTable[iLast].iFlags & 0x60 ? 0.0 : pTrack->Length(); // nie doliczać długości gdy: - // 32-minięty początek, - // 64-jazda do końca toru + // 32-minięty początek, + // 64-jazda do końca toru } if (fCurrentDistance < fDistance) { // jeśli w ogóle jest po co analizować @@ -414,17 +415,17 @@ void TController::TableTraceRoute(double fDistance, TDynamicObject *pVehicle) if ((pEvent = CheckTrackEvent(fLastDir, pTrack)) != NULL) // jeśli jest semafor na tym torze { // trzeba sprawdzić tabelkę, bo dodawanie drugi raz tego samego przystanku nie - // jest korzystne + // jest korzystne if (TableNotFound(pEvent)) // jeśli nie ma if (TableAddNew()) { if (sSpeedTable[iLast].Set(pEvent, fCurrentDistance)) // dodanie odczytu sygnału fDistance = fCurrentDistance; // jeśli sygnał stop, to nie ma - // potrzeby dalej skanować + // potrzeby dalej skanować } } // event dodajemy najpierw, żeby móc sprawdzić, czy tor został dodany po - // odczytaniu prędkości następnego + // odczytaniu prędkości następnego if ((pTrack->VelocityGet() == 0.0) // zatrzymanie || (pTrack->iAction) // jeśli tor ma własności istotne dla skanowania || (pTrack->VelocityGet() != fLastVel)) // następuje zmiana prędkości @@ -437,7 +438,7 @@ void TController::TableTraceRoute(double fDistance, TDynamicObject *pVehicle) 5 : 1); // dodanie odcinka do tabelki z flagą kierunku wejścia if (pTrack->eType == tt_Cross) // na skrzyżowaniach trzeba wybrać segment, - // po którym pojedzie pojazd + // po którym pojedzie pojazd { // dopiero tutaj jest ustalany kierunek segmentu na skrzyżowaniu sSpeedTable[iLast].iFlags |= (pTrack->CrossSegment((fLastDir < 0) ? tLast->iPrevDirection : @@ -453,7 +454,7 @@ void TController::TableTraceRoute(double fDistance, TDynamicObject *pVehicle) if (int(fLastDir) * sSpeedTable[iLast].iFlags < 0) fLastDir = -fLastDir; if (AIControllFlag) // dla AI na razie losujemy kierunek na kolejnym - // skrzyżowaniu + // skrzyżowaniu iRouteWanted = 1 + random(3); } } @@ -499,7 +500,7 @@ void TController::TableTraceRoute(double fDistance, TDynamicObject *pVehicle) if (pTrack->VelocityGet() < 0 ? tLast->VelocityGet() > 0 : pTrack->VelocityGet() > tLast->VelocityGet()) { // jeśli kolejny ma większą prędkość niż poprzedni, to zapamiętać poprzedni - // (do czasu wyjechania) + // (do czasu wyjechania) if ((sSpeedTable[iLast].iFlags & 3) == 3 ? (sSpeedTable[iLast].trTrack != tLast) : true) // jeśli nie był dodany do tabelki @@ -515,7 +516,7 @@ void TController::TableTraceRoute(double fDistance, TDynamicObject *pVehicle) true : ((iLast + 2) % iSpeedTableSize == iFirst)) // czy tabelka się nie zatka? { // jest ryzyko nieznalezienia ograniczenia - ograniczyć prędkość do pozwalającej - // na zatrzymanie na końcu przeskanowanej drogi + // na zatrzymanie na końcu przeskanowanej drogi TablePurger(); // usunąć pilnie zbędne pozycje if (((iLast + 3) % iSpeedTableSize == iFirst) ? true : @@ -532,7 +533,7 @@ void TController::TableTraceRoute(double fDistance, TDynamicObject *pVehicle) } } fTrackLength = pTrack->Length(); // zwiększenie skanowanej odległości tylko jeśli - // istnieje dalszy tor + // istnieje dalszy tor } else { // definitywny koniec skanowania, chyba że dalej puszczamy samochód po gruncie... @@ -541,7 +542,7 @@ void TController::TableTraceRoute(double fDistance, TDynamicObject *pVehicle) tLast, fCurrentDistance, fLastDir < 0 ? 0x45 : 0x41); // zapisanie ostatniego sprawdzonego toru return; // to ostatnia pozycja, bo NULL nic nie da, a może się podpiąć obrotnica, - // czy jakieś transportery + // czy jakieś transportery } } if (TableAddNew()) @@ -569,7 +570,7 @@ void TController::TableCheck(double fDistance) if (sSpeedTable[i].Update(&pos, &dir, len)) { iLast = i; // wykryta zmiana zwrotnicy - konieczne ponowne przeskanowanie - // dalszej części + // dalszej części break; // nie kontynuujemy pętli, trzeba doskanować ciąg dalszy } if (sSpeedTable[i].iFlags & 2) // jeśli odcinek @@ -592,10 +593,10 @@ void TController::TableCheck(double fDistance) if ((mvOccupied->CategoryFlag & 1) ? false : sSpeedTable[i].fDist < -fLength) { // pociąg staje zawsze, a samochód tylko jeśli nie przejedzie całą - // długością (może być zaskoczony zmianą) + // długością (może być zaskoczony zmianą) sSpeedTable[i].iFlags &= ~1; // degradacja pozycji dla samochodu; - // semafory usuwane tylko przy sprawdzaniu, - // bo wysyłają komendy + // semafory usuwane tylko przy sprawdzaniu, + // bo wysyłają komendy } } // if (sSpeedTable[i].fDist<-20.0*fLength) //jeśli to coś jest 20 razy dalej niż @@ -624,8 +625,7 @@ void TController::TableCheck(double fDistance) } }; -TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fNext, - double &fAcc) +TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fNext, double &fAcc) { // ustalenie parametrów, zwraca typ komendy, jeśli sygnał podaje prędkość do jazdy // fVelDes - prędkość zadana // fDist - dystans w jakim należy rozważyć ruch @@ -663,7 +663,7 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN if (sSpeedTable[i].fDist < 200.0) // przy 160km/h jedzie 44m/s, to da dokładność rzędu 5 sekund { // zaliczamy posterunek w pewnej odległości przed (choć W4 nie zasłania - // już semafora) +// już semafora) #if LOGSTOPS WriteLog(pVehicle->asName + " as " + TrainParams->TrainName + ": at " + AnsiString(GlobalTime->hh) + ":" + AnsiString(GlobalTime->mm) + @@ -671,8 +671,8 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN #endif fLastStopExpDist = mvOccupied->DistCounter + 0.250 + 0.001 * fLength; // przy jakim dystansie (stanie - // licznika) ma przesunąć na - // następny postój + // licznika) ma przesunąć na + // następny postój TrainParams->UpdateMTable( GlobalTime->hh, GlobalTime->mm, asNextStop.SubString(20, asNextStop.Length())); @@ -691,7 +691,7 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN if (!eSignNext) eSignNext = sSpeedTable[i].evEvent; if (mvOccupied->Vel > 0.3) // jeśli jedzie (nie trzeba czekać, aż się - // drgania wytłumią - drzwi zamykane od 1.0) + // drgania wytłumią - drzwi zamykane od 1.0) sSpeedTable[i].fVelNext = 0; // to będzie zatrzymanie // else if // ((iDrivigFlags&moveStopCloser)?sSpeedTable[i].fDist<=fMaxProximityDist*(AIControllFlag?1.0:10.0):true) @@ -707,15 +707,15 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN { // jeśli się zatrzymał przy W4, albo stał w momencie zobaczenia W4 if (!AIControllFlag) // AI tylko sobie otwiera drzwi iDrivigFlags &= ~moveStopCloser; // w razie przełączenia na AI ma - // nie podciągać do W4, gdy - // użytkownik zatrzymał za daleko + // nie podciągać do W4, gdy + // użytkownik zatrzymał za daleko if ((iDrivigFlags & moveDoorOpened) == 0) { // drzwi otwierać jednorazowo iDrivigFlags |= moveDoorOpened; // nie wykonywać drugi raz if (mvOccupied->DoorOpenCtrl == 1) //(mvOccupied->TrainType==dt_EZT) { // otwieranie drzwi w EZT if (AIControllFlag) // tylko AI otwiera drzwi EZT, użytkownik - // musi samodzielnie + // musi samodzielnie if (!mvOccupied->DoorLeftOpened && !mvOccupied->DoorRightOpened) { // otwieranie drzwi @@ -723,9 +723,9 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN int(floor(sSpeedTable[i].evEvent->ValueGet(2))) % 10; // p7=platform side (1:left, 2:right, 3:both) int lewe = (iDirection > 0) ? 1 : 2; // jeśli jedzie do - // tyłu, to drzwi - // otwiera - // odwrotnie + // tyłu, to drzwi + // otwiera + // odwrotnie int prawe = (iDirection > 0) ? 2 : 1; if (p2 & lewe) mvOccupied->DoorLeft(true); @@ -738,31 +738,31 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN } else { // otwieranie drzwi w składach wagonowych - docelowo wysyłać - // komendę zezwolenia na otwarcie drzwi + // komendę zezwolenia na otwarcie drzwi int p7, lewe, prawe; // p7=platform side (1:left, 2:right, 3:both) p7 = int(floor(sSpeedTable[i].evEvent->ValueGet(2))) % 10; // tu będzie jeszcze długość peronu zaokrąglona do 10m - // (20m bezpieczniej, bo nie modyfikuje bitu 1) + // (20m bezpieczniej, bo nie modyfikuje bitu 1) TDynamicObject *p = pVehicles[0]; // pojazd na czole składu while (p) { // otwieranie drzwi w pojazdach - flaga zezwolenia była by - // lepsza + // lepsza lewe = (p->DirectionGet() > 0) ? 1 : 2; // jeśli jedzie do - // tyłu, to drzwi - // otwiera odwrotnie + // tyłu, to drzwi + // otwiera odwrotnie prawe = 3 - lewe; p->MoverParameters->BatterySwitch(true); // wagony muszą - // mieć baterię - // załączoną do - // otwarcia - // drzwi... + // mieć baterię + // załączoną do + // otwarcia + // drzwi... if (p7 & lewe) p->MoverParameters->DoorLeft(true); if (p7 & prawe) p->MoverParameters->DoorRight(true); p = p->Next(); // pojazd podłączony z tyłu (patrząc od - // czoła) + // czoła) } // if (p7&3) //żeby jeszcze poczekał chwilę, zanim zamknie // WaitingSet(10); //10 sekund (wziąć z rozkładu????) @@ -770,8 +770,8 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN if (fStopTime > -5) // na końcu rozkładu się ustawia 60s i tu by było skrócenie WaitingSet(10); // 10 sekund (wziąć z rozkładu????) - czekanie - // niezależne od sposobu obsługi drzwi, bo - // opóźnia również kierownika + // niezależne od sposobu obsługi drzwi, bo + // opóźnia również kierownika } if (TrainParams->UpdateMTable( GlobalTime->hh, GlobalTime->mm, @@ -782,10 +782,10 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN else iDrivigFlags &= ~moveLate; // przyjazd o czasie if (TrainParams->DirectionChange()) // jeśli "@" w rozkładzie, to - // wykonanie dalszych komend + // wykonanie dalszych komend { // wykonanie kolejnej komendy, nie dotyczy ostatniej stacji if (iDrivigFlags & movePushPull) // SN61 ma się też nie ruszać, - // chyba że ma wagony + // chyba że ma wagony { iDrivigFlags |= moveStopHere; // EZT ma stać przy peronie if (OrderNextGet() != Change_direction) @@ -800,15 +800,15 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN else // a dla lokomotyw... iDrivigFlags &= ~(moveStopPoint | moveStopHere); // pozwolenie na - // przejechanie za W4 - // przed czasem i nie - // ma stać + // przejechanie za W4 + // przed czasem i nie + // ma stać JumpToNextOrder(); // przejście do kolejnego rozkazu (zmiana - // kierunku, odczepianie) + // kierunku, odczepianie) iDrivigFlags &= ~moveStopCloser; // ma nie podjeżdżać pod W4 po - // przeciwnej stronie + // przeciwnej stronie sSpeedTable[i].iFlags = 0; // ten W4 nie liczy się już zupełnie - // (nie wyśle SetVelocity) + // (nie wyśle SetVelocity) sSpeedTable[i].fVelNext = -1; // jechać continue; // nie analizować prędkości } @@ -829,7 +829,7 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN fLastStopExpDist = mvOccupied->DistCounter + 0.050 + 0.001 * fLength; // przy jakim dystansie (stanie licznika) - // ma przesunąć na następny postój + // ma przesunąć na następny postój // Controlled-> //zapisać odległość do przejechania TrainParams->StationIndexInc(); // przejście do następnej asNextStop = @@ -844,16 +844,16 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN #endif if (int(floor(sSpeedTable[i].evEvent->ValueGet(1))) & 1) iDrivigFlags |= moveStopHere; // nie podjeżdżać do semafora, - // jeśli droga nie jest wolna + // jeśli droga nie jest wolna iDrivigFlags |= moveStopCloser; // do następnego W4 podjechać - // blisko (z dociąganiem) + // blisko (z dociąganiem) iDrivigFlags &= ~moveStartHorn; // bez trąbienia przed odjazdem sSpeedTable[i].iFlags = 0; // nie liczy się już zupełnie (nie wyśle SetVelocity) sSpeedTable[i].fVelNext = -1; // można jechać za W4 if (go == cm_Unknown) // jeśli nie było komendy wcześniej go = cm_Ready; // gotów do odjazdu z W4 (semafor może - // zatrzymać) + // zatrzymać) if (tsGuardSignal) // jeśli mamy głos kierownika, to odegrać iDrivigFlags |= moveGuardSignal; continue; // nie analizować prędkości @@ -880,10 +880,10 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN fLastStopExpDist = -1.0f; // nie ma rozkładu, nie ma usuwania stacji WaitingSet(60); // tak ze 2 minuty, aż wszyscy wysiądą JumpToNextOrder(); // wykonanie kolejnego rozkazu (Change_direction - // albo Shunt) + // albo Shunt) iDrivigFlags |= moveStopHere | moveStartHorn; // ma się nie ruszać - // aż do momentu - // podania sygnału + // aż do momentu + // podania sygnału continue; // nie analizować prędkości } // koniec obsługi ostatniej stacji } // if (MoverParameters->Vel==0.0) @@ -907,12 +907,12 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN { // jeśli W5, to reakcja zależna od trybu jazdy if (OrderCurrentGet() & Obey_train) { // w trybie pociągowym: można przyspieszyć do wskazanej prędkości (po - // zjechaniu z rozjazdów) + // zjechaniu z rozjazdów) v = -1.0; // ignorować? if (sSpeedTable[i].fDist < 0.0) // jeśli wskaźnik został minięty { VelSignal = v; //!!! ustawienie, gdy przejechany jest lepsze niż wcale, - //ale to jeszcze nie to + // ale to jeszcze nie to // iStationStart=TrainParams->StationIndex; //zaktualizować // wyświetlanie rozkładu } @@ -921,12 +921,12 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN } else { // w trybie manewrowym: skanować od niego wstecz, stanąć po wyjechaniu za - // sygnalizator i zmienić kierunek + // sygnalizator i zmienić kierunek v = 0.0; // zmiana kierunku może być podanym sygnałem, ale wypadało by - // zmienić światło wcześniej + // zmienić światło wcześniej if (!(iDrivigFlags & moveSwitchFound)) // jeśli nie ma rozjazdu iDrivigFlags |= moveTrackEnd; // to dalsza jazda trwale ograniczona (W5, - // koniec toru) + // koniec toru) } } else if (sSpeedTable[i].iFlags & 0x800) @@ -937,8 +937,8 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN eSignSkip = sSpeedTable[i] .evEvent; // to można go pominąć (wziąć drugą prędkosć) iDrivigFlags |= moveVisibility; // jazda na widoczność - skanować - // możliwość kolizji i nie podjeżdżać - // zbyt blisko + // możliwość kolizji i nie podjeżdżać + // zbyt blisko // usunąć flagę po podjechaniu blisko semafora zezwalającego na jazdę // ostrożnie interpretować sygnały - semafor może zezwalać na jazdę // pociągu z przodu! @@ -953,22 +953,22 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN else { // zawalidrogi nie ma (albo pojazd jest samochodem), sprawdzić sygnał if (sSpeedTable[i].iFlags & 0x200) // jeśli Tm - w zasadzie to sprawdzić - // komendę! + // komendę! { // jeśli podana prędkość manewrowa if ((OrderCurrentGet() & Obey_train) ? v == 0.0 : false) { // jeśli tryb pociągowy a tarcze ma ShuntVelocity 0 0 v = -1; // ignorować, chyba że prędkość stanie się niezerowa if (sSpeedTable[i].iFlags & 0x20) // a jak przejechana sSpeedTable[i].iFlags = 0; // to można usunąć, bo podstawowy automat - // usuwa tylko niezerowe + // usuwa tylko niezerowe } else if (go <= cm_Ready) // jeśli jeszcze nie ma komendy if (v != 0.0) // komenda jest tylko gdy ma jechać, bo stoi na podstawie - // tabelki + // tabelki { // jeśli nie było komendy wcześniej - pierwsza się liczy - ustawianie - // VelSignal + // VelSignal go = cm_ShuntVelocity; // w trybie pociągowym tylko jeśli włącza - // tryb manewrowy (v!=0.0) + // tryb manewrowy (v!=0.0) // Ra 2014-06: (VelSignal) nie może być tu ustawiane, bo Tm może być // daleko // VelSignal=v; //nie do końca tak, to jest druga prędkość @@ -977,16 +977,16 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN if (sSpeedTable[i].fDist < 0.0) // jeśli przejechany { VelSignal = v; //!!! ustawienie, gdy przejechany jest lepsze niż - //wcale, ale to jeszcze nie to + // wcale, ale to jeszcze nie to sSpeedTable[i].iFlags = 0; // to można usunąć (nie mogą być usuwane w skanowaniu) } } } else // if (sSpeedTable[i].iFlags&0x100) //jeśli semafor !!! Komendę trzeba - // sprawdzić !!!! + // sprawdzić !!!! if (go <= cm_Ready) // jeśli nie było komendy wcześniej - pierwsza się liczy - // - ustawianie VelSignal + // - ustawianie VelSignal if (v < 0.0 ? true : v >= 1.0) // bo wartość 0.1 służy do hamowania tylko { go = cm_SetVelocity; // może odjechać @@ -999,17 +999,17 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN if (sSpeedTable[i].fDist < 0.0) // jeśli przejechany { VelSignal = v; //!!! ustawienie, gdy przejechany jest lepsze niż - //wcale, ale to jeszcze nie to + // wcale, ale to jeszcze nie to if (sSpeedTable[i].iFlags & 0x100) // jeśli semafor if ((sSpeedTable[i].evEvent != eSignSkip) ? true : (sSpeedTable[i].fVelNext != 0.0)) // ale inny niż ten, - // na którym minięto - // S1, chyba że się - // już zmieniło + // na którym minięto + // S1, chyba że się + // już zmieniło iDrivigFlags &= ~moveVisibility; // sygnał zezwalający na - // jazdę wyłącza jazdę na - // widoczność (S1 na SBL) + // jazdę wyłącza jazdę na + // widoczność (S1 na SBL) sSpeedTable[i].iFlags = 0; // to można usunąć (nie mogą być usuwane w skanowaniu) } @@ -1021,9 +1021,9 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN moveStopHere) // jeśli ma stać, dostaje komendę od razu go = cm_Command; // komenda z komórki, do wykonania po zatrzymaniu else if (sSpeedTable[i].fDist <= 20.0) // jeśli ma dociągnąć, to niech - // dociąga (moveStopCloser - // dotyczy dociągania do W4, nie - // semafora) + // dociąga (moveStopCloser + // dotyczy dociągania do W4, nie + // semafora) go = cm_Command; // komenda z komórki, do wykonania po zatrzymaniu } } // jeśli nie ma zawalidrogi @@ -1039,8 +1039,8 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN ((sSpeedTable[i].iFlags & 0x501) == 0x501) && (d > fMaxProximityDist) : false) a = (iDrivigFlags & moveStopCloser) ? fAcc : 0.0; // ma podjechać bliżej - - // czy na pewno w tym - // miejscu taki warunek? + // czy na pewno w tym + // miejscu taki warunek? else { a = (v * v - mvOccupied->Vel * mvOccupied->Vel) / @@ -1063,11 +1063,11 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN continue; // i tyle wystarczy } else // event trzyma tylko jeśli VelNext=0, nawet po przejechaniu (nie powinno - // dotyczyć samochodów?) + // dotyczyć samochodów?) a = (v == 0.0 ? -1.0 : fAcc); // ruszanie albo hamowanie if (a < fAcc) { // mniejsze przyspieszenie to mniejsza możliwość rozpędzenia się albo konieczność - // hamowania + // hamowania // jeśli droga wolna, to może być a>1.0 i się tu nie załapuje // if (mvOccupied->Vel>10.0) fAcc = a; // zalecane przyspieszenie (nie musi być uwzględniane przez AI) @@ -1078,7 +1078,7 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN { // jeśli nie ma wskazań do hamowania, można podać drogę i prędkość na jej końcu fNext = v; // istotna jest prędkość na końcu tego odcinka fDist = d; // dlugość odcinka (kolejne pozycje mogą wydłużać drogę, jeśli - // prędkość jest stała) + // prędkość jest stała) } } // if (v>=0.0) if (fNext >= 0.0) @@ -1106,7 +1106,7 @@ void TController::TablePurger() (sSpeedTable[i].fVelNext < 0) && ((sSpeedTable[i].iFlags & 0xAB) == 0xA3) : true) { // jeśli jest to minięty (0x20) tor (0x03) do liczenia cięciw (0x80), a nie zwrotnica - // (0x08) + // (0x08) for (; k > 0; --k, i = (i + 1) % iSpeedTableSize) sSpeedTable[i] = sSpeedTable[(i + 1) % iSpeedTableSize]; // skopiowanie // WriteLog("Odtykacz usuwa pozycję"); @@ -1136,8 +1136,8 @@ void TController::TablePurger() //--------------------------------------------------------------------------- TController::TController(bool AI, TDynamicObject *NewControll, bool InitPsyche, - bool primary // czy ma aktywnie prowadzić? - ) + bool primary // czy ma aktywnie prowadzić? + ) { iEngineActive = 0; LastUpdatedTime = 0.0; @@ -1270,18 +1270,18 @@ TController::TController(bool AI, TDynamicObject *NewControll, bool InitPsyche, fLastStopExpDist = -1.0f; iRouteWanted = 3; // powiedzmy, że ma jechać prosto (1=w lewo) iCoupler = 0; // sprzęg; niezerowy gdy ma być podłączanie; samo podłączanie w trybie Connect - // (wcześniej może być np. Prepare_engine) + // (wcześniej może być np. Prepare_engine) fOverhead1 = 3000.0; // informacja o napięciu w sieci trakcyjnej (0=brak drutu, zatrzymaj!) fOverhead2 = -1.0; // informacja o sposobie jazdy (-1=normalnie, 0=bez prądu, >0=z opuszczonym i - // ograniczeniem prędkości) + // ograniczeniem prędkości) iOverheadZero = 0; // suma bitowa jezdy bezprądowej, bity ustawiane przez pojazdy z - // podniesionymi pantografami + // podniesionymi pantografami iOverheadDown = 0; // suma bitowa opuszczenia pantografów, bity ustawiane przez pojazdy z - // podniesionymi pantografami + // podniesionymi pantografami fAccDesiredAv = 0.0; // uśrednione przyspieszenie z kolejnych przebłysków świadomości, żeby - // ograniczyć migotanie + // ograniczyć migotanie fVoltage = 0.0; // uśrednione napięcie sieci: przy spadku poniżej wartości minimalnej opóźnić - // rozruch o losowy czas + // rozruch o losowy czas }; void TController::CloseLog() @@ -1359,12 +1359,12 @@ void TController::OrdersClear() void TController::Activation() { // umieszczenie obsady w odpowiednim członie, wykonywane wyłącznie gdy steruje AI iDirection = iDirectionOrder; // kierunek (względem sprzęgów pojazdu z AI) właśnie został - // ustalony (zmieniony) + // ustalony (zmieniony) if (iDirection) { // jeśli jest ustalony kierunek TDynamicObject *old = pVehicle, *d = pVehicle; // w tym siedzi AI TController *drugi; // jakby były dwa, to zamienić miejscami, a nie robić wycieku pamięci - // poprzez nadpisanie + // poprzez nadpisanie int brake = mvOccupied->LocalBrakePos; while (mvControlling->MainCtrlPos) // samo zapętlenie DecSpeed() nie wystarcza :/ DecSpeed(true); // wymuszenie zerowania nastawnika jazdy @@ -1394,13 +1394,13 @@ void TController::Activation() if (d) { drugi = d->Mechanik; // zapamiętanie tego, co ewentualnie tam siedzi, żeby w razie - // dwóch zamienić miejscami + // dwóch zamienić miejscami d->Mechanik = this; // na razie bilokacja d->MoverParameters->SetInternalCommand( "", 0, 0); // usunięcie ewentualnie zalegającej komendy (Change_direction?) if (d->DirectionGet() != pVehicle->DirectionGet()) // jeśli są przeciwne do siebie iDirection = -iDirection; // to będziemy jechać w drugą stronę względem - // zasiedzianego pojazdu + // zasiedzianego pojazdu pVehicle->Mechanik = drugi; // wsadzamy tego, co ewentualnie był (podwójna trakcja) pVehicle->MoverParameters->CabNo = 0; // wyłączanie kabin po drodze pVehicle->MoverParameters->ActiveCab = 0; // i zaznaczenie, że nie ma tam nikogo @@ -1413,7 +1413,7 @@ void TController::Activation() { // jeśli zmieniony został pojazd prowadzony Global::pWorld->CabChange(old, pVehicle); // ewentualna zmiana kabiny użytkownikowi ControllingSet(); // utworzenie połączenia do sterowanego pojazdu (może się zmienić) - - // silnikowy dla EZT + // silnikowy dla EZT } if (mvControlling->EngineType == DieselEngine) // dla 2Ls150 - przed ustawieniem kierunku - można zmienić tryb pracy @@ -1491,12 +1491,12 @@ void TController::AutoRewident() bdelay_P); break; case bdelay_G: // towarowy G - wszystko na G, jeśli nie ma to P (powinno się wyłączyć - // hamulec) + // hamulec) d->MoverParameters->BrakeDelaySwitch( TestFlag(d->MoverParameters->BrakeDelays, bdelay_G) ? bdelay_G : bdelay_P); break; case bdelay_R: // towarowy GP - lokomotywa oraz 5 pierwszych pojazdów przy niej na G, reszta - // na P + // na P if (d->MoverParameters->Power > 1) { d->MoverParameters->BrakeDelaySwitch(bdelay_G); @@ -1581,12 +1581,12 @@ bool TController::CheckVehicles(TOrders user) p->RaLightsSet(0, 0); // gasimy światła if (p->MoverParameters->EnginePowerSource.SourceType == CurrentCollector) { // jeśli pojazd posiada pantograf, to przydzielamy mu maskę, którą będzie informował o - // jeździe bezprądowej + // jeździe bezprądowej p->iOverheadMask = pantmask; pantmask << 1; // przesunięcie bitów, max. 32 pojazdy z pantografami w składzie } d = p->DirectionSet(d ? 1 : -1); // zwraca położenie następnego (1=zgodny,0=odwrócony - - // względem czoła składu) + // względem czoła składu) p->fScanDist = 300.0; // odległość skanowania w poszukiwaniu innych pojazdów p->ctOwner = this; // dominator oznacza swoje terytorium p = p->Next(); // pojazd podłączony od tyłu (licząc od czoła) @@ -1612,24 +1612,24 @@ bool TController::CheckVehicles(TOrders user) else if (OrderCurrentGet() == Disconnect) if (mvOccupied->ActiveDir > 0) // jak ma kierunek do przodu Lights(16, 0); //światła manewrowe (Tb1) tylko z przodu, aby nie pozostawić - //odczepionego ze światłem + // odczepionego ze światłem else // jak dociska Lights(0, 16); //światła manewrowe (Tb1) tylko z przodu, aby nie pozostawić - //odczepionego ze światłem + // odczepionego ze światłem } else // Ra 2014-02: lepiej tu niż w pętli obsługującej komendy, bo tam się zmieni informacja - // o składzie + // o składzie switch (user) // gdy człowiek i gdy nastąpiło połącznie albo rozłączenie { case Change_direction: while (OrderCurrentGet() & (Change_direction)) JumpToNextOrder(); // zmianę kierunku też można olać, ale zmienić kierunek - // skanowania! + // skanowania! break; case Connect: while (OrderCurrentGet() & (Change_direction)) JumpToNextOrder(); // zmianę kierunku też można olać, ale zmienić kierunek - // skanowania! + // skanowania! if (OrderCurrentGet() & (Connect)) { // jeśli miało być łączenie, zakładamy, że jest dobrze (sprawdzić?) iCoupler = 0; // koniec z doczepianiem @@ -1637,20 +1637,20 @@ bool TController::CheckVehicles(TOrders user) JumpToNextOrder(); // wykonanie następnej komendy if (OrderCurrentGet() & (Change_direction)) JumpToNextOrder(); // zmianę kierunku też można olać, ale zmienić kierunek - // skanowania! + // skanowania! } break; case Disconnect: while (OrderCurrentGet() & (Change_direction)) JumpToNextOrder(); // zmianę kierunku też można olać, ale zmienić kierunek - // skanowania! + // skanowania! if (OrderCurrentGet() & (Disconnect)) { // wypadało by sprawdzić, czy odczepiono wagony w odpowiednim miejscu - // (iVehicleCount) + // (iVehicleCount) JumpToNextOrder(); // wykonanie następnej komendy if (OrderCurrentGet() & (Change_direction)) JumpToNextOrder(); // zmianę kierunku też można olać, ale zmienić kierunek - // skanowania! + // skanowania! } } // Ra 2014-09: tymczasowo prymitywne ustawienie warunku pod kątem SN61 @@ -1685,7 +1685,7 @@ int TController::OrderDirectionChange(int newdir, TMoverParameters *Vehicle) int testd = newdir; if (Vehicle->Vel < 0.5) { // jeśli prawie stoi, można zmienić kierunek, musi być wykonane dwukrotnie, bo za pierwszym - // razem daje na zero + // razem daje na zero switch (newdir * Vehicle->CabNo) { // DirectionBackward() i DirectionForward() to zmiany względem kabiny case -1: // if (!Vehicle->DirectionBackward()) testd=0; break; @@ -1719,7 +1719,7 @@ void TController::WaitingSet(double Seconds) void TController::SetVelocity(double NewVel, double NewVelNext, TStopReason r) { // ustawienie nowej prędkości WaitingTime = -WaitingExpireTime; // przypisujemy -WaitingExpireTime, a potem porównujemy z - // zerem + // zerem MaxVelFlag = False; // Ra: to nie jest używane MinVelFlag = False; // Ra: to nie jest używane /* nie używane @@ -1745,11 +1745,11 @@ void TController::SetVelocity(double NewVel, double NewVelNext, TStopReason r) 1.0)) // jesli stoi (na razie, bo chyba powinien też, gdy hamuje przed semaforem) if (iDrivigFlags & moveStartHorn) // jezeli trąbienie włączone if (!(iDrivigFlags & (moveStartHornDone | moveConnect))) // jeśli nie zatrąbione - // i nie jest to moment - // podłączania składu + // i nie jest to moment + // podłączania składu if (mvOccupied->CategoryFlag & 1) // tylko pociągi trąbią (unimogi tylko na - // torach, więc trzeba raczej sprawdzać - // tor) + // torach, więc trzeba raczej sprawdzać + // tor) if ((NewVel >= 1.0) || (NewVel < 0.0)) // o ile prędkość jest znacząca { // fWarningDuration=0.3; //czas trąbienia // if (AIControllFlag) //jak siedzi krasnoludek, to włączy trąbienie @@ -1982,7 +1982,7 @@ bool TController::PrepareEngine() OK = mvControlling->MainSwitch(true); if (mvControlling->EngineType == DieselEngine) { // Ra 2014-06: dla SN61 trzeba wrzucić pierwszą pozycję - nie wiem, czy tutaj... - // kiedyś działało... + // kiedyś działało... if (!mvControlling->MainCtrlPos) { if (mvControlling->RList[0].R == @@ -2221,14 +2221,14 @@ bool TController::IncSpeed() if (fabs(mvControlling->Im) < (fReady < 0.4 ? mvControlling->Imin : mvControlling->IminLo)) { // Ra: wywalał nadmiarowy, bo Im może być ujemne; jak nie odhamowany, to nie - // przesadzać z prądem + // przesadzać z prądem if ((mvOccupied->Vel <= 30) || (mvControlling->Imax > mvControlling->ImaxLo) || (fVoltage + fVoltage < mvControlling->EnginePowerSource.CollectorParameters.MinV + mvControlling->EnginePowerSource.CollectorParameters.MaxV)) { // bocznik na szeregowej przy ciezkich bruttach albo przy wysokim rozruchu - // pod górę albo przy niskim napięciu + // pod górę albo przy niskim napięciu if (mvControlling->MainCtrlPos ? mvControlling->RList[mvControlling->MainCtrlPos].R > 0.0 : true) // oporowa @@ -2252,13 +2252,13 @@ bool TController::IncSpeed() if (mvControlling->MainCtrlPos < mvControlling->MainCtrlPosNo - 1) // a nie jest ostatnia pozycja mvControlling->DecScndCtrl(2); // to bocznik na zero po chamsku - // (ktoś miał to poprawić...) + // (ktoś miał to poprawić...) OK = mvControlling->IncMainCtrl(1); } if ((mvControlling->MainCtrlPos > 2) && (mvControlling->Im == 0)) // brak prądu na dalszych pozycjach Need_TryAgain = true; // nie załączona lokomotywa albo wywalił - // nadmiarowy + // nadmiarowy else if (!OK) // nie da się wrzucić kolejnej pozycji OK = mvControlling->IncScndCtrl(1); // to dać bocznik } @@ -2285,7 +2285,7 @@ bool TController::IncSpeed() case DieselEngine: if (mvControlling->ShuntModeAllow) { // dla 2Ls150 można zmienić tryb pracy, jeśli jest w liniowym i nie daje rady (wymaga - // zerowania kierunku) + // zerowania kierunku) // mvControlling->ShuntMode=(OrderList[OrderPos]&Shunt)||(fMass>224000.0); } if ((mvControlling->Vel > mvControlling->dizel_minVelfullengage) && @@ -2384,13 +2384,13 @@ void TController::SpeedSet() else switch (mvControlling->MainCtrlPos) { // ruch nastawnika uzależniony jest od aktualnie ustawionej - // pozycji + // pozycji case 0: if (mvControlling->MainCtrlActualPos) // jeśli kułakowy nie jest - // wyzerowany + // wyzerowany break; // to czekać na wyzerowanie mvControlling->IncMainCtrl(1); // przetok; bez "break", bo nie - // ma czekania na 1. pozycji + // ma czekania na 1. pozycji case 1: if (VelDesired >= 20) mvControlling->IncMainCtrl(1); // szeregowa @@ -2442,10 +2442,10 @@ void TController::SpeedSet() if (mvControlling->Imax * mvControlling->Voltage / (fMass * fAccGravity) < -2.8) // a na niskim się za szybko nie pojedzie { // włączenie wysokiego rozruchu; - // (I*U)[A*V=W=kg*m*m/sss]/(m[kg]*a[m/ss])=v[m/s]; 2.8m/ss=10km/h + // (I*U)[A*V=W=kg*m*m/sss]/(m[kg]*a[m/ss])=v[m/s]; 2.8m/ss=10km/h if (mvControlling->RList[mvControlling->MainCtrlPos].Bn > 1) { // jeśli jedzie na równoległym, to zbijamy do szeregowego, aby włączyć - // wysoki rozruch + // wysoki rozruch if (mvControlling->ScndCtrlPos > 0) // jeżeli jest bocznik mvControlling->DecScndCtrl( 2); // wyłączyć bocznik, bo może blokować skręcenie NJ @@ -2567,9 +2567,9 @@ void TController::RecognizeCommand() } void TController::PutCommand(AnsiString NewCommand, double NewValue1, double NewValue2, - const TLocation &NewLocation, TStopReason reason) + const TLocation &NewLocation, TStopReason reason) { // wysłanie komendy przez event PutValues, jak pojazd ma obsadę, to wysyła tutaj, a nie do pojazdu - // bezpośrednio + // bezpośrednio vector3 sl; sl.x = -NewLocation.X; // zamiana na współrzędne scenerii sl.z = NewLocation.Y; @@ -2579,7 +2579,7 @@ void TController::PutCommand(AnsiString NewCommand, double NewValue1, double New } bool TController::PutCommand(AnsiString NewCommand, double NewValue1, double NewValue2, - const vector3 *NewLocation, TStopReason reason) + const vector3 *NewLocation, TStopReason reason) { // analiza komendy if (NewCommand == "CabSignal") { // SHP wyzwalane jest przez człon z obsadą, ale obsługiwane przez silnikowy @@ -2594,7 +2594,7 @@ bool TController::PutCommand(AnsiString NewCommand, double NewValue1, double New fOverhead1 = NewValue1; // informacja o napięciu w sieci trakcyjnej (0=brak drutu, zatrzymaj!) fOverhead2 = NewValue2; // informacja o sposobie jazdy (-1=normalnie, 0=bez prądu, >0=z - // opuszczonym i ograniczeniem prędkości) + // opuszczonym i ograniczeniem prędkości) return true; // załatwione } else if (NewCommand == "Emergency_brake") // wymuszenie zatrzymania, niezależnie kto prowadzi @@ -2668,7 +2668,7 @@ bool TController::PutCommand(AnsiString NewCommand, double NewValue1, double New } } if (NewLocation) // jeśli podane współrzędne eventu/komórki ustawiającej rozkład (trainset - // nie podaje) + // nie podaje) { vector3 v = *NewLocation - pVehicle->GetPosition(); // wektor do punktu sterującego vector3 d = pVehicle->VectorFront(); // wektor wskazujący przód @@ -2686,7 +2686,7 @@ bool TController::PutCommand(AnsiString NewCommand, double NewValue1, double New */ if (AIControllFlag) // jeśli prowadzi komputer Activation(); // umieszczenie obsługi we właściwym członie, ustawienie nawrotnika w - // przód + // przód } /* else @@ -2706,7 +2706,7 @@ bool TController::PutCommand(AnsiString NewCommand, double NewValue1, double New // DirectionForward(false); //jedziemy do tyłu (nawrotnik do tyłu) // CheckVehicles(); //sprawdzenie składu, AI zapali światła TableClear(); // wyczyszczenie tabelki prędkości, bo na nowo trzeba określić kierunek i - // sprawdzić przystanki + // sprawdzić przystanki OrdersInit( fabs(NewValue1)); // ustalenie tabelki komend wg rozkładu oraz prędkości początkowej // if (NewValue1!=0.0) if (!AIControllFlag) DirectionForward(NewValue1>0.0); //ustawienie @@ -2723,10 +2723,10 @@ bool TController::PutCommand(AnsiString NewCommand, double NewValue1, double New { // o ile jazda if (!iEngineActive) OrderNext(Prepare_engine); // trzeba odpalić silnik najpierw, światła ustawi - // JumpToNextOrder() + // JumpToNextOrder() // if (OrderList[OrderPos]!=Obey_train) //jeśli nie pociągowa OrderNext(Obey_train); // to uruchomić jazdę pociągową (od razu albo po odpaleniu - // silnika + // silnika OrderCheck(); // jeśli jazda pociągowa teraz, to wykonać niezbędne operacje } if (NewValue1 != 0.0) // jeśli jechać @@ -2734,7 +2734,7 @@ bool TController::PutCommand(AnsiString NewCommand, double NewValue1, double New else iDrivigFlags |= moveStopHere; // stać do momentu podania komendy jazdy SetVelocity(NewValue1, NewValue2, reason); // bylo: nic nie rob bo SetVelocity zewnetrznie - // jest wywolywane przez dynobj.cpp + // jest wywolywane przez dynobj.cpp } else if (NewCommand == "SetProximityVelocity") { @@ -2793,7 +2793,7 @@ bool TController::PutCommand(AnsiString NewCommand, double NewValue1, double New if (NewValue1 == 0.0) iDirectionOrder = -iDirection; // zmiana na przeciwny niż obecny else if (NewLocation) // jeśli podane współrzędne eventu/komórki ustawiającej rozkład - // (trainset nie podaje) + // (trainset nie podaje) { vector3 v = *NewLocation - pVehicle->GetPosition(); // wektor do punktu sterującego vector3 d = pVehicle->VectorFront(); // wektor wskazujący przód @@ -2823,7 +2823,7 @@ bool TController::PutCommand(AnsiString NewCommand, double NewValue1, double New else if (NewCommand == "Shunt") { // NewValue1 - ilość wagonów (-1=wszystkie); NewValue2: 0=odczep, 1..63=dołącz, -1=bez zmian //-3,-y - podłączyć do całego stojącego składu (sprzęgiem y>=1), zmienić kierunek i czekać w - //trybie pociągowym + // trybie pociągowym //-2,-y - podłączyć do całego stojącego składu (sprzęgiem y>=1), zmienić kierunek i czekać //-2, y - podłączyć do całego stojącego składu (sprzęgiem y>=1) i czekać //-1,-y - podłączyć do całego stojącego składu (sprzęgiem y>=1) i jechać w powrotną stronę @@ -2847,7 +2847,7 @@ bool TController::PutCommand(AnsiString NewCommand, double NewValue1, double New OrderPush(Disconnect); // a odczep już po zmianie kierunku } else if (NewValue2 < 0.0) // jeśli wszystkie, a sprzęg ujemny, to tylko zmiana kierunku - // po podczepieniu + // po podczepieniu { // np. Shunt -1 -3 iDirectionOrder = -iDirection; // jak się podczepi, to jazda w przeciwną stronę OrderNext(Change_direction); @@ -2880,7 +2880,7 @@ bool TController::PutCommand(AnsiString NewCommand, double NewValue1, double New } if (NewValue1 < -1.5) // jeśli -2/-3, czyli czekanie z ruszeniem na sygnał iDrivigFlags |= moveStopHere; // nie podjeżdżać do semafora, jeśli droga nie jest wolna - // (nie dotyczy Connect) + // (nie dotyczy Connect) if (NewValue1 < -2.5) // jeśli OrderNext(Obey_train); // to potem jazda pociągowa else @@ -3065,17 +3065,17 @@ bool TController::UpdateSituation(double dt) if (mvControlling->EnginePowerSource.SourceType == CurrentCollector) { if (mvOccupied->ScndPipePress > 4.3) // gdy główna sprężarka bezpiecznie nabije - // ciśnienie + // ciśnienie mvControlling->bPantKurek3 = true; // to można przestawić kurek na zasilanie pantografów z głównej pneumatyki fVoltage = 0.5 * (fVoltage + fabs(mvControlling->RunningTraction.TractionVoltage)); // uśrednione napięcie - // sieci: przy spadku - // poniżej wartości - // minimalnej opóźnić - // rozruch o losowy - // czas + // sieci: przy spadku + // poniżej wartości + // minimalnej opóźnić + // rozruch o losowy + // czas if (fVoltage < mvControlling->EnginePowerSource.CollectorParameters .MinV) // gdy rozłączenie WS z powodu niskiego napięcia if (fActionTime >= 0) // jeśli czas oczekiwania nie został ustawiony @@ -3086,14 +3086,14 @@ bool TController::UpdateSituation(double dt) { // jeżeli jedzie if (iDrivigFlags & moveDoorOpened) // jeśli drzwi otwarte if (mvOccupied->Vel > 1.0) // nie zamykać drzwi przy drganiach, bo zatrzymanie na W4 - // akceptuje niewielkie prędkości + // akceptuje niewielkie prędkości Doors(false); // przy prowadzeniu samochodu trzeba każdą oś odsuwać oddzielnie, inaczej kicha wychodzi if (mvOccupied->CategoryFlag & 2) // jeśli samochód // if (fabs(mvOccupied->OffsetTrackH)Dim.W) //Ra: szerokość drogi tu // powinna być? if (!mvOccupied->ChangeOffsetH(-0.01 * mvOccupied->Vel * dt)) // ruch w poprzek - // drogi + // drogi mvOccupied->ChangeOffsetH(0.01 * mvOccupied->Vel * dt); // Ra: co to miało być, to nie wiem if (mvControlling->EnginePowerSource.SourceType == CurrentCollector) @@ -3200,7 +3200,7 @@ bool TController::UpdateSituation(double dt) double scanmax = (mvOccupied->Vel > 5.0) ? 400 + fBrakeDist : 50.0 * fDriverDist; // 1000m dla stojących pociągów; Ra 2015-01: przy - // dłuższej drodze skanowania AI jeździ spokojniej + // dłuższej drodze skanowania AI jeździ spokojniej // 2. Sprawdzić, czy tabelka pokrywa założony odcinek (nie musi, jeśli jest STOP). // 3. Sprawdzić, czy trajektoria ruchu przechodzi przez zwrotnice - jeśli tak, to sprawdzić, // czy stan się nie zmienił. @@ -3216,7 +3216,7 @@ bool TController::UpdateSituation(double dt) { // tu bedzie logika sterowania if (mvOccupied->CommandIn.Command != "") if (!mvOccupied->RunInternalCommand()) // rozpoznaj komende bo lokomotywa jej nie - // rozpoznaje + // rozpoznaje RecognizeCommand(); // samo czyta komendę wstawioną do pojazdu? if (mvOccupied->SecuritySystem.Status > 1) // jak zadziałało CA/SHP if (!mvOccupied->SecuritySystemReset()) // to skasuj @@ -3236,7 +3236,7 @@ bool TController::UpdateSituation(double dt) fMinProximityDist = -0.01; fMaxProximityDist = 0.0; //[m] dojechać maksymalnie fVelPlus = 0.5; // dopuszczalne przekroczenie prędkości na ograniczeniu bez - // hamowania + // hamowania fVelMinus = 0.5; // margines prędkości powodujący załączenie napędu if (AIControllFlag) { // to robi tylko AI, wersję dla człowieka trzeba dopiero zrobić @@ -3245,9 +3245,9 @@ bool TController::UpdateSituation(double dt) if (pVehicles[0]->DirectionGet() > 0) // jeśli sprzęg 0 { // sprzęg 0 - próba podczepienia if (pVehicles[0]->MoverParameters->Couplers[0].Connected) // jeśli jest coś - // wykryte (a - // chyba jest, - // nie?) + // wykryte (a + // chyba jest, + // nie?) if (pVehicles[0]->MoverParameters->Attach( 0, 2, pVehicles[0]->MoverParameters->Couplers[0].Connected, iCoupler)) @@ -3263,9 +3263,9 @@ bool TController::UpdateSituation(double dt) else // if (pVehicles[0]->MoverParameters->DirAbsolute<0) //jeśli sprzęg 1 { // sprzęg 1 - próba podczepienia if (pVehicles[0]->MoverParameters->Couplers[1].Connected) // jeśli jest coś - // wykryte (a - // chyba jest, - // nie?) + // wykryte (a + // chyba jest, + // nie?) if (pVehicles[0]->MoverParameters->Attach( 1, 2, pVehicles[0]->MoverParameters->Couplers[1].Connected, iCoupler)) @@ -3314,7 +3314,7 @@ bool TController::UpdateSituation(double dt) fMinProximityDist = 0.0; fMaxProximityDist = 5.0; //[m] w takim przedziale odległości powinien stanąć fVelPlus = 2.0; // dopuszczalne przekroczenie prędkości na ograniczeniu bez - // hamowania + // hamowania fVelMinus = 1.0; // margines prędkości powodujący załączenie napędu // VelReduced=5; //[km/h] // if (mvOccupied->Vel<0.5) //jeśli już prawie stanął @@ -3364,7 +3364,7 @@ bool TController::UpdateSituation(double dt) if (n) { // jeśli jeszcze nie koniec p = p->Prev(); // kolejny w stronę czoła składu (licząc od - // tyłu), bo dociskamy + // tyłu), bo dociskamy if (!p) iVehicleCount = -2, n = 0; // nie ma co dalej sprawdzać, doczepianie zakończone @@ -3373,7 +3373,7 @@ bool TController::UpdateSituation(double dt) if (p ? p->MoverParameters->Couplers[d].CouplingFlag == 0 : true) iVehicleCount = -2; // odczepiono, co było do odczepienia else if (!p->Dettach(d)) // zwraca maskę bitową połączenia; usuwa - // własność pojazdów + // własność pojazdów { // tylko jeśli odepnie // WriteLog("Odczepiony od strony "); iVehicleCount = -2; @@ -3401,16 +3401,16 @@ bool TController::UpdateSituation(double dt) .PipePressureVal; // tu może być 0 albo -1 nawet if (p < 3.9) p = 3.9; // TODO: zabezpieczenie przed dziwnymi CHK do czasu wyjaśnienia - // sensu 0 oraz -1 w tym miejscu + // sensu 0 oraz -1 w tym miejscu if (mvOccupied->BrakeSystem == ElectroPneumatic ? mvOccupied->BrakePress > 2 : mvOccupied->PipePress < p + 0.1) { // jeśli w miarę został zahamowany (ciśnienie mniejsze niż podane na - // pozycji 3, zwyle 0.37) + // pozycji 3, zwyle 0.37) if (mvOccupied->BrakeSystem == ElectroPneumatic) mvOccupied->BrakeLevelSet(0); // wyłączenie EP, gdy wystarczy (może - // nie być potrzebne, bo na początku - // jest) + // nie być potrzebne, bo na początku + // jest) // WriteLog("Luzowanie lokomotywy i zmiana kierunku"); mvOccupied->BrakeReleaser(1); // wyluzuj lokomotywę; a ST45? mvOccupied->DecLocalBrakeLevel(10); // zwolnienie hamulca @@ -3418,7 +3418,7 @@ bool TController::UpdateSituation(double dt) DirectionForward(mvOccupied->ActiveDir < 0); // zmiana kierunku jazdy na przeciwny (dociskanie) CheckVehicles(); // od razu zmienić światła (zgasić) - bez tego się nie - // odczepi + // odczepi fStopTime = 0.0; // nie ma na co czekać z odczepianiem } } @@ -3508,7 +3508,7 @@ bool TController::UpdateSituation(double dt) // OrderList[OrderPos]:=Shunt; //Ra: to nie może tak być, bo scenerie robią // Jump_to_first_order i przechodzi w manewrowy JumpToNextOrder(); // w następnym jest Shunt albo Obey_train, moze też być - // Change_direction, Connect albo Disconnect + // Change_direction, Connect albo Disconnect // if OrderList[OrderPos]<>Wait_for_Orders) // if BrakeSystem=Pneumatic) //napelnianie uderzeniowe na wstepie // if BrakeSubsystem=Oerlikon) @@ -3596,7 +3596,7 @@ bool TController::UpdateSituation(double dt) (iDrivigFlags & moveStopHere) : false) WaitingTime = -WaitingExpireTime; // zakaz ruszania z miejsca bez otrzymania - // wolnej drogi + // wolnej drogi else if (mvOccupied->CategoryFlag & 1) { // jeśli pociąg if (AIControllFlag) @@ -3627,9 +3627,9 @@ bool TController::UpdateSituation(double dt) } else if ((VelSignal == 0.0) && (VelNext > 0.0) && (mvOccupied->Vel < 1.0)) if (iCoupler ? true : (iDrivigFlags & moveStopHere) == 0) // Ra: tu jest coś nie - // tak, bo bez tego - // warunku ruszało w - // manewrowym !!!! + // tak, bo bez tego + // warunku ruszało w + // manewrowym !!!! SetVelocity(VelNext, VelNext, stopSem); // omijanie SBL } // koniec samoistnego odjeżdżania if (AIControllFlag) @@ -3655,10 +3655,10 @@ bool TController::UpdateSituation(double dt) if (mvOccupied->Vel < 0.1) { // jeśli się zatrzymał, to zmieniamy kierunek jazdy, a nawet kabinę/człon Activation(); // ustawienie zadanego wcześniej kierunku i ewentualne - // przemieszczenie AI + // przemieszczenie AI PrepareEngine(); JumpToNextOrder(); // następnie robimy, co jest do zrobienia (Shunt albo - // Obey_train) + // Obey_train) if (OrderList[OrderPos] & (Shunt | Connect)) // jeśli dalej mamy manewry if ((iDrivigFlags & moveStopHere) == 0) // o ile nie stać w miejscu { // jechać od razu w przeciwną stronę i nie trąbić z tego tytułu @@ -3690,7 +3690,7 @@ bool TController::UpdateSituation(double dt) // przeszkody // no chyba żeby to uwzgldnić już w (ActualProximityDist) VelDesired = fVelMax; // wstępnie prędkość maksymalna dla pojazdu(-ów), będzie - // następnie ograniczana + // następnie ograniczana if (TrainParams) // jeśli ma rozkład if (TrainParams->TTVmax > 0.0) // i ograniczenie w rozkładzie VelDesired = Min0R(VelDesired, @@ -3699,9 +3699,9 @@ bool TController::UpdateSituation(double dt) // Ra: odczyt (ActualProximityDist), (VelNext) i (AccPreferred) z tabelki prędkosci AccDesired = AccPreferred; // AccPreferred wynika z osobowości mechanika VelNext = VelDesired; // maksymalna prędkość wynikająca z innych czynników niż - // trajektoria ruchu + // trajektoria ruchu ActualProximityDist = scanmax; // funkcja Update() może pozostawić wartości bez - // zmian + // zmian // hm, kiedyś semafory wysyłały SetVelocity albo ShuntVelocity i ustawły tak // VelSignal - a teraz jak to zrobić? TCommandType comm = TableUpdate(VelDesired, ActualProximityDist, VelNext, @@ -3721,7 +3721,7 @@ bool TController::UpdateSituation(double dt) break; // ale jak coś z przodu zamyka, to ma stać if (iDrivigFlags & moveStopCloser) VelSignal = VelDesired; // niech jedzie, jak W4 puściło - nie, ma czekać na - // sygnał z sygnalizatora! + // sygnał z sygnalizatora! case cm_SetVelocity: // od wersji 357 semafor nie budzi wyłączonej lokomotywy if (!(OrderList[OrderPos] & ~(Obey_train | Shunt))) // jedzie w dowolnym trybie albo Wait_for_orders @@ -3772,12 +3772,12 @@ bool TController::UpdateSituation(double dt) if (comm == cm_Command) // jeśli komenda Shunt iDrivigFlags |= moveStopHere; // to ją odbierz bez przemieszczania się (np. - // odczep wagony po dopchnięciu do końca toru) + // odczep wagony po dopchnięciu do końca toru) iDirectionOrder = -iDirection; // zmiana kierunku jazdy OrderList[OrderPos] = TOrders(OrderList[OrderPos] | Change_direction); // zmiana kierunku - // bez psucia - // kolejnych komend + // bez psucia + // kolejnych komend } } double vel = mvOccupied->Vel; // prędkość w kierunku jazdy @@ -3788,11 +3788,11 @@ bool TController::UpdateSituation(double dt) // Ra: jazda na widoczność if (pVehicles[0]->fTrackBlock < 1000.0) // przy 300m stał z zapamiętaną kolizją { // Ra 2F3F: przy jeździe pociągowej nie powinien dojeżdżać do poprzedzającego - // składu + // składu if ((mvOccupied->CategoryFlag & 1) ? ((OrderCurrentGet() & (Connect | Obey_train)) == Obey_train) : false) // jeśli jesteśmy pociągiem a jazda pociągowa i nie ściąganie ze - // szlaku + // szlaku { pVehicles[0]->ABuScanObjects(pVehicles[0]->DirectionGet(), 1000.0); // skanowanie sprawdzające @@ -3802,7 +3802,7 @@ bool TController::UpdateSituation(double dt) if (VelNext != 0.0) // a następny sygnał zezwala na jazdę if (pVehicles[0]->fTrackBlock < ActualProximityDist) // i jest bliżej (tu by trzeba było wstawić - // odległość do semafora, z pominięciem SBL + // odległość do semafora, z pominięciem SBL VelDesired = 0.0; // to stoimy } else @@ -3821,7 +3821,7 @@ bool TController::UpdateSituation(double dt) 0) // jeśli to coś jest podłączone sprzęgiem wirtualnym { // wyliczanie optymalnego przyspieszenia do jazdy na widoczność double k = c->Connected->Vel; // prędkość pojazdu z przodu (zakładając, - // że jedzie w tę samą stronę!!!) + // że jedzie w tę samą stronę!!!) if (k < vel + 10) // porównanie modułów prędkości [km/h] { // zatroszczyć się trzeba, jeśli tamten nie jedzie znacząco szybciej double d = @@ -3840,7 +3840,7 @@ bool TController::UpdateSituation(double dt) { AccPreferred = -1.0; // to hamuj maksymalnie VelNext = VelDesired = 0.0; // i nie pakuj się na - // tamtego + // tamtego } } else // jeśli oba jadą, to przyhamuj lekko i ogranicz prędkość @@ -3852,19 +3852,19 @@ bool TController::UpdateSituation(double dt) AccPreferred = fAccThreshold; // to przyhamuj troszkę VelNext = VelDesired = int(k); // to chyba już sobie - // dohamuje według - // uznania + // dohamuje według + // uznania } } ReactionTime = 0.1; // orientuj się, bo jest goraco } else { // jeśli odległość jest większa, ustalić maksymalne możliwe - // przyspieszenie (hamowanie) + // przyspieszenie (hamowanie) k = (k * k - vel * vel) / (25.92 * d); // energia kinetyczna - // dzielona przez masę i - // drogę daje - // przyspieszenie + // dzielona przez masę i + // drogę daje + // przyspieszenie if (k > 0.0) k *= 1.5; // jedź szybciej, jeśli możesz // double ak=(c->Connected->V>0?1.0:-1.0)*c->Connected->AccS; @@ -3892,7 +3892,7 @@ bool TController::UpdateSituation(double dt) } // sprawdzamy możliwe ograniczenia prędkości if (OrderCurrentGet() & (Shunt | Obey_train)) // w Connect nie, bo moveStopHere - // odnosi się do stanu po połączeniu + // odnosi się do stanu po połączeniu if (iDrivigFlags & moveStopHere) // jeśli ma czekać na wolną drogę if (vel == 0.0) // a stoi if (VelNext == 0.0) // a wyjazdu nie ma @@ -3910,9 +3910,9 @@ bool TController::UpdateSituation(double dt) mvOccupied->RunningTrack.Velmax); // uwaga na ograniczenia szlakowej! if (VelforDriver >= 0) // tu jest zero przy zmianie kierunku jazdy VelDesired = Min0R(VelDesired, VelforDriver); // Ra: tu może być 40, jeśli - // mechanik nie ma znajomości - // szlaaku, albo kierowca jeździ - // 70 + // mechanik nie ma znajomości + // szlaaku, albo kierowca jeździ + // 70 if (TrainParams) if (TrainParams->CheckTrainLatency() < 5.0) if (TrainParams->TTVmax > 0.0) @@ -3923,10 +3923,10 @@ bool TController::UpdateSituation(double dt) if (VelDesired > 0.0) if (VelNext > 0.0) { // jeśli można jechać, to odpalić dźwięk kierownika oraz zamknąć drzwi w - // składzie + // składzie if (iDrivigFlags & moveGuardSignal) { // komunikat od kierownika tu, bo musi być wolna droga i odczekany czas - // stania + // stania iDrivigFlags &= ~moveGuardSignal; // tylko raz nadać tsGuardSignal->Stop(); // w zasadzie to powinien mieć flagę, czy jest dźwiękiem radiowym, czy @@ -3955,15 +3955,15 @@ bool TController::UpdateSituation(double dt) if (!mvOccupied ->DoorOpenCtrl) // jeśli drzwi niesterowane przez maszynistę Doors(false); // a EZT zamknie dopiero po odegraniu komunikatu - // kierownika + // kierownika } if (mvOccupied->V == 0.0) AbsAccS = fAccGravity; // Ra 2014-03: jesli skład stoi, to działa na niego - // składowa styczna grawitacji + // składowa styczna grawitacji else AbsAccS = iDirection * mvOccupied->AccS; // przyspieszenie chwilowe, liczone - // jako różnica skierowanej prędkości w - // czasie +// jako różnica skierowanej prędkości w +// czasie // if (mvOccupied->V<0.0) AbsAccS=-AbsAccS; //Ra 2014-03: to trzeba przemyśleć // if (vel<0) //jeżeli się stacza w tył; 2014-03: to jest bez sensu, bo vel>=0 // AbsAccS=-AbsAccS; //to przyspieszenie też działa wtedy w nieodpowiednią stronę @@ -3977,12 +3977,12 @@ bool TController::UpdateSituation(double dt) // ustalanie zadanego przyspieszenia //(ActualProximityDist) - odległość do miejsca zmniejszenia prędkości //(AccPreferred) - wynika z psychyki oraz uwzglęnia już ewentualne zderzenie z - //pojazdem z przodu, ujemne gdy należy hamować + // pojazdem z przodu, ujemne gdy należy hamować //(AccDesired) - uwzględnia sygnały na drodze ruchu, ujemne gdy należy hamować //(fAccGravity) - chwilowe przspieszenie grawitacyjne, ujemne działa przeciwnie do - //zadanego kierunku jazdy + // zadanego kierunku jazdy //(AbsAccS) - chwilowe przyspieszenie pojazu (uwzględnia grawitację), ujemne działa - //przeciwnie do zadanego kierunku jazdy + // przeciwnie do zadanego kierunku jazdy //(AccDesired) porównujemy z (fAccGravity) albo (AbsAccS) // if ((VelNext>=0.0)&&(ActualProximityDist>=0)&&(mvOccupied->Vel>=VelNext)) //gdy // zbliza sie i jest za szybko do NOWEGO @@ -3994,25 +3994,25 @@ bool TController::UpdateSituation(double dt) (ActualProximityDist > fMaxProximityDist * (1 + 0.1 * vel)) : false) // dojedz do semafora/przeszkody { // jeśli jedzie wolniej niż można i jest wystarczająco daleko, to można - // przyspieszyć + // przyspieszyć if (AccPreferred > 0.0) // jeśli nie ma zawalidrogi AccDesired = AccPreferred; // VelDesired:=Min0R(VelDesired,VelReduced+VelNext); } else if (ActualProximityDist > fMinProximityDist) { // jedzie szybciej, niż trzeba na końcu ActualProximityDist, ale jeszcze - // jest daleko + // jest daleko if (vel < VelNext + 40.0) // dwustopniowe hamowanie - niski przy małej różnicy { // jeśli jedzie wolniej niż VelNext+35km/h //Ra: 40, żeby nie - // kombinował na zwrotnicach + // kombinował na zwrotnicach if (VelNext == 0.0) { // jeśli ma się zatrzymać, musi być to robione precyzyjnie i - // skutecznie + // skutecznie if (ActualProximityDist < fMaxProximityDist) // jak minął już maksymalny dystans { // po prostu hamuj (niski stopień) //ma stanąć, a jest w - // drodze hamowania albo ma jechać + // drodze hamowania albo ma jechać AccDesired = fAccThreshold; // hamowanie tak, aby stanąć VelDesired = 0.0; // Min0R(VelDesired,VelNext); } @@ -4020,18 +4020,18 @@ bool TController::UpdateSituation(double dt) { // jeśli ma stanąć, a mieści się w drodze hamowania if (vel < 10.0) // jeśli prędkość jest łatwa do zatrzymania { // tu jest trochę problem, bo do punktu zatrzymania dobija - // na raty + // na raty // AccDesired=AccDesired<0.0?0.0:0.1*AccPreferred; AccDesired = AccPreferred; // proteza trochę; jak tu - // wychodzi 0.05, to loki - // mają problem utrzymać - // takie przyspieszenie + // wychodzi 0.05, to loki + // mają problem utrzymać + // takie przyspieszenie } else if (vel <= 30.0) // trzymaj 30 km/h AccDesired = Min0R(0.5 * AccDesired, AccPreferred); // jak jest tu 0.5, to - // samochody się - // dobijają do siebie + // samochody się + // dobijają do siebie else AccDesired = 0.0; } @@ -4040,19 +4040,19 @@ bool TController::UpdateSituation(double dt) VelNext + fVelPlus) // jeśli niewielkie przekroczenie // AccDesired=0.0; AccDesired = Min0R(0.0, AccPreferred); // proteza trochę: to - // niech nie hamuje, - // chyba że coś z - // przodu + // niech nie hamuje, + // chyba że coś z + // przodu else AccDesired = -(vel * vel) / (25.92 * (ActualProximityDist + 0.1)); //-fMinProximityDist));//-0.1; - ////mniejsze opóźnienie przy - //małej różnicy + ////mniejsze opóźnienie przy + // małej różnicy ReactionTime = 0.1; // i orientuj się szybciej, jak masz stanąć } else if (vel < VelNext + fVelPlus) // jeśli niewielkie - // przekroczenie, ale ma jechać + // przekroczenie, ale ma jechać AccDesired = Min0R(0.0, AccPreferred); // to olej (zacznij luzować) else @@ -4064,7 +4064,7 @@ bool TController::UpdateSituation(double dt) 0.1); // mniejsze opóźnienie przy małej różnicy if (ActualProximityDist < fMaxProximityDist) ReactionTime = 0.1; // i orientuj się szybciej, jeśli w - // krytycznym przedziale + // krytycznym przedziale } } else // przy dużej różnicy wysoki stopień (1,25 potrzebnego opoznienia) @@ -4103,7 +4103,7 @@ bool TController::UpdateSituation(double dt) AccDesired = AccPreferred; // dociagnij do semafora; else VelDesired = 0.0; //,AccDesired=-fabs(fAccGravity); //stoj (hamuj z siłą - //równą składowej stycznej grawitacji) + // równą składowej stycznej grawitacji) } else VelDesired = 0.0; // VelNext=0 i stoi bliżej niż fMaxProximityDist @@ -4125,7 +4125,7 @@ bool TController::UpdateSituation(double dt) // koniec predkosci aktualnej if (fAccThreshold > -0.3) // bez sensu, ale dla towarowych korzystnie { // Ra 2014-03: to nie uwzględnia odległości i zaczyna hamować, jak tylko zobaczy - // W4 + // W4 if ((AccDesired > 0.0) && (VelNext >= 0.0)) // wybieg bądź lekkie hamowanie, warunki byly zamienione if (vel > VelNext + 100.0) // lepiej zaczac hamowac @@ -4214,9 +4214,9 @@ bool TController::UpdateSituation(double dt) #endif if (AccDesired > 0.1) if (vel < 10.0) // Ra 2F1H: jeśli prędkość jest mała, a można przyspieszać, - // to nie ograniczać przyspieszenia do 0.5m/ss + // to nie ograniczać przyspieszenia do 0.5m/ss AccDesired = 0.9; // przy małych prędkościach może być trudno utrzymać - // małe przyspieszenie + // małe przyspieszenie // Ra 2F1I: wyłączyć kiedyś to uśrednianie i przeanalizować skanowanie, czemu // migocze if (AccDesired > -0.15) // hamowania lepeiej nie uśredniać @@ -4251,7 +4251,7 @@ bool TController::UpdateSituation(double dt) else if (((fAccGravity < -0.01) ? AccDesired < 0.0 : AbsAccS > AccDesired) || (vel > VelDesired)) // jak za bardzo przyspiesza albo prędkość - // przekroczona + // przekroczona DecSpeed(); // pojedyncze cofnięcie pozycji, bo na zero to przesada } // yB: usunięte różne dziwne warunki, oddzielamy część zadającą od wykonawczej @@ -4261,7 +4261,7 @@ bool TController::UpdateSituation(double dt) if (AbsAccS < AccDesired) // jeśli przyspieszenie pojazdu jest mniejsze niż żądane oraz if (vel < VelDesired - fVelMinus) // jeśli prędkość w kierunku czoła jest - // mniejsza od dozwolonej o margines + // mniejsza od dozwolonej o margines if ((ActualProximityDist > fMaxProximityDist) ? true : (vel < VelNext)) IncSpeed(); // to można przyspieszyć // if ((AbsAccS AccDesired) || (mvOccupied->BrakeCtrlPos < 0)) : false) // hamować bardziej, gdy aktualne opóźnienie hamowania - // mniejsze niż (AccDesired) + // mniejsze niż (AccDesired) IncBrake(); else if (OrderList[OrderPos] != Disconnect) // przy odłączaniu nie zwalniamy tu hamulca @@ -4324,7 +4324,7 @@ bool TController::UpdateSituation(double dt) if (fBrakeTime < 0 ? true : (AccDesired < fAccGravity - 0.3) || (mvOccupied->BrakeCtrlPos <= 0)) if (!IncBrake()) // jeśli upłynął czas reakcji hamulca, chyba że - // nagłe albo luzował + // nagłe albo luzował MinVelFlag = true; else { @@ -4397,7 +4397,7 @@ bool TController::UpdateSituation(double dt) } // if (AIControllFlag) else { // tu mozna dać komunikaty tekstowe albo słowne: przyspiesz, hamuj (lekko, - // średnio, mocno) + // średnio, mocno) } } // kierunek różny od zera else @@ -4564,9 +4564,15 @@ void TController::OrdersDump() } }; -TOrders TController::OrderCurrentGet() { return OrderList[OrderPos]; } +TOrders TController::OrderCurrentGet() +{ + return OrderList[OrderPos]; +} -TOrders TController::OrderNextGet() { return OrderList[OrderPos + 1]; } +TOrders TController::OrderNextGet() +{ + return OrderList[OrderPos + 1]; +} void TController::OrdersInit(double fVel) { // wypełnianie tabelki rozkazów na podstawie rozkładu @@ -4805,7 +4811,7 @@ TCommandType TController::BackwardScan() // zwraca true, jeśli należy odwrócić kierunek jazdy pojazdu if ((OrderList[OrderPos] & ~(Shunt | Connect))) return cm_Unknown; // skanowanie sygnałów tylko gdy jedzie w trybie manewrowym albo czeka na - // rozkazy + // rozkazy vector3 sl; int startdir = -pVehicles[0]->DirectionGet(); // kierunek jazdy względem sprzęgów pojazdu na czele @@ -4876,7 +4882,7 @@ TCommandType TController::BackwardScan() (mvOccupied->Vel > 0.0) && (OrderCurrentGet() != Shunt) : false) { // jeśli semafor jest daleko, a pojazd jedzie, to informujemy o - // zmianie prędkości +// zmianie prędkości // jeśli jedzie manewrowo, musi dostać SetVelocity, żeby sie na pociągowy przełączył // Mechanik->PutCommand("SetProximityVelocity",scandist,vmechmax,sl); #if LOGBACKSCAN @@ -4888,11 +4894,11 @@ TCommandType TController::BackwardScan() return (vmechmax > 0) ? cm_SetVelocity : cm_Unknown; } else // ustawiamy prędkość tylko wtedy, gdy ma ruszyć, stanąć albo ma - // stać + // stać // if ((MoverParameters->Vel==0.0)||(vmechmax==0.0)) //jeśli stoi lub ma // stanąć/stać { // semafor na tym torze albo lokomtywa stoi, a ma ruszyć, albo ma - // stanąć, albo nie ruszać +// stanąć, albo nie ruszać // stop trzeba powtarzać, bo inaczej zatrąbi i pojedzie sam // PutCommand("SetVelocity",vmechmax,e->Params[9].asMemCell->Value2(),&sl,stopSem); #if LOGBACKSCAN @@ -4913,7 +4919,7 @@ TCommandType TController::BackwardScan() { // jeśli tarcza jest daleko, to: //- jesli pojazd jedzie, to informujemy o zmianie prędkości //- jeśli stoi, to z własnej inicjatywy może podjechać pod zamkniętą - //tarczę + // tarczę if (mvOccupied->Vel > 0.0) // tylko jeśli jedzie { // Mechanik->PutCommand("SetProximityVelocity",scandist,vmechmax,sl); #if LOGBACKSCAN @@ -4925,11 +4931,11 @@ TCommandType TController::BackwardScan() return (iDrivigFlags & moveTrackEnd) ? cm_ChangeDirection : cm_Unknown; // jeśli jedzie na W5 albo koniec toru, - // to można zmienić kierunek + // to można zmienić kierunek } } else // ustawiamy prędkość tylko wtedy, gdy ma ruszyć, albo stanąć albo - // ma stać pod tarczą + // ma stać pod tarczą { // stop trzeba powtarzać, bo inaczej zatrąbi i pojedzie sam // if ((MoverParameters->Vel==0.0)||(vmechmax==0.0)) //jeśli jedzie // lub ma stanąć/stać @@ -4944,7 +4950,7 @@ TCommandType TController::BackwardScan() } if ((vmechmax != 0.0) && (scandist < 100.0)) { // jeśli Tm w odległości do 100m podaje zezwolenie na jazdę, to od - // razu ją ignorujemy, aby móc szukać kolejnej +// razu ją ignorujemy, aby móc szukać kolejnej // eSignSkip=e; //wtedy uznajemy ignorowaną przy poszukiwaniu nowej #if LOGBACKSCAN WriteLog(edir + "- will be ignored due to Ms2"); @@ -5029,7 +5035,7 @@ void TController::TakeControl(bool yes) // Activation(); //przeniesie użytkownika w ostatnio wybranym kierunku CheckVehicles(); // ustawienie świateł TableClear(); // ponowne utworzenie tabelki, bo człowiek mógł pojechać niezgodnie z - // sygnałami + // sygnałami } else { // a teraz użytkownik @@ -5054,15 +5060,30 @@ void TController::DirectionForward(bool forward) mvControlling->IncMainCtrl(1); //żeby nie zgasł }; -AnsiString TController::Relation() { return TrainParams->ShowRelation(); }; // zwraca relację pociągu +AnsiString TController::Relation() +{ // zwraca relację pociągu + return TrainParams->ShowRelation(); +}; -AnsiString TController::TrainName() { return TrainParams->TrainName; }; // zwraca relację pociągu +AnsiString TController::TrainName() +{ // zwraca relację pociągu + return TrainParams->TrainName; +}; -int TController::StationCount() { return TrainParams->StationCount; }; // zwraca ilość stacji (miejsc zatrzymania) +int TController::StationCount() +{ // zwraca ilość stacji (miejsc zatrzymania) + return TrainParams->StationCount; +}; -int TController::StationIndex() { return TrainParams->StationIndex; }; // zwraca indeks aktualnej stacji (miejsca zatrzymania) +int TController::StationIndex() +{ // zwraca indeks aktualnej stacji (miejsca zatrzymania) + return TrainParams->StationIndex; +}; -bool TController::IsStop() { return TrainParams->IsStop(); }; // informuje, czy jest zatrzymanie na najbliższej stacji +bool TController::IsStop() +{ // informuje, czy jest zatrzymanie na najbliższej stacji + return TrainParams->IsStop(); +}; void TController::MoveTo(TDynamicObject *to) { // przesunięcie AI do innego pojazdu (przy zmianie kabiny) @@ -5087,7 +5108,7 @@ AnsiString TController::TableText(int i) { // pozycja tabelki prędkości i = (iFirst + i) % iSpeedTableSize; // numer pozycji if (i != iLast) // w (iLast) znajduje się kolejny tor do przeskanowania, ale nie jest ona - // aktywną + // aktywną return sSpeedTable[i].TableText(); return ""; // wskaźnik końca }; @@ -5123,9 +5144,9 @@ void TController::RouteSwitch(int d) if ((sSpeedTable[i].iFlags & 32) == 0) // odcinek nie może być miniętym if (sSpeedTable[i].trTrack->eType == tt_Cross) // jeśli skrzyżowanie { // obcięcie tabelki skanowania przed skrzyżowaniem, aby ponownie - // wybrać drogę + // wybrać drogę iLast = i - 1; // ponowne skanowanie skrzyżowania (w zwrotnicach - // jest iLast=i, ale tam jest prościej) + // jest iLast=i, ale tam jest prościej) if (iLast < 0) iLast += iSpeedTableSize; // bo tabelka jest zapętlona return; diff --git a/Driver.h b/Driver.h index bc4e053d..c72116d1 100644 --- a/Driver.h +++ b/Driver.h @@ -164,7 +164,7 @@ class TController double fLastStopExpDist; // odległość wygasania ostateniego przystanku double ReactionTime; // czas reakcji Ra: czego i na co? świadomości AI double fBrakeTime; // wpisana wartość jest zmniejszana do 0, gdy ujemna należy zmienić nastawę - // hamulca + // hamulca private: double fReady; // poziom odhamowania wagonów bool Ready; // ABu: stan gotowosci do odjazdu - sprawdzenie odhamowania wagonow @@ -178,7 +178,7 @@ class TController public: bool AIControllFlag; // rzeczywisty/wirtualny maszynista int iRouteWanted; // oczekiwany kierunek jazdy (0-stop,1-lewo,2-prawo,3-prosto) np. odpala - // migacz lub czeka na stan zwrotnicy + // migacz lub czeka na stan zwrotnicy private: TDynamicObject *pVehicle; // pojazd w którym siedzi sterujący TDynamicObject * @@ -194,17 +194,17 @@ class TController int iGuardRadio; // numer kanału radiowego kierownika (0, gdy nie używa radia) public: double AccPreferred; // preferowane przyspieszenie (wg psychiki kierującego, zmniejszana przy - // wykryciu kolizji) + // wykryciu kolizji) double AccDesired; // przyspieszenie, jakie ma utrzymywać (<0:nie przyspieszaj,<-0.1:hamuj) double VelDesired; // predkość, z jaką ma jechać, wynikająca z analizy tableki; <=VelSignal double fAccDesiredAv; // uśrednione przyspieszenie z kolejnych przebłysków świadomości, żeby - // ograniczyć migotanie + // ograniczyć migotanie private: double VelforDriver; // prędkość, używana przy zmianie kierunku (ograniczenie przy nieznajmości - // szlaku?) + // szlaku?) double VelSignal; // predkość zadawana przez semafor (funkcją SetVelocity()) double VelLimit; // predkość zadawana przez event jednokierunkowego ograniczenia prędkości - // (PutValues albo komendą) + // (PutValues albo komendą) public: double VelNext; // prędkość, jaka ma być po przejechaniu długości ProximityDist private: @@ -215,7 +215,7 @@ class TController ActualProximityDist; // odległość brana pod uwagę przy wyliczaniu prędkości i przyspieszenia private: vector3 vCommandLocation; // polozenie wskaznika, sygnalizatora lub innego obiektu do ktorego - // odnosi sie komenda + // odnosi sie komenda TOrders OrderList[maxorders]; // lista rozkazów int OrderPos, OrderTop; // rozkaz aktualny oraz wolne miejsce do wstawiania nowych std::ofstream LogFile; // zapis parametrow fizycznych @@ -226,7 +226,7 @@ class TController int iDirectionOrder; //żadany kierunek jazdy (służy do zmiany kierunku) int iVehicleCount; // ilość pojazdów do odłączenia albo zabrania ze składu (-1=wszystkie) int iCoupler; // maska sprzęgu, jaką należy użyć przy łączeniu (po osiągnięciu trybu Connect), 0 - // gdy jazda bez łączenia + // gdy jazda bez łączenia int iDriverFailCount; // licznik błędów AI bool Need_TryAgain; // true, jeśli druga pozycja w elektryku nie załapała bool Need_BrakeRelease; @@ -235,13 +235,13 @@ class TController double fMinProximityDist; // minimalna oległość do przeszkody, jaką należy zachować double fOverhead1; // informacja o napięciu w sieci trakcyjnej (0=brak drutu, zatrzymaj!) double fOverhead2; // informacja o sposobie jazdy (-1=normalnie, 0=bez prądu, >0=z opuszczonym i - // ograniczeniem prędkości) + // ograniczeniem prędkości) int iOverheadZero; // suma bitowa jezdy bezprądowej, bity ustawiane przez pojazdy z - // podniesionymi pantografami + // podniesionymi pantografami int iOverheadDown; // suma bitowa opuszczenia pantografów, bity ustawiane przez pojazdy z - // podniesionymi pantografami + // podniesionymi pantografami double fVoltage; // uśrednione napięcie sieci: przy spadku poniżej wartości minimalnej opóźnić - // rozruch o losowy czas + // rozruch o losowy czas private: double fMaxProximityDist; // akceptowalna odległość stanięcia przed przeszkodą TStopReason eStopReason; // powód zatrzymania przy ustawieniu zerowej prędkości @@ -268,15 +268,18 @@ class TController void ControllingSet(); // znajduje człon do sterowania void AutoRewident(); // ustawia hamulce w składzie public: - Mtable::TTrainParameters *__fastcall Timetable() { return TrainParams; }; + Mtable::TTrainParameters *__fastcall Timetable() + { + return TrainParams; + }; void PutCommand(AnsiString NewCommand, double NewValue1, double NewValue2, - const _mover::TLocation &NewLocation, TStopReason reason = stopComm); + const _mover::TLocation &NewLocation, TStopReason reason = stopComm); bool PutCommand(AnsiString NewCommand, double NewValue1, double NewValue2, - const vector3 *NewLocation, TStopReason reason = stopComm); + const vector3 *NewLocation, TStopReason reason = stopComm); bool UpdateSituation(double dt); // uruchamiac przynajmniej raz na sekundę // procedury dotyczace rozkazow dla maszynisty void SetVelocity(double NewVel, double NewVelNext, - TStopReason r = stopNone); // uaktualnia informacje o prędkości + TStopReason r = stopNone); // uaktualnia informacje o prędkości bool SetProximityVelocity( double NewDist, double NewVelNext); // uaktualnia informacje o prędkości przy nastepnym semaforze @@ -298,8 +301,8 @@ class TController void OrdersClear(); void OrdersDump(); TController(bool AI, TDynamicObject *NewControll, bool InitPsyche, - bool primary = true // czy ma aktywnie prowadzić? - ); + bool primary = true // czy ma aktywnie prowadzić? + ); AnsiString OrderCurrent(); void WaitingSet(double Seconds); @@ -319,8 +322,7 @@ class TController TEvent *__fastcall TableCheckTrackEvent(double fDirection, TTrack *Track); void TableTraceRoute(double fDistance, TDynamicObject *pVehicle = NULL); void TableCheck(double fDistance); - TCommandType TableUpdate(double &fVelDes, double &fDist, double &fNext, - double &fAcc); + TCommandType TableUpdate(double &fVelDes, double &fDist, double &fNext, double &fAcc); void TablePurger(); private: // Ra: stare funkcje skanujące, używane do szukania sygnalizatora z tyłu @@ -342,8 +344,14 @@ class TController int StationCount(); int StationIndex(); bool IsStop(); - bool Primary() { return this ? bool(iDrivigFlags & movePrimary) : false; }; - int inline DrivigFlags() { return iDrivigFlags; }; + bool Primary() + { + return this ? bool(iDrivigFlags & movePrimary) : false; + }; + int inline DrivigFlags() + { + return iDrivigFlags; + }; void MoveTo(TDynamicObject *to); void DirectionInitial(); AnsiString TableText(int i); diff --git a/DynObj.cpp b/DynObj.cpp index 7c72b402..32f55c71 100644 --- a/DynObj.cpp +++ b/DynObj.cpp @@ -54,7 +54,7 @@ void TAnimPant::AKP_4E() fLenL1 = 1.22; // 1.176289 w modelach fLenU1 = 1.755; // 1.724482197 w modelach fHoriz = 0.535; // 0.54555075 przesunięcie ślizgu w długości pojazdu względem osi obrotu dolnego - // ramienia + // ramienia fHeight = 0.07; // wysokość ślizgu ponad oś obrotu fWidth = 0.635; // połowa szerokości ślizgu, 0.635 dla AKP-1 i AKP-4E fAngleL0 = DegToRad(2.8547285515689267247882521833308); @@ -68,7 +68,7 @@ void TAnimPant::AKP_4E() hvPowerWire = NULL; fWidthExtra = 0.381; //(2.032m-1.027)/2 // poza obszarem roboczym jest aproksymacja łamaną o 5 odcinkach - fHeightExtra[0] = 0.0; //+0.0762 + fHeightExtra[0] = 0.0; //+0.0762 fHeightExtra[1] = -0.01; //+0.1524 fHeightExtra[2] = -0.03; //+0.2286 fHeightExtra[3] = -0.07; //+0.3048 @@ -131,7 +131,8 @@ TAnim::~TAnim() break; } }; -void TAnim::Parovoz(){// animowanie tłoka i rozrządu parowozu +void TAnim::Parovoz(){ + // animowanie tłoka i rozrządu parowozu }; //--------------------------------------------------------------------------- TDynamicObject *__fastcall TDynamicObject::FirstFind(int &coupler_nr) @@ -288,7 +289,10 @@ TDynamicObject* TDynamicObject::GetFirstCabDynamic(int cpl_type) }; */ -void TDynamicObject::ABuSetModelShake(vector3 mShake) { modelShake = mShake; }; +void TDynamicObject::ABuSetModelShake(vector3 mShake) +{ + modelShake = mShake; +}; int TDynamicObject::GetPneumatic(bool front, bool red) { @@ -413,7 +417,7 @@ void TDynamicObject::UpdateDoorRotate(TAnim *pAnim) { // animacja drzwi - obrót if (pAnim->smAnimated) { // if (MoverParameters->DoorOpenMethod==2) //obrotowe albo dwójłomne (trzeba kombinowac - // submodelami i ShiftL=90,R=180) + // submodelami i ShiftL=90,R=180) if (pAnim->iNumber & 1) pAnim->smAnimated->SetRotate(float3(1, 0, 0), dDoorMoveR); else @@ -425,7 +429,7 @@ void TDynamicObject::UpdateDoorFold(TAnim *pAnim) { // animacja drzwi - obrót if (pAnim->smAnimated) { // if (MoverParameters->DoorOpenMethod==2) //obrotowe albo dwójłomne (trzeba kombinowac - // submodelami i ShiftL=90,R=180) + // submodelami i ShiftL=90,R=180) if (pAnim->iNumber & 1) { pAnim->smAnimated->SetRotate(float3(0, 0, 1), dDoorMoveR); @@ -849,7 +853,7 @@ void __inline TDynamicObject::ABuLittleUpdate(double ObjSqrDist) } if (MoverParameters->Battery) { // sygnały czoła pociagu //Ra: wyświetlamy bez ograniczeń odległości, by były widoczne z - // daleka + // daleka if (TestFlag(iLights[0], 1)) { btHeadSignals11.TurnOn(); @@ -899,7 +903,7 @@ TDynamicObject *__fastcall TDynamicObject::ABuFindNearestObject(TTrack *Track, TDynamicObject *MyPointer, int &CouplNr) { // zwraca wskaznik do obiektu znajdujacego sie na torze (Track), którego sprzęg jest najblizszy - // kamerze + // kamerze // służy np. do łączenia i rozpinania sprzęgów // WE: Track - tor, na ktorym odbywa sie poszukiwanie // MyPointer - wskaznik do obiektu szukajacego @@ -926,7 +930,7 @@ TDynamicObject *__fastcall TDynamicObject::ABuFindNearestObject(TTrack *Track, { // wektor [kamera-sprzeg0], potem [kamera-sprzeg1] // Powinno byc wyliczone, ale nie zaszkodzi drugi raz: //(bo co, jesli nie wykonuje sie obrotow wozkow?) - Ra: ale zawsze są liczone - //współrzędne sprzęgów + // współrzędne sprzęgów // Track->Dynamics[i]->modelRot.z=ABuAcos(Track->Dynamics[i]->Axle0.pPosition-Track->Dynamics[i]->Axle1.pPosition); // poz=Track->Dynamics[i]->vPosition; //pozycja środka pojazdu // kon=vector3( //położenie przodu względem środka @@ -1101,7 +1105,7 @@ TDynamicObject *__fastcall TDynamicObject::ABuFindObject(TTrack *Track, int Scan 0; // to, bo (ScanDir>=0) if (Track->iCategoryFlag & 254) // trajektoria innego typu niż tor kolejowy { // dla torów nie ma sensu tego sprawdzać, rzadko co jedzie po jednej - // szynie i się mija + // szynie i się mija // Ra: mijanie samochodów wcale nie jest proste // Przesuniecie wzgledne pojazdow. Wyznaczane, zeby sprawdzic, // czy pojazdy faktycznie sie zderzaja (moga byc przesuniete @@ -1120,7 +1124,7 @@ TDynamicObject *__fastcall TDynamicObject::ABuFindObject(TTrack *Track, int Scan if (RelOffsetH + RelOffsetH > MoverParameters->Dim.W + Track->Dynamics[i]->MoverParameters->Dim.W) continue; // odległość większa od połowy sumy szerokości - kolizji - // nie będzie + // nie będzie // jeśli zahaczenie jest niewielkie, a jest miejsce na poboczu, to // zjechać na pobocze } @@ -1147,7 +1151,7 @@ TDynamicObject *__fastcall TDynamicObject::ABuFindObject(TTrack *Track, int Scan 1; // odwrotnie, bo (ScanDir<0) if (Track->iCategoryFlag & 254) // trajektoria innego typu niż tor kolejowy { // dla torów nie ma sensu tego sprawdzać, rzadko co jedzie po jednej - // szynie i się mija + // szynie i się mija // Ra: mijanie samochodów wcale nie jest proste // Przesunięcie względne pojazdów. Wyznaczane, żeby sprawdzić, // czy pojazdy faktycznie się zderzają (mogą być przesunięte @@ -1166,7 +1170,7 @@ TDynamicObject *__fastcall TDynamicObject::ABuFindObject(TTrack *Track, int Scan if (RelOffsetH + RelOffsetH > MoverParameters->Dim.W + Track->Dynamics[i]->MoverParameters->Dim.W) continue; // odległość większa od połowy sumy szerokości - kolizji - // nie będzie + // nie będzie } iMinDist = i; // potencjalna kolizja MinDist = TestDist; // odleglość pomiędzy aktywnymi osiami pojazdów @@ -1175,7 +1179,7 @@ TDynamicObject *__fastcall TDynamicObject::ABuFindObject(TTrack *Track, int Scan } } dist += MinDist; // doliczenie odległości przeszkody albo długości odcinka do przeskanowanej - // odległości + // odległości return (iMinDist >= 0) ? Track->Dynamics[iMinDist] : NULL; } dist += Track->Length(); // doliczenie długości odcinka do przeskanowanej odległości @@ -1227,7 +1231,7 @@ void TDynamicObject::CouplersDettach(double MinDist, int MyScanDir) if ((PrevConnectedNo ? PrevConnected->NextConnected : PrevConnected->PrevConnected) == this) { // Ra: nie rozłączamy znalezionego, jeżeli nie do nas podłączony (może jechać w - // innym kierunku) + // innym kierunku) PrevConnected->MoverParameters->Couplers[PrevConnectedNo].Connected = NULL; if (PrevConnectedNo == 0) { @@ -1257,7 +1261,7 @@ void TDynamicObject::CouplersDettach(double MinDist, int MyScanDir) if ((NextConnectedNo ? NextConnected->NextConnected : NextConnected->PrevConnected) == this) { // Ra: nie rozłączamy znalezionego, jeżeli nie do nas podłączony (może jechać w - // innym kierunku) + // innym kierunku) NextConnected->MoverParameters->Couplers[NextConnectedNo].Connected = NULL; if (NextConnectedNo == 0) { @@ -1289,7 +1293,7 @@ void TDynamicObject::ABuScanObjects(int ScanDir, double ScanDist) FirstAxle->GetTrack(); // tor na którym "stoi" skrajny wózek (może być inny niż tor pojazdu) if (FirstAxle->GetDirection() < 0) // czy oś jest ustawiona w stronę Point1? ScanDir = -ScanDir; // jeśli tak, to kierunek szukania będzie przeciwny (teraz względem - // toru) + // toru) Byte MyCouplFound; // numer sprzęgu do podłączenia w obiekcie szukajacym MyCouplFound = (MyScanDir < 0) ? 1 : 0; Byte CouplFound; // numer sprzęgu w znalezionym obiekcie (znaleziony wypełni) @@ -1511,7 +1515,7 @@ TDynamicObject::TDynamicObject() cp1 = cp2 = sp1 = sp2 = 0; iDirection = 1; // stoi w kierunku tradycyjnym (0, gdy jest odwrócony) iAxleFirst = 0; // numer pierwszej osi w kierunku ruchu (przełączenie następuje, gdy osie sa na - // tym samym torze) + // tym samym torze) iInventory = 0; // flagi bitowe posiadanych submodeli (zaktualizuje się po wczytaniu MMD) RaLightsSet(0, 0); // początkowe zerowanie stanu świateł // Ra: domyślne ilości animacji dla zgodności wstecz (gdy brak ilości podanych w MMD) @@ -1536,7 +1540,7 @@ TDynamicObject::TDynamicObject() fScanDist = 300.0; // odległość skanowania, zwiększana w trybie łączenia ctOwner = NULL; // na początek niczyj iOverheadMask = 0; // maska przydzielana przez AI pojazdom posiadającym pantograf, aby wymuszały - // jazdę bezprądową + // jazdę bezprądową tmpTraction.TractionVoltage = 0; // Ra 2F1H: prowizorka, trzeba przechować napięcie, żeby nie wywalało WS pod izolatorem fAdjustment = 0.0; // korekcja odległości pomiędzy wózkami (np. na łukach) @@ -1651,7 +1655,7 @@ double TDynamicObject::Init( int dlugosc = MoreParams.Length(); ActPar = MoreParams.SubString(1, kropka - 1).UpperCase(); // pierwszy parametr; MoreParams = MoreParams.SubString(kropka + 1, dlugosc - kropka); // reszta do dalszej - // obrobki + // obrobki kropka = MoreParams.Pos("."); if (ActPar.SubString(1, 1) == "B") // jesli hamulce @@ -1780,13 +1784,13 @@ double TDynamicObject::Init( { // ustawianie samochodow na poboczu albo na środku drogi if (Track->fTrackWidth < 3.5) // jeśli droga wąska MoverParameters->OffsetTrackH = 0.0; // to stawiamy na środku, niezależnie od stanu - // ruchu + // ruchu else if (driveractive) // od 3.5m do 8.0m jedzie po środku pasa, dla szerszych w odległości - // 1.5m + // 1.5m MoverParameters->OffsetTrackH = Track->fTrackWidth <= 8.0 ? -Track->fTrackWidth * 0.25 : -1.5; else // jak stoi, to kołem na poboczu i pobieramy szerokość razem z poboczem, ale nie z - // chodnikiem + // chodnikiem MoverParameters->OffsetTrackH = -0.5 * (Track->WidthTotal() - MoverParameters->Dim.W) + 0.05; iHornWarning = 0; // nie będzie trąbienia po podaniu zezwolenia na jazdę @@ -1889,7 +1893,7 @@ double TDynamicObject::Init( smBuforPrawy[i]->WillBeAnimated(); } for (int i = 0; i < iAxles; i++) // wyszukiwanie osi (0 jest na końcu, dlatego dodajemy - // długość?) + // długość?) dRailPosition[i] = (Reversed ? -dWheelsPosition[i] : (dWheelsPosition[i] + MoverParameters->Dim.L)) + fDist; @@ -1943,7 +1947,7 @@ double TDynamicObject::Init( break; } Move(0.0001); // potrzebne do wyliczenia aktualnej pozycji; nie może być zero, bo nie przeliczy - // pozycji + // pozycji // teraz jeszcze trzeba przypisać pojazdy do nowego toru, bo przesuwanie początkowe osi nie // zrobiło tego ABuCheckMyTrack(); // zmiana toru na ten, co oś Axle0 (oś z przodu) @@ -2009,11 +2013,11 @@ void TDynamicObject::Move(double fDistance) bEnabled &= Axle1.Move(fDistance, iAxleFirst); // oś z tyłu pojazdu prusza się pierwsza bEnabled &= Axle0.Move(fDistance /*-fAdjustment*/, !iAxleFirst); // oś z przodu pojazdu } - else //gf: bez wywolania Move na postoju nie ma event0 - { - bEnabled&=Axle1.Move(fDistance,iAxleFirst); //oś z tyłu pojazdu prusza się pierwsza - bEnabled&=Axle0.Move(fDistance,!iAxleFirst); //oś z przodu pojazdu - } + else // gf: bez wywolania Move na postoju nie ma event0 + { + bEnabled &= Axle1.Move(fDistance, iAxleFirst); // oś z tyłu pojazdu prusza się pierwsza + bEnabled &= Axle0.Move(fDistance, !iAxleFirst); // oś z przodu pojazdu + } if (fDistance != 0.0) // nie liczyć ponownie, jeśli stoi { // liczenie pozycji pojazdu tutaj, bo jest używane w wielu miejscach vPosition = 0.5 * (Axle1.pPosition + Axle0.pPosition); //środek między skrajnymi osiami @@ -2049,7 +2053,7 @@ void TDynamicObject::Move(double fDistance) } mMatrix.Identity(); // to też można by od razu policzyć, ale potrzebne jest do wyświetlania mMatrix.BasisChange(vLeft, vUp, vFront); // przesuwanie jest jednak rzadziej niż - // renderowanie + // renderowanie mMatrix = Inverse(mMatrix); // wyliczenie macierzy dla pojazdu (potrzebna tylko do wyświetlania?) // if (MoverParameters->CategoryFlag&2) @@ -2076,7 +2080,7 @@ void TDynamicObject::Move(double fDistance) TTrack *t0 = Axle0.GetTrack(); // już po przesunięciu TTrack *t1 = Axle1.GetTrack(); if ((t0->eEnvironment == e_flat) && (t1->eEnvironment == e_flat)) // może być - // e_bridge... + // e_bridge... fShade = 0.0; // standardowe oświetlenie else { // jeżeli te tory mają niestandardowy stopień zacienienia (e_canyon, e_tunnel) @@ -2171,11 +2175,11 @@ void TDynamicObject::AttachPrev(TDynamicObject *Object, int iType) if ((MoverParameters->Power < 1.0) && (Object->MoverParameters->Power > 1.0)) // my nie mamy mocy, ale ten drugi ma iLights = Object->MoverParameters->iLights; // to w tym z mocą będą światła - // załączane, a w tym bez tylko widoczne + // załączane, a w tym bez tylko widoczne else if ((MoverParameters->Power > 1.0) && (Object->MoverParameters->Power < 1.0)) // my mamy moc, ale ten drugi nie ma Object->iLights = MoverParameters->iLights; // to w tym z mocą będą światła - // załączane, a w tym bez tylko widoczne + // załączane, a w tym bez tylko widoczne return; // SetPneumatic(1,1); //Ra: to i tak się nie wykonywało po return // SetPneumatic(1,0); @@ -2337,10 +2341,10 @@ bool TDynamicObject::Update(double dt, double dt1) // if ((!MoverParameters->PantCompFlag)&&(MoverParameters->CompressedVolume>=2.8)) // MoverParameters->PantVolume=MoverParameters->CompressedVolume; if (MoverParameters->PantPress < (MoverParameters->TrainType == dt_EZT ? 2.4 : 3.5)) - { // 3.5 wg http://www.transportszynowy.pl/eu06-07pneumat.php + { // 3.5 wg http://www.transportszynowy.pl/eu06-07pneumat.php //"Wyłączniki ciśnieniowe odbieraków prądu wyłączają sterowanie wyłącznika szybkiego - //oraz uniemożliwiają podniesienie odbieraków prądu, gdy w instalacji rozrządu - //ciśnienie spadnie poniżej wartości 3,5 bara." + // oraz uniemożliwiają podniesienie odbieraków prądu, gdy w instalacji rozrządu + // ciśnienie spadnie poniżej wartości 3,5 bara." // Ra 2013-12: Niebugocław mówi, że w EZT podnoszą się przy 2.5 // if (!MoverParameters->PantCompFlag) // MoverParameters->PantVolume=MoverParameters->CompressedVolume; @@ -2375,7 +2379,7 @@ bool TDynamicObject::Update(double dt, double dt1) ts.R = -0.5 * MoverParameters->BDist / sin(ts.R * 0.5); if ((ts.R > 15000.0) || (ts.R < -15000.0)) ts.R = 0.0; // szkoda czasu na zbyt duże promienie, 4km to promień nie wymagający - // przechyłki + // przechyłki } else ts.R = 0.0; @@ -2383,7 +2387,7 @@ bool TDynamicObject::Update(double dt, double dt1) // Ra: składową pochylenia wzdłużnego mamy policzoną w jednostkowym wektorze vFront ts.Len = 1.0; // Max0R(MoverParameters->BDist,MoverParameters->ADist); ts.dHtrack = -vFront.y; // Axle1.pPosition.y-Axle0.pPosition.y; //wektor między skrajnymi osiami - // (!!!odwrotny) + // (!!!odwrotny) ts.dHrail = (Axle1.GetRoll() + Axle0.GetRoll()) * 0.5; //średnia przechyłka pudła // TTrackParam tp; tp.Width = MyTrack->fTrackWidth; @@ -2447,14 +2451,14 @@ bool TDynamicObject::Update(double dt, double dt1) */ NoVoltTime = NoVoltTime + dt; if (NoVoltTime > 0.2) // jeśli brak zasilania dłużej niż 0.2 sekundy (25km/h pod - // izolatorem daje 0.15s) + // izolatorem daje 0.15s) { // Ra 2F1H: prowizorka, trzeba przechować napięcie, żeby nie wywalało WS pod - // izolatorem + // izolatorem if (MoverParameters->Vel > 0.5) // jeśli jedzie if (MoverParameters->PantFrontUp || MoverParameters->PantRearUp) // Ra 2014-07: doraźna blokada logowania - // zimnych lokomotyw - zrobić to trzeba - // inaczej + // zimnych lokomotyw - zrobić to trzeba + // inaczej // if (NoVoltTime>0.02) //tu można ograniczyć czas rozłączenia // if (DebugModeFlag) //logowanie nie zawsze if (MoverParameters->Mains) @@ -2744,7 +2748,7 @@ bool TDynamicObject::Update(double dt, double dt1) if (pants[0].fParamPants->hvPowerWire && pants[1].fParamPants->hvPowerWire) // i oba podłączone do drutów fPantCurrent = fCurrent * 0.5; // to dzielimy prąd równo na oba (trochę bez - // sensu, ale lepiej tak niż podwoić prąd) + // sensu, ale lepiej tak niż podwoić prąd) for (int i = 0; i < iAnimType[ANIM_PANTS]; ++i) { // pętla po wszystkich pantografach p = pants[i].fParamPants; @@ -2780,7 +2784,7 @@ bool TDynamicObject::Update(double dt, double dt1) (MoverParameters->PantRearVolt == 0.0)) sPantUp.Play(vol, 0, MechInside, vPosition); if (p->hvPowerWire) // TODO: wyliczyć trzeba prąd przypadający na pantograf i - // wstawić do GetVoltage() + // wstawić do GetVoltage() { MoverParameters->PantFrontVolt = p->hvPowerWire->VoltageGet(MoverParameters->Voltage, fPantCurrent); @@ -2804,7 +2808,7 @@ bool TDynamicObject::Update(double dt, double dt1) (MoverParameters->PantFrontVolt == 0.0)) sPantUp.Play(vol, 0, MechInside, vPosition); if (p->hvPowerWire) // TODO: wyliczyć trzeba prąd przypadający na pantograf i - // wstawić do GetVoltage() + // wstawić do GetVoltage() { MoverParameters->PantRearVolt = p->hvPowerWire->VoltageGet(MoverParameters->Voltage, fPantCurrent); @@ -2833,7 +2837,7 @@ bool TDynamicObject::Update(double dt, double dt1) { if (PantDiff > 0.001) // jeśli nie dolega do drutu { // jeśli poprzednia wysokość jest mniejsza niż pożądana, zwiększyć kąt dolnego - // ramienia zgodnie z ciśnieniem + // ramienia zgodnie z ciśnieniem if (pantspeedfactor > 0.55 * PantDiff) // 0.55 to około pochodna kąta po wysokości k += 0.55 * PantDiff; // ograniczenie "skoku" w danej klatce @@ -2889,7 +2893,7 @@ bool TDynamicObject::Update(double dt, double dt1) { // to coś wyłączało dźwięk silnika w ST43! MoverParameters->ConverterFlag = false; MoverParameters->CompressorFlag = false; // Ra: to jest wątpliwe - wyłączenie - // sprężarki powinno być w jednym miejscu! + // sprężarki powinno być w jednym miejscu! } } } @@ -3013,7 +3017,7 @@ bool TDynamicObject::Update(double dt, double dt1) else { CouplCounter = 25; // a bezruch nie, ale trzeba zaktualizować odległość, bo zawalidroga może - // sobie pojechać + // sobie pojechać } if (MoverParameters->DerailReason > 0) { @@ -3366,7 +3370,7 @@ void TDynamicObject::RenderSounds() if ((MoverParameters->DynamicBrakeFlag) && (MoverParameters->EnginePower > 0.1) && (MoverParameters->EngineType == ElectricSeriesMotor)) // Szociu - 29012012 - jeżeli uruchomiony jest hamulec - // elektrodynamiczny, odtwarzany jest dźwięk silnika + // elektrodynamiczny, odtwarzany jest dźwięk silnika vol += 0.8; if (enginevolume > 0.0001) @@ -3601,7 +3605,7 @@ void TDynamicObject::RenderSounds() if (MoverParameters->DoorClosureWarning) { if (MoverParameters->DepartureSignal) // NBMX sygnal odjazdu, MC: pod warunkiem ze jest - // zdefiniowane w chk + // zdefiniowane w chk sDepartureSignal.TurnOn(MechInside, GetPosition()); else sDepartureSignal.TurnOff(MechInside, GetPosition()); @@ -3755,7 +3759,7 @@ void TDynamicObject::RenderAlpha() // McZapkie-250202 // wczytywanie pliku z danymi multimedialnymi (dzwieki) void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, - AnsiString ReplacableSkin) + AnsiString ReplacableSkin) { double dSDist; TFileStream *fs; @@ -3806,7 +3810,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, } if ((i = asModel.Pos(",")) > 0) { // Ra 2015-01: może szukać przecinka w nazwie modelu, a po przecinku była by liczba - // tekstur? + // tekstur? if (i < asModel.Length()) iMultiTex = asModel[i + 1] - '0'; if (iMultiTex < 0) @@ -3866,7 +3870,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, if (!ReplacableSkin.IsEmpty()) { // próba wycięcia trzeciej nazwy iMultiTex = -4; // skoro zostało coś po kresce, to są co - // najmniej cztery + // najmniej cztery ReplacableSkinID[-iMultiTex] = TTexturesManager::GetTextureID( NULL, NULL, @@ -3902,7 +3906,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, Global::iDynamicFiltering); if (ReplacableSkinID[4]) iMultiTex = 4; // jak są cztery, to blokujemy podmianę tekstury - // rozkładem + // rozkładem } } } @@ -3918,22 +3922,22 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, NULL, NULL, ReplacableSkin.c_str(), Global::iDynamicFiltering); if (TTexturesManager::GetAlpha(ReplacableSkinID[1])) iAlpha = 0x31310031; // tekstura -1 z kanałem alfa - nie renderować w cyklu - // nieprzezroczystych + // nieprzezroczystych else iAlpha = 0x30300030; // wszystkie tekstury nieprzezroczyste - nie renderować w - // cyklu przezroczystych + // cyklu przezroczystych if (ReplacableSkinID[2]) if (TTexturesManager::GetAlpha(ReplacableSkinID[2])) iAlpha |= 0x02020002; // tekstura -2 z kanałem alfa - nie renderować w cyklu - // nieprzezroczystych + // nieprzezroczystych if (ReplacableSkinID[3]) if (TTexturesManager::GetAlpha(ReplacableSkinID[3])) iAlpha |= 0x04040004; // tekstura -3 z kanałem alfa - nie renderować w cyklu - // nieprzezroczystych + // nieprzezroczystych if (ReplacableSkinID[4]) if (TTexturesManager::GetAlpha(ReplacableSkinID[4])) iAlpha |= 0x08080008; // tekstura -4 z kanałem alfa - nie renderować w cyklu - // nieprzezroczystych + // nieprzezroczystych } // Winger 040304 - ladowanie przedsionkow dla EZT if (MoverParameters->TrainType == dt_EZT) @@ -3984,7 +3988,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, str = Parser->GetNextSymbol().LowerCase(); if (str == AnsiString("animations:")) { // Ra: ustawienie ilości poszczególnych animacji - musi być jako pierwsze, inaczej - // ilości będą domyślne + // ilości będą domyślne if (!pAnimations) { // jeśli nie ma jeszcze tabeli animacji, można odczytać nowe ilości int co = 0, ile; @@ -3992,7 +3996,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, do { // kolejne liczby to ilość animacj, -1 to znacznik końca ile = Parser->GetNextSymbol().ToIntDef(-1); // ilość danego typu - // animacji + // animacji // if (co==ANIM_PANTS) // if (!Global::bLoadTraction) // if (!DebugModeFlag) //w debugmode pantografy mają "niby działać" @@ -4030,7 +4034,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, if (j == ANIM_PANTS) // zliczamy poprzednie animacje if (!pants) if (iAnimType[ANIM_PANTS]) // o ile jakieś pantografy są (a - // domyślnie są) + // domyślnie są) pants = pAnimations + k; // zapamiętanie na potrzeby wyszukania submodeli pAnimations[k].iShift = sm; // przesunięcie do przydzielenia wskaźnika @@ -4082,7 +4086,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, if (pAnimations[i].smAnimated) { //++iAnimatedAxles; pAnimations[i].smAnimated->WillBeAnimated(); // wyłączenie optymalizacji - // transformu + // transformu pAnimations[i].yUpdate = UpdateAxle; // animacja osi pAnimations[i].fMaxDist = 50 * @@ -4092,8 +4096,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, MoverParameters ->WheelDiameter; // 50m do kwadratu, a średnica do trzeciej pAnimations[i].fMaxDist *= Global::fDistanceFactor; // współczynnik - // przeliczeniowy - // jakości ekranu + // przeliczeniowy + // jakości ekranu } } // Ra: ustawianie indeksów osi @@ -4121,12 +4125,12 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, else if ((k >= '1') && (k <= '9')) { pAnimations[i++].dWheelAngle = dWheelAngle + m; // obrót osi - // tocznych + // tocznych --k; // następna będzie albo taka sama, albo bierzemy kolejny znak } else k = MoverParameters->AxleArangement[j++]; // pobranie kolejnego - // znaku + // znaku } } } @@ -4162,17 +4166,17 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, // m(3)[1]=m[3][1]+0.054; //w górę o wysokość ślizgu (na razie tak) if ((mdModel->Flags() & 0x8000) == 0) // jeśli wczytano z T3D m.InitialRotate(); // może być potrzebny dodatkowy obrót, jeśli - // wczytano z T3D, tzn. przed wykonaniem - // Init() + // wczytano z T3D, tzn. przed wykonaniem + // Init() pants[i].fParamPants->vPos.z = m[3][0]; // przesunięcie w bok (asymetria) pants[i].fParamPants->vPos.y = m[3][1]; // przesunięcie w górę odczytane z modelu if ((sm = pants[i].smElement[0]->ChildGet()) != NULL) { // jeśli ma potomny, można policzyć długość (odległość potomnego - // od osi obrotu) + // od osi obrotu) m = float4x4(*sm->GetMatrix()); // wystarczyłby wskaźnik, nie - // trzeba kopiować + // trzeba kopiować // może trzeba: pobrać macierz dolnego ramienia, wyzerować // przesunięcie, przemnożyć przez macierz górnego pants[i].fParamPants->fHoriz = -fabs(m[3][1]); @@ -4189,18 +4193,18 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, // pants[i].fParamPants->fAngleL0=pants[i].fParamPants->fAngleL; pants[i].fParamPants->fAngleL = pants[i].fParamPants->fAngleL0; // początkowy kąt dolnego - // ramienia + // ramienia if ((sm = sm->ChildGet()) != NULL) { // jeśli dalej jest ślizg, można policzyć długość górnego - // ramienia + // ramienia m = float4x4(*sm->GetMatrix()); // wystarczyłby wskaźnik, - // nie trzeba kopiować + // nie trzeba kopiować // trzeba by uwzględnić macierz dolnego ramienia, żeby // uzyskać kąt do poziomu... pants[i].fParamPants->fHoriz += fabs(m(3)[1]); // różnica długości rzutów ramion na - // płaszczyznę podstawy (jedna dodatnia, - // druga ujemna) + // płaszczyznę podstawy (jedna dodatnia, + // druga ujemna) pants[i].fParamPants->fLenU1 = hypot(m[3][1], m[3][2]); // po osi OX nie potrzeba // pants[i].fParamPants->pantu=acos((1.22*cos(pants[i].fParamPants->fAngleL)+0.535)/1.755); @@ -4210,7 +4214,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, pants[i].fParamPants->fAngleU0 = atan2(fabs(m[3][2]), fabs(m[3][1])); // początkowy kąt górnego - // ramienia, odczytany z modelu + // ramienia, odczytany z modelu // if (pants[i].fParamPants->fAngleU0fAngleU0+=M_PI; //gdyby w odwrotną // stronę wyszło @@ -4225,25 +4229,25 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, // Ra: ze względu na to, że niektóre modele pantografów są // zrąbane, ich mierzenie ma obecnie ograniczony sens sm->ParentMatrix(&m); // pobranie macierzy transformacji - // pivota ślizgu względem wstawienia - // pojazdu + // pivota ślizgu względem wstawienia + // pojazdu if ((mdModel->Flags() & 0x8000) == 0) // jeśli wczytano z - // T3D + // T3D m.InitialRotate(); // może być potrzebny dodatkowy - // obrót, jeśli wczytano z T3D, tzn. - // przed wykonaniem Init() + // obrót, jeśli wczytano z T3D, tzn. + // przed wykonaniem Init() float det = Det(m); if (fabs(det - 1.0) < 0.001) // dopuszczamy 1 promil błędu - // na skalowaniu ślizgu + // na skalowaniu ślizgu { // skalowanie jest w normie, można pobrać wymiary z modelu pants[i].fParamPants->fHeight = sm->MaxY(m); // przeliczenie maksimum wysokości - // wierzchołków względem macierzy + // wierzchołków względem macierzy pants[i].fParamPants->fHeight -= m[3][1]; // odjęcie wysokości pivota ślizgu pants[i].fParamPants->vPos.x = m[3][2]; // przy okazji odczytać z modelu pozycję w - // długości + // długości // ErrorLog("Model OK: "+asModel+", // height="+pants[i].fParamPants->fHeight); // ErrorLog("Model OK: "+asModel+", @@ -4282,7 +4286,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, if (pants[i].fParamPants->vPos.y == 0.0) { // jeśli pierwsze ramię nie ustawiło tej wartości, próbować drugim //!!!! docelowo zrobić niezależną animację ramion z każdej - //strony + // strony m = float4x4( *sm->GetMatrix()); // skopiowanie, bo będziemy mnożyć m(3)[1] = @@ -4345,7 +4349,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, double pant1x = Parser->GetNextSymbol().ToDouble(); double pant2x = Parser->GetNextSymbol().ToDouble(); double pant1h = Parser->GetNextSymbol().ToDouble(); // wysokość pierwszego - // ślizgu + // ślizgu double pant2h = Parser->GetNextSymbol().ToDouble(); // wysokość drugiego ślizgu if (pant1h > 0.5) pant1h = pant2h; // tu może być zbyt duża wartość @@ -4484,8 +4488,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, if (pAnimations[i + j].smAnimated) { //++iAnimatedDoors; pAnimations[i + j].smAnimated->WillBeAnimated(); // wyłączenie - // optymalizacji - // transformu + // optymalizacji + // transformu switch (MoverParameters->DoorOpenMethod) { // od razu zapinamy potrzebny typ animacji case 1: @@ -4557,7 +4561,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, ((MoverParameters->EngineType == ElectricSeriesMotor) || (MoverParameters->EngineType == ElectricInductionMotor)))) // plik z dzwiekiem wentylatora, mnozniki i - // ofsety amp. i czest. + // ofsety amp. i czest. { str = Parser->GetNextSymbol(); rsWentylator.Init(str.c_str(), Parser->GetNextSymbol().ToDouble(), @@ -4630,7 +4634,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, rsDerailment.FA = 0.0; } else if (str == AnsiString("dieselinc:")) // dzwiek przy wlazeniu na obroty - // woodwarda + // woodwarda { str = Parser->GetNextSymbol(); rsDiesielInc.Init(str.c_str(), Parser->GetNextSymbol().ToDouble(), @@ -4769,7 +4773,7 @@ void TDynamicObject::RadioStop() { // zatrzymanie pojazdu if (Mechanik) // o ile ktoś go prowadzi if (MoverParameters->SecuritySystem.RadioStop) // jeśli pojazd ma RadioStop i jest on - // aktywny + // aktywny Mechanik->PutCommand("Emergency_brake", 1.0, 1.0, &vPosition, stopRadio); }; @@ -4828,7 +4832,7 @@ int TDynamicObject::DirectionSet(int d) ABuScanObjects(-1, 300); } return 1 - (iDirection ? NextConnectedNo : PrevConnectedNo); // informacja o położeniu - // następnego + // następnego }; TDynamicObject *__fastcall TDynamicObject::PrevAny() @@ -4865,7 +4869,7 @@ double TDynamicObject::NextDistance(double d) TDynamicObject *__fastcall TDynamicObject::Neightbour(int &dir) { // ustalenie następnego (1) albo poprzedniego (0) w składzie bez względu na prawidłowość - // iDirection + // iDirection int d = dir; // zapamiętanie kierunku dir = 1 - (dir ? NextConnectedNo : PrevConnectedNo); // nowa wartość return (d ? (MoverParameters->Couplers[1].CouplingFlag ? NextConnected : NULL) : @@ -4891,14 +4895,14 @@ void TDynamicObject::CoupleDist() if (MoverParameters->Couplers[0].CouplingFlag == 0) // jeśli wirtualny if (MoverParameters->Couplers[0].CoupleDist < 300.0) // i mniej niż 300m { // przez MoverParameters->Couplers[0].Connected nie da się dostać do DynObj, stąd - // prowizorka + // prowizorka // WriteLog("Collision of // "+AnsiString(MoverParameters->Couplers[0].CoupleDist)+"m detected by // "+asName+":0."); w = 0.5 * (MoverParameters->Couplers[0].Connected->Dim.W + MoverParameters->Dim.W); // minimalna odległość minięcia d = -DotProduct(vLeft, vCoulpler[0]); // odległość prostej ruchu od początku - // układu współrzędnych + // układu współrzędnych d = fabs( DotProduct(vLeft, ((TMoverParameters *)(MoverParameters->Couplers[0].Connected)) @@ -4919,7 +4923,7 @@ void TDynamicObject::CoupleDist() w = 0.5 * (MoverParameters->Couplers[1].Connected->Dim.W + MoverParameters->Dim.W); // minimalna odległość minięcia d = -DotProduct(vLeft, vCoulpler[1]); // odległość prostej ruchu od początku - // układu współrzędnych + // układu współrzędnych d = fabs( DotProduct(vLeft, ((TMoverParameters *)(MoverParameters->Couplers[1].Connected)) @@ -4935,7 +4939,7 @@ void TDynamicObject::CoupleDist() TDynamicObject *__fastcall TDynamicObject::ControlledFind() { // taka proteza: chcę podłączyć kabinę EN57 bezpośrednio z silnikowym, aby nie robić tego przez - // ukrotnienie + // ukrotnienie // drugi silnikowy i tak musi być ukrotniony, podobnie jak kolejna jednostka // lepiej by było przesyłać komendy sterowania, co jednak wymaga przebudowy transmisji komend // (LD) diff --git a/DynObj.h b/DynObj.h index 6680302a..854e1a46 100644 --- a/DynObj.h +++ b/DynObj.h @@ -102,13 +102,13 @@ class TAnimPant class TAnim { // klasa animowanej części pojazdu (koła, drzwi, pantografy, burty, napęd parowozu, siłowniki - // itd.) + // itd.) public: union { TSubModel *smAnimated; // animowany submodel (jeśli tylko jeden, np. oś) TSubModel **smElement; // jeśli animowanych elementów jest więcej (pantograf, napęd - // parowozu) + // parowozu) int iShift; // przesunięcie przed przydzieleniem wskaźnika }; union @@ -153,7 +153,7 @@ class TDynamicObject TTrackFollower Axle0; // oś z przodu (od sprzęgu 0) TTrackFollower Axle1; // oś z tyłu (od sprzęgu 1) int iAxleFirst; // numer pierwszej osi w kierunku ruchu (oś wiążąca pojazd z torem i wyzwalająca - // eventy) + // eventy) float fAxleDist; // rozstaw wózków albo osi do liczenia proporcji zacienienia vector3 modelRot; // obrot pudła względem świata - do przeanalizowania, czy potrzebne!!! // bool bCameraNear; //blisko kamer są potrzebne dodatkowe obliczenia szczegółów @@ -189,7 +189,7 @@ class TDynamicObject TSubModel ** pAnimated; // lista animowanych submodeli (może być ich więcej niż obiektów animujących) double dWheelAngle[3]; // kąty obrotu kół: 0=przednie toczne, 1=napędzające i wiązary, 2=tylne - // toczne + // toczne void UpdateNone(TAnim *pAnim){}; // animacja pusta (funkcje ustawiania submodeli, gdy blisko kamery) void UpdateAxle(TAnim *pAnim); // animacja osi @@ -332,20 +332,32 @@ class TDynamicObject public: int *iLights; // wskaźnik na bity zapalonych świateł (własne albo innego członu) double fTrackBlock; // odległość do przeszkody do dalszego ruchu (wykrywanie kolizji z innym - // pojazdem) + // pojazdem) TDynamicObject *__fastcall PrevAny(); TDynamicObject *__fastcall Prev(); TDynamicObject *__fastcall Next(); TDynamicObject *__fastcall NextC(int C); double NextDistance(double d = -1.0); - void SetdMoveLen(double dMoveLen) { MoverParameters->dMoveLen = dMoveLen; } - void ResetdMoveLen() { MoverParameters->dMoveLen = 0; } - double GetdMoveLen() { return MoverParameters->dMoveLen; } + void SetdMoveLen(double dMoveLen) + { + MoverParameters->dMoveLen = dMoveLen; + } + void ResetdMoveLen() + { + MoverParameters->dMoveLen = 0; + } + double GetdMoveLen() + { + return MoverParameters->dMoveLen; + } int GetPneumatic(bool front, bool red); void SetPneumatic(bool front, bool red); AnsiString asName; - AnsiString GetName() { return this ? asName : AnsiString(""); }; + AnsiString GetName() + { + return this ? asName : AnsiString(""); + }; TRealSound rsDiesielInc; // youBy TRealSound rscurve; // youBy @@ -375,10 +387,10 @@ class TDynamicObject int iAlpha; // maska przezroczystości tekstur int iMultiTex; //<0 tekstury wskazane wpisem, >0 tekstury z przecinkami, =0 jedna int iOverheadMask; // maska przydzielana przez AI pojazdom posiadającym pantograf, aby wymuszały - // jazdę bezprądową + // jazdę bezprądową TTractionParam tmpTraction; double fAdjustment; // korekcja - docelowo przenieść do TrkFoll.cpp wraz z odległością od - // poprzedniego + // poprzedniego TDynamicObject(); ~TDynamicObject(); double TDynamicObject::Init( // zwraca długość pojazdu albo 0, jeśli błąd @@ -395,7 +407,10 @@ class TDynamicObject void Render(); void RenderAlpha(); void RenderSounds(); - inline vector3 GetPosition() { return vPosition; }; + inline vector3 GetPosition() + { + return vPosition; + }; inline vector3 HeadPosition() { return vCoulpler[iDirection ^ 1]; @@ -408,13 +423,34 @@ class TDynamicObject { return iAxleFirst ? Axle1.pPosition : Axle0.pPosition; }; - inline vector3 VectorFront() { return vFront; }; - inline vector3 VectorUp() { return vUp; }; - inline vector3 VectorLeft() { return vLeft; }; - inline double *__fastcall Matrix() { return mMatrix.getArray(); }; - inline double GetVelocity() { return MoverParameters->Vel; }; - inline double GetLength() { return MoverParameters->Dim.L; }; - inline double GetWidth() { return MoverParameters->Dim.W; }; + inline vector3 VectorFront() + { + return vFront; + }; + inline vector3 VectorUp() + { + return vUp; + }; + inline vector3 VectorLeft() + { + return vLeft; + }; + inline double *__fastcall Matrix() + { + return mMatrix.getArray(); + }; + inline double GetVelocity() + { + return MoverParameters->Vel; + }; + inline double GetLength() + { + return MoverParameters->Dim.L; + }; + inline double GetWidth() + { + return MoverParameters->Dim.W; + }; inline TTrack *__fastcall GetTrack() { return (iAxleFirst ? Axle1.GetTrack() : Axle0.GetTrack()); @@ -422,8 +458,7 @@ class TDynamicObject // void UpdatePos(); // McZapkie-260202 - void LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, - AnsiString ReplacableSkin); + void LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, AnsiString ReplacableSkin); inline double ABuGetDirection() // ABu. { @@ -463,7 +498,7 @@ class TDynamicObject TDynamicObject *__fastcall ControlledFind(); void ParamSet(int what, int into); int RouteWish(TTrack *tr); // zapytanie do AI, po którym segmencie skrzyżowania - // jechać + // jechać void DestinationSet(AnsiString to); AnsiString TextureTest(AnsiString &name); void OverheadTrack(float o); diff --git a/EU07.bpr b/EU07.bpr index 61f494f1..7db2e5df 100644 --- a/EU07.bpr +++ b/EU07.bpr @@ -13,13 +13,13 @@ TractionPower.obj parser.obj sky.obj AirCoupler.obj opengl\glew.obj ResourceManager.obj VBO.obj TextureDDS.obj opengl\ARB_Multisample.obj Float3d.obj Classes.obj Driver.obj Names.obj Console.obj Mover.obj - Console\PoKeys55.obj Forth.obj Console\LPT.obj"/> + Console\PoKeys55.obj Forth.obj Console\LPT.obj PyInt.obj"/> - + @@ -33,8 +33,8 @@ - - + + @@ -58,8 +58,8 @@ IncludeVerInfo=1 AutoIncBuild=0 MajorVer=15 MinorVer=3 -Release=1167 -Build=470 +Release=1168 +Build=471 Debug=1 PreRelease=0 Special=0 @@ -71,8 +71,8 @@ CodePage=1250 [Version Info Keys] CompanyName=EU07 Team FileDescription=MaSzyna EU07-424 -FileVersion=15.3.1167.470 -InternalName=9th by firleju + SPKS + MP +FileVersion=15.3.1168.471 +InternalName=9th by firleju + SPKS + MP + python LegalCopyright= LegalTrademarks= OriginalFilename=eu07.exe @@ -81,12 +81,14 @@ ProductVersion=15.3 Comments= [HistoryLists\hlIncludePath] -Count=1 -Item0=Console;opengl;McZapkie;$(BCB)\include;$(BCB)\include\vcl +Count=2 +Item0=Console;opengl;McZapkie;$(BCB)\include;$(BCB)\include\vcl;python\include +Item1=Console;opengl;McZapkie;$(BCB)\include;$(BCB)\include\vcl [HistoryLists\hlLibraryPath] -Count=1 -Item0=Console;opengl;McZapkie;$(BCB)\lib\obj;$(BCB)\lib +Count=2 +Item0=Console;opengl;McZapkie;$(BCB)\lib\obj;$(BCB)\lib;python\libs +Item1=Console;opengl;McZapkie;$(BCB)\lib\obj;$(BCB)\lib [HistoryLists\hlDebugSourcePath] Count=2 diff --git a/EU07.cpp b/EU07.cpp index 1c4879e1..2d1cd249 100644 --- a/EU07.cpp +++ b/EU07.cpp @@ -33,6 +33,7 @@ USEUNIT("Camera.cpp"); USEUNIT("Texture.cpp"); USEUNIT("World.cpp"); USELIB("opengl\glut32.lib"); +USELIB("omf_python27.lib"); USEUNIT("Model3d.cpp"); USEUNIT("MdlMngr.cpp"); USEUNIT("Train.cpp"); @@ -80,10 +81,11 @@ USEUNIT("McZapkie\hamulce.pas"); USEUNIT("Console\PoKeys55.cpp"); USEUNIT("Forth.cpp"); USEUNIT("Console\LPT.cpp"); +USEUNIT("PyInt.cpp"); //--------------------------------------------------------------------------- #include "World.h" -HDC hDC = NULL; // Private GDI Device Context +HDC hDC = NULL; // Private GDI Device Context HGLRC hRC = NULL; // Permanent Rendering Context HWND hWnd = NULL; // Holds Our Window Handle @@ -122,15 +124,15 @@ GLvoid ReSizeGLScene(GLsizei width, GLsizei height) // resize and initialize the { WindowWidth = width; WindowHeight = height; - if (height == 0) // prevent a divide by zero by - height = 1; // making height equal one + if (height == 0) // prevent a divide by zero by + height = 1; // making height equal one glViewport(0, 0, width, height); // Reset The Current Viewport - glMatrixMode(GL_PROJECTION); // select the Projection Matrix - glLoadIdentity(); // reset the Projection Matrix + glMatrixMode(GL_PROJECTION); // select the Projection Matrix + glLoadIdentity(); // reset the Projection Matrix // calculate the aspect ratio of the window gluPerspective(45.0f, (GLdouble)width / (GLdouble)height, 0.2f, 2500.0f); glMatrixMode(GL_MODELVIEW); // select the Modelview Matrix - glLoadIdentity(); // reset the Modelview Matrix + glLoadIdentity(); // reset the Modelview Matrix } //--------------------------------------------------------------------------- @@ -172,7 +174,7 @@ GLvoid KillGLWindow(GLvoid) // properly kill the window if (fullscreen) // Are We In Fullscreen Mode? { ChangeDisplaySettings(NULL, 0); // if so switch back to the desktop - ShowCursor(TRUE); // show mouse pointer + ShowCursor(TRUE); // show mouse pointer } // KillFont(); } @@ -186,31 +188,31 @@ GLvoid KillGLWindow(GLvoid) // properly kill the window BOOL CreateGLWindow(char *title, int width, int height, int bits, bool fullscreenflag) { - GLuint PixelFormat; // holds the results after searching for a match - HINSTANCE hInstance; // holds the instance of the application - WNDCLASS wc; // windows class structure - DWORD dwExStyle; // window extended style - DWORD dwStyle; // window style - RECT WindowRect; // grabs rectangle upper left / lower right values - WindowRect.left = (long)0; // set left value to 0 - WindowRect.right = (long)width; // set right value to requested width - WindowRect.top = (long)0; // set top value to 0 + GLuint PixelFormat; // holds the results after searching for a match + HINSTANCE hInstance; // holds the instance of the application + WNDCLASS wc; // windows class structure + DWORD dwExStyle; // window extended style + DWORD dwStyle; // window style + RECT WindowRect; // grabs rectangle upper left / lower right values + WindowRect.left = (long)0; // set left value to 0 + WindowRect.right = (long)width; // set right value to requested width + WindowRect.top = (long)0; // set top value to 0 WindowRect.bottom = (long)height; // set bottom value to requested height fullscreen = fullscreenflag; // set the global fullscreen flag - hInstance = GetModuleHandle(NULL); // grab an instance for our window + hInstance = GetModuleHandle(NULL); // grab an instance for our window wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; // redraw on size, and own DC for window. - wc.lpfnWndProc = (WNDPROC)WndProc; // wndproc handles messages - wc.cbClsExtra = 0; // no extra window data - wc.cbWndExtra = 0; // no extra window data - wc.hInstance = hInstance; // set the instance - wc.hIcon = LoadIcon(NULL, IDI_WINLOGO); // load the default icon - wc.hCursor = LoadCursor(NULL, IDC_ARROW); // load the arrow pointer - wc.hbrBackground = NULL; // no background required for GL - wc.lpszMenuName = NULL; // we don't want a menu + wc.lpfnWndProc = (WNDPROC)WndProc; // wndproc handles messages + wc.cbClsExtra = 0; // no extra window data + wc.cbWndExtra = 0; // no extra window data + wc.hInstance = hInstance; // set the instance + wc.hIcon = LoadIcon(NULL, IDI_WINLOGO); // load the default icon + wc.hCursor = LoadCursor(NULL, IDC_ARROW); // load the arrow pointer + wc.hbrBackground = NULL; // no background required for GL + wc.lpszMenuName = NULL; // we don't want a menu wc.lpszClassName = "EU07"; // nazwa okna do komunikacji zdalnej - // // Set The Class Name + // // Set The Class Name if (!arbMultisampleSupported) // tylko dla pierwszego okna if (!RegisterClass(&wc)) // Attempt To Register The Window Class @@ -223,9 +225,9 @@ BOOL CreateGLWindow(char *title, int width, int height, int bits, bool fullscree if (fullscreen) // Attempt Fullscreen Mode? { - DEVMODE dmScreenSettings; // device mode + DEVMODE dmScreenSettings; // device mode memset(&dmScreenSettings, 0, sizeof(dmScreenSettings)); // makes sure memory's cleared - dmScreenSettings.dmSize = sizeof(dmScreenSettings); // size of the devmode structure + dmScreenSettings.dmSize = sizeof(dmScreenSettings); // size of the devmode structure // tolaris-240403: poprawka na odswiezanie monitora // locate primary monitor... @@ -254,9 +256,9 @@ BOOL CreateGLWindow(char *title, int width, int height, int bits, bool fullscree dmScreenSettings.dmDisplayFrequency = refreshrate; dmScreenSettings.dmFields = DM_DISPLAYFREQUENCY; } - dmScreenSettings.dmPelsWidth = width; // selected screen width + dmScreenSettings.dmPelsWidth = width; // selected screen width dmScreenSettings.dmPelsHeight = height; // selected screen height - dmScreenSettings.dmBitsPerPel = bits; // selected bits per pixel + dmScreenSettings.dmBitsPerPel = bits; // selected bits per pixel dmScreenSettings.dmFields = dmScreenSettings.dmFields | DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT; @@ -282,13 +284,13 @@ BOOL CreateGLWindow(char *title, int width, int height, int bits, bool fullscree if (fullscreen) // Are We Still In Fullscreen Mode? { - dwExStyle = WS_EX_APPWINDOW; // Window Extended Style + dwExStyle = WS_EX_APPWINDOW; // Window Extended Style dwStyle = WS_POPUP | WS_CLIPSIBLINGS | WS_CLIPCHILDREN; // Windows Style - ShowCursor(FALSE); // Hide Mouse Pointer + ShowCursor(FALSE); // Hide Mouse Pointer } else { - dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; // Window Extended Style + dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; // Window Extended Style dwStyle = WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN; // Windows Style } @@ -297,19 +299,19 @@ BOOL CreateGLWindow(char *title, int width, int height, int bits, bool fullscree // Create The Window if (NULL == - (hWnd = CreateWindowEx(dwExStyle, // Extended Style For The Window - "EU07", // Class Name - title, // Window Title - dwStyle | // Defined Window Style + (hWnd = CreateWindowEx(dwExStyle, // Extended Style For The Window + "EU07", // Class Name + title, // Window Title + dwStyle | // Defined Window Style WS_CLIPSIBLINGS | // Required Window Style - WS_CLIPCHILDREN, // Required Window Style + WS_CLIPCHILDREN, // Required Window Style 0, - 0, // Window Position + 0, // Window Position WindowRect.right - WindowRect.left, // Calculate Window Width WindowRect.bottom - WindowRect.top, // Calculate Window Height - NULL, // No Parent Window - NULL, // No Menu - hInstance, // Instance + NULL, // No Parent Window + NULL, // No Menu + hInstance, // Instance NULL))) // Dont Pass Anything To WM_CREATE { KillGLWindow(); // Reset The Display @@ -321,24 +323,24 @@ BOOL CreateGLWindow(char *title, int width, int height, int bits, bool fullscree static PIXELFORMATDESCRIPTOR pfd = // pfd Tells Windows How We Want Things To Be { sizeof(PIXELFORMATDESCRIPTOR), // Size Of This Pixel Format Descriptor - 1, // Version Number - PFD_DRAW_TO_WINDOW | // Format Must Support Window - PFD_SUPPORT_OPENGL | // Format Must Support OpenGL - PFD_DOUBLEBUFFER, // Must Support Double Buffering - PFD_TYPE_RGBA, // Request An RGBA Format - bits, // Select Our Color Depth + 1, // Version Number + PFD_DRAW_TO_WINDOW | // Format Must Support Window + PFD_SUPPORT_OPENGL | // Format Must Support OpenGL + PFD_DOUBLEBUFFER, // Must Support Double Buffering + PFD_TYPE_RGBA, // Request An RGBA Format + bits, // Select Our Color Depth 0, - 0, 0, 0, 0, 0, // Color Bits Ignored - 0, // No Alpha Buffer - 0, // Shift Bit Ignored - 0, // No Accumulation Buffer - 0, 0, 0, 0, // Accumulation Bits Ignored - 24, // 32Bit Z-Buffer (Depth Buffer) - 0, // No Stencil Buffer - 0, // No Auxiliary Buffer + 0, 0, 0, 0, 0, // Color Bits Ignored + 0, // No Alpha Buffer + 0, // Shift Bit Ignored + 0, // No Accumulation Buffer + 0, 0, 0, 0, // Accumulation Bits Ignored + 24, // 32Bit Z-Buffer (Depth Buffer) + 0, // No Stencil Buffer + 0, // No Auxiliary Buffer PFD_MAIN_PLANE, // Main Drawing Layer - 0, // Reserved - 0, 0, 0 // Layer Masks Ignored + 0, // Reserved + 0, 0, 0 // Layer Masks Ignored }; if (NULL == (hDC = GetDC(hWnd))) // Did We Get A Device Context? @@ -413,9 +415,9 @@ BOOL CreateGLWindow(char *title, int width, int height, int bits, bool fullscree return CreateGLWindow(title, width, height, bits, fullscreenflag); // rekurencja } - ShowWindow(hWnd, SW_SHOW); // show the window - SetForegroundWindow(hWnd); // slightly higher priority - SetFocus(hWnd); // sets keyboard focus to the window + ShowWindow(hWnd, SW_SHOW); // show the window + SetForegroundWindow(hWnd); // slightly higher priority + SetFocus(hWnd); // sets keyboard focus to the window ReSizeGLScene(width, height); // set up our perspective GL screen if (!InitGL()) // initialize our newly created GL Window @@ -579,7 +581,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, // handle for this window } case WM_MOVE: // przesuwanie okna? { - mx = WindowWidth / 2 + LOWORD(lParam); // horizontal position + mx = WindowWidth / 2 + LOWORD(lParam); // horizontal position my = WindowHeight / 2 + HIWORD(lParam); // vertical position // SetCursorPos(mx,my); break; @@ -739,7 +741,7 @@ int WINAPI WinMain(HINSTANCE hInstance, // instance // DrawGLScene() // if (!pause) // if (Global::bInactivePause?Global::bActive:true) //tak nie, bo spada z góry - if (World.Update()) // Was There A Quit Received? + if (World.Update()) // Was There A Quit Received? SwapBuffers(hDC); // Swap Buffers (Double Buffering) else done = true; //[F10] or DrawGLScene signalled a quit @@ -754,6 +756,3 @@ int WINAPI WinMain(HINSTANCE hInstance, // instance KillGLWindow(); // kill the window return (msg.wParam); // exit the program } - - - diff --git a/EU07.res b/EU07.res index b7e359bdce7b52f4c373dbb9f89009a0f563b355..8c269b7d32b2e973cc7cf05e3a4fe1b850b7a8cf 100644 GIT binary patch delta 108 zcmca0@kU~U4kx3+WL-{qAnD6#%zd440t+((KLe1S+|4P=ST}hkr!r&I5 J^GmLDMgY?l8h8Kz delta 80 zcmaDOaY15(4kshaWL-{qAnD6#%zc%ykA<0mp8-fu?&g$bOq#rsQ<>3j@>$N~{ALV# i3?>X_43-QG3_c8ElNWPoGY2swPQJ}0xtWbSjS&Dn4HKLI diff --git a/EvLaunch.cpp b/EvLaunch.cpp index 523e8b0c..b77593a8 100644 --- a/EvLaunch.cpp +++ b/EvLaunch.cpp @@ -43,9 +43,14 @@ TEventLauncher::TEventLauncher() iCheckMask = 0; } -TEventLauncher::~TEventLauncher() { SafeDeleteArray(szText); } +TEventLauncher::~TEventLauncher() +{ + SafeDeleteArray(szText); +} -void TEventLauncher::Init() {} +void TEventLauncher::Init() +{ +} bool TEventLauncher::Load(cParser *parser) { // wczytanie wyzwalacza zdarzeń diff --git a/Event.cpp b/Event.cpp index e4f584b4..fc3265df 100644 --- a/Event.cpp +++ b/Event.cpp @@ -31,7 +31,7 @@ TEvent::TEvent(AnsiString m) // asName=""; //czy nazwa eventu jest niezbędna w tym przypadku? chyba nie evNext = evNext2 = NULL; bEnabled = false; // false dla eventów używanych do skanowania sygnałów (nie dodawane do - // kolejki) + // kolejki) asNodeName = m; // nazwa obiektu powiązanego iQueued = 0; // nie został dodany do kolejki // bIsHistory=false; @@ -91,7 +91,7 @@ void TEvent::Conditions(cParser *parser, AnsiString s) if (!asNodeName.IsEmpty()) { // podczepienie łańcucha, jeśli nie jest pusty Params[9].asText = new char[asNodeName.Length() + 1]; // usuwane i zamieniane na - // wskaźnik + // wskaźnik strcpy(Params[9].asText, asNodeName.c_str()); } parser->getTokens(); @@ -313,7 +313,7 @@ void TEvent::Load(cParser *parser, vector3 *org) case tp_PutValues: parser->getTokens(3); *parser >> Params[3].asdouble >> Params[4].asdouble >> Params[5].asdouble; // położenie - // X,Y,Z + // X,Y,Z if (org) { // przesunięcie // tmp->pCenter.RotateY(aRotate.y/180.0*M_PI); //Ra 2014-11: uwzględnienie rotacji @@ -330,7 +330,7 @@ void TEvent::Load(cParser *parser, vector3 *org) if (str.Pos("#")) str = str.SubString(1, str.Pos("#") - 1); // obcięcie unikatowości bEnabled = false; // nie do kolejki (dla SetVelocity też, ale jak jest do toru - // dowiązany) + // dowiązany) Params[6].asCommand = cm_PassengerStopPoint; } else if (str == "SetVelocity") diff --git a/FadeSound.cpp b/FadeSound.cpp index 5213c69e..f369d85d 100644 --- a/FadeSound.cpp +++ b/FadeSound.cpp @@ -27,9 +27,14 @@ TFadeSound::TFadeSound() fTime = 0; } -TFadeSound::~TFadeSound() { Free(); } +TFadeSound::~TFadeSound() +{ + Free(); +} -void TFadeSound::Free() {} +void TFadeSound::Free() +{ +} void TFadeSound::Init(char *Name, float fNewFade) { @@ -47,7 +52,10 @@ void TFadeSound::TurnOn() fTime = fFade; } -void TFadeSound::TurnOff() { State = ss_ShuttingDown; } +void TFadeSound::TurnOff() +{ + State = ss_ShuttingDown; +} void TFadeSound::Update() { diff --git a/FadeSound.h b/FadeSound.h index 85f58dbd..65dabbc9 100644 --- a/FadeSound.h +++ b/FadeSound.h @@ -26,7 +26,10 @@ class TFadeSound void Init(char *Name, float fNewFade); void TurnOn(); void TurnOff(); - bool Playing() { return (State == ss_Commencing || State == ss_Starting); }; + bool Playing() + { + return (State == ss_Commencing || State == ss_Starting); + }; void Free(); void Update(); void Volume(long vol); diff --git a/Float3d.h b/Float3d.h index d1122c7f..4e0fc10a 100644 --- a/Float3d.h +++ b/Float3d.h @@ -37,7 +37,10 @@ inline float3 &operator+=(float3 &v1, const float3 &v2) v1.z += v2.z; return v1; }; -inline float3 operator-(const float3 &v) { return float3(-v.x, -v.y, -v.z); }; +inline float3 operator-(const float3 &v) +{ + return float3(-v.x, -v.y, -v.z); +}; inline float3 operator-(const float3 &v1, const float3 &v2) { return float3(v1.x - v2.x, v1.y - v2.y, v1.z - v2.z); @@ -46,8 +49,14 @@ inline float3 operator+(const float3 &v1, const float3 &v2) { return float3(v1.x + v2.x, v1.y + v2.y, v1.z + v2.z); }; -double inline float3::Length() const { return sqrt(x * x + y * y + z * z); }; -inline float3 operator/(const float3 &v, double k) { return float3(v.x / k, v.y / k, v.z / k); }; +double inline float3::Length() const +{ + return sqrt(x * x + y * y + z * z); +}; +inline float3 operator/(const float3 &v, double k) +{ + return float3(v.x / k, v.y / k, v.z / k); +}; inline float3 SafeNormalize(const float3 &v) { // bezpieczna normalizacja (wektor długości 1.0) double l = v.Length(); @@ -79,8 +88,14 @@ class float4 z = c; w = d; }; - double inline float4::LengthSquared() const { return x * x + y * y + z * z + w * w; }; - double inline float4::Length() const { return sqrt(x * x + y * y + z * z + w * w); }; + double inline float4::LengthSquared() const + { + return x * x + y * y + z * z + w * w; + }; + double inline float4::Length() const + { + return sqrt(x * x + y * y + z * z + w * w); + }; }; inline float4 operator*(const float4 &q1, const float4 &q2) { // mnożenie to prawie jak mnożenie macierzy @@ -177,15 +192,24 @@ class float4x4 for (int i = 0; i < 16; ++i) e[i] = f[i]; }; - float *__fastcall operator()(int i) { return &e[i << 2]; } - const float *__fastcall readArray(void) { return e; } + float *__fastcall operator()(int i) + { + return &e[i << 2]; + } + const float *__fastcall readArray(void) + { + return e; + } void Identity() { for (int i = 0; i < 16; ++i) e[i] = 0; e[0] = e[5] = e[10] = e[15] = 1.0f; } - const float *operator[](int i) const { return &e[i << 2]; }; + const float *operator[](int i) const + { + return &e[i << 2]; + }; void InitialRotate() { // taka specjalna rotacja, nie ma co ciągać trygonometrii float f; @@ -206,7 +230,10 @@ class float4x4 return true; } void Quaternion(float4 *q); - inline float3 *TranslationGet() { return (float3 *)(e + 12); } + inline float3 *TranslationGet() + { + return (float3 *)(e + 12); + } }; inline float3 operator*(const float4x4 &m, const float3 &v) diff --git a/Gauge.cpp b/Gauge.cpp index 0421eef7..1772754f 100644 --- a/Gauge.cpp +++ b/Gauge.cpp @@ -46,8 +46,8 @@ void TGauge::Clear() fDesiredValue = 0; }; -void TGauge::Init(TSubModel *NewSubModel, TGaugeType eNewType, double fNewScale, - double fNewOffset, double fNewFriction, double fNewValue) +void TGauge::Init(TSubModel *NewSubModel, TGaugeType eNewType, double fNewScale, double fNewOffset, + double fNewFriction, double fNewValue) { // ustawienie parametrów animacji submodelu if (NewSubModel) { // warunek na wszelki wypadek, gdyby się submodel nie podłączył @@ -168,7 +168,7 @@ void TGauge::Update() case gt_Digital: // Ra 2014-07: licznik cyfrowy sm = SubModel->ChildGet(); AnsiString n = FormatFloat("0000000000", floor(fValue)); // na razie tak trochę bez - // sensu + // sensu do { // pętla po submodelach potomnych i obracanie ich o kąt zależy od cyfry w (fValue) if (sm->pName) diff --git a/Gauge.h b/Gauge.h index 228d0ab2..703c3f4b 100644 --- a/Gauge.h +++ b/Gauge.h @@ -22,7 +22,7 @@ typedef enum gt_Rotate, // obrót gt_Move, // przesunięcie równoległe gt_Wiper, // obrót trzech kolejnych submodeli o ten sam kąt (np. wycieraczka, drzwi - // harmonijkowe) + // harmonijkowe) gt_Digital // licznik cyfrowy, np. kilometrów } TGaugeType; @@ -49,15 +49,17 @@ class TGauge // zmienne "gg" ~TGauge(); void Clear(); void Init(TSubModel *NewSubModel, TGaugeType eNewTyp, double fNewScale = 1, - double fNewOffset = 0, double fNewFriction = 0, double fNewValue = 0); - bool Load(TQueryParserComp *Parser, TModel3d *md1, TModel3d *md2 = NULL, - double mul = 1.0); + double fNewOffset = 0, double fNewFriction = 0, double fNewValue = 0); + bool Load(TQueryParserComp *Parser, TModel3d *md1, TModel3d *md2 = NULL, double mul = 1.0); void PermIncValue(double fNewDesired); void IncValue(double fNewDesired); void DecValue(double fNewDesired); void UpdateValue(double fNewDesired); void PutValue(double fNewDesired); - float GetValue() { return fValue; }; + float GetValue() + { + return fValue; + }; void Update(); void Render(); void AssignFloat(float *fValue); diff --git a/Geom.cpp b/Geom.cpp index 4ea477c8..6d42ab00 100644 --- a/Geom.cpp +++ b/Geom.cpp @@ -19,11 +19,17 @@ http://mozilla.org/MPL/2.0/. #include "Globals.h" #include "Geom.h" -__fastcall TGeometry::TGeometry() {} +__fastcall TGeometry::TGeometry() +{ +} -__fastcall TGeometry::~TGeometry() {} +__fastcall TGeometry::~TGeometry() +{ +} -bool TGeometry::Init() {} +bool TGeometry::Init() +{ +} vector3 TGeometry::Load(TQueryParserComp *Parser) { @@ -113,7 +119,9 @@ vector3 TGeometry::Load(TQueryParserComp *Parser) tmp->fSquareRadius += r; } -bool TGeometry::Render() {} +bool TGeometry::Render() +{ +} //--------------------------------------------------------------------------- #pragma package(smart_init) diff --git a/Globals.cpp b/Globals.cpp index 1a6be1a6..7eb2d449 100644 --- a/Globals.cpp +++ b/Globals.cpp @@ -49,9 +49,9 @@ double Global::fLuminance = 1.0; // jasno int Global::iReCompile = 0; // zwiększany, gdy trzeba odświeżyć siatki HWND Global::hWnd = NULL; // uchwyt okna int Global::iCameraLast = -1; -AnsiString Global::asRelease = "15.3.1167.470"; +AnsiString Global::asRelease = "15.3.1168.471"; AnsiString Global::asVersion = - "Compilation 2015-04-14, release " + Global::asRelease + "."; // tutaj, bo wysyłany + "Compilation 2015-04-17, release " + Global::asRelease + "."; // tutaj, bo wysyłany int Global::iViewMode = 0; // co aktualnie widać: 0-kabina, 1-latanie, 2-sprzęgi, 3-dokumenty int Global::iTextMode = 0; // tryb pracy wyświetlacza tekstowego int Global::iScreenMode[12] = {0, 0, 0, 0, 0, 0, @@ -263,16 +263,16 @@ void Global::ConfigParse(TQueryParserComp *qp, cParser *cp) else if (str == AnsiString("wireframe")) bWireFrame = (GetNextSymbol().LowerCase() == AnsiString("yes")); else if (str == AnsiString("debugmode")) // McZapkie! - DebugModeFlag uzywana w mover.pas, - // warto tez blokowac cheaty gdy false + // warto tez blokowac cheaty gdy false DebugModeFlag = (GetNextSymbol().LowerCase() == AnsiString("yes")); else if (str == AnsiString("soundenabled")) // McZapkie-040302 - blokada dzwieku - przyda - // sie do debugowania oraz na komp. bez karty - // dzw. + // sie do debugowania oraz na komp. bez karty + // dzw. bSoundEnabled = (GetNextSymbol().LowerCase() == AnsiString("yes")); // else if (str==AnsiString("renderalpha")) //McZapkie-1312302 - dwuprzebiegowe renderowanie // bRenderAlpha=(GetNextSymbol().LowerCase()==AnsiString("yes")); else if (str == AnsiString("physicslog")) // McZapkie-030402 - logowanie parametrow - // fizycznych dla kazdego pojazdu z maszynista + // fizycznych dla kazdego pojazdu z maszynista WriteLogFlag = (GetNextSymbol().LowerCase() == AnsiString("yes")); else if (str == AnsiString("physicsdeactivation")) // McZapkie-291103 - usypianie fizyki PhysicActivationFlag = (GetNextSymbol().LowerCase() == AnsiString("yes")); @@ -310,7 +310,7 @@ void Global::ConfigParse(TQueryParserComp *qp, cParser *cp) fFriction = GetNextSymbol().ToDouble(); else if (str == AnsiString("livetraction")) { // Winger 160404 - zaleznosc napiecia loka od trakcji; Ra 2014-03: teraz prąd przy braku - // sieci + // sieci bLiveTraction = (GetNextSymbol().LowerCase() == AnsiString("yes")); } else if (str == AnsiString("skyenabled")) @@ -418,7 +418,7 @@ void Global::ConfigParse(TQueryParserComp *qp, cParser *cp) else if (str == AnsiString("slowmotion")) // tworzenie plików binarnych iSlowMotionMask = GetNextSymbol().ToIntDef(-1); // domyślnie -1 else if (str == AnsiString("modifytga")) // czy korygować pliki TGA dla szybszego - // wczytywania + // wczytywania iModifyTGA = GetNextSymbol().ToIntDef(0); // domyślnie 0 else if (str == AnsiString("hideconsole")) // hunter-271211: ukrywanie konsoli bHideConsole = (GetNextSymbol().LowerCase() == AnsiString("yes")); @@ -465,6 +465,10 @@ void Global::ConfigParse(TQueryParserComp *qp, cParser *cp) asLang = GetNextSymbol(); // domyślny język - http://tools.ietf.org/html/bcp47 else if (str == AnsiString("opengl")) // deklarowana wersja OpenGL, żeby powstrzymać błędy fOpenGL = GetNextSymbol().ToDouble(); // wymuszenie wersji OpenGL + else if (str == AnsiString("pyscreenrendererpriority")) // priority of python screen + // renderer + TPythonInterpreter::getInstance()->setScreenRendererPriority( + GetNextSymbol().LowerCase().c_str()); } while (str != "endconfig"); //(!Parser->EndOfFile) // na koniec trochę zależności if (!bLoadTraction) // wczytywanie drutów i słupów diff --git a/Globals.h b/Globals.h index b0bdb96d..e12443a9 100644 --- a/Globals.h +++ b/Globals.h @@ -14,16 +14,17 @@ http://mozilla.org/MPL/2.0/. #include "system.hpp" #include "opengl/glew.h" #include "dumb3d.h" +#include "PyInt.h" //#include "Classes.h" using namespace Math3D; // definicje klawiszy -const int k_IncMainCtrl = 0; //[Num+] +const int k_IncMainCtrl = 0; //[Num+] const int k_IncMainCtrlFAST = 1; //[Num+] [Shift] -const int k_DecMainCtrl = 2; //[Num-] +const int k_DecMainCtrl = 2; //[Num-] const int k_DecMainCtrlFAST = 3; //[Num-] [Shift] -const int k_IncScndCtrl = 4; //[Num/] +const int k_IncScndCtrl = 4; //[Num/] const int k_IncScndCtrlFAST = 5; const int k_DecScndCtrl = 6; const int k_DecScndCtrlFAST = 7; @@ -151,7 +152,7 @@ class TTranscripts ~TTranscripts(); void AddLine(char *txt, float show, float hide, bool it); void Add(char *txt, float len, - bool backgorund = false); // dodanie tekstów, długość dźwięku, czy istotne + bool backgorund = false); // dodanie tekstów, długość dźwięku, czy istotne void Update(); // usuwanie niepotrzebnych (ok. 10 razy na sekundę) }; @@ -206,7 +207,10 @@ class Global static AnsiString asHumanCtrlVehicle; static void LoadIniFile(AnsiString asFileName); static void InitKeys(AnsiString asFileName); - inline static vector3 GetCameraPosition() { return pCameraPosition; }; + inline static vector3 GetCameraPosition() + { + return pCameraPosition; + }; static void SetCameraPosition(vector3 pNewCameraPosition); static void SetCameraRotation(double Yaw); static int iWriteLogEnabled; // maska bitowa: 1-zapis do pliku, 2-okienko diff --git a/Ground.cpp b/Ground.cpp index 85e62ffe..88a6a0b4 100644 --- a/Ground.cpp +++ b/Ground.cpp @@ -276,7 +276,7 @@ void TGroundNode::RaRenderVBO() glColor3ub(Diffuse[0], Diffuse[1], Diffuse[2]); if (TextureID) glBindTexture(GL_TEXTURE_2D, TextureID); // Ustaw aktywną teksturę - glDrawArrays(iType, iVboPtr, iNumVerts); // Narysuj naraz wszystkie trójkąty + glDrawArrays(iType, iVboPtr, iNumVerts); // Narysuj naraz wszystkie trójkąty } void TGroundNode::RenderVBO() @@ -284,7 +284,7 @@ void TGroundNode::RenderVBO() double mgn = SquareMagnitude(pCenter - Global::pCameraPosition); if ((mgn > fSquareRadius || (mgn < fSquareMinRadius)) && (iType != TP_EVLAUNCH)) // McZapkie-070602: nie rysuj odleglych obiektow ale sprawdzaj - // wyzwalacz zdarzen + // wyzwalacz zdarzen return; int i, a; switch (iType) @@ -556,8 +556,8 @@ void TGroundNode::RenderDL() // if (pTriGroup) if (pTriGroup!=this) return; //wyświetla go inny obiekt double mgn = SquareMagnitude(pCenter - Global::pCameraPosition); if ((mgn > fSquareRadius) || (mgn < fSquareMinRadius)) // McZapkie-070602: nie rysuj odleglych - // obiektow ale sprawdzaj wyzwalacz - // zdarzen + // obiektow ale sprawdzaj wyzwalacz + // zdarzen return; int i, a; switch (iType) @@ -1379,7 +1379,7 @@ TGroundNode *__fastcall TGround::DynamicFind(AnsiString asNameToFind) void TGround::DynamicList(bool all) { // odesłanie nazw pojazdów dostępnych na scenerii (nazwy, szczególnie wagonów, mogą się - // powtarzać!) + // powtarzać!) for (TGroundNode *Current = nRootDynamic; Current; Current = Current->nNext) if (all || Current->DynamicObject->Mechanik) WyslijString(Current->asName, 6); // same nazwy pojazdów @@ -1626,9 +1626,8 @@ TGroundNode *__fastcall TGround::AddGroundNode(cParser *parser) *parser >> tmp->hvTraction->NominalVoltage >> tmp->hvTraction->MaxCurrent >> tmp->hvTraction->fResistivity; if (tmp->hvTraction->fResistivity == 0.01) // tyle jest w sceneriach [om/km] - tmp->hvTraction->fResistivity = - 0.075; // taka sensowniejsza wartość za - // http://www.ikolej.pl/fileadmin/user_upload/Seminaria_IK/13_05_07_Prezentacja_Kruczek.pdf + tmp->hvTraction->fResistivity = 0.075; // taka sensowniejsza wartość za + // http://www.ikolej.pl/fileadmin/user_upload/Seminaria_IK/13_05_07_Prezentacja_Kruczek.pdf tmp->hvTraction->fResistivity *= 0.001; // teraz [om/m] parser->getTokens(); *parser >> token; @@ -1722,7 +1721,7 @@ TGroundNode *__fastcall TGround::AddGroundNode(cParser *parser) if (sTracks->Update(TP_MEMCELL, tmp->asName.c_str(), tmp)) // najpierw sprawdzić, czy już jest { // przy zdublowaniu wskaźnik zostanie podmieniony w drzewku na późniejszy (zgodność - // wsteczna) + // wsteczna) ErrorLog("Duplicated memcell: " + tmp->asName); // to zgłaszać duplikat } else @@ -1749,7 +1748,7 @@ TGroundNode *__fastcall TGround::AddGroundNode(cParser *parser) if (sTracks->Update(TP_TRACK, tmp->asName.c_str(), tmp)) // najpierw sprawdzić, czy już jest { // przy zdublowaniu wskaźnik zostanie podmieniony w drzewku na późniejszy (zgodność - // wsteczna) + // wsteczna) if (tmp->pTrack->iCategoryFlag & 1) // jeśli jest zdublowany tor kolejowy ErrorLog("Duplicated track: " + tmp->asName); // to zgłaszać duplikat } @@ -1802,7 +1801,7 @@ TGroundNode *__fastcall TGround::AddGroundNode(cParser *parser) parser->getTokens(); *parser >> token; DriverType = AnsiString(token.c_str()); // McZapkie:010303 - w przyszlosci rozne - // konfiguracje mechanik/pomocnik itp + // konfiguracje mechanik/pomocnik itp tf3 = fTrainSetVel; // prędkość parser->getTokens(); *parser >> token; @@ -1827,14 +1826,14 @@ TGroundNode *__fastcall TGround::AddGroundNode(cParser *parser) if (tf1 != -1.0) if (fabs(tf1) > 0.5) // maksymalna odległość między sprzęgami - do przemyślenia int1 = 0; // likwidacja sprzęgu, jeśli odległość zbyt duża - to powinno być - // uwzględniane w fizyce sprzęgów... + // uwzględniane w fizyce sprzęgów... TempConnectionType[iTrainSetWehicleNumber] = int1; // wartość dodatnia } else { // pojazd wstawiony luzem fTrainSetDist = 0; // zerowanie dodatkowego przesunięcia asTrainName = ""; // puste oznacza jazdę pojedynczego bez rozkładu, "none" jest dla - // składu (trainset) + // składu (trainset) parser->getTokens(); *parser >> token; str = AnsiString(token.c_str()); // track @@ -1898,7 +1897,7 @@ TGroundNode *__fastcall TGround::AddGroundNode(cParser *parser) .AllowedFlag & ctrain_depot) // jesli zablokowany TempConnectionType[iTrainSetWehicleNumber] |= ctrain_depot; // będzie - // blokada + // blokada iTrainSetWehicleNumber++; } else @@ -1995,7 +1994,7 @@ TGroundNode *__fastcall TGround::AddGroundNode(cParser *parser) if (sTracks->Update(TP_MODEL, tmp->asName.c_str(), tmp)) // najpierw sprawdzić, czy już jest { // przy zdublowaniu wskaźnik zostanie podmieniony w drzewku na późniejszy (zgodność - // wsteczna) + // wsteczna) ErrorLog("Duplicated model: " + tmp->asName); // to zgłaszać duplikat } else @@ -2057,7 +2056,7 @@ TGroundNode *__fastcall TGround::AddGroundNode(cParser *parser) str = AnsiString(token.c_str()); #ifdef _PROBLEND // PROBLEND Q: 13122011 - Szociu: 27012012 - PROBLEND = true; // domyslnie uruchomione nowe wyświetlanie + PROBLEND = true; // domyslnie uruchomione nowe wyświetlanie tmp->PROBLEND = true; // odwolanie do tgroundnode, bo rendering jest w tej klasie if (str.Pos("@") > 0) // sprawdza, czy w nazwie tekstury jest znak "@" { @@ -2336,7 +2335,7 @@ void TGround::FirstInit() glFogi(GL_FOG_MODE, GL_LINEAR); glFogfv(GL_FOG_COLOR, Global::FogColor); // set fog color glFogf(GL_FOG_START, Global::fFogStart); // fog start depth - glFogf(GL_FOG_END, Global::fFogEnd); // fog end depth + glFogf(GL_FOG_END, Global::fFogEnd); // fog end depth glEnable(GL_FOG); } else @@ -2443,7 +2442,7 @@ bool TGround::Init(AnsiString asFile, HDC hDC) if (LastNode->iType != TP_DYNAMIC) { // jeśli nie jest pojazdem LastNode->nNext = nRootOfType[LastNode->iType]; // ostatni dodany dołączamy - // na końcu nowego + // na końcu nowego nRootOfType[LastNode->iType] = LastNode; // ustawienie nowego na początku listy iNumNodes++; @@ -2516,10 +2515,10 @@ bool TGround::Init(AnsiString asFile, HDC hDC) if (iTrainSetWehicleNumber ? !TempConnectionType[iTrainSetWehicleNumber - 1] : false) // jeśli ostatni pojazd ma sprzęg 0 LastNode->DynamicObject->RaLightsSet(-1, 2 + 32 + 64); // to założymy mu - // końcówki blaszane - // (jak AI się - // odpali, to sobie - // poprawi) + // końcówki blaszane + // (jak AI się + // odpali, to sobie + // poprawi) bTrainSet = false; fTrainSetVel = 0; // iTrainSetConnection=0; @@ -2569,7 +2568,7 @@ bool TGround::Init(AnsiString asFile, HDC hDC) ErrorLog("Duplicated event: " + tmp->asName); found->Append(tmp); // doczepka (taki wirtualny multiple bez warunków) found->Type = tp_Ignored; // dezaktywacja pierwotnego - taka proteza na - // wsteczną zgodność + // wsteczną zgodność // SafeDelete(tmp); //bezlitośnie usuwamy wszelkie duplikaty, żeby nie // zaśmiecać drzewka } @@ -2580,7 +2579,7 @@ bool TGround::Init(AnsiString asFile, HDC hDC) RootEvent = tmp; if (!found) { // jeśli nazwa wystąpiła, to do kolejki i wyszukiwarki dodawany jest tylko - // pierwszy + // pierwszy if (RootEvent->Type != tp_Ignored) if (RootEvent->asName.Pos( "onstart")) // event uruchamiany automatycznie po starcie @@ -2942,7 +2941,7 @@ bool TGround::InitEvents() Current->Params[9].asMemCell = tmp->MemCell; if (Current->Type == tp_GetValues) // jeśli odczyt komórki if (tmp->MemCell->IsVelocity()) // a komórka zawiera komendę SetVelocity albo - // ShuntVelocity + // ShuntVelocity Current->bEnabled = false; // to event nie będzie dodawany do kolejki } else @@ -3004,7 +3003,7 @@ bool TGround::InitEvents() if (Current->Params[9].asAnimContainer) { Current->Params[9].asAnimContainer->WillBeAnimated(); // oflagowanie - // animacji + // animacji if (!Current->Params[9] .asAnimContainer->Event()) // nie szukać, gdy znaleziony Current->Params[9].asAnimContainer->EventAssign( @@ -3194,24 +3193,23 @@ void TGround::InitTracks() if (Track->asEvent0Name.IsEmpty()) if (FindEvent(Current->asName + ":event0")) Track->asEvent0Name = Current->asName + ":event0"; - if (Track->asEvent1Name.IsEmpty()) + if (Track->asEvent1Name.IsEmpty()) if (FindEvent(Current->asName + ":event1")) Track->asEvent1Name = Current->asName + ":event1"; if (Track->asEvent2Name.IsEmpty()) if (FindEvent(Current->asName + ":event2")) Track->asEvent2Name = Current->asName + ":event2"; - if (Track->asEventall0Name.IsEmpty()) - if (FindEvent(Current->asName+":eventall0")) - Track->asEventall0Name=Current->asName+":eventall0"; - if (Track->asEventall1Name.IsEmpty()) - if (FindEvent(Current->asName+":eventall1")) - Track->asEventall1Name=Current->asName+":eventall1"; - if (Track->asEventall2Name.IsEmpty()) - if (FindEvent(Current->asName+":eventall2")) - Track->asEventall2Name=Current->asName+":eventall2"; - - } + if (Track->asEventall0Name.IsEmpty()) + if (FindEvent(Current->asName + ":eventall0")) + Track->asEventall0Name = Current->asName + ":eventall0"; + if (Track->asEventall1Name.IsEmpty()) + if (FindEvent(Current->asName + ":eventall1")) + Track->asEventall1Name = Current->asName + ":eventall1"; + if (Track->asEventall2Name.IsEmpty()) + if (FindEvent(Current->asName + ":eventall2")) + Track->asEventall2Name = Current->asName + ":eventall2"; + } Track->AssignEvents( Track->asEvent0Name.IsEmpty() ? NULL : FindEvent(Track->asEvent0Name), Track->asEvent1Name.IsEmpty() ? NULL : FindEventScan(Track->asEvent1Name), @@ -3237,7 +3235,7 @@ void TGround::InitTracks() if (!Model) // jak nie ma modelu break; // to pewnie jest wykolejnica, a ta jest domyślnie zamknięta i wykoleja case tt_Normal: // tylko proste są podłączane do rozjazdów, stąd dwa rozjazdy się nie - // połączą ze sobą + // połączą ze sobą if (Track->CurrentPrev() == NULL) // tylko jeśli jeszcze nie podłączony { tmp = FindTrack(Track->CurrentSegment()->FastGetPoint_0(), iConnection, Current); @@ -3379,7 +3377,7 @@ void TGround::InitTraction() nTemp->psTractionPowerSource = new TTractionPowerSource(); nTemp->psTractionPowerSource->Init(Traction->NominalVoltage, Traction->MaxCurrent); nTemp->nNext = nRootOfType[nTemp->iType]; // ostatni dodany dołączamy na końcu - // nowego + // nowego nRootOfType[nTemp->iType] = nTemp; // ustawienie nowego na początku listy iNumNodes++; } @@ -3401,12 +3399,12 @@ void TGround::InitTraction() } if (Traction->hvNext[0]) // jeśli został podłączony if (Traction->psSection && tmp->psSection) // tylko przęsło z izolatorem może nie - // mieć zasilania, bo ma 2, trzeba - // sprawdzać sąsiednie + // mieć zasilania, bo ma 2, trzeba + // sprawdzać sąsiednie if (Traction->psSection != tmp->psSection) // połączone odcinki mają różne zasilacze { // to może być albo podłączenie podstacji lub kabiny sekcyjnej do sekcji, albo - // błąd + // błąd if (Traction->psSection->bSection && !tmp->psSection->bSection) { //(tmp->psSection) jest podstacją, a (Traction->psSection) nazwą sekcji tmp->PowerSet(Traction->psSection); // zastąpienie wskazaniem sekcji @@ -3436,11 +3434,11 @@ void TGround::InitTraction() } if (Traction->hvNext[1]) // jeśli został podłączony if (Traction->psSection && tmp->psSection) // tylko przęsło z izolatorem może nie - // mieć zasilania, bo ma 2, trzeba - // sprawdzać sąsiednie + // mieć zasilania, bo ma 2, trzeba + // sprawdzać sąsiednie if (Traction->psSection != tmp->psSection) { // to może być albo podłączenie podstacji lub kabiny sekcyjnej do sekcji, albo - // błąd + // błąd if (Traction->psSection->bSection && !tmp->psSection->bSection) { //(tmp->psSection) jest podstacją, a (Traction->psSection) nazwą sekcji tmp->PowerSet(Traction->psSection); // zastąpienie wskazaniem sekcji @@ -3462,7 +3460,7 @@ void TGround::InitTraction() { // operacje mające na celu wykrywanie bieżni wspólnych i łączenie przęseł naprążania if (nCurrent->hvTraction->WhereIs()) // oznakowanie przedostatnich przęseł { // poszukiwanie bieżni wspólnej dla przedostatnich przęseł, również w celu połączenia - // zasilania + // zasilania // to się nie sprawdza, bo połączyć się mogą dwa niezasilane odcinki jako najbliższe // sobie // nCurrent->hvTraction->hvParallel=TractionNearestFind(nCurrent->pCenter,0,nCurrent); @@ -3484,7 +3482,7 @@ void TGround::InitTraction() } int zg = 0; // zgodność kierunku przęseł, tymczasowo iterator do tabeli końców TGroundNode **nEnds = new TGroundNode *[iConnection]; // końców jest ok. 10 razy mniej niż - // wszystkich przęseł (Quark: 216) + // wszystkich przęseł (Quark: 216) for (nCurrent = nRootOfType[TP_TRACTION]; nCurrent; nCurrent = nCurrent->nNext) { //łączenie bieżni wspólnych, w tym oznaczanie niepodanych jawnie Traction = nCurrent->hvTraction; @@ -3522,36 +3520,36 @@ void TGround::InitTraction() while (zg) { // ustalenie zastępczej rezystancji dla każdego przęsła zg = 0; // flaga podłączonych przęseł końcowych: -1=puste wskaźniki, 0=coś zostało, - // 1=wykonano łączenie + // 1=wykonano łączenie for (int i = 0; i < iConnection; ++i) if (nEnds[i]) // załatwione będziemy zerować { // każdy przebieg to próba podłączenia końca segmentu naprężania do innego zasilanego - // przęsła + // przęsła if (nEnds[i]->hvTraction->hvNext[0]) { // jeśli końcowy ma ciąg dalszy od strony 0 (Point1), szukamy odcinka najbliższego - // do Point2 + // do Point2 if (TractionNearestFind(nEnds[i]->hvTraction->pPoint2, 0, nEnds[i])) // poszukiwanie przęsła { nEnds[i] = NULL; zg = 1; // jak coś zostało podłączone, to może zasilanie gdzieś dodatkowo - // dotrze + // dotrze } } else if (nEnds[i]->hvTraction->hvNext[1]) { // jeśli końcowy ma ciąg dalszy od strony 1 (Point2), szukamy odcinka najbliższego - // do Point1 + // do Point1 if (TractionNearestFind(nEnds[i]->hvTraction->pPoint1, 1, nEnds[i])) // poszukiwanie przęsła { nEnds[i] = NULL; zg = 1; // jak coś zostało podłączone, to może zasilanie gdzieś dodatkowo - // dotrze + // dotrze } } else { // gdy koniec jest samotny, to na razie nie zostanie podłączony (nie powinno - // takich być) + // takich być) nEnds[i] = NULL; } } @@ -3711,7 +3709,7 @@ TTraction *__fastcall TGround::FindTraction(vector3 *Point, int &iConnection, TG TTraction *__fastcall TGround::TractionNearestFind(vector3 &p, int dir, TGroundNode *n) { // wyszukanie najbliższego do (p) przęsła o tej samej nazwie sekcji (ale innego niż podłączone) - // oraz zasilanego z kierunku (dir) + // oraz zasilanego z kierunku (dir) TGroundNode *nCurrent, *nBest = NULL; int i, j, k, zg; double d, dist = 200.0 * 200.0; //[m] odległość graniczna @@ -3737,7 +3735,7 @@ TTraction *__fastcall TGround::TractionNearestFind(vector3 &p, int dir, TGroundN nCurrent->hvTraction->vParametric) >= 0 ? dir ^ 1 : dir)]) // ma zasilanie z odpowiedniej - // strony + // strony if (nCurrent->hvTraction->fResistance[k] >= 0.0) //żeby się nie propagowały jakieś ujemne { // znaleziony kandydat do połączenia @@ -3750,7 +3748,7 @@ TTraction *__fastcall TGround::TractionNearestFind(vector3 &p, int dir, TGroundN dist = d; // nowy rekord odległości nBest = nCurrent; zg = k; // z którego końca brać wskaźnik - // zasilacza + // zasilacza } } if (nBest) // jak znalezione przęsło z zasilaniem, to podłączenie "równoległe" @@ -3774,7 +3772,7 @@ bool TGround::AddToQuery(TEvent *Event, TDynamicObject *Node) Event->Activator = Node; if (Event->Type == tp_AddValues ? (Event->fDelay == 0.0) : false) { // eventy AddValues trzeba wykonywać natychmiastowo, inaczej kolejka może zgubić - // jakieś dodawanie + // jakieś dodawanie // Ra: kopiowanie wykonania tu jest bez sensu, lepiej by było wydzielić funkcję // wykonującą eventy i ją wywołać if (EventConditon(Event)) @@ -3784,7 +3782,7 @@ bool TGround::AddToQuery(TEvent *Event, TDynamicObject *Node) Event->Params[2].asdouble, Event->iFlags); if (Event->Params[6].asTrack) { // McZapkie-100302 - updatevalues oprocz zmiany wartosci robi putcommand dla - // wszystkich 'dynamic' na danym torze + // wszystkich 'dynamic' na danym torze for (int i = 0; i < Event->Params[6].asTrack->iNumDynamics; ++i) Event->Params[5].asMemCell->PutCommand( Event->Params[6].asTrack->Dynamics[i]->Mechanik, @@ -3956,7 +3954,7 @@ bool TGround::CheckQuery() tmpEvent->Params[2].asdouble, tmpEvent->iFlags); if (tmpEvent->Params[6].asTrack) { // McZapkie-100302 - updatevalues oprocz zmiany wartosci robi putcommand dla - // wszystkich 'dynamic' na danym torze + // wszystkich 'dynamic' na danym torze for (int i = 0; i < tmpEvent->Params[6].asTrack->iNumDynamics; ++i) tmpEvent->Params[5].asMemCell->PutCommand( tmpEvent->Params[6].asTrack->Dynamics[i]->Mechanik, @@ -3980,7 +3978,7 @@ bool TGround::CheckQuery() // loc.Y= tmpEvent->Params[8].nGroundNode->pCenter.z; // loc.Z= tmpEvent->Params[8].nGroundNode->pCenter.y; if (Global::iMultiplayer) // potwierdzenie wykonania dla serwera (odczyt - // semafora już tak nie działa) + // semafora już tak nie działa) WyslijEvent(tmpEvent->asName, tmpEvent->Activator->GetName()); // tmpEvent->Params[9].asMemCell->PutCommand(tmpEvent->Activator->Mechanik,loc); tmpEvent->Params[9].asMemCell->PutCommand( @@ -4075,7 +4073,7 @@ bool TGround::CheckQuery() case tp_TrackVel: if (tmpEvent->Params[9].asTrack) { // prędkość na zwrotnicy może być ograniczona z góry we wpisie, większej się nie - // ustawi eventem + // ustawi eventem WriteLog("type: TrackVel"); // WriteLog("Vel: ",tmpEvent->Params[0].asdouble); tmpEvent->Params[9].asTrack->VelocitySet(tmpEvent->Params[0].asdouble); @@ -4106,7 +4104,7 @@ bool TGround::CheckQuery() 5.0) // to musi mieć sensowny okres powtarzania if (tmpEvent->iQueued < 2) { // trzeba zrobić wyjątek, aby event mógł się sam dodać do - // kolejki, raz już jest, ale będzie usunięty + // kolejki, raz już jest, ale będzie usunięty // pętla eventowa może być uruchomiona wiele razy, ale tylko // pierwsze uruchomienie zadziała tmpEvent->iQueued = @@ -4154,7 +4152,7 @@ bool TGround::CheckQuery() tmpEvent->Params[9].asMemCell->UpdateValues( tmpEvent->Activator->asDestination.c_str(), // adres docelowy tmpEvent->Activator->DirectionGet(), // kierunek pojazdu względem czoła - // składu (1=zgodny,-1=przeciwny) + // składu (1=zgodny,-1=przeciwny) tmpEvent->Activator->MoverParameters ->Power, // moc pojazdu silnikowego: 0 dla wagonu tmpEvent->iFlags & (update_memstring | update_memval1 | update_memval2)); @@ -4269,7 +4267,7 @@ bool TGround::Update(double dt, int iter) TAnimModel::AnimUpdate(dt1); // wykonanie zakolejkowanych animacji for (TGroundNode *Current = nRootDynamic; Current; Current = Current->nNext) { // Ra: zmienić warunek na sprawdzanie pantografów w jednej zmiennej: czy pantografy i czy - // podniesione + // podniesione if (Current->DynamicObject->MoverParameters->EnginePowerSource.SourceType == CurrentCollector) GetTraction(Current->DynamicObject); // poszukiwanie drutu dla pantografów @@ -4277,7 +4275,7 @@ bool TGround::Update(double dt, int iter) } for (TGroundNode *Current = nRootDynamic; Current; Current = Current->nNext) Current->DynamicObject->Update(dt, dt1); // Ra 2015-01: tylko tu przelicza sieć - // trakcyjną + // trakcyjną } else { // jezeli jest tylko jedna iteracja @@ -4363,9 +4361,9 @@ bool TGround::GetTraction(TDynamicObject *model) else { // jeśli t jest w przedziale, wyznaczyć odległość wzdłuż wektorów vUp i vLeft vStyk = p->hvPowerWire->pPoint1 + fRaParam * vParam; // punkt styku - // płaszczyzny z drutem - // (dla generatora łuku - // el.) + // płaszczyzny z drutem + // (dla generatora łuku + // el.) vGdzie = vStyk - pant0; // wektor // odległość w pionie musi być w zasięgu ruchu "pionowego" pantografu fVertical = DotProduct( @@ -4373,11 +4371,11 @@ bool TGround::GetTraction(TDynamicObject *model) // odległość w bok powinna być mniejsza niż pół szerokości pantografu fHorizontal = fabs(DotProduct(vGdzie, vLeft)) - p->fWidth; // to się musi mieścić w przedziale zależnym od - // szerokości pantografu + // szerokości pantografu // jeśli w pionie albo w bok jest za daleko, to dany drut jest nieużyteczny if (fHorizontal > 0) // 0.635 dla AKP-1 AKP-4E { // drut wyszedł poza zakres roboczy, ale jeszcze jest nabieżnik - - // pantograf się unosi bez utraty prądu + // pantograf się unosi bez utraty prądu if (fHorizontal > p->fWidthExtra) // czy wyszedł za nabieżnik { p->hvPowerWire = NULL; // dotychczasowy drut nie liczy się @@ -4385,18 +4383,18 @@ bool TGround::GetTraction(TDynamicObject *model) } else { // problem jest, gdy nowy drut jest wyżej, wtedy pantograf odłącza się - // od starego, a na podniesienie do nowego potrzebuje czasu + // od starego, a na podniesienie do nowego potrzebuje czasu p->PantTraction = fVertical + 0.15 * fHorizontal / p->fWidthExtra; // na razie liniowo na - // nabieżniku, dokładność - // poprawi się później + // nabieżniku, dokładność + // poprawi się później // p->fHorizontal=fHorizontal; //zapamiętanie położenia drutu } } else { // po wyselekcjonowaniu drutu, przypisać go do toru, żeby nie trzeba było - // szukać + // szukać // dla 3 końcowych przęseł sprawdzić wszystkie dostępne przęsła // bo mogą być umieszczone równolegle nad torem - połączyć w pierścień // najlepiej, jakby odcinki równoległe były oznaczone we wpisach @@ -4420,7 +4418,7 @@ bool TGround::GetTraction(TDynamicObject *model) for (int j = r - 2; j <= r; j++) for (int i = c - 2; i <= c; i++) { // poszukiwanie po najbliższych sektorach niewiele da przy większym - // zagęszczeniu + // zagęszczeniu tmp = FastGetSubRect(i, j); if (tmp) { // dany sektor może nie mieć nic w środku @@ -4438,34 +4436,35 @@ bool TGround::GetTraction(TDynamicObject *model) DotProduct(vParam, vFront); if ((fRaParam >= -0.001) ? (fRaParam <= 1.001) : false) { // jeśli tylko jest w przedziale, wyznaczyć odległość wzdłuż - // wektorów vUp i vLeft + // wektorów vUp i vLeft vStyk = node->hvTraction->pPoint1 + fRaParam * vParam; // punkt styku płaszczyzny z - // drutem (dla generatora łuku - // el.) + // drutem (dla generatora łuku + // el.) vGdzie = vStyk - pant0; // wektor fVertical = DotProduct( vGdzie, vUp); // musi się mieścić w przedziale ruchu pantografu if (fVertical >= 0.0) // jeśli ponad pantografem (bo może - // łapać druty spod wiaduktu) + // łapać druty spod wiaduktu) if (Global::bEnableTraction ? fVertical < p->PantWys - 0.15 : false) // jeśli drut jest niżej niż 15cm pod - // ślizgiem + // ślizgiem { // przełączamy w tryb połamania, o ile jedzie; - // (bEnableTraction) aby dało się jeździć na koślawych - // sceneriach + // (bEnableTraction) aby dało się jeździć na + // koślawych + // sceneriach fHorizontal = fabs(DotProduct(vGdzie, vLeft)) - p->fWidth; // i do tego jeszcze - // wejdzie pod ślizg + // wejdzie pod ślizg if (fHorizontal <= 0.0) // 0.635 dla AKP-1 AKP-4E { p->PantWys = -1.0; // ujemna liczba oznacza połamanie p->hvPowerWire = NULL; // bo inaczej się zasila - // w nieskończoność z - // połamanego + // w nieskończoność z + // połamanego // p->fHorizontal=fHorizontal; //zapamiętanie // położenia drutu if (model->MoverParameters->EnginePowerSource @@ -4474,7 +4473,7 @@ bool TGround::GetTraction(TDynamicObject *model) --model->MoverParameters->EnginePowerSource .CollectorParameters .CollectorsNo; // teraz będzie - // mniejsza + // mniejsza if (DebugModeFlag) ErrorLog( "Pant. break: at " + @@ -4486,14 +4485,14 @@ bool TGround::GetTraction(TDynamicObject *model) } } else if (fVertical < p->PantTraction) // ale niżej, niż - // poprzednio - // znaleziony + // poprzednio + // znaleziony { fHorizontal = fabs(DotProduct(vGdzie, vLeft)) - p->fWidth; if (fHorizontal <= 0.0) // 0.635 dla AKP-1 AKP-4E { // to się musi mieścić w przedziale zaleznym od - // szerokości pantografu + // szerokości pantografu p->hvPowerWire = node->hvTraction; // jakiś znaleziony p->PantTraction = @@ -4503,28 +4502,28 @@ bool TGround::GetTraction(TDynamicObject *model) } else if (fHorizontal < p->fWidthExtra) // czy zmieścił się w - // zakresie nabieżnika? + // zakresie nabieżnika? { // problem jest, gdy nowy drut jest wyżej, wtedy - // pantograf odłącza się od starego, a na - // podniesienie do nowego potrzebuje czasu + // pantograf odłącza się od starego, a na + // podniesienie do nowego potrzebuje czasu fVertical += 0.15 * fHorizontal / p->fWidthExtra; // korekta wysokości o - // nabieżnik - drut nad - // nabieżnikiem jest - // geometrycznie jakby nieco - // wyżej + // nabieżnik - drut nad + // nabieżnikiem jest + // geometrycznie jakby nieco + // wyżej if (fVertical < p->PantTraction) // gdy po korekcie jest - // niżej, niż poprzednio - // znaleziony + // niżej, niż poprzednio + // znaleziony { // gdyby to wystarczyło, to możemy go uznać p->hvPowerWire = node->hvTraction; // może być p->PantTraction = fVertical; // na razie liniowo na - // nabieżniku, dokładność - // poprawi się później + // nabieżniku, dokładność + // poprawi się później // p->fHorizontal=fHorizontal; // //zapamiętanie położenia drutu } @@ -4584,7 +4583,7 @@ bool TGround::RenderDL(vector3 pPosition) for (node = tmp->nRenderHidden; node; node = node->nNext3) node->RenderHidden(); tmp->RenderSounds(); // jeszcze dźwięki pojazdów by się przydały, również - // niewidocznych + // niewidocznych } // renderowanie progresywne - zależne od FPS oraz kierunku patrzenia iRendered = 0; // ilość renderowanych sektorów @@ -4597,7 +4596,7 @@ bool TGround::RenderDL(vector3 pPosition) { if (j <= 0) i = -i; // pierwszy przebieg: j<=0, i>=0; drugi: j>=0, i<=0; trzeci: j<=0, i<=0 - // czwarty: j>=0, i>=0; + // czwarty: j>=0, i>=0; j = -j; // i oraz j musi być zmienione wcześniej, żeby continue działało direction = vector3(i, 0, j); // wektor od kamery do danego sektora if (LengthSquared3(direction) > 5) // te blisko są zawsze wyświetlane @@ -4674,7 +4673,7 @@ bool TGround::RenderVBO(vector3 pPosition) for (node = tmp->nRenderHidden; node; node = node->nNext3) node->RenderHidden(); tmp->RenderSounds(); // jeszcze dźwięki pojazdów by się przydały, również - // niewidocznych + // niewidocznych } } // renderowanie progresywne - zależne od FPS oraz kierunku patrzenia @@ -4688,7 +4687,7 @@ bool TGround::RenderVBO(vector3 pPosition) { if (j <= 0) i = -i; // pierwszy przebieg: j<=0, i>=0; drugi: j>=0, i<=0; trzeci: j<=0, i<=0 - // czwarty: j>=0, i>=0; + // czwarty: j>=0, i>=0; j = -j; // i oraz j musi być zmienione wcześniej, żeby continue działało direction = vector3(i, 0, j); // wektor od kamery do danego sektora if (LengthSquared3(direction) > 5) // te blisko są zawsze wyświetlane @@ -5049,7 +5048,7 @@ void TGround::TerrainWrite() if (Current->TextureID) switch (Current->iType) { // pętla po trójkątach - zliczanie wierzchołków, dodaje submodel dla - // każdej tekstury + // każdej tekstury case GL_TRIANGLES: Current->iVboPtr = sk->TriangleAdd( m, Current->TextureID, @@ -5058,10 +5057,10 @@ void TGround::TerrainWrite() Current->iNumVerts; // zwiększenie całkowitej ilości wierzchołków break; case GL_TRIANGLE_STRIP: // na razie nie, bo trzeba przerabiać na pojedyncze - // trójkąty + // trójkąty break; case GL_TRIANGLE_FAN: // na razie nie, bo trzeba przerabiać na pojedyncze - // trójkąty + // trójkąty break; } for (Current = Rects[i][j].nRootNode; Current; Current = Current->nNext2) @@ -5092,10 +5091,10 @@ void TGround::TerrainWrite() } break; case GL_TRIANGLE_STRIP: // na razie nie, bo trzeba przerabiać na pojedyncze - // trójkąty + // trójkąty break; case GL_TRIANGLE_FAN: // na razie nie, bo trzeba przerabiać na pojedyncze - // trójkąty + // trójkąty break; } } diff --git a/Ground.h b/Ground.h index 316de17a..dc97bce2 100644 --- a/Ground.h +++ b/Ground.h @@ -160,7 +160,7 @@ class TGroundNode : public Resource void RenderHidden(); // obsługa dźwięków i wyzwalaczy zdarzeń void RenderDL(); // renderowanie nieprzezroczystych w Display Lists void RenderAlphaDL(); // renderowanie przezroczystych w Display Lists - // (McZapkie-131202) + // (McZapkie-131202) void RaRenderVBO(); // renderowanie (nieprzezroczystych) ze wspólnego VBO void RenderVBO(); // renderowanie nieprzezroczystych z własnego VBO void RenderAlphaVBO(); // renderowanie przezroczystych z (własnego) VBO @@ -193,19 +193,18 @@ class TSubRect : public Resource, public CMesh TSubRect(); virtual ~TSubRect(); virtual void Release(); // zwalnianie VBO sektora - void NodeAdd( - TGroundNode *Node); // dodanie obiektu do sektora na etapie rozdzielania na sektory + void NodeAdd(TGroundNode *Node); // dodanie obiektu do sektora na etapie rozdzielania na sektory void RaNodeAdd(TGroundNode *Node); // dodanie obiektu do listy renderowania void Sort(); // optymalizacja obiektów w sektorze (sortowanie wg tekstur) TTrack *__fastcall FindTrack(vector3 *Point, int &iConnection, TTrack *Exclude); TTraction *__fastcall FindTraction(vector3 *Point, int &iConnection, TTraction *Exclude); bool StartVBO(); // ustwienie VBO sektora dla (nRenderRect), (nRenderRectAlpha) i - // (nRenderWires) + // (nRenderWires) bool RaTrackAnimAdd(TTrack *t); // zgłoszenie toru do animacji void RaAnimate(); // przeliczenie animacji torów void RenderDL(); // renderowanie nieprzezroczystych w Display Lists void RenderAlphaDL(); // renderowanie przezroczystych w Display Lists - // (McZapkie-131202) + // (McZapkie-131202) void RenderVBO(); // renderowanie nieprzezroczystych z własnego VBO void RenderAlphaVBO(); // renderowanie przezroczystych z (własnego) VBO void RenderSounds(); // dźwięki pojazdów z niewidocznych sektorów @@ -227,7 +226,10 @@ class TGroundRect : public TSubRect private: int iLastDisplay; // numer klatki w której był ostatnio wyświetlany TSubRect *pSubRects; - void Init() { pSubRects = new TSubRect[iNumSubRects * iNumSubRects]; }; + void Init() + { + pSubRects = new TSubRect[iNumSubRects * iNumSubRects]; + }; public: static int iFrameNumber; // numer kolejny wyświetlanej klatki @@ -359,8 +361,14 @@ class TGround }; TSubRect *__fastcall GetSubRect(int iCol, int iRow); TSubRect *__fastcall FastGetSubRect(int iCol, int iRow); - int GetRowFromZ(double z) { return (z / fSubRectSize + fHalfTotalNumSubRects); }; - int GetColFromX(double x) { return (x / fSubRectSize + fHalfTotalNumSubRects); }; + int GetRowFromZ(double z) + { + return (z / fSubRectSize + fHalfTotalNumSubRects); + }; + int GetColFromX(double x) + { + return (x / fSubRectSize + fHalfTotalNumSubRects); + }; TEvent *__fastcall FindEvent(const AnsiString &asEventName); TEvent *__fastcall FindEventScan(const AnsiString &asEventName); void TrackJoin(TGroundNode *Current); diff --git a/Machajka.cpp b/Machajka.cpp index d7e672d3..3d75b541 100644 --- a/Machajka.cpp +++ b/Machajka.cpp @@ -15,9 +15,14 @@ http://mozilla.org/MPL/2.0/. #include "Timer.h" #include "Globals.h" -__fastcall TMachajka::TMachajka() : TTrain() { TTrain::TTrain(); } +__fastcall TMachajka::TMachajka() : TTrain() +{ + TTrain::TTrain(); +} -__fastcall TMachajka::~TMachajka() {} +__fastcall TMachajka::~TMachajka() +{ +} bool TMachajka::Init(TDynamicObject *NewDynamicObject) { @@ -63,11 +68,20 @@ void TMachajka::OnKeyPress(int cKey) } } -bool TMachajka::Update(double dt) { TTrain::Update(dt); } +bool TMachajka::Update(double dt) +{ + TTrain::Update(dt); +} -bool TMachajka::UpdateMechPosition() { TTrain::UpdateMechPosition(); } +bool TMachajka::UpdateMechPosition() +{ + TTrain::UpdateMechPosition(); +} -bool TMachajka::Render() { TTrain::Render(); } +bool TMachajka::Render() +{ + TTrain::Render(); +} //--------------------------------------------------------------------------- #pragma package(smart_init) diff --git a/MdlMngr.cpp b/MdlMngr.cpp index 3900f0c2..9e191424 100644 --- a/MdlMngr.cpp +++ b/MdlMngr.cpp @@ -57,7 +57,10 @@ __fastcall TModelsManager::~TModelsManager() Free(); }; */ -void TModelsManager::Free() { SafeDeleteArray(Models); } +void TModelsManager::Free() +{ + SafeDeleteArray(Models); +} TModel3d *__fastcall TModelsManager::LoadModel(char *Name, bool dynamic) { // wczytanie modelu do tablicy @@ -75,7 +78,7 @@ TModel3d *__fastcall TModelsManager::LoadModel(char *Name, bool dynamic) TModel3d *__fastcall TModelsManager::GetModel(const char *Name, bool dynamic) { // model może być we wpisie "node...model" albo "node...dynamic", a także być dodatkowym w dynamic - // (kabina, wnętrze, ładunek) + // (kabina, wnętrze, ładunek) // dla "node...dynamic" mamy podaną ścieżkę w "\dynamic\" i musi być co najmniej 1 poziom, zwkle // są 2 // dla "node...model" może być typowy model statyczny ze ścieżką, domyślnie w "\scenery\" albo @@ -97,7 +100,7 @@ TModel3d *__fastcall TModelsManager::GetModel(const char *Name, bool dynamic) // - wczytanie modelu animowanego - Init() - sprawdzić char buf[255]; AnsiString buftp = Global::asCurrentTexturePath; // zapamiętanie aktualnej ścieżki do tekstur, - // bo będzie tyczmasowo zmieniana + // bo będzie tyczmasowo zmieniana /* // Ra: niby tak jest lepiej, ale działa gorzej, więc przywrócone jest oryginalne //nawet jeśli model będzie pobrany z tablicy, to trzeba ustalić ścieżkę dla tekstur diff --git a/MemCell.cpp b/MemCell.cpp index d7126ad0..feceee07 100644 --- a/MemCell.cpp +++ b/MemCell.cpp @@ -34,19 +34,23 @@ TMemCell::TMemCell(vector3 *p) { fValue1 = fValue2 = 0; szText = new char[256]; // musi być dla automatycznie tworzonych komórek dla odcinków - // izolowanych + // izolowanych vPosition = p ? *p : vector3(0, 0, 0); // ustawienie współrzędnych, bo do TGroundNode nie ma dostępu bCommand = false; // komenda wysłana OnSent = NULL; } -TMemCell::~TMemCell() { SafeDeleteArray(szText); } +TMemCell::~TMemCell() +{ + SafeDeleteArray(szText); +} -void TMemCell::Init() {} +void TMemCell::Init() +{ +} -void TMemCell::UpdateValues(char *szNewText, double fNewValue1, double fNewValue2, - int CheckMask) +void TMemCell::UpdateValues(char *szNewText, double fNewValue1, double fNewValue2, int CheckMask) { if (CheckMask & update_memadd) { // dodawanie wartości @@ -140,8 +144,7 @@ void TMemCell::PutCommand(TController *Mech, vector3 *Loc) Mech->PutCommand(szText, fValue1, fValue2, Loc); } -bool TMemCell::Compare(char *szTestText, double fTestValue1, double fTestValue2, - int CheckMask) +bool TMemCell::Compare(char *szTestText, double fTestValue1, double fTestValue2, int CheckMask) { // porównanie zawartości komórki pamięci z podanymi wartościami if (TestFlag(CheckMask, conditional_memstring)) { // porównać teksty @@ -161,7 +164,10 @@ bool TMemCell::Compare(char *szTestText, double fTestValue1, double fTestValue2, (!TestFlag(CheckMask, conditional_memval2) || (fValue2 == fTestValue2))); }; -bool TMemCell::Render() { return true; } +bool TMemCell::Render() +{ + return true; +} bool TMemCell::IsVelocity() { // sprawdzenie, czy event odczytu tej komórki ma być do skanowania, czy do kolejkowania diff --git a/MemCell.h b/MemCell.h index 271a79c8..caef4d94 100644 --- a/MemCell.h +++ b/MemCell.h @@ -30,19 +30,35 @@ class TMemCell TMemCell(vector3 *p); ~TMemCell(); void Init(); - void UpdateValues(char *szNewText, double fNewValue1, double fNewValue2, - int CheckMask); + void UpdateValues(char *szNewText, double fNewValue1, double fNewValue2, int CheckMask); bool Load(cParser *parser); void PutCommand(TController *Mech, vector3 *Loc); - bool Compare(char *szTestText, double fTestValue1, double fTestValue2, - int CheckMask); + bool Compare(char *szTestText, double fTestValue1, double fTestValue2, int CheckMask); bool Render(); - inline char *__fastcall Text() { return szText; }; - inline double Value1() { return fValue1; }; - inline double Value2() { return fValue2; }; - inline vector3 Position() { return vPosition; }; - inline TCommandType Command() { return eCommand; }; - inline bool StopCommand() { return bCommand; }; + inline char *__fastcall Text() + { + return szText; + }; + inline double Value1() + { + return fValue1; + }; + inline double Value2() + { + return fValue2; + }; + inline vector3 Position() + { + return vPosition; + }; + inline TCommandType Command() + { + return eCommand; + }; + inline bool StopCommand() + { + return bCommand; + }; void StopCommandSent(); TCommandType CommandCheck(); bool IsVelocity(); diff --git a/Model3d.cpp b/Model3d.cpp index deb28c07..435b6fdd 100644 --- a/Model3d.cpp +++ b/Model3d.cpp @@ -178,8 +178,7 @@ void TSubModel::NameSet(const char *n) // int TSubModel::SeekFaceNormal(DWORD *Masks, int f,DWORD dwMask,vector3 *pt,GLVERTEX // *Vertices) -int TSubModel::SeekFaceNormal(DWORD *Masks, int f, DWORD dwMask, float3 *pt, - float8 *Vertices) +int TSubModel::SeekFaceNormal(DWORD *Masks, int f, DWORD dwMask, float3 *pt, float8 *Vertices) { // szukanie punktu stycznego do (pt), zwraca numer wierzchołka, a nie trójkąta int iNumFaces = iNumVerts / 3; // bo maska powierzchni jest jedna na trójkąt // GLVERTEX *p; //roboczy wskaźnik @@ -458,7 +457,7 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic) parser.getToken(token); if (token[0] == '*') { // jeśli pierwszy znak jest gwiazdką, poszukać submodelu o nazwie bez tej gwiazdki i wziąć - // z niego wierzchołki + // z niego wierzchołki Error("Verticles reference not yet supported!"); } else @@ -476,7 +475,7 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic) Vertices = new float8[iNumVerts]; iNumFaces = iNumVerts / 3; sg = new DWORD[iNumFaces]; // maski powierzchni: 0 oznacza brak użredniania wektorów - // normalnych + // normalnych int *wsp = new int[iNumVerts]; // z którego wierzchołka kopiować wektor normalny int maska = 0; for (int i = 0; i < iNumVerts; i++) @@ -484,10 +483,10 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic) wsp[i] = -1; // wektory normalne nie są policzone dla tego wierzchołka if ((i % 3) == 0) { // jeśli będzie maska -1, to dalej będą wierzchołki z wektorami normalnymi, - // podanymi jawnie + // podanymi jawnie parser.getToken(maska); // maska powierzchni trójkąta sg[i / 3] = (maska == -1) ? 0 : maska; // dla maski -1 będzie 0, czyli nie - // ma wspólnych wektorów normalnych + // ma wspólnych wektorów normalnych } parser.getToken(Vertices[i].Point.x); parser.getToken(Vertices[i].Point.y); @@ -514,14 +513,14 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic) AnsiString(pName) + "\", verticle " + AnsiString(i)); } if (i > 0) // jeśli pierwszy trójkąt będzie zdegenerowany, to zostanie - // usunięty i nie ma co sprawdzać + // usunięty i nie ma co sprawdzać if (((Vertices[i].Point - Vertices[i - 1].Point).Length() > 1000.0) || ((Vertices[i - 1].Point - Vertices[i - 2].Point).Length() > 1000.0) || ((Vertices[i - 2].Point - Vertices[i].Point).Length() > 1000.0)) { // jeżeli są dalej niż 2km od siebie //Ra 15-01: obiekt wstawiany nie - // powinien być większy niż 300m (trójkąty terenu w E3D mogą mieć - // 1.5km) + // powinien być większy niż 300m (trójkąty terenu w E3D mogą mieć + // 1.5km) --iNumFaces; // o jeden trójkąt mniej iNumVerts -= 3; // czyli o 3 wierzchołki i -= 3; // wczytanie kolejnego w to miejsce @@ -533,7 +532,7 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic) int i; // indeks dla trójkątów float3 *n = new float3[iNumFaces]; // tablica wektorów normalnych dla trójkątów for (i = 0; i < iNumFaces; i++) // pętla po trójkątach - będzie szybciej, jak - // wstępnie przeliczymy normalne trójkątów + // wstępnie przeliczymy normalne trójkątów n[i] = SafeNormalize( CrossProduct(Vertices[i * 3].Point - Vertices[i * 3 + 1].Point, Vertices[i * 3].Point - Vertices[i * 3 + 2].Point)); @@ -554,7 +553,7 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic) while (f >= 0) { // sumowanie z wektorem normalnym sąsiada (włącznie ze sobą) wsp[f] = v; // informacja, że w tym wierzchołku jest już policzony - // wektor normalny + // wektor normalny norm += n[f / 3]; f = SeekFaceNormal(sg, f / 3 + 1, sg[i], &Vertices[v].Point, Vertices); // i szukanie od kolejnego trójkąta @@ -776,7 +775,7 @@ void TSubModel::InitialRotate(bool doit) (*mat)(3)[0] = (*mat)(3)[1] = (*mat)(3)[2] = 0.0; // zerujemy przesunięcie przed obracaniem normalnych if (eType != TP_STARS) // gwiazdki mają kolory zamiast normalnych, to ich wtedy - // nie ruszamy + // nie ruszamy for (int i = 0; i < iNumVerts; ++i) Vertices[i].Normal = SafeNormalize((*mat) * Vertices[i].Normal); } @@ -916,7 +915,10 @@ void TSubModel::SetRotateIK1(float3 vNewAngles) struct ToLower { - char operator()(char input) { return tolower(input); } + char operator()(char input) + { + return tolower(input); + } }; TSubModel *__fastcall TSubModel::GetFromName(AnsiString search, bool i) @@ -1003,7 +1005,7 @@ void TSubModel::RaAnimation(TAnimType a) case at_Billboard: // obrót w pionie do kamery { matrix4x4 mat; // potrzebujemy współrzędne przesunięcia środka układu współrzędnych - // submodelu + // submodelu glGetDoublev(GL_MODELVIEW_MATRIX, mat.getArray()); // pobranie aktualnej matrycy float3 gdzie = float3(mat[3][0], mat[3][1], mat[3][2]); // początek układu współrzędnych submodelu względem kamery @@ -1092,7 +1094,7 @@ void TSubModel::RenderDL() { double Distdimm = 1.0; if (fCosViewAngle < fCosHotspotAngle) // zmniejszona jasność między Hotspot a - // Falloff + // Falloff if (fCosFalloffAngle < fCosHotspotAngle) Distdimm = 1.0 - (fCosHotspotAngle - fCosViewAngle) / @@ -1188,9 +1190,9 @@ void TSubModel::RenderAlphaDL() char c; if (!smLetter) { // jeśli nie ma tablicy, to ją stworzyć; miejsce nieodpowiednie, ale tymczasowo - // może być + // może być smLetter = new TSubModel *[256]; // tablica wskaźników submodeli dla - // wyświetlania tekstu + // wyświetlania tekstu ZeroMemory(smLetter, 256 * sizeof(TSubModel *)); // wypełnianie zerami p = Child; while (p) @@ -1270,7 +1272,7 @@ void TSubModel::RenderVBO() { double Distdimm = 1.0; if (fCosViewAngle < fCosHotspotAngle) // zmniejszona jasność między Hotspot a - // Falloff + // Falloff if (fCosFalloffAngle < fCosHotspotAngle) Distdimm = 1.0 - (fCosHotspotAngle - fCosViewAngle) / @@ -1523,8 +1525,8 @@ void TSubModel::InfoSet(TSubModelInfo *info) pTexture = pName = NULL; }; -void TSubModel::BinInit(TSubModel *s, float4x4 *m, float8 *v, TStringPack *t, - TStringPack *n, bool dynamic) +void TSubModel::BinInit(TSubModel *s, float4x4 *m, float8 *v, TStringPack *t, TStringPack *n, + bool dynamic) { // ustawienie wskaźników w submodelu iVisible = 1; // tymczasowo używane Child = ((int)Child > 0) ? s + (int)Child : NULL; // zerowy nie może być potomnym @@ -1539,7 +1541,7 @@ void TSubModel::BinInit(TSubModel *s, float4x4 *m, float8 *v, TStringPack *t, { // jeśli dany submodel jest zgaszonym światłem, to domyślnie go ukrywamy if (s.SubString(1, 8) == "Light_On") // jeśli jest światłem numerowanym iVisible = 0; // to domyślnie wyłączyć, żeby się nie nakładało z obiektem - // "Light_Off" + // "Light_Off" else if (dynamic) // inaczej wyłączało smugę w latarniach if (s.SubString(s.Length() - 2, 3) == "_on") // jeśli jest kontrolką w stanie zapalonym @@ -1783,12 +1785,12 @@ void TModel3d::LoadFromBinFile(char *FileName, bool dynamic) case 'SUB0': // submodele: 'SUB0',len,(256 bajtów na submodel) iSubModelsCount = (k - 2) / 64; Root = (TSubModel *)(iModel + i + 2); // numery na wskaźniki przetworzymy - // później + // później break; case 'SUB1': // submodele: 'SUB1',len,(320 bajtów na submodel) iSubModelsCount = (k - 2) / 80; Root = (TSubModel *)(iModel + i + 2); // numery na wskaźniki przetworzymy - // później + // później for (ch = 1; ch < iSubModelsCount; ++ch) // trzeba przesunąć bliżej, bo 256 wystarczy MoveMemory(((char *)Root) + 256 * ch, ((char *)Root) + 320 * ch, 256); @@ -1909,7 +1911,7 @@ void TModel3d::Init() if (Global::fDistanceFactor != 1.0) // trochę zaoszczędzi czasu na modelach z wieloma submocelami Root->AdjustDist(); // aktualizacja odległości faz LoD, zależnie od rozdzielczości - // pionowej oraz multisamplingu + // pionowej oraz multisamplingu if (Global::bUseVBO) { if (!m_pVNT) // jeśli nie ma jeszcze tablicy (wczytano z pliku tekstowego) @@ -2019,7 +2021,10 @@ void TModel3d::SaveToBinFile(char *FileName) delete[] info; }; -void TModel3d::BreakHierarhy() { Error("Not implemented yet :("); }; +void TModel3d::BreakHierarhy() +{ + Error("Not implemented yet :("); +}; /* void TModel3d::Render(vector3 pPosition,double fAngle,GLuint ReplacableSkinId,int iAlpha) @@ -2122,8 +2127,7 @@ void TModel3d::RaRender(double fSquareDistance, GLuint *ReplacableSkinId, int iA } }; -void TModel3d::RaRenderAlpha(double fSquareDistance, GLuint *ReplacableSkinId, - int iAlpha) +void TModel3d::RaRenderAlpha(double fSquareDistance, GLuint *ReplacableSkinId, int iAlpha) { // renderowanie specjalne, np. kabiny if (iAlpha & iFlags & 0x2F2F002F) // czy w ogóle jest co robić w tym cyklu? { @@ -2159,8 +2163,7 @@ iAlpha) // 2011-03-16 cztery nowe funkcje renderowania z możliwością pochylania obiektów //----------------------------------------------------------------------------- -void TModel3d::Render(vector3 *vPosition, vector3 *vAngle, GLuint *ReplacableSkinId, - int iAlpha) +void TModel3d::Render(vector3 *vPosition, vector3 *vAngle, GLuint *ReplacableSkinId, int iAlpha) { // nieprzezroczyste, Display List glPushMatrix(); glTranslated(vPosition->x, vPosition->y, vPosition->z); @@ -2178,7 +2181,7 @@ void TModel3d::Render(vector3 *vPosition, vector3 *vAngle, GLuint *ReplacableSki glPopMatrix(); }; void TModel3d::RenderAlpha(vector3 *vPosition, vector3 *vAngle, GLuint *ReplacableSkinId, - int iAlpha) + int iAlpha) { // przezroczyste, Display List glPushMatrix(); glTranslated(vPosition->x, vPosition->y, vPosition->z); @@ -2194,8 +2197,7 @@ void TModel3d::RenderAlpha(vector3 *vPosition, vector3 *vAngle, GLuint *Replacab Root->RenderAlphaDL(); glPopMatrix(); }; -void TModel3d::RaRender(vector3 *vPosition, vector3 *vAngle, GLuint *ReplacableSkinId, - int iAlpha) +void TModel3d::RaRender(vector3 *vPosition, vector3 *vAngle, GLuint *ReplacableSkinId, int iAlpha) { // nieprzezroczyste, VBO glPushMatrix(); glTranslated(vPosition->x, vPosition->y, vPosition->z); @@ -2215,8 +2217,8 @@ void TModel3d::RaRender(vector3 *vPosition, vector3 *vAngle, GLuint *ReplacableS } glPopMatrix(); }; -void TModel3d::RaRenderAlpha(vector3 *vPosition, vector3 *vAngle, - GLuint *ReplacableSkinId, int iAlpha) +void TModel3d::RaRenderAlpha(vector3 *vPosition, vector3 *vAngle, GLuint *ReplacableSkinId, + int iAlpha) { // przezroczyste, VBO glPushMatrix(); glTranslated(vPosition->x, vPosition->y, vPosition->z); @@ -2280,7 +2282,7 @@ void TModel3d::TerrainRenderVBO(int n) while (r) { if (r->iVisible == n) // tylko jeśli ma być widoczny w danej ramce (problem dla - // 0==false) + // 0==false) r->RenderVBO(); // sub kolejne (Next) się nie wyrenderują r = r->NextGet(); } diff --git a/Model3d.h b/Model3d.h index ce5a5e3e..0eae774f 100644 --- a/Model3d.h +++ b/Model3d.h @@ -36,21 +36,33 @@ class TStringPack //+8 - tabela indeksów public: char *String(int n); - char *StringAt(int n) { return data + 9 + n; }; + char *StringAt(int n) + { + return data + 9 + n; + }; TStringPack() { data = NULL; index = NULL; }; - void Init(char *d) { data = d; }; - void InitIndex(int *i) { index = i; }; + void Init(char *d) + { + data = d; + }; + void InitIndex(int *i) + { + index = i; + }; }; class TMaterialColor { public: TMaterialColor(){}; - TMaterialColor(char V) { r = g = b = V; }; + TMaterialColor(char V) + { + r = g = b = V; + }; // TMaterialColor(double R, double G, double B) TMaterialColor(char R, char G, char B) { @@ -199,7 +211,7 @@ class TSubModel float fFarDecayRadius; // normalizacja j.w. float fCosFalloffAngle; // cosinus kąta stożka pod którym widać światło float fCosHotspotAngle; // cosinus kąta stożka pod którym widać aureolę i zwiększone natężenie - // światła + // światła float fCosViewAngle; // cos kata pod jakim sie teraz patrzy // Ra: dalej są zmienne robocze, można je przestawiać z zachowaniem rozmiaru klasy int TextureID; // numer tekstury, -1 wymienna, 0 brak @@ -250,8 +262,14 @@ class TSubModel int Load(cParser &Parser, TModel3d *Model, int Pos, bool dynamic); void ChildAdd(TSubModel *SubModel); void NextAdd(TSubModel *SubModel); - TSubModel *__fastcall NextGet() { return Next; }; - TSubModel *__fastcall ChildGet() { return Child; }; + TSubModel *__fastcall NextGet() + { + return Next; + }; + TSubModel *__fastcall ChildGet() + { + return Child; + }; int TriangleAdd(TModel3d *m, int tex, int tri); float8 *__fastcall TrianglePtr(int tex, int pos, int *la, int *ld, int *ls); // float8* TrianglePtr(const char *tex,int tri); @@ -269,9 +287,15 @@ class TSubModel void RenderVBO(); void RenderAlphaVBO(); // inline matrix4x4* GetMatrix() {return dMatrix;}; - inline float4x4 *__fastcall GetMatrix() { return fMatrix; }; + inline float4x4 *__fastcall GetMatrix() + { + return fMatrix; + }; // matrix4x4* GetTransform() {return Matrix;}; - inline void Hide() { iVisible = 0; }; + inline void Hide() + { + iVisible = 0; + }; void RaArrayFill(CVertNormTex *Vert); // void Render(); int FlagsCheck(); @@ -284,8 +308,8 @@ class TSubModel void DisplayLists(); void Info(); void InfoSet(TSubModelInfo *info); - void BinInit(TSubModel *s, float4x4 *m, float8 *v, TStringPack *t, - TStringPack *n = NULL, bool dynamic = false); + void BinInit(TSubModel *s, float4x4 *m, float8 *v, TStringPack *t, TStringPack *n = NULL, + bool dynamic = false); void ReplacableSet(GLuint *r, int a) { ReplacableSkinId = r; @@ -294,8 +318,14 @@ class TSubModel void TextureNameSet(const char *n); void NameSet(const char *n); // Ra: funkcje do budowania terenu z E3D - int Flags() { return iFlags; }; - void UnFlagNext() { iFlags &= 0x00FFFFFF; }; + int Flags() + { + return iFlags; + }; + void UnFlagNext() + { + iFlags &= 0x00FFFFFF; + }; void ColorsSet(int *a, int *d, int *s); inline float3 Translation1Get() { @@ -305,6 +335,10 @@ class TSubModel { return *(fMatrix->TranslationGet()) + Child->Translation1Get(); } + int GetTextureId() + { + return TextureID; + } void ParentMatrix(float4x4 *m); float MaxY(const float4x4 &m); void AdjustDist(); @@ -356,7 +390,10 @@ class TModel3d : public CMesh int iSubModelsCount; // Ra: używane do tworzenia binarnych AnsiString asBinary; // nazwa pod którą zapisać model binarny public: - inline TSubModel *__fastcall GetSMRoot() { return (Root); }; + inline TSubModel *__fastcall GetSMRoot() + { + return (Root); + }; // double Radius; //Ra: nie używane TModel3d(); TModel3d(char *FileName); @@ -371,36 +408,40 @@ class TModel3d : public CMesh void SaveToBinFile(char *FileName); void BreakHierarhy(); // renderowanie specjalne - void Render(double fSquareDistance, GLuint *ReplacableSkinId = NULL, - int iAlpha = 0x30300030); + void Render(double fSquareDistance, GLuint *ReplacableSkinId = NULL, int iAlpha = 0x30300030); void RenderAlpha(double fSquareDistance, GLuint *ReplacableSkinId = NULL, - int iAlpha = 0x30300030); - void RaRender(double fSquareDistance, GLuint *ReplacableSkinId = NULL, - int iAlpha = 0x30300030); + int iAlpha = 0x30300030); + void RaRender(double fSquareDistance, GLuint *ReplacableSkinId = NULL, int iAlpha = 0x30300030); void RaRenderAlpha(double fSquareDistance, GLuint *ReplacableSkinId = NULL, - int iAlpha = 0x30300030); + int iAlpha = 0x30300030); // jeden kąt obrotu void Render(vector3 pPosition, double fAngle = 0, GLuint *ReplacableSkinId = NULL, - int iAlpha = 0x30300030); - void RenderAlpha(vector3 pPosition, double fAngle = 0, - GLuint *ReplacableSkinId = NULL, int iAlpha = 0x30300030); + int iAlpha = 0x30300030); + void RenderAlpha(vector3 pPosition, double fAngle = 0, GLuint *ReplacableSkinId = NULL, + int iAlpha = 0x30300030); void RaRender(vector3 pPosition, double fAngle = 0, GLuint *ReplacableSkinId = NULL, - int iAlpha = 0x30300030); - void RaRenderAlpha(vector3 pPosition, double fAngle = 0, - GLuint *ReplacableSkinId = NULL, int iAlpha = 0x30300030); + int iAlpha = 0x30300030); + void RaRenderAlpha(vector3 pPosition, double fAngle = 0, GLuint *ReplacableSkinId = NULL, + int iAlpha = 0x30300030); // trzy kąty obrotu void Render(vector3 *vPosition, vector3 *vAngle, GLuint *ReplacableSkinId = NULL, - int iAlpha = 0x30300030); - void RenderAlpha(vector3 *vPosition, vector3 *vAngle, - GLuint *ReplacableSkinId = NULL, int iAlpha = 0x30300030); + int iAlpha = 0x30300030); + void RenderAlpha(vector3 *vPosition, vector3 *vAngle, GLuint *ReplacableSkinId = NULL, + int iAlpha = 0x30300030); void RaRender(vector3 *vPosition, vector3 *vAngle, GLuint *ReplacableSkinId = NULL, - int iAlpha = 0x30300030); - void RaRenderAlpha(vector3 *vPosition, vector3 *vAngle, - GLuint *ReplacableSkinId = NULL, int iAlpha = 0x30300030); + int iAlpha = 0x30300030); + void RaRenderAlpha(vector3 *vPosition, vector3 *vAngle, GLuint *ReplacableSkinId = NULL, + int iAlpha = 0x30300030); // inline int GetSubModelsCount() { return (SubModelsCount); }; - int Flags() { return iFlags; }; + int Flags() + { + return iFlags; + }; void Init(); - char *__fastcall NameGet() { return Root ? Root->pName : NULL; }; + char *__fastcall NameGet() + { + return Root ? Root->pName : NULL; + }; int TerrainCount(); TSubModel *__fastcall TerrainSquare(int n); void TerrainRenderVBO(int n); diff --git a/Mover.cpp b/Mover.cpp index 47c4f07d..5bb01cab 100644 --- a/Mover.cpp +++ b/Mover.cpp @@ -16,9 +16,8 @@ http://mozilla.org/MPL/2.0/. const dEpsilon = 0.01; // 1cm (zależy od typu sprzęgu...) -TMoverParameters::TMoverParameters(double VelInitial, AnsiString TypeNameInit, - AnsiString NameInit, int LoadInitial, - AnsiString LoadTypeInitial, int Cab) +TMoverParameters::TMoverParameters(double VelInitial, AnsiString TypeNameInit, AnsiString NameInit, + int LoadInitial, AnsiString LoadTypeInitial, int Cab) : T_MoverParameters(VelInitial, TypeNameInit, NameInit, LoadInitial, LoadTypeInitial, Cab) { // główny konstruktor DimHalf.x = 0.5 * Dim.W; // połowa szerokości, OX jest w bok? @@ -32,13 +31,13 @@ TMoverParameters::TMoverParameters(double VelInitial, AnsiString TypeNameInit, }; double TMoverParameters::Distance(const TLocation &Loc1, const TLocation &Loc2, - const TDimension &Dim1, const TDimension &Dim2) + const TDimension &Dim1, const TDimension &Dim2) { // zwraca odległość pomiędzy pojazdami (Loc1) i (Loc2) z uwzględnieneim ich długości (kule!) return hypot(Loc2.X - Loc1.X, Loc1.Y - Loc2.Y) - 0.5 * (Dim2.L + Dim1.L); }; -double TMoverParameters::Distance(const vector3 &s1, const vector3 &s2, - const vector3 &d1, const vector3 &d2){ +double TMoverParameters::Distance(const vector3 &s1, const vector3 &s2, const vector3 &d1, + const vector3 &d2){ // obliczenie odległości prostopadłościanów o środkach (s1) i (s2) i wymiarach (d1) i (d2) // return 0.0; //będzie zgłaszać warning - funkcja do usunięcia, chyba że się przyda... }; @@ -50,9 +49,8 @@ double TMoverParameters::CouplerDist(Byte Coupler) Couplers[Coupler].Connected->Dim); // odległość pomiędzy sprzęgami (kula!) }; -bool TMoverParameters::Attach(Byte ConnectNo, Byte ConnectToNr, - TMoverParameters *ConnectTo, Byte CouplingType, - bool Forced) +bool TMoverParameters::Attach(Byte ConnectNo, Byte ConnectToNr, TMoverParameters *ConnectTo, + Byte CouplingType, bool Forced) { //łączenie do swojego sprzęgu (ConnectNo) pojazdu (ConnectTo) stroną (ConnectToNr) // Ra: zwykle wykonywane dwukrotnie, dla każdego pojazdu oddzielnie // Ra: trzeba by odróżnić wymóg dociśnięcia od uszkodzenia sprzęgu przy podczepianiu AI do @@ -91,12 +89,11 @@ bool TMoverParameters::Attach(Byte ConnectNo, Byte ConnectToNr, } } return false; // brak podłączanego pojazdu, zbyt duża odległość, niezgodny typ sprzęgu, brak - // sprzęgu, brak haka + // sprzęgu, brak haka }; -bool TMoverParameters::Attach(Byte ConnectNo, Byte ConnectToNr, - T_MoverParameters *ConnectTo, Byte CouplingType, - bool Forced) +bool TMoverParameters::Attach(Byte ConnectNo, Byte ConnectToNr, T_MoverParameters *ConnectTo, + Byte CouplingType, bool Forced) { //łączenie do (ConnectNo) pojazdu (ConnectTo) stroną (ConnectToNr) return Attach(ConnectNo, ConnectToNr, (TMoverParameters *)ConnectTo, CouplingType, Forced); }; @@ -139,7 +136,7 @@ bool TMoverParameters::Dettach(Byte ConnectNo) } else if (i > 0) { // odłączamy węże i resztę, pozostaje sprzęg fizyczny, który wymaga dociśnięcia (z wirtualnym - // nic) + // nic) Couplers[ConnectNo].CouplingFlag &= ctrain_coupler; Couplers[ConnectNo].Connected->Couplers[Couplers[ConnectNo].ConnectedNr].CouplingFlag = Couplers[ConnectNo].CouplingFlag; @@ -196,7 +193,7 @@ void TMoverParameters::BrakeLevelSet(double b) else if (fBrakeCtrlPos > Handle->GetPos(bh_MAX)) fBrakeCtrlPos = Handle->GetPos(bh_MAX); int x = floor(fBrakeCtrlPos); // jeśli odwołujemy się do BrakeCtrlPos w pośrednich, to musi być - // obcięte a nie zaokrągone + // obcięte a nie zaokrągone while ((x > BrakeCtrlPos) && (BrakeCtrlPos < BrakeCtrlPosNo)) // jeśli zwiększyło się o 1 if (!T_MoverParameters::IncBrakeLevelOld()) break; // wyjście awaryjne @@ -234,10 +231,13 @@ bool TMoverParameters::BrakeLevelAdd(double b) bool TMoverParameters::IncBrakeLevel() { // nowa wersja na użytek AI, false gdy osiągnięto pozycję BrakeCtrlPosNo - return BrakeLevelAdd(1.0); }; + return BrakeLevelAdd(1.0); +}; -bool TMoverParameters::DecBrakeLevel() -{ return BrakeLevelAdd(-1.0); }; // nowa wersja na użytek AI, false gdy osiągnięto pozycję -1 +bool TMoverParameters::DecBrakeLevel() +{ // nowa wersja na użytek AI, false gdy osiągnięto pozycję -1 + return BrakeLevelAdd(-1.0); +}; bool TMoverParameters::ChangeCab(int direction) { // zmiana kabiny i resetowanie ustawien @@ -298,7 +298,7 @@ bool TMoverParameters::CurrentSwitch(int direction) void TMoverParameters::UpdatePantVolume(double dt) { // KURS90 - sprężarka pantografów; Ra 2014-07: teraz jest to zbiornik rozrządu, chociaż to jeszcze - // nie tak + // nie tak if (EnginePowerSource.SourceType == CurrentCollector) // tylko jeśli pantografujący { // Ra 2014-07: zasadniczo, to istnieje zbiornik rozrządu i zbiornik pantografów - na razie @@ -310,7 +310,7 @@ void TMoverParameters::UpdatePantVolume(double dt) if ((TrainType == dt_EZT) ? (PantPress < ScndPipePress) : bPantKurek3) // kurek zamyka połączenie z ZG { // zbiornik pantografu połączony ze zbiornikiem głównym - małą sprężarką się tego nie - // napompuje + // napompuje // Ra 2013-12: Niebugocław mówi, że w EZT nie ma potrzeby odcinać kurkiem PantPress = EnginePowerSource.CollectorParameters .MaxPress; // ograniczenie ciśnienia do MaxPress (tylko w pantografach!) @@ -335,7 +335,7 @@ void TMoverParameters::UpdatePantVolume(double dt) if ((TrainType & (dt_EZT | dt_ET40 | dt_ET41 | dt_ET42)) ? (GetTrainsetVoltage() < EnginePowerSource.CollectorParameters.MinV) : true) // to jest trochę proteza; zasilanie członu może być przez sprzęg - // WN + // WN if (MainSwitch(false)) EventFlag = true; // wywalenie szybkiego z powodu niskiego ciśnienia if (TrainType != dt_EZT) // w EN57 pompuje się tylko w silnikowym @@ -377,7 +377,7 @@ void TMoverParameters::UpdateBatteryVoltage(double dt) else sn3 = 0; if (iLights[0] & 63) // 64=blachy, nie ciągną prądu //rozpisać na poszczególne - // żarówki... + // żarówki... sn4 = dt * 0.003; else sn4 = 0; @@ -475,9 +475,8 @@ ZN //masa */ double TMoverParameters::ComputeMovement(double dt, double dt1, const TTrackShape &Shape, - TTrackParam &Track, - TTractionParam &ElectricTraction, - const TLocation &NewLoc, TRotation &NewRot) + TTrackParam &Track, TTractionParam &ElectricTraction, + const TLocation &NewLoc, TRotation &NewRot) { // trzeba po mału przenosić tu tę funkcję double d; T_MoverParameters::ComputeMovement(dt, dt1, Shape, Track, ElectricTraction, NewLoc, NewRot); @@ -554,8 +553,8 @@ double TMoverParameters::ComputeMovement(double dt, double dt1, const TTrackShap }; double TMoverParameters::FastComputeMovement(double dt, const TTrackShape &Shape, - TTrackParam &Track, const TLocation &NewLoc, - TRotation &NewRot) + TTrackParam &Track, const TLocation &NewLoc, + TRotation &NewRot) { // trzeba po mału przenosić tu tę funkcję double d; T_MoverParameters::FastComputeMovement(dt, Shape, Track, NewLoc, NewRot); diff --git a/Mover.h b/Mover.h index 2db455f5..f92b3eb1 100644 --- a/Mover.h +++ b/Mover.h @@ -36,7 +36,7 @@ class TMoverParameters : public T_MoverParameters unsigned char WarningSignal; // tymczasowo 8bit, ze względu na funkcje w MTools double fBrakeCtrlPos; // płynna nastawa hamulca zespolonego bool bPantKurek3; // kurek trójdrogowy (pantografu): true=połączenie z ZG, false=połączenie z - // małą sprężarką + // małą sprężarką int iProblem; // flagi problemów z taborem, aby AI nie musiało porównywać; 0=może jechać int iLights[2]; // bity zapalonych świateł tutaj, żeby dało się liczyć pobór prądu private: @@ -44,16 +44,16 @@ class TMoverParameters : public T_MoverParameters public: TMoverParameters(double VelInitial, AnsiString TypeNameInit, AnsiString NameInit, - int LoadInitial, AnsiString LoadTypeInitial, int Cab); + int LoadInitial, AnsiString LoadTypeInitial, int Cab); // obsługa sprzęgów double Distance(const TLocation &Loc1, const TLocation &Loc2, const TDimension &Dim1, - const TDimension &Dim2); + const TDimension &Dim2); double Distance(const vector3 &Loc1, const vector3 &Loc2, const vector3 &Dim1, - const vector3 &Dim2); - bool Attach(Byte ConnectNo, Byte ConnectToNr, TMoverParameters *ConnectTo, - Byte CouplingType, bool Forced = false); - bool Attach(Byte ConnectNo, Byte ConnectToNr, T_MoverParameters *ConnectTo, - Byte CouplingType, bool Forced = false); + const vector3 &Dim2); + bool Attach(Byte ConnectNo, Byte ConnectToNr, TMoverParameters *ConnectTo, Byte CouplingType, + bool Forced = false); + bool Attach(Byte ConnectNo, Byte ConnectToNr, T_MoverParameters *ConnectTo, Byte CouplingType, + bool Forced = false); int DettachStatus(Byte ConnectNo); bool Dettach(Byte ConnectNo); void SetCoupleDist(); @@ -65,11 +65,11 @@ class TMoverParameters : public T_MoverParameters bool ChangeCab(int direction); bool CurrentSwitch(int direction); void UpdateBatteryVoltage(double dt); - double ComputeMovement(double dt, double dt1, const TTrackShape &Shape, - TTrackParam &Track, TTractionParam &ElectricTraction, - const TLocation &NewLoc, TRotation &NewRot); + double ComputeMovement(double dt, double dt1, const TTrackShape &Shape, TTrackParam &Track, + TTractionParam &ElectricTraction, const TLocation &NewLoc, + TRotation &NewRot); double FastComputeMovement(double dt, const TTrackShape &Shape, TTrackParam &Track, - const TLocation &NewLoc, TRotation &NewRot); + const TLocation &NewLoc, TRotation &NewRot); double ShowEngineRotation(int VehN); // double GetTrainsetVoltage(void); // bool Physic_ReActivation(void); @@ -170,7 +170,7 @@ class TMoverParameters : public T_MoverParameters // TLocation &NewLoc, TRotation &NewRot); // bool ChangeOffsetH(double DeltaOffset); //__fastcall T_MoverParameters(double VelInitial, AnsiString TypeNameInit, AnsiString NameInit, - //int LoadInitial + // int LoadInitial // , AnsiString LoadTypeInitial, int Cab); // bool LoadChkFile(AnsiString chkpath); // bool CheckLocomotiveParameters(bool ReadyFlag, int Dir); diff --git a/Names.h b/Names.h index 76f162d2..3ddcaf85 100644 --- a/Names.h +++ b/Names.h @@ -26,8 +26,14 @@ class ItemRecord // typedef void ListGet(ItemRecord *r, int *&n); void TreeAdd(ItemRecord *r, int c); - template inline TOut *DataGet() { return (TOut *)pData; }; - template inline void DataSet(TOut *x) { pData = (void *)x; }; + template inline TOut *DataGet() + { + return (TOut *)pData; + }; + template inline void DataSet(TOut *x) + { + pData = (void *)x; + }; void *__fastcall TreeFind(const char *n); ItemRecord *__fastcall TreeFindRecord(const char *n); }; @@ -46,8 +52,7 @@ class TNames int Add(int t, const char *n); // dodanie obiektu typu (t) int Add(int t, const char *n, void *d); // dodanie obiektu z wskaźnikiem int Add(int t, const char *n, int d); // dodanie obiektu z numerem - bool Update(int t, const char *n, - void *d); // dodanie jeśli nie ma, wymiana (d), gdy jest + bool Update(int t, const char *n, void *d); // dodanie jeśli nie ma, wymiana (d), gdy jest void TreeSet(); ItemRecord *__fastcall TreeSet(int *n, int d, int u); void Sort(int t); // przebudowa drzewa typu (t) diff --git a/PyInt.cpp b/PyInt.cpp new file mode 100644 index 00000000..542ecd37 --- /dev/null +++ b/PyInt.cpp @@ -0,0 +1,601 @@ +#include "PyInt.h" +#include "Train.h" +#include "Logs.h" +#include +#include +#include + +TPythonInterpreter *TPythonInterpreter::_instance = NULL; + +//#define _PY_INT_MORE_LOG + +TPythonInterpreter::TPythonInterpreter() +{ + WriteLog("Loading Python ..."); + Py_SetPythonHome("python"); + Py_Initialize(); + _main = PyImport_ImportModule("__main__"); + if (_main == NULL) + { + WriteLog("Cannot import Python module __main__"); + } + _screenRendererPriority = THREAD_PRIORITY_NORMAL; // domyslny priorytet normalny + PyObject *cStringModule = PyImport_ImportModule("cStringIO"); + _stdErr = NULL; + if (cStringModule == NULL) + return; + PyObject *cStringClassName = PyObject_GetAttrString(cStringModule, "StringIO"); + if (cStringClassName == NULL) + return; + PyObject *cString = PyObject_CallObject(cStringClassName, NULL); + if (cString == NULL) + return; + if (PySys_SetObject("stderr", cString) != 0) + return; + _stdErr = cString; +} + +TPythonInterpreter *TPythonInterpreter::getInstance() +{ + if (!_instance) + { + _instance = new TPythonInterpreter(); + } + return _instance; +} + +bool TPythonInterpreter::loadClassFile(const char *lookupPath, const char *className) +{ + std::set::const_iterator it = _classes.find(className); + if (it == _classes.end()) + { + FILE *sourceFile = _getFile(lookupPath, className); + if (sourceFile != NULL) + { + fseek(sourceFile, 0, SEEK_END); + long fsize = ftell(sourceFile); + char *buffer = (char *)calloc(fsize + 1, sizeof(char)); + fseek(sourceFile, 0, SEEK_SET); + long freaded = fread(buffer, sizeof(char), fsize, sourceFile); + buffer[freaded] = 0; // z jakiegos powodu czytamy troche mniej i trzczeba dodac konczace +// zero do bufora (mimo ze calloc teoretycznie powiniene zwrocic +// wyzerowana pamiec) +#ifdef _PY_INT_MORE_LOG + char buf[255]; + sprintf(buf, "readed %d / %d characters for %s", freaded, fsize, className); + WriteLog(buf); +#endif // _PY_INT_MORE_LOG + fclose(sourceFile); + if (PyRun_SimpleString(buffer) != 0) + { + handleError(); + return false; + } + char *classNameToRemember = (char *)calloc(strlen(className) + 1, sizeof(char)); + strcpy(classNameToRemember, className); + _classes.insert(classNameToRemember); + free(buffer); + return true; + } + return false; + } + return true; +} + +PyObject *TPythonInterpreter::newClass(const char *className) +{ + return newClass(className, NULL); +} + +FILE *TPythonInterpreter::_getFile(const char *lookupPath, const char *className) +{ + char *sourceFilePath; + if (lookupPath != NULL) + { + sourceFilePath = (char *)calloc(strlen(lookupPath) + strlen(className) + 4, sizeof(char)); + strcat(sourceFilePath, lookupPath); + strcat(sourceFilePath, className); + strcat(sourceFilePath, ".py"); + + FILE *file = fopen(sourceFilePath, "r"); +#ifdef _PY_INT_MORE_LOG + WriteLog(sourceFilePath); +#endif // _PY_INT_MORE_LOG + free(sourceFilePath); + if (file != NULL) + { + return file; + } + } + char *basePath = "python\\local\\"; + sourceFilePath = (char *)calloc(strlen(basePath) + strlen(className) + 4, sizeof(char)); + strcat(sourceFilePath, basePath); + strcat(sourceFilePath, className); + strcat(sourceFilePath, ".py"); + + FILE *file = fopen(sourceFilePath, "r"); +#ifdef _PY_INT_MORE_LOG + WriteLog(sourceFilePath); +#endif // _PY_INT_MORE_LOG + free(sourceFilePath); + if (file != NULL) + { + return file; + } + return NULL; +} + +void TPythonInterpreter::handleError() +{ +#ifdef _PY_INT_MORE_LOG + WriteLog("Python Error occured"); +#endif // _PY_INT_MORE_LOG + if (_stdErr != NULL) + { // std err pythona jest buforowane + PyErr_Print(); + PyObject *bufferContent = PyObject_CallMethod(_stdErr, "getvalue", NULL); + PyObject_CallMethod(_stdErr, "truncate", "i", 0); // czyscimy bufor na kolejne bledy + WriteLog(PyString_AsString(bufferContent)); + } + else + { // nie dziala buffor pythona + if (PyErr_Occurred() != NULL) + { + PyObject *ptype, *pvalue, *ptraceback; + PyErr_Fetch(&ptype, &pvalue, &ptraceback); + if (ptype == NULL) + { + WriteLog("Don't konw how to handle NULL exception"); + } + PyErr_NormalizeException(&ptype, &pvalue, &ptraceback); + if (ptype == NULL) + { + WriteLog("Don't konw how to handle NULL exception"); + } + PyObject *pStrType = PyObject_Str(ptype); + if (pStrType != NULL) + { + WriteLog(PyString_AsString(pStrType)); + } + WriteLog(PyString_AsString(pvalue)); + PyObject *pStrTraceback = PyObject_Str(ptraceback); + if (pStrTraceback != NULL) + { + WriteLog(PyString_AsString(pStrTraceback)); + } + else + { + WriteLog("Python Traceback cannot be shown"); + } + } + else + { +#ifdef _PY_INT_MORE_LOG + WriteLog("Called python error handler when no error occured!"); +#endif // _PY_INT_MORE_LOG + } + } +} +PyObject *TPythonInterpreter::newClass(const char *className, PyObject *argsTuple) +{ + if (_main == NULL) + { + WriteLog("main turned into null"); + return NULL; + } + PyObject *classNameObj = PyObject_GetAttrString(_main, className); + if (classNameObj == NULL) + { +#ifdef _PY_INT_MORE_LOG + char buf[255]; + sprintf(buf, "Python class %s not defined!", className); + WriteLog(buf); +#endif // _PY_INT_MORE_LOG + return NULL; + } + PyObject *object = PyObject_CallObject(classNameObj, argsTuple); + + if (PyErr_Occurred() != NULL) + { + handleError(); + return NULL; + } + return object; +} + +void TPythonInterpreter::setScreenRendererPriority(const char *priority) +{ + if (strncmp(priority, "normal", 6) == 0) + { + _screenRendererPriority = THREAD_PRIORITY_NORMAL; +#ifdef _PY_INT_MORE_LOG + WriteLog("Python screen renderer priority: Normal"); +#endif // _PY_INT_MORE_LOG + } + else if (strncmp(priority, "lower", 5) == 0) + { + _screenRendererPriority = THREAD_PRIORITY_BELOW_NORMAL; +#ifdef _PY_INT_MORE_LOG + WriteLog("Python screen renderer priority: Lower"); +#endif // _PY_INT_MORE_LOG + } + else if (strncmp(priority, "lowest", 6) == 0) + { + _screenRendererPriority = THREAD_PRIORITY_LOWEST; +#ifdef _PY_INT_MORE_LOG + WriteLog("Python screen renderer priority: Lowest"); +#endif // _PY_INT_MORE_LOG + } + else if (strncmp(priority, "idle", 4) == 0) + { + _screenRendererPriority = THREAD_PRIORITY_IDLE; +#ifdef _PY_INT_MORE_LOG + WriteLog("Python screen renderer priority: Idle"); +#endif // _PY_INT_MORE_LOG + } +} + +TPythonScreenRenderer::TPythonScreenRenderer(int textureId, PyObject *renderer) +{ + _textureId = textureId; + _pyRenderer = renderer; +} + +void TPythonScreenRenderer::updateTexture() +{ + int width, height; + if (_pyWidth == NULL || _pyHeight == NULL) + { + WriteLog("Unknown python texture size!"); + return; + } + width = PyInt_AsLong(_pyWidth); + height = PyInt_AsLong(_pyHeight); + if (_pyTexture != NULL) + { + char *textureData = PyString_AsString(_pyTexture); + if (textureData != NULL) + { +#ifdef _PY_INT_MORE_LOG + char buff[255]; + sprintf(buff, "Sending texture id: %d w: %d h: %d", _textureId, width, height); + WriteLog(buff); +#endif // _PY_INT_MORE_LOG + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + glBindTexture(GL_TEXTURE_2D, _textureId); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, + textureData); +#ifdef _PY_INT_MORE_LOG + GLenum status = glGetError(); + switch (status) + { + case GL_INVALID_ENUM: + WriteLog("An unacceptable value is specified for an enumerated argument. The " + "offending function is ignored, having no side effect other than to set " + "the error flag."); + break; + case GL_INVALID_VALUE: + WriteLog("A numeric argument is out of range. The offending function is ignored, " + "having no side effect other than to set the error flag."); + break; + case GL_INVALID_OPERATION: + WriteLog("The specified operation is not allowed in the current state. The " + "offending function is ignored, having no side effect other than to set " + "the error flag."); + break; + case GL_NO_ERROR: + WriteLog("No error has been recorded. The value of this symbolic constant is " + "guaranteed to be zero."); + break; + case GL_STACK_OVERFLOW: + WriteLog("This function would cause a stack overflow. The offending function is " + "ignored, having no side effect other than to set the error flag."); + break; + case GL_STACK_UNDERFLOW: + WriteLog("This function would cause a stack underflow. The offending function is " + "ignored, having no side effect other than to set the error flag."); + break; + case GL_OUT_OF_MEMORY: + WriteLog("There is not enough memory left to execute the function. The state of " + "OpenGL is undefined, except for the state of the error flags, after this " + "error is recorded."); + break; + }; +#endif // _PY_INT_MORE_LOG + } + else + { + WriteLog("RAW python texture data is NULL!"); + } + } + else + { + WriteLog("Python texture object is NULL!"); + } +} + +void TPythonScreenRenderer::render(PyObject *trainState) +{ +#ifdef _PY_INT_MORE_LOG + WriteLog("Python rendering texture ..."); +#endif // _PY_INT_MORE_LOG + _pyTexture = PyObject_CallMethod(_pyRenderer, "render", "O", trainState); + + if (_pyTexture == NULL) + { + TPythonInterpreter::getInstance()->handleError(); + } + else + { + _pyWidth = PyObject_CallMethod(_pyRenderer, "get_width", NULL); + if (_pyWidth == NULL) + { + TPythonInterpreter::getInstance()->handleError(); + } + _pyHeight = PyObject_CallMethod(_pyRenderer, "get_height", NULL); + if (_pyHeight == NULL) + { + TPythonInterpreter::getInstance()->handleError(); + } + } +} + +TPythonScreenRenderer::~TPythonScreenRenderer() +{ +#ifdef _PY_INT_MORE_LOG + WriteLog("PythonScreenRenderer descturctor called"); +#endif // _PY_INT_MORE_LOG + if (_pyRenderer != NULL) + { + Py_CLEAR(_pyRenderer); + } + cleanup(); +#ifdef _PY_INT_MORE_LOG + WriteLog("PythonScreenRenderer desctructor finished"); +#endif // _PY_INT_MORE_LOG +} + +void TPythonScreenRenderer::cleanup() +{ + if (_pyTexture != NULL) + { + Py_CLEAR(_pyTexture); + _pyTexture = NULL; + } + if (_pyWidth != NULL) + { + Py_CLEAR(_pyWidth); + _pyWidth = NULL; + } + if (_pyHeight != NULL) + { + Py_CLEAR(_pyHeight); + _pyHeight = NULL; + } +} + +void TPythonScreens::reset(void *train) +{ + _terminationFlag = true; + if (_thread != NULL) + { + WriteLog("Awaiting python thread to end"); + WaitForSingleObject(_thread, INFINITE); + _thread = NULL; + } + _terminationFlag = false; + _cleanupReadyFlag = false; + _renderReadyFlag = false; + for (std::vector::iterator i = _screens.begin(); i != _screens.end(); + ++i) + { + delete *i; + } +#ifdef _PY_INT_MORE_LOG + WriteLog("Clearing renderer vector"); +#endif // _PY_INT_MORE_LOG + _screens.clear(); + _train = train; +} + +void TPythonScreens::init(TQueryParserComp *parser, TModel3d *model, AnsiString name, int cab) +{ + char buff[255]; + AnsiString asSubModelName = parser->GetNextSymbol(); + AnsiString asPyClassName = parser->GetNextSymbol(); + char *subModelName = (char *)calloc(asSubModelName.Length() + 1, sizeof(char)); + strcpy(subModelName, asSubModelName.LowerCase().c_str()); + char *pyClassName = (char *)calloc(asPyClassName.Length() + 1, sizeof(char)); + strcpy(pyClassName, asPyClassName.LowerCase().c_str()); + TSubModel *subModel = model->GetFromName(subModelName); + if (subModel == NULL) + { + sprintf(buff, "Python Screen: submodel %s not found - Ignoring screen", subModelName); + WriteLog(buff); + free(subModelName); + free(pyClassName); + return; // nie ma takiego sub modelu w danej kabinie pomijamy + } + int textureId = subModel->GetTextureId(); + if (textureId <= 0) + { + sprintf(buff, "Python Screen: invalid texture id %d - Ignoring screen", textureId); + WriteLog(buff); + free(subModelName); + free(pyClassName); + return; // sub model nie posiada tekstury lub tekstura wymienna - nie obslugiwana + } + TPythonInterpreter *python = TPythonInterpreter::getInstance(); + python->loadClassFile(_lookupPath, pyClassName); + PyObject *args = Py_BuildValue("(ssi)", _lookupPath, name.c_str(), cab); + if (args == NULL) + { + WriteLog("Python Screen: cannot create __init__ arguments"); + free(subModelName); + free(pyClassName); + return; + } + PyObject *pyRenderer = python->newClass(pyClassName, args); + Py_CLEAR(args); + if (pyRenderer == NULL) + { + sprintf(buff, "Python Screen: null renderer for %s - Ignoring screen", pyClassName); + WriteLog(buff); + free(subModelName); + free(pyClassName); + return; // nie mozna utworzyc obiektu Pythonowego + } + TPythonScreenRenderer *renderer = new TPythonScreenRenderer(textureId, pyRenderer); + _screens.push_back(renderer); + sprintf(buff, "Created python screen %s on submodel %s (%d)", pyClassName, subModelName, + textureId); + WriteLog(buff); + free(subModelName); + free(pyClassName); +} + +void TPythonScreens::update() +{ + if (!_renderReadyFlag) + { + return; + } + _renderReadyFlag = false; + for (std::vector::iterator i = _screens.begin(); i != _screens.end(); + ++i) + { + (*i)->updateTexture(); + } + _cleanupReadyFlag = true; +} + +void TPythonScreens::setLookupPath(AnsiString path) +{ + if (_lookupPath != NULL) + { + free(_lookupPath); + } + _lookupPath = (char *)calloc(path.Length() + 1, sizeof(char)); + strcpy(_lookupPath, path.c_str()); +} + +TPythonScreens::TPythonScreens() +{ + _lookupPath = NULL; + TPythonInterpreter::getInstance()->loadClassFile(NULL, "abstractscreenrenderer"); + _terminationFlag = false; + _renderReadyFlag = false; + _cleanupReadyFlag = false; + _thread = NULL; +} + +TPythonScreens::~TPythonScreens() +{ +#ifdef _PY_INT_MORE_LOG + WriteLog("Called python sceeens destructor"); +#endif // _PY_INT_MORE_LOG + reset(NULL); + if (_lookupPath != NULL) + { +#ifdef _PY_INT_MORE_LOG + WriteLog("Freeing lookup path"); +#endif // _PY_INT_MORE_LOG + free(_lookupPath); + } +} + +void TPythonScreens::run() +{ + while (1) + { + if (_terminationFlag) + { + return; + } + TTrain *train = (TTrain *)_train; + _trainState = train->GetTrainState(); + if (_terminationFlag) + { + _freeTrainState(); + return; + } + for (std::vector::iterator i = _screens.begin(); + i != _screens.end(); ++i) + { + (*i)->render(_trainState); + } + _freeTrainState(); + if (_terminationFlag) + { + _cleanup(); + return; + } + _renderReadyFlag = true; + while (!_cleanupReadyFlag && !_terminationFlag) + { + Sleep(100); + } + if (_terminationFlag) + { + return; + } + _cleanup(); + } +} + +void TPythonScreens::finish() +{ + _thread == NULL; +} + +DWORD WINAPI ScreenRendererThread(LPVOID lpParam) +{ + TPythonScreens *renderer = (TPythonScreens *)lpParam; + renderer->run(); + renderer->finish(); +#ifdef _PY_INT_MORE_LOG + WriteLog("Python Screen Renderer Thread Ends"); +#endif // _PY_INT_MORE_LOG + return true; +} + +void TPythonScreens::start() +{ + if (_screens.size() > 0) + { + _thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ScreenRendererThread, this, + CREATE_SUSPENDED, &_threadId); + if (_thread != NULL) + { + SetThreadPriority(_thread, + TPythonInterpreter::getInstance()->getScreenRendererPriotity()); + if (ResumeThread(_thread) != (DWORD)-1) + { + return; + } + } + WriteLog("Python Screen Renderer Thread Did Not Start"); + } +} + +void TPythonScreens::_cleanup() +{ + _cleanupReadyFlag = false; + for (std::vector::iterator i = _screens.begin(); i != _screens.end(); + ++i) + { + (*i)->cleanup(); + } +} + +void TPythonScreens::_freeTrainState() +{ + if (_trainState != NULL) + { + PyDict_Clear(_trainState); + Py_CLEAR(_trainState); + _trainState = NULL; + } +} diff --git a/PyInt.h b/PyInt.h new file mode 100644 index 00000000..4228e049 --- /dev/null +++ b/PyInt.h @@ -0,0 +1,95 @@ +#ifndef PyIntH +#define PyIntH + +#undef _DEBUG // bez tego macra Py_DECREF powoduja problemy przy linkowaniu + +#include "Python.h" +#include "QueryParserComp.hpp" +#include "Model3d.h" +#include +#include + +#define PyGetFloat(param) PyFloat_FromDouble(param >= 0 ? param : -param) +#define PyGetInt(param) PyInt_FromLong(param) +#define PyGetBool(param) param ? Py_True : Py_False + +struct ltstr +{ + bool operator()(const char *s1, const char *s2) const + { + return strcmp(s1, s2) < 0; + } +}; + +class TPythonInterpreter +{ + protected: + TPythonInterpreter(); + ~TPythonInterpreter() + { + } + static TPythonInterpreter *_instance; + int _screenRendererPriority; + std::set _classes; + PyObject *_main; + PyObject *_stdErr; + FILE *_getFile(const char *lookupPath, const char *className); + + public: + static TPythonInterpreter *getInstance(); + bool loadClassFile(const char *lookupPath, const char *className); + PyObject *newClass(const char *className); + PyObject *newClass(const char *className, PyObject *argsTuple); + int getScreenRendererPriotity() + { + return _screenRendererPriority; + }; + void setScreenRendererPriority(const char *priority); + void handleError(); +}; + +class TPythonScreenRenderer +{ + protected: + PyObject *_pyRenderer; + PyObject *_pyTexture; + int _textureId; + PyObject *_pyWidth; + PyObject *_pyHeight; + + public: + TPythonScreenRenderer(int textureId, PyObject *renderer); + ~TPythonScreenRenderer(); + void render(PyObject *trainState); + void cleanup(); + void updateTexture(); +}; + +class TPythonScreens +{ + protected: + bool _cleanupReadyFlag; + bool _renderReadyFlag; + bool _terminationFlag; + HANDLE _thread; + DWORD _threadId; + std::vector _screens; + char *_lookupPath; + void *_train; + void _cleanup(); + void _freeTrainState(); + PyObject *_trainState; + + public: + void reset(void *train); + void setLookupPath(AnsiString path); + void init(TQueryParserComp *parser, TModel3d *model, AnsiString name, int cab); + void update(); + TPythonScreens(); + ~TPythonScreens(); + void run(); + void start(); + void finish(); +}; + +#endif // PyIntH diff --git a/RealSound.cpp b/RealSound.cpp index c1709f0b..ff8d6e14 100644 --- a/RealSound.cpp +++ b/RealSound.cpp @@ -45,10 +45,12 @@ TRealSound::~TRealSound() // if (this) if (pSound) pSound->Stop(); } -void TRealSound::Free() {} +void TRealSound::Free() +{ +} -void TRealSound::Init(char *SoundName, double DistanceAttenuation, double X, double Y, - double Z, bool Dynamic, bool freqmod, double rmin) +void TRealSound::Init(char *SoundName, double DistanceAttenuation, double X, double Y, double Z, + bool Dynamic, bool freqmod, double rmin) { // Nazwa=SoundName; //to tak raczej nie zadziała, (SoundName) jest tymczasowe pSound = TSoundsManager::GetFromName(SoundName, Dynamic, &fFrequency); @@ -57,7 +59,7 @@ void TRealSound::Init(char *SoundName, double DistanceAttenuation, double X, dou if (freqmod) if (fFrequency != 22050.0) { // dla modulowanych nie może być zmiany mnożnika, bo częstotliwość w nagłówku byłą - // ignorowana, a mogła być inna niż 22050 + // ignorowana, a mogła być inna niż 22050 fFrequency = 22050.0; ErrorLog("Bad sound: " + AnsiString(SoundName) + ", as modulated, should have 22.05kHz in header"); @@ -95,8 +97,7 @@ double TRealSound::ListenerDistance(vector3 ListenerPosition) } } -void TRealSound::Play(double Volume, int Looping, bool ListenerInside, - vector3 NewPosition) +void TRealSound::Play(double Volume, int Looping, bool ListenerInside, vector3 NewPosition) { if (!pSound) return; @@ -168,7 +169,8 @@ void TRealSound::Play(double Volume, int Looping, bool ListenerInside, } }; -void TRealSound::Start(){// włączenie dźwięku +void TRealSound::Start(){ + // włączenie dźwięku }; @@ -185,8 +187,7 @@ void TRealSound::Stop() } }; -void TRealSound::AdjFreq(double Freq, - double dt) // McZapkie TODO: dorobic tu efekt Dopplera +void TRealSound::AdjFreq(double Freq, double dt) // McZapkie TODO: dorobic tu efekt Dopplera // Freq moze byc liczba dodatnia mniejsza od 1 lub wieksza od 1 { float df, Vlist, Vsrc; @@ -223,7 +224,10 @@ double TRealSound::GetWaveTime() // McZapkie: na razie tylko dla 22KHz/8bps fFrequency; //(pSound->); // wielkosc w bajtach przez czestotliwosc probkowania } -void TRealSound::SetPan(int Pan) { pSound->SetPan(Pan); } +void TRealSound::SetPan(int Pan) +{ + pSound->SetPan(Pan); +} int TRealSound::GetStatus() { @@ -243,8 +247,8 @@ void TRealSound::ResetPosition() pSound->SetCurrentPosition(0); } -void TTextSound::Init(char *SoundName, double SoundAttenuation, double X, double Y, - double Z, bool Dynamic, bool freqmod, double rmin) +void TTextSound::Init(char *SoundName, double SoundAttenuation, double X, double Y, double Z, + bool Dynamic, bool freqmod, double rmin) { // dodatkowo doczytuje plik tekstowy TRealSound::Init(SoundName, SoundAttenuation, X, Y, Z, Dynamic, freqmod, rmin); fTime = GetWaveTime(); @@ -264,8 +268,7 @@ void TTextSound::Init(char *SoundName, double SoundAttenuation, double X, double delete ts; } }; -void TTextSound::Play(double Volume, int Looping, bool ListenerInside, - vector3 NewPosition) +void TTextSound::Play(double Volume, int Looping, bool ListenerInside, vector3 NewPosition) { if (!asText.IsEmpty()) { // jeśli ma powiązany tekst diff --git a/RealSound.h b/RealSound.h index 5a1fbcdb..ef750910 100644 --- a/RealSound.h +++ b/RealSound.h @@ -32,8 +32,8 @@ class TRealSound TRealSound(); ~TRealSound(); void Free(); - void Init(char *SoundName, double SoundAttenuation, double X, double Y, double Z, - bool Dynamic, bool freqmod = false, double rmin = 0.0); + void Init(char *SoundName, double SoundAttenuation, double X, double Y, double Z, bool Dynamic, + bool freqmod = false, double rmin = 0.0); double ListenerDistance(vector3 ListenerPosition); void Play(double Volume, int Looping, bool ListenerInside, vector3 NewPosition); void Start(); @@ -51,8 +51,8 @@ class TTextSound : public TRealSound AnsiString asText; float fTime; // czas trwania public: - void Init(char *SoundName, double SoundAttenuation, double X, double Y, double Z, - bool Dynamic, bool freqmod = false, double rmin = 0.0); + void Init(char *SoundName, double SoundAttenuation, double X, double Y, double Z, bool Dynamic, + bool freqmod = false, double rmin = 0.0); void Play(double Volume, int Looping, bool ListenerInside, vector3 NewPosition); }; diff --git a/ResourceManager.cpp b/ResourceManager.cpp index ed470681..79d2ac4e 100644 --- a/ResourceManager.cpp +++ b/ResourceManager.cpp @@ -17,7 +17,10 @@ double ResourceManager::_expiry = 5.0f; double ResourceManager::_lastUpdate = 0.0f; double ResourceManager::_lastReport = 0.0f; -void ResourceManager::Register(Resource *resource) { _resources.push_back(resource); }; +void ResourceManager::Register(Resource *resource) +{ + _resources.push_back(resource); +}; void ResourceManager::Unregister(Resource *resource) { @@ -33,7 +36,10 @@ class ResourceExpired { public: ResourceExpired(double time) : _time(time){}; - bool operator()(Resource *resource) { return (resource->GetLastUsage() < _time); } + bool operator()(Resource *resource) + { + return (resource->GetLastUsage() < _time); + } private: double _time; diff --git a/ResourceManager.h b/ResourceManager.h index 26efdf73..e2afec36 100644 --- a/ResourceManager.h +++ b/ResourceManager.h @@ -20,10 +20,16 @@ class Resource public: virtual void Release() = 0; - double GetLastUsage() const { return _lastUsage; } + double GetLastUsage() const + { + return _lastUsage; + } protected: - void SetLastUsage(double lastUsage) { _lastUsage = lastUsage; } + void SetLastUsage(double lastUsage) + { + _lastUsage = lastUsage; + } private: double _lastUsage; @@ -37,7 +43,10 @@ class ResourceManager static void Unregister(Resource *resource); static void Sweep(double currentTime); - static void SetExpiry(double expiry) { _expiry = expiry; } + static void SetExpiry(double expiry) + { + _expiry = expiry; + } private: typedef std::vector Resources; diff --git a/Segment.cpp b/Segment.cpp index 30fcbf21..617b936b 100644 --- a/Segment.cpp +++ b/Segment.cpp @@ -41,10 +41,13 @@ TSegment::TSegment(TTrack *owner) pOwner = owner; }; -TSegment::~TSegment() { SafeDeleteArray(fTsBuffer); }; +TSegment::~TSegment() +{ + SafeDeleteArray(fTsBuffer); +}; -bool TSegment::Init(vector3 NewPoint1, vector3 NewPoint2, double fNewStep, - double fNewRoll1, double fNewRoll2) +bool TSegment::Init(vector3 NewPoint1, vector3 NewPoint2, double fNewStep, double fNewRoll1, + double fNewRoll2) { // wersja dla prostego - wyliczanie punktów kontrolnych vector3 dir; if (fNewRoll1 == fNewRoll2) @@ -62,8 +65,8 @@ bool TSegment::Init(vector3 NewPoint1, vector3 NewPoint2, double fNewStep, }; bool TSegment::Init(vector3 &NewPoint1, vector3 NewCPointOut, vector3 NewCPointIn, - vector3 &NewPoint2, double fNewStep, double fNewRoll1, - double fNewRoll2, bool bIsCurve) + vector3 &NewPoint2, double fNewStep, double fNewRoll1, double fNewRoll2, + bool bIsCurve) { // wersja uniwersalna (dla krzywej i prostego) Point1 = NewPoint1; CPointOut = NewCPointOut; @@ -329,9 +332,8 @@ vector3 TSegment::FastGetPoint(double t) return (bCurve ? RaInterpolate(t) : ((1.0 - t) * Point1 + (t)*Point2)); } -void TSegment::RenderLoft(const vector6 *ShapePoints, int iNumShapePoints, - double fTextureLength, int iSkip, int iQualityFactor, - vector3 **p, bool bRender) +void TSegment::RenderLoft(const vector6 *ShapePoints, int iNumShapePoints, double fTextureLength, + int iSkip, int iQualityFactor, vector3 **p, bool bRender) { // generowanie trójkątów dla odcinka trajektorii ruchu // standardowo tworzy triangle_strip dla prostego albo ich zestaw dla łuku // po modyfikacji - dla ujemnego (iNumShapePoints) w dodatkowych polach tabeli @@ -401,7 +403,7 @@ void TSegment::RenderLoft(const vector6 *ShapePoints, int iNumShapePoints, pt.y += jmm1 * ShapePoints[j].y + m1 * ShapePoints[j + iNumShapePoints].y; if (bRender) { // skrzyżowania podczas łączenia siatek mogą nie renderować poboczy, ale - // potrzebować punktów + // potrzebować punktów glNormal3f(norm.x, norm.y, norm.z); glTexCoord2f( jmm1 * ShapePoints[j].z + m1 * ShapePoints[j + iNumShapePoints].z, tv1); @@ -424,7 +426,7 @@ void TSegment::RenderLoft(const vector6 *ShapePoints, int iNumShapePoints, pt.y += jmm2 * ShapePoints[j].y + m2 * ShapePoints[j + iNumShapePoints].y; if (bRender) { // skrzyżowania podczas łączenia siatek mogą nie renderować poboczy, ale - // potrzebować punktów + // potrzebować punktów glNormal3f(norm.x, norm.y, norm.z); glTexCoord2f( jmm2 * ShapePoints[j].z + m2 * ShapePoints[j + iNumShapePoints].z, tv2); @@ -511,8 +513,8 @@ void TSegment::RenderLoft(const vector6 *ShapePoints, int iNumShapePoints, }; void TSegment::RenderSwitchRail(const vector6 *ShapePoints1, const vector6 *ShapePoints2, - int iNumShapePoints, double fTextureLength, int iSkip, - double fOffsetX) + int iNumShapePoints, double fTextureLength, int iSkip, + double fOffsetX) { // tworzenie siatki trójkątów dla iglicy vector3 pos1, pos2, dir, parallel1, parallel2, pt; double a1, a2, s, step, offset, tv1, tv2, t, t2, t2step, oldt2, sp, oldsp; @@ -696,9 +698,8 @@ void TSegment::Render() } } -void TSegment::RaRenderLoft(CVertNormTex *&Vert, const vector6 *ShapePoints, - int iNumShapePoints, double fTextureLength, int iSkip, - int iEnd, double fOffsetX) +void TSegment::RaRenderLoft(CVertNormTex *&Vert, const vector6 *ShapePoints, int iNumShapePoints, + double fTextureLength, int iSkip, int iEnd, double fOffsetX) { // generowanie trójkątów dla odcinka trajektorii ruchu // standardowo tworzy triangle_strip dla prostego albo ich zestaw dla łuku // po modyfikacji - dla ujemnego (iNumShapePoints) w dodatkowych polach tabeli @@ -896,9 +897,8 @@ void TSegment::RaRenderLoft(CVertNormTex *&Vert, const vector6 *ShapePoints, } }; -void TSegment::RaAnimate(CVertNormTex *&Vert, const vector6 *ShapePoints, - int iNumShapePoints, double fTextureLength, int iSkip, int iEnd, - double fOffsetX) +void TSegment::RaAnimate(CVertNormTex *&Vert, const vector6 *ShapePoints, int iNumShapePoints, + double fTextureLength, int iSkip, int iEnd, double fOffsetX) { // jak wyżej, tylko z pominięciem mapowania i braku trapezowania vector3 pos1, pos2, dir, parallel1, parallel2, pt; double s, step, fOffset, t, fEnd; diff --git a/Segment.h b/Segment.h index 390c8eb6..59f868b3 100644 --- a/Segment.h +++ b/Segment.h @@ -77,22 +77,36 @@ class TSegment // (0-Bezier,1-prosty,2/3-łuk w lewo/prawo,6/7-przejściowa w lewo/prawo) TSegment(TTrack *owner); ~TSegment(); - bool Init(vector3 NewPoint1, vector3 NewPoint2, double fNewStep, - double fNewRoll1 = 0, double fNewRoll2 = 0); - bool Init(vector3 &NewPoint1, vector3 NewCPointOut, vector3 NewCPointIn, - vector3 &NewPoint2, double fNewStep, double fNewRoll1 = 0, - double fNewRoll2 = 0, bool bIsCurve = true); + bool Init(vector3 NewPoint1, vector3 NewPoint2, double fNewStep, double fNewRoll1 = 0, + double fNewRoll2 = 0); + bool Init(vector3 &NewPoint1, vector3 NewCPointOut, vector3 NewCPointIn, vector3 &NewPoint2, + double fNewStep, double fNewRoll1 = 0, double fNewRoll2 = 0, bool bIsCurve = true); inline double ComputeLength(); // McZapkie-150503 - inline vector3 GetDirection1() { return bCurve ? CPointOut - Point1 : CPointOut; }; - inline vector3 GetDirection2() { return bCurve ? CPointIn - Point2 : CPointIn; }; + inline vector3 GetDirection1() + { + return bCurve ? CPointOut - Point1 : CPointOut; + }; + inline vector3 GetDirection2() + { + return bCurve ? CPointIn - Point2 : CPointIn; + }; vector3 GetDirection(double fDistance); - vector3 GetDirection() { return CPointOut; }; + vector3 GetDirection() + { + return CPointOut; + }; vector3 FastGetDirection(double fDistance, double fOffset); vector3 GetPoint(double fDistance); void RaPositionGet(double fDistance, vector3 &p, vector3 &a); vector3 FastGetPoint(double t); - inline vector3 FastGetPoint_0() { return Point1; }; - inline vector3 FastGetPoint_1() { return Point2; }; + inline vector3 FastGetPoint_0() + { + return Point1; + }; + inline vector3 FastGetPoint_1() + { + return Point2; + }; inline double GetRoll(double s) { s /= fLength; @@ -103,14 +117,16 @@ class TSegment r1 = fRoll1; r2 = fRoll2; } - void RenderLoft(const vector6 *ShapePoints, int iNumShapePoints, - double fTextureLength, int iSkip = 0, int iQualityFactor = 1, - vector3 **p = NULL, bool bRender = true); + void RenderLoft(const vector6 *ShapePoints, int iNumShapePoints, double fTextureLength, + int iSkip = 0, int iQualityFactor = 1, vector3 **p = NULL, bool bRender = true); void RenderSwitchRail(const vector6 *ShapePoints1, const vector6 *ShapePoints2, - int iNumShapePoints, double fTextureLength, int iSkip = 0, - double fOffsetX = 0.0f); + int iNumShapePoints, double fTextureLength, int iSkip = 0, + double fOffsetX = 0.0f); void Render(); - inline double GetLength() { return fLength; }; + inline double GetLength() + { + return fLength; + }; void MoveMe(vector3 pPosition) { Point1 += pPosition; @@ -121,14 +137,18 @@ class TSegment CPointOut += pPosition; } } - int RaSegCount() { return fTsBuffer ? iSegCount : 1; }; - void RaRenderLoft(CVertNormTex *&Vert, const vector6 *ShapePoints, - int iNumShapePoints, double fTextureLength, int iSkip = 0, - int iEnd = 0, double fOffsetX = 0.0); + int RaSegCount() + { + return fTsBuffer ? iSegCount : 1; + }; + void RaRenderLoft(CVertNormTex *&Vert, const vector6 *ShapePoints, int iNumShapePoints, + double fTextureLength, int iSkip = 0, int iEnd = 0, double fOffsetX = 0.0); void RaAnimate(CVertNormTex *&Vert, const vector6 *ShapePoints, int iNumShapePoints, - double fTextureLength, int iSkip = 0, int iEnd = 0, - double fOffsetX = 0.0); - void AngleSet(int i, double a) { fAngle[i] = a; }; + double fTextureLength, int iSkip = 0, int iEnd = 0, double fOffsetX = 0.0); + void AngleSet(int i, double a) + { + fAngle[i] = a; + }; void Rollment(double w1, double w2); // poprawianie przechyłki }; diff --git a/Sound.cpp b/Sound.cpp index 0580d810..06b4cc0c 100644 --- a/Sound.cpp +++ b/Sound.cpp @@ -34,7 +34,7 @@ int TSoundsManager::Count = 0; TSoundContainer *TSoundsManager::First = NULL; TSoundContainer::TSoundContainer(LPDIRECTSOUND pDS, char *Directory, char *strFileName, - int NConcurrent) + int NConcurrent) { // wczytanie pliku dźwiękowego int hr = 111; DSBuffer = NULL; // na początek, gdyby uruchomić dźwięków się nie udało @@ -94,7 +94,7 @@ TSoundContainer::TSoundContainer(LPDIRECTSOUND pDS, char *Directory, char *strFi //---------------------------------------------------------- BYTE *pbWavData; // Pointer to actual wav data - UINT cbWavSize; // Size of data + UINT cbWavSize; // Size of data VOID *pbData = NULL; VOID *pbData2 = NULL; DWORD dwLength; @@ -171,7 +171,10 @@ LPDIRECTSOUNDBUFFER TSoundContainer::GetUnique(LPDIRECTSOUND pDS) return DSBuffers.top(); }; -TSoundsManager::~TSoundsManager() { Free(); }; +TSoundsManager::~TSoundsManager() +{ + Free(); +}; void TSoundsManager::Free() { @@ -200,8 +203,7 @@ void TSoundsManager::LoadSounds(char *Directory) FindClose(handle); }; -LPDIRECTSOUNDBUFFER TSoundsManager::GetFromName(char *Name, bool Dynamic, - float *fSamplingRate) +LPDIRECTSOUNDBUFFER TSoundsManager::GetFromName(char *Name, bool Dynamic, float *fSamplingRate) { // wyszukanie dźwięku w pamięci albo wczytanie z pliku AnsiString file; if (Dynamic) diff --git a/Sound.h b/Sound.h index 1d90aa80..37652b45 100644 --- a/Sound.h +++ b/Sound.h @@ -39,8 +39,7 @@ class TSoundContainer TSoundContainer *Next; std::stack DSBuffers; LPDIRECTSOUNDBUFFER GetUnique(LPDIRECTSOUND pDS); - TSoundContainer(LPDIRECTSOUND pDS, char *Directory, char *strFileName, - int NConcurrent); + TSoundContainer(LPDIRECTSOUND pDS, char *Directory, char *strFileName, int NConcurrent); ~TSoundContainer(); }; @@ -62,8 +61,7 @@ class TSoundsManager static void Free(); static void Init(char *Name, int Concurrent); static void LoadSounds(char *Directory); - static LPDIRECTSOUNDBUFFER GetFromName(char *Name, bool Dynamic, - float *fSamplingRate = NULL); + static LPDIRECTSOUNDBUFFER GetFromName(char *Name, bool Dynamic, float *fSamplingRate = NULL); static void RestoreAll(); }; diff --git a/Spline.cpp b/Spline.cpp index a693bed4..2c4c5525 100644 --- a/Spline.cpp +++ b/Spline.cpp @@ -73,7 +73,9 @@ __fastcall TKnot::TKnot(int n) } } -__fastcall TKnot::~TKnot() {} +__fastcall TKnot::~TKnot() +{ +} vector3 TKnot::GetDirection(float t) { diff --git a/Spring.cpp b/Spring.cpp index b615902b..8a832db1 100644 --- a/Spring.cpp +++ b/Spring.cpp @@ -24,7 +24,9 @@ TSpring::TSpring() restLen = 0; } -TSpring::~TSpring() {} +TSpring::~TSpring() +{ +} void TSpring::Init(double nrestLen, double nKs, double nKd) { @@ -43,7 +45,7 @@ bool TSpring::ComputateForces(vector3 pPosition1, vector3 pPosition2) // VectorDifference(&p1->pos,&p2->pos,&deltaP); // Vector distance deltaP = pPosition1 - pPosition2; // dist = VectorLength(&deltaP); // Magnitude of - //deltaP + // deltaP dist = deltaP.Length(); if (dist == 0) { @@ -72,7 +74,9 @@ bool TSpring::ComputateForces(vector3 pPosition1, vector3 pPosition2) return true; } -void TSpring::Render() {} +void TSpring::Render() +{ +} //--------------------------------------------------------------------------- diff --git a/Spring.h b/Spring.h index 050df3dc..a215609d 100644 --- a/Spring.h +++ b/Spring.h @@ -13,7 +13,7 @@ http://mozilla.org/MPL/2.0/. #define STATIC_THRESHOLD 0.17f // efine STATIC_THRESHOLD 0.03f const double m_Kd = 0.02f; // DAMPING FACTOR -const double m_Kr = 0.8f; // 1.0 = SUPERBALL BOUNCE 0.0 = DEAD WEIGHT +const double m_Kr = 0.8f; // 1.0 = SUPERBALL BOUNCE 0.0 = DEAD WEIGHT const double m_Ksh = 5.0f; // HOOK'S SPRING CONSTANT const double m_Ksd = 0.1f; // SPRING DAMPING CONSTANT @@ -35,8 +35,8 @@ class TSpring void Render(); vector3 vForce1, vForce2; double restLen; // LENGTH OF SPRING AT REST - double Ks; // SPRING CONSTANT - double Kd; // SPRING DAMPING + double Ks; // SPRING CONSTANT + double Kd; // SPRING DAMPING private: }; diff --git a/Texture.cpp b/Texture.cpp index f9920907..bf5e81c2 100644 --- a/Texture.cpp +++ b/Texture.cpp @@ -89,7 +89,10 @@ TTexturesManager::Names::iterator TTexturesManager::LoadFromFile(std::string fil struct ReplaceSlash { - const char operator()(const char input) { return input == '/' ? '\\' : input; } + const char operator()(const char input) + { + return input == '/' ? '\\' : input; + } }; GLuint TTexturesManager::GetTextureID(char *dir, char *where, std::string fileName, int filter) @@ -397,7 +400,7 @@ TTexturesManager::AlphaValue TTexturesManager::LoadTGA(std::string fileName, int copybytes += (1 + (chunkheader & 127)) * bytesPerPixel; // ilość pikseli if (chunkheader < 128) // jeśli kopiowanie, pikseli jest więcej copyto += (chunkheader)*bytesPerPixel; // rozmiar kopiowanego obszaru (bez - // jednego piksela) + // jednego piksela) } if (copybytes > imageSize) { // nie ma prawa być większe @@ -440,7 +443,7 @@ TTexturesManager::AlphaValue TTexturesManager::LoadTGA(std::string fileName, int chunkheader = (unsigned char)*copyfrom; // jeden bajt, pozostałe zawsze zerowe if (copyto > copyfrom) { // jeśli piksele mają być kopiowane, to możliwe jest przesunięcie ich o 1 bajt, na - // miejsce licznika + // miejsce licznika filesize = (imageData + imageSize - copyto) / bytesPerPixel; // ile pikseli pozostało do końca // WriteLog("Decompression buffer overflow at pixel @@ -455,7 +458,7 @@ TTexturesManager::AlphaValue TTexturesManager::LoadTGA(std::string fileName, int if ((filesize > 128) || !(Global::iModifyTGA & 4)) // gdy za dużo pikseli albo wyłączone writeback = -1; // zapis możliwe jeśli ilość problematycznych pikseli nie - // przekaracza 128 + // przekaracza 128 break; // bufor się zatkał, dalej w ten sposób się nie da } if (chunkheader < 128) @@ -511,7 +514,7 @@ TTexturesManager::AlphaValue TTexturesManager::LoadTGA(std::string fileName, int }; if (chunkheader < 128) { // if the header is < 128, it means the that is the number of RAW color packets minus - // 1 + // 1 chunkheader++; // add 1 to get number of following color values file.read(copyto, chunkheader * bytesPerPixel); copyto += chunkheader * bytesPerPixel; diff --git a/TextureDDS.cpp b/TextureDDS.cpp index 6849e112..74af43bb 100644 --- a/TextureDDS.cpp +++ b/TextureDDS.cpp @@ -274,8 +274,8 @@ void DecompressDXT5(DDS_IMAGE_DATA lImage, const GLubyte *lCompData, GLubyte *Da alphas[3] = (3 * alphas[0] + 2 * alphas[1] + 2) / 5; // Bit code 011 alphas[4] = (2 * alphas[0] + 3 * alphas[1] + 2) / 5; // Bit code 100 alphas[5] = (1 * alphas[0] + 4 * alphas[1] + 2) / 5; // Bit code 101 - alphas[6] = 0x00; // Bit code 110 - alphas[7] = 0xFF; // Bit code 111 + alphas[6] = 0x00; // Bit code 110 + alphas[7] = 0xFF; // Bit code 111 } // Note: Have to separate the next two loops, diff --git a/Timer.cpp b/Timer.cpp index 10135b7a..1e6ad3ce 100644 --- a/Timer.cpp +++ b/Timer.cpp @@ -25,7 +25,10 @@ double fSimulationTime = 0; double fSoundTimer = 0; double fSinceStart = 0; -double GetTime() { return fSimulationTime; } +double GetTime() +{ + return fSimulationTime; +} double GetDeltaTime() { // czas symulacji (stoi gdy pauza) @@ -37,19 +40,35 @@ double GetDeltaRenderTime() return DeltaRenderTime; } -double GetfSinceStart() { return fSinceStart; } +double GetfSinceStart() +{ + return fSinceStart; +} -void SetDeltaTime(double t) { DeltaTime = t; } +void SetDeltaTime(double t) +{ + DeltaTime = t; +} -double GetSimulationTime() { return fSimulationTime; } +double GetSimulationTime() +{ + return fSimulationTime; +} -void SetSimulationTime(double t) { fSimulationTime = t; } +void SetSimulationTime(double t) +{ + fSimulationTime = t; +} bool GetSoundTimer() { // Ra: być może, by dźwięki nie modyfikowały się zbyt często, po 0.1s zeruje się ten licznik - return (fSoundTimer == 0.0f); } + return (fSoundTimer == 0.0f); +} -double GetFPS() { return fFPS; } +double GetFPS() +{ + return fFPS; +} void ResetTimers() { diff --git a/Track.cpp b/Track.cpp index 2817a04b..e6a6bb78 100644 --- a/Track.cpp +++ b/Track.cpp @@ -68,8 +68,8 @@ TSwitchExtension::TSwitchExtension(TTrack *owner, int what) Segments[2] = (what >= 3) ? new TSegment(owner) : NULL; // z punktu 2 do 4 skrzyżowanie od góry: wersja "-1": - Segments[3] = (what >= 4) ? new TSegment(owner) : - NULL; // z punktu 4 do 1 1 1=4 0 0=3 + Segments[3] = + (what >= 4) ? new TSegment(owner) : NULL; // z punktu 4 do 1 1 1=4 0 0=3 Segments[4] = (what >= 5) ? new TSegment(owner) : NULL; // z punktu 1 do 3 4 x 3 3 3 x 2 2 Segments[5] = (what >= 6) ? new TSegment(owner) : @@ -102,16 +102,17 @@ TIsolated::TIsolated(const AnsiString &n, TIsolated *i) pMemCell = NULL; // podpiąć istniejącą albo utworzyć pustą }; -TIsolated::~TIsolated(){// usuwanie - /* - TIsolated *p=pRoot; - while (pRoot) - { - p=pRoot; - p->pNext=NULL; - delete p; - } - */ +TIsolated::~TIsolated(){ + // usuwanie + /* + TIsolated *p=pRoot; + while (pRoot) + { + p=pRoot; + p->pNext=NULL; + delete p; + } + */ }; TIsolated *__fastcall TIsolated::Find(const AnsiString &n) @@ -324,7 +325,7 @@ TTrack *__fastcall TTrack::NullCreate(int dir) trk2->bVisible = false; trk2->fVelocity = 20.0; // zawracanie powoli trk2->fRadius = 20.0; // promień, aby się dodawało do tabelki prędkości i liczyło - // narastająco + // narastająco trk2->Init(); // utworzenie segmentu switch (dir) { //łączenie z nowym torem @@ -796,7 +797,7 @@ void TTrack::Load(cParser *parser, vector3 pOrigin, AnsiString name) if (SwitchExtension) // jeśli tor ruchomy if (fabs(fVelocity) >= 1.0) //żeby zero nie ograniczało dożywotnio SwitchExtension->fVelocity = fVelocity; // zapamiętanie głównego ograniczenia; a - // np. -40 ogranicza tylko na bok + // np. -40 ogranicza tylko na bok } else if (str == "isolated") { // obwód izolowany, do którego tor należy @@ -830,16 +831,16 @@ void TTrack::Load(cParser *parser, vector3 pOrigin, AnsiString name) } else if (str == "overhead") { // informacja o stanie sieci: 0-jazda bezprądowa, >0-z opuszczonym i ograniczeniem - // prędkości + // prędkości parser->getTokens(); *parser >> fOverhead; if (fOverhead > 0.0) iAction |= 0x40; // flaga opuszczenia pantografu (tor uwzględniany w skanowaniu jako - // ograniczenie dla pantografujących) + // ograniczenie dla pantografujących) } else if (str == "colides") { // informacja o stanie sieci: 0-jazda bezprądowa, >0-z opuszczonym i ograniczeniem - // prędkości + // prędkości parser->getTokens(); *parser >> token; // trColides=; //tor kolizyjny, na którym trzeba sprawdzać pojazdy pod kątem zderzenia @@ -1222,7 +1223,7 @@ void TTrack::Compile(GLuint tex) switch (eType) // dalej zależnie od typu { case tt_Table: // obrotnica jak zwykły tor, animacja wykonywana w RaAnimate(), tutaj tylko - // regeneracja siatek + // regeneracja siatek case tt_Normal: if (TextureID2) if (tex ? TextureID2 == tex : true) // jeśli pasuje do grupy (tex) @@ -1232,7 +1233,7 @@ void TTrack::Compile(GLuint tex) if (fTexLength == 4.0) // jeśli stare mapowanie na profil 0.2 0.5 1.1 (również 6-9-9/noil) { // stare mapowanie z różną gęstością pikseli i oddzielnymi teksturami na każdy - // profil + // profil if (iTrapezoid) // trapez albo przechyłki { // podsypka z podkladami trapezowata // ewentualnie poprawić mapowanie, żeby środek mapował się na @@ -1272,9 +1273,9 @@ void TTrack::Compile(GLuint tex) } else { // mapowanie proporcjonalne do powierzchni, rozmiar w poprzek określa - // fTexLength + // fTexLength double max = fTexRatio2 * fTexLength; // szerokość proporcjonalna do - // długości + // długości double map11 = max > 0.0 ? (fHTW + side) / max : 0.25; // załamanie od strony 1 double map12 = @@ -1451,7 +1452,7 @@ void TTrack::Compile(GLuint tex) if (TextureID2) if (tex ? TextureID2 == tex : true) // jeśli pasuje do grupy (tex) { // pobocze drogi - poziome przy przechyłce (a może krawężnik i chodnik zrobić jak - // w Midtown Madness 2?) + // w Midtown Madness 2?) if (!tex) glBindTexture(GL_TEXTURE_2D, TextureID2); vector6 rpts1[6], @@ -1469,7 +1470,7 @@ void TTrack::Compile(GLuint tex) rpts2[2] = vector6(-rozp, -fTexHeight1, 0.0); // prawy brzeg podstawy if (iTrapezoid) // trapez albo przechyłki { // pobocza do trapezowatej nawierzchni - dodatkowe punkty z drugiej strony - // odcinka + // odcinka rpts1[3] = vector6(rozp2, -fTexHeight2, 0.0); // lewy brzeg lewego pobocza rpts1[4] = @@ -1509,7 +1510,7 @@ void TTrack::Compile(GLuint tex) 0.484375 - map1l); // lewy brzeg lewego chodnika if (iTrapezoid) // trapez albo przechyłki { // pobocza do trapezowatej nawierzchni - dodatkowe punkty z drugiej strony - // odcinka + // odcinka slop2 = fabs((iTrapezoid & 2) ? slop2 : slop); // szerokość chodnika po prawej double map2l = @@ -1534,7 +1535,7 @@ void TTrack::Compile(GLuint tex) } if (iTrapezoid) // trapez albo przechyłki { // pobocza do trapezowatej nawierzchni - dodatkowe punkty z drugiej strony - // odcinka + // odcinka if ((fTexHeight1 >= 0.0) ? true : (slop != 0.0)) Segment->RenderLoft(rpts1, -3, fTexLength); // tylko jeśli jest z prawej if ((fTexHeight1 >= 0.0) ? true : (side != 0.0)) @@ -1595,7 +1596,7 @@ void TTrack::Compile(GLuint tex) SwitchExtension->Segments[5]->RaSegCount(); // mogą być tylko 3 drogi SwitchExtension->vPoints = new vector3[SwitchExtension->iPoints]; // tablica utworzona z zapasem, ale nie - // wypełniona współrzędnymi + // wypełniona współrzędnymi } vector3 *b = SwitchExtension->bPoints ? @@ -1630,7 +1631,7 @@ void TTrack::Compile(GLuint tex) // if (TextureID2) // if (tex?TextureID2==tex:true) //jeśli pasuje do grupy (tex) { // pobocze drogi - poziome przy przechyłce (a może krawężnik i chodnik zrobić jak w - // Midtown Madness 2?) + // Midtown Madness 2?) if (TextureID2) if (!tex) glBindTexture(GL_TEXTURE_2D, TextureID2); @@ -1642,7 +1643,7 @@ void TTrack::Compile(GLuint tex) { // standardowo: od zewnątrz pochylenie, a od wewnątrz poziomo rpts1[0] = vector6(rozp, -fTexHeight1, 0.0); // lewy brzeg podstawy rpts1[1] = vector6(bpts1[0].x + side, bpts1[0].y, 0.5); // lewa krawędź - // załamania + // załamania rpts1[2] = vector6(bpts1[0].x, bpts1[0].y, 1.0); // lewy brzeg pobocza (mapowanie może być inne rpts2[0] = vector6(bpts1[1].x, bpts1[1].y, 1.0); // prawy brzeg pobocza @@ -1651,15 +1652,15 @@ void TTrack::Compile(GLuint tex) rpts2[2] = vector6(-rozp, -fTexHeight1, 0.0); // prawy brzeg podstawy // if (iTrapezoid) //trapez albo przechyłki { // pobocza do trapezowatej nawierzchni - dodatkowe punkty z drugiej strony - // odcinka + // odcinka rpts1[3] = vector6(rozp2, -fTexHeight2, 0.0); // lewy brzeg lewego pobocza rpts1[4] = vector6(bpts1[2].x + side2, bpts1[2].y, 0.5); // krawędź - // załamania + // załamania rpts1[5] = vector6(bpts1[2].x, bpts1[2].y, 1.0); // brzeg pobocza rpts2[3] = vector6(bpts1[3].x, bpts1[3].y, 1.0); rpts2[4] = vector6(bpts1[3].x - side2, bpts1[3].y, 0.5); rpts2[5] = vector6(-rozp2, -fTexHeight2, 0.0); // prawy brzeg prawego - // pobocza + // pobocza } } else @@ -1690,7 +1691,7 @@ void TTrack::Compile(GLuint tex) 0.484375 - map1l); // lewy brzeg lewego chodnika // if (iTrapezoid) //trapez albo przechyłki { // pobocza do trapezowatej nawierzchni - dodatkowe punkty z drugiej strony - // odcinka + // odcinka slop2 = fabs((iTrapezoid & 2) ? slop2 : slop); // szerokość chodnika po prawej double map2l = max > 0.0 ? @@ -1715,7 +1716,7 @@ void TTrack::Compile(GLuint tex) } bool render = TextureID2 ? (tex ? TextureID2 == tex : true) : false; // renderować nie trzeba, ale trzeba wyznaczyć - // punkty brzegowe nawierzchni + // punkty brzegowe nawierzchni // if (iTrapezoid) //trapez albo przechyłki if (SwitchExtension->iRoads == 4) { // pobocza do trapezowatej nawierzchni - dodatkowe punkty z drugiej strony odcinka @@ -1734,7 +1735,7 @@ void TTrack::Compile(GLuint tex) } else // to będzie ewentualnie dla prostego na skrzyżowaniu trzech dróg { // punkt 3 pokrywa się z punktem 1, jak w zwrotnicy; połączenie 1->2 nie musi być - // prostoliniowe + // prostoliniowe if ((fTexHeight1 >= 0.0) ? true : (side != 0.0)) // OK SwitchExtension->Segments[2]->RenderLoft(rpts2, -3, fTexLength, 0, 1, &b, render); // z P2 do P4 @@ -1760,15 +1761,15 @@ void TTrack::Compile(GLuint tex) { // coś się gubi w obliczeniach na wskaźnikach i = (int((void *)(b)) - int((void *)(SwitchExtension->vPoints))) / sizeof(vector3); // ustalenie liczby punktów, bo mogło wyjść inaczej niż - // policzone z góry + // policzone z góry if (i > 0) { // jeśli zostało to właśnie utworzone if (SwitchExtension->iPoints > i) // jeśli wyszło mniej niż było miejsca SwitchExtension->iPoints = i; // domknięcie wachlarza else --SwitchExtension->iPoints; // jak tutaj wejdzie, to błąd jest - zrobić - // miejsce na powtórzenie pierwszego punktu - // na końcu + // miejsce na powtórzenie pierwszego punktu + // na końcu SwitchExtension->vPoints[SwitchExtension->iPoints++] = SwitchExtension->vPoints[0]; SwitchExtension->bPoints = true; // tablica punktów została wypełniona @@ -2077,7 +2078,7 @@ void TTrack::RaArrayFill(CVertNormTex *Vert, const CVertNormTex *Start) vector6 bpts1[8]; // punkty głównej płaszczyzny nie przydają się do robienia boków if (fTexLength == 4.0) // jeśli stare mapowanie { // stare mapowanie z różną gęstością pikseli i oddzielnymi teksturami na każdy - // profil + // profil if (iTrapezoid) // trapez albo przechyłki { // podsypka z podkladami trapezowata // ewentualnie poprawić mapowanie, żeby środek mapował się na 1.435/4.671 @@ -2259,7 +2260,7 @@ void TTrack::RaArrayFill(CVertNormTex *Vert, const CVertNormTex *Start) } if (TextureID2) { // pobocze drogi - poziome przy przechyłce (a może krawężnik i chodnik zrobić jak w - // Midtown Madness 2?) + // Midtown Madness 2?) vector6 rpts1[6], rpts2[6]; // współrzędne przekroju i mapowania dla prawej i lewej strony if (fTexHeight1 >= 0.0) @@ -2275,15 +2276,15 @@ void TTrack::RaArrayFill(CVertNormTex *Vert, const CVertNormTex *Start) rpts2[2] = vector6(-rozp, -fTexHeight1, 0.0); // prawy brzeg podstawy if (iTrapezoid) // trapez albo przechyłki { // pobocza do trapezowatej nawierzchni - dodatkowe punkty z drugiej strony - // odcinka + // odcinka rpts1[3] = vector6(rozp2, -fTexHeight2, 0.0); // lewy brzeg lewego pobocza rpts1[4] = vector6(bpts1[2].x + side2, bpts1[2].y, 0.5); // krawędź - // załamania + // załamania rpts1[5] = vector6(bpts1[2].x, bpts1[2].y, 1.0); // brzeg pobocza rpts2[3] = vector6(bpts1[3].x, bpts1[3].y, 1.0); rpts2[4] = vector6(bpts1[3].x - side2, bpts1[3].y, 0.5); rpts2[5] = vector6(-rozp2, -fTexHeight2, 0.0); // prawy brzeg prawego - // pobocza + // pobocza Segment->RaRenderLoft(Vert, rpts1, -3, fTexLength); Segment->RaRenderLoft(Vert, rpts2, -3, fTexLength); } @@ -2323,7 +2324,7 @@ void TTrack::RaArrayFill(CVertNormTex *Vert, const CVertNormTex *Start) 0.484375 - map1l); // lewy brzeg lewego chodnika if (iTrapezoid) // trapez albo przechyłki { // pobocza do trapezowatej nawierzchni - dodatkowe punkty z drugiej strony - // odcinka + // odcinka slop2 = fabs((iTrapezoid & 2) ? slop2 : slop); // szerokość chodnika po prawej double map2l = max > 0.0 ? @@ -2400,7 +2401,7 @@ void TTrack::RaArrayFill(CVertNormTex *Vert, const CVertNormTex *Start) } if (TextureID2) { // pobocze drogi - poziome przy przechyłce (a może krawężnik i chodnik zrobić jak w - // Midtown Madness 2?) + // Midtown Madness 2?) vector6 rpts1[6], rpts2[6]; // współrzędne przekroju i mapowania dla prawej i lewej strony rpts1[0] = vector6(rozp, -fTexHeight1, 0.0); // lewy brzeg podstawy @@ -2681,7 +2682,7 @@ bool TTrack::Switch(int i, double t, double d) { // nie ma się co bawić SwitchExtension->fOffset = SwitchExtension->fDesiredOffset; RaAnimate(); // przeliczenie położenia iglic; czy zadziała na niewyświetlanym - // sektorze w VBO? + // sektorze w VBO? } return true; } @@ -2950,7 +2951,7 @@ TTrack *__fastcall TTrack::RaAnimate() SwitchExtension->vTrans)) // czy przemieściło się od ostatniego sprawdzania { double hlen = 0.5 * SwitchExtension->Segments[0]->GetLength(); // połowa - // długości + // długości SwitchExtension->fOffset = ac->AngleGet(); // pobranie kąta z submodelu double sina = -hlen * sin(DegToRad(SwitchExtension->fOffset)), cosa = -hlen * cos(DegToRad(SwitchExtension->fOffset)); @@ -2962,7 +2963,7 @@ TTrack *__fastcall TTrack::RaAnimate() middle - vector3(sina, 0.0, cosa), 5.0); // nowy odcinek for (int i = 0; i < iNumDynamics; i++) Dynamics[i]->Move(0.000001); // minimalny ruch, aby przeliczyć pozycję i - // kąty + // kąty if (Global::bUseVBO) { // dla OpenGL 1.4 odświeży się cały sektor, w późniejszych poprawiamy fragment // aktualizacja pojazdów na torze @@ -3147,7 +3148,7 @@ void TTrack::ConnectionsLog() TTrack *__fastcall TTrack::Neightbour(int s, double &d) { // zwraca wskaźnik na sąsiedni tor, w kierunku określonym znakiem (s), odwraca (d) w razie - // niezgodności kierunku torów + // niezgodności kierunku torów TTrack *t; // nie zmieniamy kierunku (d), jeśli nie ma toru dalej if (eType != tt_Cross) { // jeszcze trzeba sprawdzić zgodność @@ -3155,7 +3156,7 @@ TTrack *__fastcall TTrack::Neightbour(int s, double &d) if (t) // o ile jest na co przejść, zmieniamy znak kierunku na nowym torze if (t->eType == tt_Cross) { // jeśli wjazd na skrzyżowanie, trzeba ustalić segment, bo od tego zależy zmiana - // kierunku (d) + // kierunku (d) // if (r) //gdy nie podano (r), to nie zmieniać (d) // if (s*t->CrossSegment(((s>0)?iNextDirection:iPrevDirection),r)<0) // d=-d; diff --git a/Track.h b/Track.h index d8a6ed3c..cd81f9c1 100644 --- a/Track.h +++ b/Track.h @@ -51,7 +51,7 @@ class TSwitchExtension TSwitchExtension(TTrack *owner, int what); ~TSwitchExtension(); TSegment *Segments[6]; // dwa tory od punktu 1, pozostałe dwa od 2? Ra 140101: 6 połączeń dla - // skrzyżowań + // skrzyżowań // TTrack *trNear[4]; //tory dołączone do punktów 1, 2, 3 i 4 // dotychczasowe [2]+[2] wskaźniki zamienić na nowe [4] TTrack *pNexts[2]; // tory dołączone do punktów 2 i 4 @@ -111,9 +111,18 @@ class TIsolated static TIsolated *__fastcall Find( const AnsiString &n); // znalezienie obiektu albo utworzenie nowego void Modify(int i, TDynamicObject *o); // dodanie lub odjęcie osi - bool Busy() { return (iAxles > 0); }; - static TIsolated *__fastcall Root() { return (pRoot); }; - TIsolated *__fastcall Next() { return (pNext); }; + bool Busy() + { + return (iAxles > 0); + }; + static TIsolated *__fastcall Root() + { + return (pRoot); + }; + TIsolated *__fastcall Next() + { + return (pNext); + }; }; class TTrack : public Resource @@ -168,7 +177,7 @@ class TTrack : public Resource bool bVisible; // czy rysowany int iAction; // czy modyfikowany eventami (specjalna obsługa przy skanowaniu) float fOverhead; // informacja o stanie sieci: 0-jazda bezprądowa, >0-z opuszczonym i - // ograniczeniem prędkości + // ograniczeniem prędkości private: double fVelocity; // prędkość dla AI (powyżej rośnie prawdopowobieństwo wykolejenia) public: @@ -185,15 +194,30 @@ class TTrack : public Resource void Init(); static TTrack *__fastcall Create400m(int what, double dx); TTrack *__fastcall NullCreate(int dir); - inline bool IsEmpty() { return (iNumDynamics <= 0); }; + inline bool IsEmpty() + { + return (iNumDynamics <= 0); + }; void ConnectPrevPrev(TTrack *pNewPrev, int typ); void ConnectPrevNext(TTrack *pNewPrev, int typ); void ConnectNextPrev(TTrack *pNewNext, int typ); void ConnectNextNext(TTrack *pNewNext, int typ); - inline double Length() { return Segment->GetLength(); }; - inline TSegment *__fastcall CurrentSegment() { return Segment; }; - inline TTrack *__fastcall CurrentNext() { return (trNext); }; - inline TTrack *__fastcall CurrentPrev() { return (trPrev); }; + inline double Length() + { + return Segment->GetLength(); + }; + inline TSegment *__fastcall CurrentSegment() + { + return Segment; + }; + inline TTrack *__fastcall CurrentNext() + { + return (trNext); + }; + inline TTrack *__fastcall CurrentPrev() + { + return (trPrev); + }; TTrack *__fastcall Neightbour(int s, double &d); bool SetConnections(int i); bool Switch(int i, double t = -1.0, double d = -1.0); @@ -222,7 +246,7 @@ class TTrack : public Resource void RenderDyn(); // renderowanie nieprzezroczystych pojazdów (oba tryby) void RenderDynAlpha(); // renderowanie przezroczystych pojazdów (oba tryby) void RenderDynSounds(); // odtwarzanie dźwięków pojazdów jest niezależne od ich - // wyświetlania + // wyświetlania void RaOwnerSet(TSubRect *o) { @@ -244,7 +268,10 @@ class TTrack : public Resource AnsiString IsolatedName(); bool IsolatedEventsAssign(TEvent *busy, TEvent *free); double WidthTotal(); - GLuint TextureGet(int i) { return i ? TextureID1 : TextureID2; }; + GLuint TextureGet(int i) + { + return i ? TextureID1 : TextureID2; + }; bool IsGroupable(); int TestPoint(vector3 *Point); void MovedUp1(double dh); diff --git a/Traction.cpp b/Traction.cpp index e6a1c5f8..ee7efd06 100644 --- a/Traction.cpp +++ b/Traction.cpp @@ -664,7 +664,7 @@ void TTraction::PowerSet(TTractionPowerSource *ps) { // ustalenie punktu zasilania (nie ma jeszcze połączeń między przęsłami) psPowered = ps; // ustawienie bezpośredniego zasilania dla przęsła psPower[0] = psPower[1] = ps; // a to chyba nie jest dobry pomysł, bo nawet zasilane przęsło - // powinno mieć wskazania na inne + // powinno mieć wskazania na inne fResistance[0] = fResistance[1] = 0.0; // a liczy się tylko rezystancja zasilacza } }; diff --git a/Traction.h b/Traction.h index 6fc9a67f..96b16fd5 100644 --- a/Traction.h +++ b/Traction.h @@ -56,7 +56,7 @@ class TTraction AnsiString asParallel; // nazwa przęsła, z którym może być bieżnia wspólna TTraction *hvParallel; // jednokierunkowa i zapętlona lista przęseł ewentualnej bieżni wspólnej float fResistance[2]; // rezystancja zastępcza do punktu zasilania (0: przęsło zasilane, <0: do - // policzenia) + // policzenia) int iTries; // bool bVisible; // DWORD dwFlags; diff --git a/TractionPower.cpp b/TractionPower.cpp index c7e49b7a..fb086879 100644 --- a/TractionPower.cpp +++ b/TractionPower.cpp @@ -79,20 +79,22 @@ bool TTractionPowerSource::Load(cParser *parser) Recuperation = true; else if (token.compare("section") == 0) // odłącznik sekcyjny bSection = true; // nie jest źródłem zasilania, a jedynie informuje o prądzie odłączenia - // sekcji z obwodu + // sekcji z obwodu parser->getTokens(); *parser >> token; if (token.compare("end") != 0) Error("tractionpowersource end statement missing"); // if (!bSection) //odłącznik sekcji zasadniczo nie ma impedancji (0.01 jest OK) if (InternalRes < 0.1) // coś mała ta rezystancja była... - InternalRes = - 0.2; // tak około 0.2, wg - // http://www.ikolej.pl/fileadmin/user_upload/Seminaria_IK/13_05_07_Prezentacja_Kruczek.pdf + InternalRes = 0.2; // tak około 0.2, wg + // http://www.ikolej.pl/fileadmin/user_upload/Seminaria_IK/13_05_07_Prezentacja_Kruczek.pdf return true; }; -bool TTractionPowerSource::Render() { return true; }; +bool TTractionPowerSource::Render() +{ + return true; +}; bool TTractionPowerSource::Update(double dt) { // powinno być wykonane raz na krok fizyki @@ -151,7 +153,7 @@ double TTractionPowerSource::CurrentGet(double res) 0.0; // napięcie dzielone przez sumę rezystancji wewnętrznej i obciążenia OutputVoltage = NominalVoltage - InternalRes * TotalCurrent; // napięcie na obciążeniu return TotalCurrent / (res * TotalPreviousAdmitance); // prąd proporcjonalny do udziału (1/res) - // w całkowitej admitancji + // w całkowitej admitancji }; void TTractionPowerSource::PowerSet(TTractionPowerSource *ps) diff --git a/TractionPower.h b/TractionPower.h index 31d59442..5ba2599f 100644 --- a/TractionPower.h +++ b/TractionPower.h @@ -48,7 +48,10 @@ class TTractionPowerSource bool Render(); bool Update(double dt); double CurrentGet(double res); - void VoltageSet(double v) { NominalVoltage = v; }; + void VoltageSet(double v) + { + NominalVoltage = v; + }; void PowerSet(TTractionPowerSource *ps); }; diff --git a/Train.cpp b/Train.cpp index 05e5aa28..1b1922a9 100644 --- a/Train.cpp +++ b/Train.cpp @@ -49,8 +49,8 @@ TCab::TCab() iButtons = 0; } -void TCab::Init(double Initx1, double Inity1, double Initz1, double Initx2, - double Inity2, double Initz2, bool InitEnabled, bool InitOccupied) +void TCab::Init(double Initx1, double Inity1, double Initz1, double Initx2, double Inity2, + double Initz2, bool InitEnabled, bool InitOccupied) { CabPos1.x = Initx1; CabPos1.y = Inity1; @@ -260,6 +260,38 @@ bool TTrain::Init(TDynamicObject *NewDynamicObject, bool e3d) return true; } +PyObject *TTrain::GetTrainState() +{ + PyObject *dict = PyDict_New(); + if (dict == NULL) + { + return NULL; + } + + PyDict_SetItemString(dict, "direction", PyGetInt(DynamicObject->MoverParameters->ActiveDir)); + PyDict_SetItemString(dict, "slipping_wheels", + PyGetBool(DynamicObject->MoverParameters->SlippingWheels)); + PyDict_SetItemString(dict, "converter", + PyGetBool(DynamicObject->MoverParameters->ConverterFlag)); + PyDict_SetItemString(dict, "main_ctrl_actual_pos", + PyGetInt(DynamicObject->MoverParameters->MainCtrlActualPos)); + PyDict_SetItemString(dict, "scnd_ctrl_actual_pos", + PyGetInt(DynamicObject->MoverParameters->ScndCtrlActualPos)); + PyDict_SetItemString(dict, "fuse", PyGetBool(DynamicObject->MoverParameters->FuseFlag)); + PyDict_SetItemString(dict, "converter_overload", + PyGetBool(DynamicObject->MoverParameters->ConvOvldFlag)); + PyDict_SetItemString(dict, "voltage", PyGetFloat(DynamicObject->MoverParameters->Voltage)); + PyDict_SetItemString(dict, "velocity", PyGetFloat(DynamicObject->MoverParameters->Vel)); + PyDict_SetItemString(dict, "im", PyGetFloat(DynamicObject->MoverParameters->Im)); + PyDict_SetItemString(dict, "compress", + PyGetBool(DynamicObject->MoverParameters->CompressorFlag)); + PyDict_SetItemString(dict, "hours", PyGetInt(GlobalTime->hh)); + PyDict_SetItemString(dict, "minutes", PyGetInt(GlobalTime->mm)); + PyDict_SetItemString(dict, "seconds", PyGetInt(GlobalTime->mr)); + PyDict_SetItemString(dict, "velocity_desired", PyGetFloat(DynamicObject->Mechanik->VelDesired)); + return dict; +} + void TTrain::OnKeyDown(int cKey) { // naciśnięcie klawisza bool isEztOer; @@ -272,7 +304,7 @@ void TTrain::OnKeyDown(int cKey) if (GetAsyncKeyState(VK_SHIFT) < 0) { // wciśnięty [Shift] if (cKey == Global::Keys[k_IncMainCtrlFAST]) // McZapkie-200702: szybkie przelaczanie na - // poz. bezoporowa + // poz. bezoporowa { if (mvControlled->IncMainCtrl(2)) { @@ -511,8 +543,8 @@ void TTrain::OnKeyDown(int cKey) !mvOccupied->ActiveCab) // tylko w maszynowym if (Console::Pressed(VK_CONTROL)) // z [Ctrl] mvControlled->bPantKurek3 = true; // zbiornik pantografu połączony jest ze - // zbiornikiem głównym (pompowanie nie ma - // sensu) + // zbiornikiem głównym (pompowanie nie ma + // sensu) else if (!mvControlled->PantCompFlag) // jeśli wyłączona if (mvControlled->Battery) // jeszcze musi być załączona bateria if (mvControlled->PantPress < 4.8) // piszą, że to tak nie działa @@ -563,7 +595,7 @@ void TTrain::OnKeyDown(int cKey) } } else if (cKey == Global::Keys[k_FailedEngineCutOff]) // McZapkie-060103: E - wylaczanie - // sekcji silnikow + // sekcji silnikow { if (mvControlled->CutOffEngine()) { @@ -700,7 +732,7 @@ void TTrain::OnKeyDown(int cKey) } else if (cKey == Global::Keys[k_Active]) // yB 300407: przelacznik rozrzadu { // Ra 2014-06: uruchomiłem to, aby aktywować czuwak w zajmowanym członie, a wyłączyć w - // innych + // innych // Ra 2014-03: aktywacja czuwaka przepięta na ustawienie kierunku w mvOccupied // if (mvControlled->Battery) //jeśli bateria jest już załączona // mvOccupied->BatterySwitch(true); //to w ten oto durny sposób aktywuje się CA/SHP @@ -1080,7 +1112,7 @@ void TTrain::OnKeyDown(int cKey) else ; else // Ra 1014-06: AI potrafi zahamować pomocniczym mimo jego braku - odhamować - // jakoś trzeba + // jakoś trzeba if ((mvOccupied->LocalBrake != ManualBrake) || mvOccupied->LocalBrakePos) mvOccupied->DecLocalBrakeLevel(1); } @@ -1166,10 +1198,10 @@ void TTrain::OnKeyDown(int cKey) (mvOccupied->BrakeHandle == FV4a ? 1 : 0)); if (GetAsyncKeyState(VK_CONTROL) < 0) mvOccupied->BrakeLevelSet(mvOccupied->Handle->GetPos(bh_NP)); // yB: czy ten stos - // funkcji nie - // powinien być jako - // oddzielna funkcja - // movera? + // funkcji nie + // powinien być jako + // oddzielna funkcja + // movera? } else if (cKey == Global::Keys[k_Brake1]) { @@ -1460,8 +1492,8 @@ void TTrain::OnKeyDown(int cKey) !mvOccupied->ActiveCab) // tylko w maszynowym if (Console::Pressed(VK_CONTROL)) // z [Ctrl] mvControlled->bPantKurek3 = false; // zbiornik pantografu połączony jest z małą - // sprężarką (pompowanie ma sens, ale potem - // trzeba przełączyć) + // sprężarką (pompowanie ma sens, ale potem + // trzeba przełączyć) else if (!mvControlled->PantCompFlag) // jeśli wyłączona if (mvControlled->Battery) // jeszcze musi być załączona bateria if (mvControlled->PantPress < 4.8) // piszą, że to tak nie działa @@ -1714,7 +1746,7 @@ void TTrain::OnKeyDown(int cKey) if (iCabn > 0) { if (!FreeFlyModeFlag) // tryb 'kabinowy' (pozwala również rozłączyć sprzęgi - // zablokowane) + // zablokowane) { if (DynamicObject->DettachStatus(iCabn - 1) < 0) // jeśli jest co odczepić if (DynamicObject->Dettach(iCabn - 1)) // iCab==1:przód,iCab==2:tył @@ -2036,7 +2068,7 @@ void TTrain::OnKeyDown(int cKey) } } if (cKey == Global::Keys[k_RightSign]) // Winger 070304: swiatla tylne (koncowki) - - // wlaczenie + // wlaczenie { if ((GetAsyncKeyState(VK_CONTROL) < 0) && (ggRearRightLightButton.SubModel)) // hunter-230112 - z controlem gasi z tylu @@ -2182,7 +2214,7 @@ void TTrain::OnKeyDown(int cKey) if (DynamicObject->Mechanik) if (!FreeFlyModeFlag) //żeby nie mieszać obserwując z zewnątrz DynamicObject->Mechanik->RouteSwitch(1); // na skrzyżowaniu skręci w - // lewo + // lewo } else if (cKey == Global::Keys[k_MechRight]) { @@ -2458,7 +2490,7 @@ bool TTrain::Update() } else fHCurrent[0] = fHCurrent[1] = fHCurrent[2] = fHCurrent[3] = 0.0; // gdy nie ma - // człona + // człona } else { // normalne pokazywanie @@ -2472,17 +2504,17 @@ bool TTrain::Update() Console::ValueSet(0, mvOccupied->Compressor); // Ra: sterowanie miernikiem: zbiornik główny Console::ValueSet(1, mvOccupied->PipePress); // Ra: sterowanie miernikiem: przewód - // główny + // główny Console::ValueSet( 2, mvOccupied->BrakePress); // Ra: sterowanie miernikiem: cylinder hamulcowy Console::ValueSet(3, fHVoltage); // woltomierz wysokiego napięcia Console::ValueSet(4, fHCurrent[2]); // Ra: sterowanie miernikiem: drugi amperomierz Console::ValueSet( 5, fHCurrent[(mvControlled->TrainType & dt_EZT) ? 0 : 1]); // pierwszy amperomierz; - // dla EZT prąd całkowity + // dla EZT prąd całkowity Console::ValueSet(6, fTachoVelocity); ////Ra: prędkość na pin 43 - wyjście analogowe (to - ///nie jest PWM); skakanie zapewnia mechanika - ///napędu + /// nie jest PWM); skakanie zapewnia mechanika + /// napędu } // hunter-080812: wyrzucanie szybkiego na elektrykach gdy nie ma napiecia przy dowolnym @@ -2517,7 +2549,7 @@ bool TTrain::Update() (mvControlled->TrainType == dt_EZT)) && (DynamicObject->Controller == Humandriver)) // hunter-110212: poprawka dla EZT { // hunter-091012: poprawka (zmiana warunku z CompressorPower /rozne od 0/ na /rowne - // 1/) + // 1/) if (fConverterTimer < fConverterPrzekaznik) { mvControlled->ConvOvldFlag = true; @@ -3056,7 +3088,7 @@ bool TTrain::Update() if (mvControlled->SlippingWheels) { // Ra 2014-12: lokomotywy 181/182 dostają SlippingWheels po zahamowaniu powyżej 2.85 bara - // i buczały + // i buczały double veldiff = (DynamicObject->GetVelocity() - fTachoVelocity) / mvControlled->Vmax; if (veldiff < -0.01) // 1% Vmax rezerwy, żeby 181/182 nie buczały po zahamowaniu, ale to proteza @@ -3101,7 +3133,7 @@ bool TTrain::Update() if ((mvControlled->Itot != 0) || (mvOccupied->BrakePress > 2) || (mvOccupied->PipePress < 3.6)) btLampkaStyczn.TurnOff(); // Ra: czy to jest udawanie działania styczników - // liniowych? + // liniowych? else if (mvOccupied->BrakePress < 1) btLampkaStyczn.TurnOn(); // mozna prowadzic rozruch if (((TestFlag(mvControlled->Couplers[1].CouplingFlag, ctrain_controll)) && @@ -3115,9 +3147,9 @@ bool TTrain::Update() // if ((TestFlag(mvControlled->BrakeStatus,+b_Rused+b_Ractive)))//Lampka // drugiego stopnia hamowania btLampkaHamPosp.Turn((TestFlag(mvOccupied->BrakeStatus, 1))); // lampka drugiego stopnia - // hamowania //TODO: - // youBy wyciągnąć flagę - // wysokiego stopnia + // hamowania //TODO: + // youBy wyciągnąć flagę + // wysokiego stopnia // hunter-111211: wylacznik cisnieniowy - Ra: tutaj? w kabinie? //yBARC - // omujborzegrzesiuzniszczylesmicalydzien @@ -3214,7 +3246,7 @@ bool TTrain::Update() { // yB - wskazniki drugiego czlonu TDynamicObject * tmp; //=mvControlled->mvSecond; //Ra 2014-07: trzeba to jeszcze wyjąć z kabiny... - // Ra 2014-07: no nie ma potrzeby szukać tego w każdej klatce + // Ra 2014-07: no nie ma potrzeby szukać tego w każdej klatce tmp = NULL; if ((TestFlag(mvControlled->Couplers[1].CouplingFlag, ctrain_controll)) && (mvOccupied->ActiveCab > 0)) @@ -4058,10 +4090,10 @@ bool TTrain::Update() if (!FreeFlyModeFlag) { if (Console::Pressed(Global::Keys[k_Releaser])) // yB: odluzniacz caly czas trzymany, - // warunki powinny byc takie same, jak - // przy naciskaniu. Wlasciwie stamtad - // mozna wyrzucic sprawdzanie - // nacisniecia. + // warunki powinny byc takie same, jak + // przy naciskaniu. Wlasciwie stamtad + // mozna wyrzucic sprawdzanie + // nacisniecia. { if ((mvControlled->EngineType == ElectricSeriesMotor) || (mvControlled->EngineType == DieselElectric)) @@ -4123,8 +4155,8 @@ bool TTrain::Update() if (ggUniversal3Button.SubModel) { ggUniversal3Button.PutValue(1); // hunter-131211: z UpdateValue na PutValue - // - by zachowywal sie jak pozostale - // przelaczniki + // - by zachowywal sie jak pozostale + // przelaczniki if (btLampkaUniversal3.Active()) LampkaUniversal3_st = true; } @@ -4146,8 +4178,8 @@ bool TTrain::Update() if (ggUniversal3Button.SubModel) { ggUniversal3Button.PutValue(0); // hunter-131211: z UpdateValue na PutValue - // - by zachowywal sie jak pozostale - // przelaczniki + // - by zachowywal sie jak pozostale + // przelaczniki if (btLampkaUniversal3.Active()) LampkaUniversal3_st = false; } @@ -4259,8 +4291,8 @@ bool TTrain::Update() if (ggCabLightDimButton.SubModel) { ggCabLightDimButton.PutValue(0); // hunter-131211: z UpdateValue na PutValue - // - by zachowywal sie jak pozostale - // przelaczniki + // - by zachowywal sie jak pozostale + // przelaczniki } } else @@ -4589,6 +4621,8 @@ bool TTrain::Update() ggDepartureSignalButton.UpdateValue(0); ggFuseButton.UpdateValue(0); ggConverterFuseButton.UpdateValue(0); + + pyScreens.update(); } // wyprowadzenie sygnałów dla haslera na PoKeys (zaznaczanie na taśmie) btHaslerBrakes.Turn(DynamicObject->MoverParameters->BrakePress > 0.4); // ciśnienie w cylindrach @@ -4619,7 +4653,7 @@ bool TTrain::CabChange(int iDirection) return true; // udało się zmienić kabinę } DynamicObject->MoverParameters->CabActivisation(); // aktywizacja poprzedniej, bo jeszcze - // nie wiadomo, czy jakiś pojazd jest + // nie wiadomo, czy jakiś pojazd jest } return false; // ewentualna zmiana pojazdu } @@ -4895,13 +4929,15 @@ bool TTrain::LoadMMediaFile(AnsiString asFileName) { if (DynamicObject->Controller == Humandriver) DynamicObject->bDisplayCab = true; // McZapkie-030303: mozliwosc wyswietlania kabiny, w - // przyszlosci dac opcje w mmd + // przyszlosci dac opcje w mmd return true; } } bool TTrain::InitializeCab(int NewCabNo, AnsiString asFileName) { + pyScreens.reset(this); + pyScreens.setLookupPath(DynamicObject->asBaseDir); bool parse = false; double dSDist; TFileStream *fs; @@ -4998,7 +5034,7 @@ bool TTrain::InitializeCab(int NewCabNo, AnsiString asFileName) if (k) DynamicObject->mdKabina = k; // nowa kabina //(mdKabina) może zostać to samo po przejściu do innego członu bez zmiany - //kabiny, przy powrocie musi być wiązanie ponowne + // kabiny, przy powrocie musi być wiązanie ponowne // else // break; //wyjście z pętli, bo model zostaje bez zmian } @@ -5183,7 +5219,7 @@ bool TTrain::InitializeCab(int NewCabNo, AnsiString asFileName) else if (str == AnsiString("fuse_bt:")) // bezp. nadmiarowy ggFuseButton.Load(Parser, DynamicObject->mdKabina); else if (str == AnsiString("converterfuse_bt:")) // hunter-261211: odblokowanie - // przekaznika nadm. przetw. i ogrz. + // przekaznika nadm. przetw. i ogrz. ggConverterFuseButton.Load(Parser, DynamicObject->mdKabina); else if (str == AnsiString("stlinoff_bt:")) // st. liniowe ggStLinOffButton.Load(Parser, DynamicObject->mdKabina); @@ -5386,7 +5422,7 @@ bool TTrain::InitializeCab(int NewCabNo, AnsiString asFileName) gg->AssignDouble(&mvControlled->dizel_engage); } // ggEngageRatio.Load(Parser,DynamicObject->mdKabina); else if (str == AnsiString("maingearstatus:")) // np. ciśnienie sterownika skrzyni - // biegów + // biegów ggMainGearStatus.Load(Parser, DynamicObject->mdKabina); else if (str == AnsiString("ignitionkey:")) // ggIgnitionKey.Load(Parser, DynamicObject->mdKabina); @@ -5508,6 +5544,8 @@ bool TTrain::InitializeCab(int NewCabNo, AnsiString asFileName) btLampkaBackward.Load(Parser, DynamicObject->mdKabina); else if (str == AnsiString("i-cablight:")) // hunter-171012 btCabLight.Load(Parser, DynamicObject->mdKabina); + else if (str == AnsiString("pyscreen:")) + pyScreens.init(Parser, DynamicObject->mdKabina, DynamicObject->GetName(), NewCabNo); // btLampkaUnknown.Init("unknown",mdKabina,false); } } @@ -5518,6 +5556,7 @@ bool TTrain::InitializeCab(int NewCabNo, AnsiString asFileName) } // ABu 050205: tego wczesniej nie bylo: delete Parser; + pyScreens.start(); if (DynamicObject->mdKabina) { DynamicObject->mdKabina @@ -5553,7 +5592,7 @@ vector3 TTrain::MirrorPosition(bool lewe) void TTrain::DynamicSet(TDynamicObject *d) { // taka proteza: chcę podłączyć kabinę EN57 bezpośrednio z silnikowym, aby nie robić tego przez - // ukrotnienie + // ukrotnienie // drugi silnikowy i tak musi być ukrotniony, podobnie jak kolejna jednostka // problem się robi ze światłami, które będą zapalane w silnikowym, ale muszą świecić się w // rozrządczych diff --git a/Train.h b/Train.h index 5189c5aa..97c7b532 100644 --- a/Train.h +++ b/Train.h @@ -23,6 +23,7 @@ http://mozilla.org/MPL/2.0/. #include "AdvSound.h" #include "RealSound.h" #include "FadeSound.h" +#include "PyInt.h" // typedef enum {st_Off, st_Starting, st_On, st_ShuttingDown} T4State; @@ -44,7 +45,7 @@ class TCab TCab(); ~TCab(); void Init(double Initx1, double Inity1, double Initz1, double Initx2, double Inity2, - double Initz2, bool InitEnabled, bool InitOccupied); + double Initz2, bool InitEnabled, bool InitOccupied); void Load(TQueryParserComp *Parser); vector3 CabPos1; vector3 CabPos2; @@ -83,14 +84,21 @@ class TTrain // bool SHP() { fShpTimer= 0; }; - inline vector3 GetDirection() { return DynamicObject->VectorFront(); }; - inline vector3 GetUp() { return DynamicObject->VectorUp(); }; + inline vector3 GetDirection() + { + return DynamicObject->VectorFront(); + }; + inline vector3 GetUp() + { + return DynamicObject->VectorUp(); + }; void UpdateMechPosition(double dt); bool Update(); void MechStop(); // virtual bool RenderAlpha(); // McZapkie-310302: ladowanie parametrow z pliku bool LoadMMediaFile(AnsiString asFileName); + PyObject *GetTrainState(); private: //żeby go nic z zewnątrz nie przestawiało TDynamicObject *DynamicObject; // przestawia zmiana pojazdu [F5] @@ -145,7 +153,7 @@ class TTrain TGauge ggAntiSlipButton; TGauge ggFuseButton; TGauge ggConverterFuseButton; // hunter-261211: przycisk odblokowania nadmiarowego przetwornic i - // ogrzewania + // ogrzewania TGauge ggStLinOffButton; TGauge ggRadioButton; TGauge ggUpperLightButton; @@ -372,10 +380,21 @@ class TTrain float fSPPress, fSNPress; int iSekunda; // Ra: sekunda aktualizacji prędkości int iRadioChannel; // numer aktualnego kanału radiowego + TPythonScreens pyScreens; + public: - int RadioChannel() { return iRadioChannel; }; - inline TDynamicObject *__fastcall Dynamic() { return DynamicObject; }; - inline TMoverParameters *__fastcall Controlled() { return mvControlled; }; + int RadioChannel() + { + return iRadioChannel; + }; + inline TDynamicObject *__fastcall Dynamic() + { + return DynamicObject; + }; + inline TMoverParameters *__fastcall Controlled() + { + return mvControlled; + }; void DynamicSet(TDynamicObject *d); void Silence(); }; diff --git a/TrkFoll.cpp b/TrkFoll.cpp index 2ae47e4a..019c01d4 100644 --- a/TrkFoll.cpp +++ b/TrkFoll.cpp @@ -37,7 +37,9 @@ TTrackFollower::TTrackFollower() fOffsetH = 0.0; // na starcie stoi na środku } -TTrackFollower::~TTrackFollower() {} +TTrackFollower::~TTrackFollower() +{ +} bool TTrackFollower::Init(TTrack *pTrack, TDynamicObject *NewOwner, double fDir) { @@ -76,7 +78,7 @@ TTrack *__fastcall TTrackFollower::SetCurrentTrack(TTrack *pTrack, int end) // bezpośrednio if (iSegment == 0) { // to jest błędna sytuacja - generuje pętle zawracające za skrzyżowaniem - ustalić, - // kiedy powstaje! + // kiedy powstaje! iSegment = 1; // doraźna poprawka } if ((end ? iSegment : -iSegment) < 0) @@ -129,14 +131,14 @@ bool TTrackFollower::Move(double fDistance, bool bPrimary) if (fDistance < 0) { if (iSetFlag(iEventFlag, -1)) // zawsze zeruje flagę sprawdzenia, jak mechanik - // dosiądzie, to się nie wykona + // dosiądzie, to się nie wykona if (Owner->Mechanik) // tylko dla jednego członu // if (TestFlag(iEventFlag,1)) //McZapkie-280503: wyzwalanie event tylko dla // pojazdow z obsada if (bPrimary && pCurrentTrack->evEvent1 && (!pCurrentTrack->evEvent1->iQueued)) Global::AddToQuery(pCurrentTrack->evEvent1, Owner); // dodanie do - // kolejki + // kolejki // Owner->RaAxleEvent(pCurrentTrack->Event1); //Ra: dynamic zdecyduje, czy dodać do // kolejki // if (TestFlag(iEventallFlag,1)) @@ -151,7 +153,7 @@ bool TTrackFollower::Move(double fDistance, bool bPrimary) else if (fDistance > 0) { if (iSetFlag(iEventFlag, -2)) // zawsze ustawia flagę sprawdzenia, jak mechanik - // dosiądzie, to się nie wykona + // dosiądzie, to się nie wykona if (Owner->Mechanik) // tylko dla jednego członu // if (TestFlag(iEventFlag,2)) //sprawdzanie jest od razu w pierwszym // warunku diff --git a/TrkFoll.h b/TrkFoll.h index 6d825c33..5c8c126a 100644 --- a/TrkFoll.h +++ b/TrkFoll.h @@ -26,7 +26,7 @@ class TTrackFollower int iEventFlag; // McZapkie-020602: informacja o tym czy wyzwalac zdarzenie: 0,1,2,3 int iEventallFlag; int iSegment; // który segment toru jest używany (żeby nie przeskakiwało po przestawieniu - // zwrotnicy pod taborem) + // zwrotnicy pod taborem) public: double fOffsetH; // Ra: odległość środka osi od osi toru (dla samochodów) - użyć do wężykowania vector3 pPosition; // współrzędne XYZ w układzie scenerii @@ -35,14 +35,23 @@ class TTrackFollower ~TTrackFollower(); TTrack *__fastcall SetCurrentTrack(TTrack *pTrack, int end); bool Move(double fDistance, bool bPrimary); - inline TTrack *__fastcall GetTrack() { return pCurrentTrack; }; + inline TTrack *__fastcall GetTrack() + { + return pCurrentTrack; + }; inline double GetRoll() { return vAngles.x; }; // przechyłka policzona przy ustalaniu pozycji //{return pCurrentSegment->GetRoll(fCurrentDistance)*fDirection;}; //zamiast liczyć można pobrać - inline double GetDirection() { return fDirection; }; // zwrot na torze - inline double GetTranslation() { return fCurrentDistance; }; // ABu-030403 + inline double GetDirection() + { + return fDirection; + }; // zwrot na torze + inline double GetTranslation() + { + return fCurrentDistance; + }; // ABu-030403 // inline double GetLength(vector3 p1, vector3 cp1, vector3 cp2, vector3 p2) //{ return pCurrentSegment->ComputeLength(p1,cp1,cp2,p2); }; // inline double GetRadius(double L, double d); //McZapkie-150503 diff --git a/World.cpp b/World.cpp index caa0e5fd..41ec5c47 100644 --- a/World.cpp +++ b/World.cpp @@ -233,7 +233,7 @@ bool TWorld::Init(HWND NhWnd, HDC hDC) if (Global::fOpenGL >= 1.4) // 1.4 miało obsługę VBO, ale bez opcji modyfikacji fragmentu bufora Global::bUseVBO = true; // VBO włączane tylko, jeśli jest obsługa oraz nie ustawiono - // niższego numeru + // niższego numeru } if (Global::bUseVBO) WriteLog("Ra: The VBO is found and will be used."); @@ -269,7 +269,7 @@ bool TWorld::Init(HWND NhWnd, HDC hDC) if (Global::fOpenGL >= 1.2) // poniższe nie działa w 1.1 glTexEnvf(TEXTURE_FILTER_CONTROL_EXT, TEXTURE_LOD_BIAS_EXT, -1); GLfloat FogColor[] = {1.0f, 1.0f, 1.0f, 1.0f}; - glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix + glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear screen and depth buffer glLoadIdentity(); // WriteLog("glClearColor (FogColor[0], FogColor[1], FogColor[2], 0.0); "); @@ -404,8 +404,9 @@ bool TWorld::Init(HWND NhWnd, HDC hDC) glFogi(GL_FOG_MODE, GL_LINEAR); // Fog Mode WriteLog("glFogfv(GL_FOG_COLOR, FogColor);"); glFogfv(GL_FOG_COLOR, FogColor); // Set Fog Color - // glFogf(GL_FOG_DENSITY, 0.594f); // How Dense Will The Fog - //Be + // glFogf(GL_FOG_DENSITY, 0.594f); // How Dense Will The + //Fog + // Be // glHint(GL_FOG_HINT, GL_NICEST); // Fog Hint Value WriteLog("glFogf(GL_FOG_START, 1000.0f);"); glFogf(GL_FOG_START, 10.0f); // Fog Start Depth @@ -836,7 +837,7 @@ void TWorld::OnKeyDown(int cKey) if ((Global::iWriteLogEnabled & 2) == 0) // nie było okienka { // otwarcie okna AllocConsole(); // jeśli konsola już jest, to zwróci błąd; uwalniać nie ma po - // co, bo się odłączy + // co, bo się odłączy SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN); } } @@ -898,7 +899,7 @@ void TWorld::OnKeyDown(int cKey) if (CouplNr < 0) CouplNr = 0; // z [-1,1] zrobić [0,1] int mask, set = 0; // Ra: [Shift]+[Ctrl]+[T] odpala mi jakąś idiotyczną zmianę - // tapety pulpitu :/ + // tapety pulpitu :/ if (GetAsyncKeyState(VK_SHIFT) < 0) // z [Shift] zapalanie set = mask = 64; // bez [Ctrl] założyć tabliczki else if (GetAsyncKeyState(VK_CONTROL) < 0) @@ -1166,7 +1167,7 @@ bool TWorld::Update() double a = fmod(Global::fTimeAngleDeg, 360.0) / 180.0 * M_PI - M_PI; // kąt godzinny w radianach //(a) jest traktowane jako czas miejscowy, nie uwzględniający stref czasowych ani czasu - //letniego + // letniego // aby wyznaczyć strefę czasową, trzeba uwzględnić południk miejscowy // aby uwzględnić czas letni, trzeba sprawdzić dzień roku double L = Global::fLatitudeDeg / 180.0 * M_PI; // szerokość geograficzna @@ -1281,7 +1282,7 @@ bool TWorld::Update() if (100.0 * LengthSquared3(d->GetPosition() - Camera.Pos) > LengthSquared3(pDynamicNearest->GetPosition() - Camera.Pos)) d = pDynamicNearest; // jeśli najbliższy nie jest 10 razy bliżej niż - // poprzedni najbliższy, zostaje poprzedni + // poprzedni najbliższy, zostaje poprzedni if (d) pDynamicNearest = d; // zmiana na nowy, jeśli coś znaleziony niepusty if (pDynamicNearest) @@ -1319,7 +1320,7 @@ bool TWorld::Update() fTimeBuffer -= iter * fMaxDt; // reszta czasu na potem (do bufora) if (n > 20) n = 20; // Ra: jeżeli FPS jest zatrważająco niski, to fizyka nie może zająć całkowicie - // procesora +// procesora #if 0 Ground.UpdatePhys(fMaxDt,n); //Ra: teraz czas kroku jest (względnie) stały if (DebugModeFlag) @@ -1404,7 +1405,7 @@ bool TWorld::Update() } else { // patrzenie w kierunku osi pojazdu, z uwzględnieniem kabiny - jakby z lusterka, - // ale bez odbicia + // ale bez odbicia Camera.LookAt = Camera.Pos - Train->GetDirection() * Train->Dynamic()->MoverParameters->ActiveCab; //-1 albo 1 @@ -1427,7 +1428,7 @@ bool TWorld::Update() atan(Train->pMechShake.x * Train->fMechRoll); // hustanie kamery na boki Camera.Pitch -= atan(Train->vMechVelocity.z * Train->fMechPitch); // hustanie kamery przod tyl //Ra: tu - // jest uciekanie kamery w górę!!! + // jest uciekanie kamery w górę!!! } // ABu011104: rzucanie pudlem vector3 temp; @@ -1834,7 +1835,7 @@ bool TWorld::Update() { OutText2 = Controlled->Mechanik->Relation(); if (!OutText2.IsEmpty()) // jeśli jest podana relacja, to dodajemy punkt następnego - // zatrzymania + // zatrzymania OutText2 = Global::Bezogonkow(OutText2 + ": -> " + Controlled->Mechanik->NextStop(), true); // dopisanie punktu zatrzymania @@ -2430,13 +2431,12 @@ bool TWorld::Update() glColor3f(0.0f, 1.0f, 0.0f); // zielone glRasterPos2f( -0.25f, - 0.18f - - 0.02f * (i - tmp->Mechanik->iStationStart)); // dopiero - // ustawienie - // pozycji - // ustala - // kolor, - // dziwne... + 0.18f - 0.02f * (i - tmp->Mechanik->iStationStart)); // dopiero + // ustawienie + // pozycji + // ustala + // kolor, + // dziwne... glPrint(Global::Bezogonkow(OutText1, true).c_str()); glColor3f(1.0f, 1.0f, 1.0f); // a reszta białym } @@ -2699,7 +2699,7 @@ void TWorld::OnCommandGet(DaneRozkaz *pRozkaz) if ((e->Type == tp_Multiple) || (e->Type == tp_Lights) || bool(e->evJoined)) // tylko jawne albo niejawne Multiple Ground.AddToQuery(e, NULL); // drugi parametr to dynamic wywołujący - tu - // brak + // brak } break; case 3: // rozkaz dla AI @@ -2767,7 +2767,7 @@ void TWorld::OnCommandGet(DaneRozkaz *pRozkaz) } else { // dla pustego wysyłamy ramki 6 z nazwami pojazdów AI (jeśli potrzebne wszystkie, - // to rozpoznać np. "*") + // to rozpoznać np. "*") Ground.DynamicList(); } } @@ -2853,7 +2853,7 @@ void TWorld::CreateE3D(const AnsiString &dir, bool dyn) { // wypadało by sprawdzić, czy T3D ładunku jest load = loads.SubString(1, i - 1); if (FileExists(dir + load + ".t3d")) // o ile jest plik ładunku, bo - // inaczej nie ma to sensu + // inaczej nie ma to sensu if (!FileExists( dir + load + ".e3d")) // a nie ma jeszcze odpowiednika binarnego diff --git a/dumb3d.cpp b/dumb3d.cpp index ace4b50a..fc0b139e 100644 --- a/dumb3d.cpp +++ b/dumb3d.cpp @@ -49,7 +49,10 @@ void inline vector3::SafeNormalize() } // From code in Graphics Gems; p. 766 -inline scalar_t det2x2(scalar_t a, scalar_t b, scalar_t c, scalar_t d) { return a * d - b * c; } +inline scalar_t det2x2(scalar_t a, scalar_t b, scalar_t c, scalar_t d) +{ + return a * d - b * c; +} inline scalar_t det3x3(scalar_t a1, scalar_t a2, scalar_t a3, scalar_t b1, scalar_t b2, scalar_t b3, scalar_t c1, scalar_t c2, scalar_t c3) @@ -390,7 +393,8 @@ int main(int, char *[]) Testmatrix4x4(); matrixFailures = failures; - cout << endl << "****************************************" << endl; + cout << endl + << "****************************************" << endl; cout << "* *" << endl; if (vectorFailures + matrixFailures == 0) cout << "* No failures detected in Math3D *" << endl; diff --git a/dumb3d.h b/dumb3d.h index a2ed36d5..05da2130 100644 --- a/dumb3d.h +++ b/dumb3d.h @@ -27,15 +27,26 @@ namespace Math3D typedef double scalar_t; // inline pass-throughs to various basic math functions // written in this style to allow for easy substitution with more efficient versions -inline scalar_t SINE_FUNCTION(scalar_t x) { return sin(x); } -inline scalar_t COSINE_FUNCTION(scalar_t x) { return cos(x); } -inline scalar_t SQRT_FUNCTION(scalar_t x) { return sqrt(x); } +inline scalar_t SINE_FUNCTION(scalar_t x) +{ + return sin(x); +} +inline scalar_t COSINE_FUNCTION(scalar_t x) +{ + return cos(x); +} +inline scalar_t SQRT_FUNCTION(scalar_t x) +{ + return sqrt(x); +} // 2 element vector class vector2 { public: - vector2(void) {} + vector2(void) + { + } vector2(scalar_t a, scalar_t b) { x = a; @@ -52,7 +63,9 @@ class vector2 class vector3 { public: - vector3(void) {} + vector3(void) + { + } vector3(scalar_t a, scalar_t b, scalar_t c) { x = a; @@ -71,15 +84,24 @@ class vector3 void inline Normalize(); void inline SafeNormalize(); double inline Length(); - void inline Zero() { x = y = z = 0.0; }; + void inline Zero() + { + x = y = z = 0.0; + }; // [] is to read, () is to write (const correctness) // const scalar_t& operator[] (int i) const { return e[i]; } // scalar_t& operator() (int i) { return e[i]; } // Provides access to the underlying array; useful for passing this class off to C APIs - const scalar_t *readArray(void) { return &x; } - scalar_t *getArray(void) { return &x; } + const scalar_t *readArray(void) + { + return &x; + } + scalar_t *getArray(void) + { + return &x; + } // union // { @@ -107,7 +129,9 @@ class vector3 class matrix4x4 { public: - matrix4x4(void) {} + matrix4x4(void) + { + } // When defining matrices in C arrays, it is easiest to define them with // the column increasing fastest. However, some APIs (OpenGL in particular) do this @@ -130,12 +154,24 @@ class matrix4x4 // [] is to read, () is to write (const correctness) // m[x][y] or m(x)[y] is the correct form - const scalar_t *operator[](int i) const { return &e[i << 2]; } - scalar_t *operator()(int i) { return &e[i << 2]; } + const scalar_t *operator[](int i) const + { + return &e[i << 2]; + } + scalar_t *operator()(int i) + { + return &e[i << 2]; + } // Low-level access to the array. - const scalar_t *readArray(void) { return e; } - scalar_t *getArray(void) { return e; } + const scalar_t *readArray(void) + { + return e; + } + scalar_t *getArray(void) + { + return e; + } // Construct various matrices; REPLACES CURRENT CONTENTS OF THE MATRIX! // Written this way to work in-place and hence be somewhat more efficient @@ -263,14 +299,20 @@ inline bool operator<(const vector3 &v1, const vector3 &v2) return false; } -inline vector3 operator-(const vector3 &v) { return vector3(-v.x, -v.y, -v.z); } +inline vector3 operator-(const vector3 &v) +{ + return vector3(-v.x, -v.y, -v.z); +} inline vector3 operator*(const vector3 &v, scalar_t k) { return vector3(k * v.x, k * v.y, k * v.z); } -inline vector3 operator*(scalar_t k, const vector3 &v) { return v * k; } +inline vector3 operator*(scalar_t k, const vector3 &v) +{ + return v * k; +} inline vector3 &operator*=(vector3 &v, scalar_t k) { @@ -293,11 +335,23 @@ inline vector3 &operator/=(vector3 &v, scalar_t k) return v; } -inline scalar_t LengthSquared3(const vector3 &v) { return DotProduct(v, v); } -inline scalar_t LengthSquared4(const vector3 &v) { return DotProduct4(v, v); } +inline scalar_t LengthSquared3(const vector3 &v) +{ + return DotProduct(v, v); +} +inline scalar_t LengthSquared4(const vector3 &v) +{ + return DotProduct4(v, v); +} -inline scalar_t Length3(const vector3 &v) { return SQRT_FUNCTION(LengthSquared3(v)); } -inline scalar_t Length4(const vector3 &v) { return SQRT_FUNCTION(LengthSquared4(v)); } +inline scalar_t Length3(const vector3 &v) +{ + return SQRT_FUNCTION(LengthSquared3(v)); +} +inline scalar_t Length4(const vector3 &v) +{ + return SQRT_FUNCTION(LengthSquared4(v)); +} inline vector3 Normalize(const vector3 &v) { @@ -314,7 +368,10 @@ inline vector3 SafeNormalize(const vector3 &v) retVal = v / l; return retVal; } -inline vector3 Normalize4(const vector3 &v) { return v / Length4(v); } +inline vector3 Normalize4(const vector3 &v) +{ + return v / Length4(v); +} inline vector3 operator+(const vector3 &v1, const vector3 &v2) { @@ -372,7 +429,10 @@ void inline vector3::Normalize() z *= il; } -double inline vector3::Length() { return SQRT_FUNCTION(x * x + y * y + z * z); } +double inline vector3::Length() +{ + return SQRT_FUNCTION(x * x + y * y + z * z); +} inline bool operator==(const matrix4x4 &m1, const matrix4x4 &m2) { diff --git a/geometry.cpp b/geometry.cpp index f2082d43..a4ef3a13 100644 --- a/geometry.cpp +++ b/geometry.cpp @@ -11,7 +11,10 @@ http://mozilla.org/MPL/2.0/. #include "Geometry.h" -inline double sqr(double a) { return (a * a); }; +inline double sqr(double a) +{ + return (a * a); +}; __fastcall TLine::TLine(){}; @@ -23,7 +26,10 @@ __fastcall TLine::TLine(vector3 NPoint, vector3 NVector) __fastcall TLine::~TLine(){}; -TPlane TLine::GetPlane() { return (TPlane(Point, Vector)); }; +TPlane TLine::GetPlane() +{ + return (TPlane(Point, Vector)); +}; double TLine::GetDistance(vector3 Point1) { @@ -80,11 +86,17 @@ double TPlane::GetSide(vector3 Point) // D3DMath_VectorMatrixMultiply(Vector,src,Transformations); //}; -bool TPlane::Defined() { return !(Vector == vector3(0, 0, 0)); }; +bool TPlane::Defined() +{ + return !(Vector == vector3(0, 0, 0)); +}; //--------------------------------------------------------------------------- -inline double Sum(vector3 &Vector) { return (Vector.x + Vector.y + Vector.z); }; +inline double Sum(vector3 &Vector) +{ + return (Vector.x + Vector.y + Vector.z); +}; bool CrossPoint(vector3 &RetPoint, TLine &Line, TPlane &Plane) { @@ -96,7 +108,10 @@ bool CrossPoint(vector3 &RetPoint, TLine &Line, TPlane &Plane) return (true); }; -inline double GetLength(vector3 &Vector) { return (Vector.Length()); }; +inline double GetLength(vector3 &Vector) +{ + return (Vector.Length()); +}; inline vector3 SetLength(vector3 &Vector, double Length) { diff --git a/parser.h b/parser.h index 369972ff..e4707895 100644 --- a/parser.h +++ b/parser.h @@ -42,15 +42,27 @@ class cParser : public std::stringstream getTokens(); *this >> output; }; - inline void ignoreToken() { readToken(); }; + inline void ignoreToken() + { + readToken(); + }; inline void ignoreTokens(int count) { for (int i = 0; i < count; i++) readToken(); }; - inline bool expectToken(std::string value) { return readToken() == value; }; - bool eof() { return mStream->eof(); }; - bool ok() { return !mStream->fail(); }; + inline bool expectToken(std::string value) + { + return readToken() == value; + }; + bool eof() + { + return mStream->eof(); + }; + bool ok() + { + return !mStream->fail(); + }; bool getTokens(int Count = 1, bool ToLower = true, const char *Break = "\n\t ;"); int getProgress() const; // percentage of file processed. // load traction? @@ -64,11 +76,11 @@ class cParser : public std::stringstream bool trimComments(std::string &String); // members: std::istream *mStream; // relevant kind of buffer is attached on creation. - std::string mPath; // path to open stream, for relative path lookups. - int mSize; // size of open stream, for progress report. + std::string mPath; // path to open stream, for relative path lookups. + int mSize; // size of open stream, for progress report. typedef std::map commentmap; commentmap mComments; - cParser *mIncludeParser; // child class to handle include directives. + cParser *mIncludeParser; // child class to handle include directives. std::vector parameters; // parameter list for included file. }; diff --git a/python/include/Python-ast.h b/python/include/Python-ast.h new file mode 100644 index 00000000..3f35bbb6 --- /dev/null +++ b/python/include/Python-ast.h @@ -0,0 +1,535 @@ +/* File automatically generated by Parser/asdl_c.py. */ + +#include "asdl.h" + +typedef struct _mod *mod_ty; + +typedef struct _stmt *stmt_ty; + +typedef struct _expr *expr_ty; + +typedef enum _expr_context { Load=1, Store=2, Del=3, AugLoad=4, AugStore=5, + Param=6 } expr_context_ty; + +typedef struct _slice *slice_ty; + +typedef enum _boolop { And=1, Or=2 } boolop_ty; + +typedef enum _operator { Add=1, Sub=2, Mult=3, Div=4, Mod=5, Pow=6, LShift=7, + RShift=8, BitOr=9, BitXor=10, BitAnd=11, FloorDiv=12 } + operator_ty; + +typedef enum _unaryop { Invert=1, Not=2, UAdd=3, USub=4 } unaryop_ty; + +typedef enum _cmpop { Eq=1, NotEq=2, Lt=3, LtE=4, Gt=5, GtE=6, Is=7, IsNot=8, + In=9, NotIn=10 } cmpop_ty; + +typedef struct _comprehension *comprehension_ty; + +typedef struct _excepthandler *excepthandler_ty; + +typedef struct _arguments *arguments_ty; + +typedef struct _keyword *keyword_ty; + +typedef struct _alias *alias_ty; + + +enum _mod_kind {Module_kind=1, Interactive_kind=2, Expression_kind=3, + Suite_kind=4}; +struct _mod { + enum _mod_kind kind; + union { + struct { + asdl_seq *body; + } Module; + + struct { + asdl_seq *body; + } Interactive; + + struct { + expr_ty body; + } Expression; + + struct { + asdl_seq *body; + } Suite; + + } v; +}; + +enum _stmt_kind {FunctionDef_kind=1, ClassDef_kind=2, Return_kind=3, + Delete_kind=4, Assign_kind=5, AugAssign_kind=6, Print_kind=7, + For_kind=8, While_kind=9, If_kind=10, With_kind=11, + Raise_kind=12, TryExcept_kind=13, TryFinally_kind=14, + Assert_kind=15, Import_kind=16, ImportFrom_kind=17, + Exec_kind=18, Global_kind=19, Expr_kind=20, Pass_kind=21, + Break_kind=22, Continue_kind=23}; +struct _stmt { + enum _stmt_kind kind; + union { + struct { + identifier name; + arguments_ty args; + asdl_seq *body; + asdl_seq *decorator_list; + } FunctionDef; + + struct { + identifier name; + asdl_seq *bases; + asdl_seq *body; + asdl_seq *decorator_list; + } ClassDef; + + struct { + expr_ty value; + } Return; + + struct { + asdl_seq *targets; + } Delete; + + struct { + asdl_seq *targets; + expr_ty value; + } Assign; + + struct { + expr_ty target; + operator_ty op; + expr_ty value; + } AugAssign; + + struct { + expr_ty dest; + asdl_seq *values; + bool nl; + } Print; + + struct { + expr_ty target; + expr_ty iter; + asdl_seq *body; + asdl_seq *orelse; + } For; + + struct { + expr_ty test; + asdl_seq *body; + asdl_seq *orelse; + } While; + + struct { + expr_ty test; + asdl_seq *body; + asdl_seq *orelse; + } If; + + struct { + expr_ty context_expr; + expr_ty optional_vars; + asdl_seq *body; + } With; + + struct { + expr_ty type; + expr_ty inst; + expr_ty tback; + } Raise; + + struct { + asdl_seq *body; + asdl_seq *handlers; + asdl_seq *orelse; + } TryExcept; + + struct { + asdl_seq *body; + asdl_seq *finalbody; + } TryFinally; + + struct { + expr_ty test; + expr_ty msg; + } Assert; + + struct { + asdl_seq *names; + } Import; + + struct { + identifier module; + asdl_seq *names; + int level; + } ImportFrom; + + struct { + expr_ty body; + expr_ty globals; + expr_ty locals; + } Exec; + + struct { + asdl_seq *names; + } Global; + + struct { + expr_ty value; + } Expr; + + } v; + int lineno; + int col_offset; +}; + +enum _expr_kind {BoolOp_kind=1, BinOp_kind=2, UnaryOp_kind=3, Lambda_kind=4, + IfExp_kind=5, Dict_kind=6, Set_kind=7, ListComp_kind=8, + SetComp_kind=9, DictComp_kind=10, GeneratorExp_kind=11, + Yield_kind=12, Compare_kind=13, Call_kind=14, Repr_kind=15, + Num_kind=16, Str_kind=17, Attribute_kind=18, + Subscript_kind=19, Name_kind=20, List_kind=21, Tuple_kind=22}; +struct _expr { + enum _expr_kind kind; + union { + struct { + boolop_ty op; + asdl_seq *values; + } BoolOp; + + struct { + expr_ty left; + operator_ty op; + expr_ty right; + } BinOp; + + struct { + unaryop_ty op; + expr_ty operand; + } UnaryOp; + + struct { + arguments_ty args; + expr_ty body; + } Lambda; + + struct { + expr_ty test; + expr_ty body; + expr_ty orelse; + } IfExp; + + struct { + asdl_seq *keys; + asdl_seq *values; + } Dict; + + struct { + asdl_seq *elts; + } Set; + + struct { + expr_ty elt; + asdl_seq *generators; + } ListComp; + + struct { + expr_ty elt; + asdl_seq *generators; + } SetComp; + + struct { + expr_ty key; + expr_ty value; + asdl_seq *generators; + } DictComp; + + struct { + expr_ty elt; + asdl_seq *generators; + } GeneratorExp; + + struct { + expr_ty value; + } Yield; + + struct { + expr_ty left; + asdl_int_seq *ops; + asdl_seq *comparators; + } Compare; + + struct { + expr_ty func; + asdl_seq *args; + asdl_seq *keywords; + expr_ty starargs; + expr_ty kwargs; + } Call; + + struct { + expr_ty value; + } Repr; + + struct { + object n; + } Num; + + struct { + string s; + } Str; + + struct { + expr_ty value; + identifier attr; + expr_context_ty ctx; + } Attribute; + + struct { + expr_ty value; + slice_ty slice; + expr_context_ty ctx; + } Subscript; + + struct { + identifier id; + expr_context_ty ctx; + } Name; + + struct { + asdl_seq *elts; + expr_context_ty ctx; + } List; + + struct { + asdl_seq *elts; + expr_context_ty ctx; + } Tuple; + + } v; + int lineno; + int col_offset; +}; + +enum _slice_kind {Ellipsis_kind=1, Slice_kind=2, ExtSlice_kind=3, Index_kind=4}; +struct _slice { + enum _slice_kind kind; + union { + struct { + expr_ty lower; + expr_ty upper; + expr_ty step; + } Slice; + + struct { + asdl_seq *dims; + } ExtSlice; + + struct { + expr_ty value; + } Index; + + } v; +}; + +struct _comprehension { + expr_ty target; + expr_ty iter; + asdl_seq *ifs; +}; + +enum _excepthandler_kind {ExceptHandler_kind=1}; +struct _excepthandler { + enum _excepthandler_kind kind; + union { + struct { + expr_ty type; + expr_ty name; + asdl_seq *body; + } ExceptHandler; + + } v; + int lineno; + int col_offset; +}; + +struct _arguments { + asdl_seq *args; + identifier vararg; + identifier kwarg; + asdl_seq *defaults; +}; + +struct _keyword { + identifier arg; + expr_ty value; +}; + +struct _alias { + identifier name; + identifier asname; +}; + + +#define Module(a0, a1) _Py_Module(a0, a1) +mod_ty _Py_Module(asdl_seq * body, PyArena *arena); +#define Interactive(a0, a1) _Py_Interactive(a0, a1) +mod_ty _Py_Interactive(asdl_seq * body, PyArena *arena); +#define Expression(a0, a1) _Py_Expression(a0, a1) +mod_ty _Py_Expression(expr_ty body, PyArena *arena); +#define Suite(a0, a1) _Py_Suite(a0, a1) +mod_ty _Py_Suite(asdl_seq * body, PyArena *arena); +#define FunctionDef(a0, a1, a2, a3, a4, a5, a6) _Py_FunctionDef(a0, a1, a2, a3, a4, a5, a6) +stmt_ty _Py_FunctionDef(identifier name, arguments_ty args, asdl_seq * body, + asdl_seq * decorator_list, int lineno, int col_offset, + PyArena *arena); +#define ClassDef(a0, a1, a2, a3, a4, a5, a6) _Py_ClassDef(a0, a1, a2, a3, a4, a5, a6) +stmt_ty _Py_ClassDef(identifier name, asdl_seq * bases, asdl_seq * body, + asdl_seq * decorator_list, int lineno, int col_offset, + PyArena *arena); +#define Return(a0, a1, a2, a3) _Py_Return(a0, a1, a2, a3) +stmt_ty _Py_Return(expr_ty value, int lineno, int col_offset, PyArena *arena); +#define Delete(a0, a1, a2, a3) _Py_Delete(a0, a1, a2, a3) +stmt_ty _Py_Delete(asdl_seq * targets, int lineno, int col_offset, PyArena + *arena); +#define Assign(a0, a1, a2, a3, a4) _Py_Assign(a0, a1, a2, a3, a4) +stmt_ty _Py_Assign(asdl_seq * targets, expr_ty value, int lineno, int + col_offset, PyArena *arena); +#define AugAssign(a0, a1, a2, a3, a4, a5) _Py_AugAssign(a0, a1, a2, a3, a4, a5) +stmt_ty _Py_AugAssign(expr_ty target, operator_ty op, expr_ty value, int + lineno, int col_offset, PyArena *arena); +#define Print(a0, a1, a2, a3, a4, a5) _Py_Print(a0, a1, a2, a3, a4, a5) +stmt_ty _Py_Print(expr_ty dest, asdl_seq * values, bool nl, int lineno, int + col_offset, PyArena *arena); +#define For(a0, a1, a2, a3, a4, a5, a6) _Py_For(a0, a1, a2, a3, a4, a5, a6) +stmt_ty _Py_For(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * + orelse, int lineno, int col_offset, PyArena *arena); +#define While(a0, a1, a2, a3, a4, a5) _Py_While(a0, a1, a2, a3, a4, a5) +stmt_ty _Py_While(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, + int col_offset, PyArena *arena); +#define If(a0, a1, a2, a3, a4, a5) _Py_If(a0, a1, a2, a3, a4, a5) +stmt_ty _Py_If(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, + int col_offset, PyArena *arena); +#define With(a0, a1, a2, a3, a4, a5) _Py_With(a0, a1, a2, a3, a4, a5) +stmt_ty _Py_With(expr_ty context_expr, expr_ty optional_vars, asdl_seq * body, + int lineno, int col_offset, PyArena *arena); +#define Raise(a0, a1, a2, a3, a4, a5) _Py_Raise(a0, a1, a2, a3, a4, a5) +stmt_ty _Py_Raise(expr_ty type, expr_ty inst, expr_ty tback, int lineno, int + col_offset, PyArena *arena); +#define TryExcept(a0, a1, a2, a3, a4, a5) _Py_TryExcept(a0, a1, a2, a3, a4, a5) +stmt_ty _Py_TryExcept(asdl_seq * body, asdl_seq * handlers, asdl_seq * orelse, + int lineno, int col_offset, PyArena *arena); +#define TryFinally(a0, a1, a2, a3, a4) _Py_TryFinally(a0, a1, a2, a3, a4) +stmt_ty _Py_TryFinally(asdl_seq * body, asdl_seq * finalbody, int lineno, int + col_offset, PyArena *arena); +#define Assert(a0, a1, a2, a3, a4) _Py_Assert(a0, a1, a2, a3, a4) +stmt_ty _Py_Assert(expr_ty test, expr_ty msg, int lineno, int col_offset, + PyArena *arena); +#define Import(a0, a1, a2, a3) _Py_Import(a0, a1, a2, a3) +stmt_ty _Py_Import(asdl_seq * names, int lineno, int col_offset, PyArena + *arena); +#define ImportFrom(a0, a1, a2, a3, a4, a5) _Py_ImportFrom(a0, a1, a2, a3, a4, a5) +stmt_ty _Py_ImportFrom(identifier module, asdl_seq * names, int level, int + lineno, int col_offset, PyArena *arena); +#define Exec(a0, a1, a2, a3, a4, a5) _Py_Exec(a0, a1, a2, a3, a4, a5) +stmt_ty _Py_Exec(expr_ty body, expr_ty globals, expr_ty locals, int lineno, int + col_offset, PyArena *arena); +#define Global(a0, a1, a2, a3) _Py_Global(a0, a1, a2, a3) +stmt_ty _Py_Global(asdl_seq * names, int lineno, int col_offset, PyArena + *arena); +#define Expr(a0, a1, a2, a3) _Py_Expr(a0, a1, a2, a3) +stmt_ty _Py_Expr(expr_ty value, int lineno, int col_offset, PyArena *arena); +#define Pass(a0, a1, a2) _Py_Pass(a0, a1, a2) +stmt_ty _Py_Pass(int lineno, int col_offset, PyArena *arena); +#define Break(a0, a1, a2) _Py_Break(a0, a1, a2) +stmt_ty _Py_Break(int lineno, int col_offset, PyArena *arena); +#define Continue(a0, a1, a2) _Py_Continue(a0, a1, a2) +stmt_ty _Py_Continue(int lineno, int col_offset, PyArena *arena); +#define BoolOp(a0, a1, a2, a3, a4) _Py_BoolOp(a0, a1, a2, a3, a4) +expr_ty _Py_BoolOp(boolop_ty op, asdl_seq * values, int lineno, int col_offset, + PyArena *arena); +#define BinOp(a0, a1, a2, a3, a4, a5) _Py_BinOp(a0, a1, a2, a3, a4, a5) +expr_ty _Py_BinOp(expr_ty left, operator_ty op, expr_ty right, int lineno, int + col_offset, PyArena *arena); +#define UnaryOp(a0, a1, a2, a3, a4) _Py_UnaryOp(a0, a1, a2, a3, a4) +expr_ty _Py_UnaryOp(unaryop_ty op, expr_ty operand, int lineno, int col_offset, + PyArena *arena); +#define Lambda(a0, a1, a2, a3, a4) _Py_Lambda(a0, a1, a2, a3, a4) +expr_ty _Py_Lambda(arguments_ty args, expr_ty body, int lineno, int col_offset, + PyArena *arena); +#define IfExp(a0, a1, a2, a3, a4, a5) _Py_IfExp(a0, a1, a2, a3, a4, a5) +expr_ty _Py_IfExp(expr_ty test, expr_ty body, expr_ty orelse, int lineno, int + col_offset, PyArena *arena); +#define Dict(a0, a1, a2, a3, a4) _Py_Dict(a0, a1, a2, a3, a4) +expr_ty _Py_Dict(asdl_seq * keys, asdl_seq * values, int lineno, int + col_offset, PyArena *arena); +#define Set(a0, a1, a2, a3) _Py_Set(a0, a1, a2, a3) +expr_ty _Py_Set(asdl_seq * elts, int lineno, int col_offset, PyArena *arena); +#define ListComp(a0, a1, a2, a3, a4) _Py_ListComp(a0, a1, a2, a3, a4) +expr_ty _Py_ListComp(expr_ty elt, asdl_seq * generators, int lineno, int + col_offset, PyArena *arena); +#define SetComp(a0, a1, a2, a3, a4) _Py_SetComp(a0, a1, a2, a3, a4) +expr_ty _Py_SetComp(expr_ty elt, asdl_seq * generators, int lineno, int + col_offset, PyArena *arena); +#define DictComp(a0, a1, a2, a3, a4, a5) _Py_DictComp(a0, a1, a2, a3, a4, a5) +expr_ty _Py_DictComp(expr_ty key, expr_ty value, asdl_seq * generators, int + lineno, int col_offset, PyArena *arena); +#define GeneratorExp(a0, a1, a2, a3, a4) _Py_GeneratorExp(a0, a1, a2, a3, a4) +expr_ty _Py_GeneratorExp(expr_ty elt, asdl_seq * generators, int lineno, int + col_offset, PyArena *arena); +#define Yield(a0, a1, a2, a3) _Py_Yield(a0, a1, a2, a3) +expr_ty _Py_Yield(expr_ty value, int lineno, int col_offset, PyArena *arena); +#define Compare(a0, a1, a2, a3, a4, a5) _Py_Compare(a0, a1, a2, a3, a4, a5) +expr_ty _Py_Compare(expr_ty left, asdl_int_seq * ops, asdl_seq * comparators, + int lineno, int col_offset, PyArena *arena); +#define Call(a0, a1, a2, a3, a4, a5, a6, a7) _Py_Call(a0, a1, a2, a3, a4, a5, a6, a7) +expr_ty _Py_Call(expr_ty func, asdl_seq * args, asdl_seq * keywords, expr_ty + starargs, expr_ty kwargs, int lineno, int col_offset, PyArena + *arena); +#define Repr(a0, a1, a2, a3) _Py_Repr(a0, a1, a2, a3) +expr_ty _Py_Repr(expr_ty value, int lineno, int col_offset, PyArena *arena); +#define Num(a0, a1, a2, a3) _Py_Num(a0, a1, a2, a3) +expr_ty _Py_Num(object n, int lineno, int col_offset, PyArena *arena); +#define Str(a0, a1, a2, a3) _Py_Str(a0, a1, a2, a3) +expr_ty _Py_Str(string s, int lineno, int col_offset, PyArena *arena); +#define Attribute(a0, a1, a2, a3, a4, a5) _Py_Attribute(a0, a1, a2, a3, a4, a5) +expr_ty _Py_Attribute(expr_ty value, identifier attr, expr_context_ty ctx, int + lineno, int col_offset, PyArena *arena); +#define Subscript(a0, a1, a2, a3, a4, a5) _Py_Subscript(a0, a1, a2, a3, a4, a5) +expr_ty _Py_Subscript(expr_ty value, slice_ty slice, expr_context_ty ctx, int + lineno, int col_offset, PyArena *arena); +#define Name(a0, a1, a2, a3, a4) _Py_Name(a0, a1, a2, a3, a4) +expr_ty _Py_Name(identifier id, expr_context_ty ctx, int lineno, int + col_offset, PyArena *arena); +#define List(a0, a1, a2, a3, a4) _Py_List(a0, a1, a2, a3, a4) +expr_ty _Py_List(asdl_seq * elts, expr_context_ty ctx, int lineno, int + col_offset, PyArena *arena); +#define Tuple(a0, a1, a2, a3, a4) _Py_Tuple(a0, a1, a2, a3, a4) +expr_ty _Py_Tuple(asdl_seq * elts, expr_context_ty ctx, int lineno, int + col_offset, PyArena *arena); +#define Ellipsis(a0) _Py_Ellipsis(a0) +slice_ty _Py_Ellipsis(PyArena *arena); +#define Slice(a0, a1, a2, a3) _Py_Slice(a0, a1, a2, a3) +slice_ty _Py_Slice(expr_ty lower, expr_ty upper, expr_ty step, PyArena *arena); +#define ExtSlice(a0, a1) _Py_ExtSlice(a0, a1) +slice_ty _Py_ExtSlice(asdl_seq * dims, PyArena *arena); +#define Index(a0, a1) _Py_Index(a0, a1) +slice_ty _Py_Index(expr_ty value, PyArena *arena); +#define comprehension(a0, a1, a2, a3) _Py_comprehension(a0, a1, a2, a3) +comprehension_ty _Py_comprehension(expr_ty target, expr_ty iter, asdl_seq * + ifs, PyArena *arena); +#define ExceptHandler(a0, a1, a2, a3, a4, a5) _Py_ExceptHandler(a0, a1, a2, a3, a4, a5) +excepthandler_ty _Py_ExceptHandler(expr_ty type, expr_ty name, asdl_seq * body, + int lineno, int col_offset, PyArena *arena); +#define arguments(a0, a1, a2, a3, a4) _Py_arguments(a0, a1, a2, a3, a4) +arguments_ty _Py_arguments(asdl_seq * args, identifier vararg, identifier + kwarg, asdl_seq * defaults, PyArena *arena); +#define keyword(a0, a1, a2) _Py_keyword(a0, a1, a2) +keyword_ty _Py_keyword(identifier arg, expr_ty value, PyArena *arena); +#define alias(a0, a1, a2) _Py_alias(a0, a1, a2) +alias_ty _Py_alias(identifier name, identifier asname, PyArena *arena); + +PyObject* PyAST_mod2obj(mod_ty t); +mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode); +int PyAST_Check(PyObject* obj); diff --git a/python/include/Python.h b/python/include/Python.h new file mode 100644 index 00000000..775412b8 --- /dev/null +++ b/python/include/Python.h @@ -0,0 +1,178 @@ +#ifndef Py_PYTHON_H +#define Py_PYTHON_H +/* Since this is a "meta-include" file, no #ifdef __cplusplus / extern "C" { */ + +/* Include nearly all Python header files */ + +#include "patchlevel.h" +#include "pyconfig.h" +#include "pymacconfig.h" + +/* Cyclic gc is always enabled, starting with release 2.3a1. Supply the + * old symbol for the benefit of extension modules written before then + * that may be conditionalizing on it. The core doesn't use it anymore. + */ +#ifndef WITH_CYCLE_GC +#define WITH_CYCLE_GC 1 +#endif + +#include + +#ifndef UCHAR_MAX +#error "Something's broken. UCHAR_MAX should be defined in limits.h." +#endif + +#if UCHAR_MAX != 255 +#error "Python's source code assumes C's unsigned char is an 8-bit type." +#endif + +#if defined(__sgi) && defined(WITH_THREAD) && !defined(_SGI_MP_SOURCE) +#define _SGI_MP_SOURCE +#endif + +#include +#ifndef NULL +# error "Python.h requires that stdio.h define NULL." +#endif + +#include +#ifdef HAVE_ERRNO_H +#include +#endif +#include +#ifdef HAVE_UNISTD_H +#include +#endif + +/* For size_t? */ +#ifdef HAVE_STDDEF_H +#include +#endif + +/* CAUTION: Build setups should ensure that NDEBUG is defined on the + * compiler command line when building Python in release mode; else + * assert() calls won't be removed. + */ +#include + +#include "pyport.h" + +/* pyconfig.h or pyport.h may or may not define DL_IMPORT */ +#ifndef DL_IMPORT /* declarations for DLL import/export */ +#define DL_IMPORT(RTYPE) RTYPE +#endif +#ifndef DL_EXPORT /* declarations for DLL import/export */ +#define DL_EXPORT(RTYPE) RTYPE +#endif + +/* Debug-mode build with pymalloc implies PYMALLOC_DEBUG. + * PYMALLOC_DEBUG is in error if pymalloc is not in use. + */ +#if defined(Py_DEBUG) && defined(WITH_PYMALLOC) && !defined(PYMALLOC_DEBUG) +#define PYMALLOC_DEBUG +#endif +#if defined(PYMALLOC_DEBUG) && !defined(WITH_PYMALLOC) +#error "PYMALLOC_DEBUG requires WITH_PYMALLOC" +#endif +#include "pymath.h" +#include "pymem.h" + +#include "object.h" +#include "objimpl.h" + +#include "pydebug.h" + +#include "unicodeobject.h" +#include "intobject.h" +#include "boolobject.h" +#include "longobject.h" +#include "floatobject.h" +#ifndef WITHOUT_COMPLEX +#include "complexobject.h" +#endif +#include "rangeobject.h" +#include "stringobject.h" +#include "memoryobject.h" +#include "bufferobject.h" +#include "bytesobject.h" +#include "bytearrayobject.h" +#include "tupleobject.h" +#include "listobject.h" +#include "dictobject.h" +#include "enumobject.h" +#include "setobject.h" +#include "methodobject.h" +#include "moduleobject.h" +#include "funcobject.h" +#include "classobject.h" +#include "fileobject.h" +#include "cobject.h" +#include "pycapsule.h" +#include "traceback.h" +#include "sliceobject.h" +#include "cellobject.h" +#include "iterobject.h" +#include "genobject.h" +#include "descrobject.h" +#include "warnings.h" +#include "weakrefobject.h" + +#include "codecs.h" +#include "pyerrors.h" + +#include "pystate.h" + +#include "pyarena.h" +#include "modsupport.h" +#include "pythonrun.h" +#include "ceval.h" +#include "sysmodule.h" +#include "intrcheck.h" +#include "import.h" + +#include "abstract.h" + +#include "compile.h" +#include "eval.h" + +#include "pyctype.h" +#include "pystrtod.h" +#include "pystrcmp.h" +#include "dtoa.h" + +/* _Py_Mangle is defined in compile.c */ +PyAPI_FUNC(PyObject*) _Py_Mangle(PyObject *p, PyObject *name); + +/* PyArg_GetInt is deprecated and should not be used, use PyArg_Parse(). */ +#define PyArg_GetInt(v, a) PyArg_Parse((v), "i", (a)) + +/* PyArg_NoArgs should not be necessary. + Set ml_flags in the PyMethodDef to METH_NOARGS. */ +#define PyArg_NoArgs(v) PyArg_Parse(v, "") + +/* Argument must be a char or an int in [-128, 127] or [0, 255]. */ +#define Py_CHARMASK(c) ((unsigned char)((c) & 0xff)) + +#include "pyfpe.h" + +/* These definitions must match corresponding definitions in graminit.h. + There's code in compile.c that checks that they are the same. */ +#define Py_single_input 256 +#define Py_file_input 257 +#define Py_eval_input 258 + +#ifdef HAVE_PTH +/* GNU pth user-space thread support */ +#include +#endif + +/* Define macros for inline documentation. */ +#define PyDoc_VAR(name) static char name[] +#define PyDoc_STRVAR(name,str) PyDoc_VAR(name) = PyDoc_STR(str) +#ifdef WITH_DOC_STRINGS +#define PyDoc_STR(str) str +#else +#define PyDoc_STR(str) "" +#endif + +#endif /* !Py_PYTHON_H */ diff --git a/python/include/abstract.h b/python/include/abstract.h new file mode 100644 index 00000000..a3774238 --- /dev/null +++ b/python/include/abstract.h @@ -0,0 +1,1396 @@ +#ifndef Py_ABSTRACTOBJECT_H +#define Py_ABSTRACTOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef PY_SSIZE_T_CLEAN +#define PyObject_CallFunction _PyObject_CallFunction_SizeT +#define PyObject_CallMethod _PyObject_CallMethod_SizeT +#endif + +/* Abstract Object Interface (many thanks to Jim Fulton) */ + +/* + PROPOSAL: A Generic Python Object Interface for Python C Modules + +Problem + + Python modules written in C that must access Python objects must do + so through routines whose interfaces are described by a set of + include files. Unfortunately, these routines vary according to the + object accessed. To use these routines, the C programmer must check + the type of the object being used and must call a routine based on + the object type. For example, to access an element of a sequence, + the programmer must determine whether the sequence is a list or a + tuple: + + if(is_tupleobject(o)) + e=gettupleitem(o,i) + else if(is_listitem(o)) + e=getlistitem(o,i) + + If the programmer wants to get an item from another type of object + that provides sequence behavior, there is no clear way to do it + correctly. + + The persistent programmer may peruse object.h and find that the + _typeobject structure provides a means of invoking up to (currently + about) 41 special operators. So, for example, a routine can get an + item from any object that provides sequence behavior. However, to + use this mechanism, the programmer must make their code dependent on + the current Python implementation. + + Also, certain semantics, especially memory management semantics, may + differ by the type of object being used. Unfortunately, these + semantics are not clearly described in the current include files. + An abstract interface providing more consistent semantics is needed. + +Proposal + + I propose the creation of a standard interface (with an associated + library of routines and/or macros) for generically obtaining the + services of Python objects. This proposal can be viewed as one + components of a Python C interface consisting of several components. + + From the viewpoint of C access to Python services, we have (as + suggested by Guido in off-line discussions): + + - "Very high level layer": two or three functions that let you exec or + eval arbitrary Python code given as a string in a module whose name is + given, passing C values in and getting C values out using + mkvalue/getargs style format strings. This does not require the user + to declare any variables of type "PyObject *". This should be enough + to write a simple application that gets Python code from the user, + execs it, and returns the output or errors. (Error handling must also + be part of this API.) + + - "Abstract objects layer": which is the subject of this proposal. + It has many functions operating on objects, and lest you do many + things from C that you can also write in Python, without going + through the Python parser. + + - "Concrete objects layer": This is the public type-dependent + interface provided by the standard built-in types, such as floats, + strings, and lists. This interface exists and is currently + documented by the collection of include files provided with the + Python distributions. + + From the point of view of Python accessing services provided by C + modules: + + - "Python module interface": this interface consist of the basic + routines used to define modules and their members. Most of the + current extensions-writing guide deals with this interface. + + - "Built-in object interface": this is the interface that a new + built-in type must provide and the mechanisms and rules that a + developer of a new built-in type must use and follow. + + This proposal is a "first-cut" that is intended to spur + discussion. See especially the lists of notes. + + The Python C object interface will provide four protocols: object, + numeric, sequence, and mapping. Each protocol consists of a + collection of related operations. If an operation that is not + provided by a particular type is invoked, then a standard exception, + NotImplementedError is raised with a operation name as an argument. + In addition, for convenience this interface defines a set of + constructors for building objects of built-in types. This is needed + so new objects can be returned from C functions that otherwise treat + objects generically. + +Memory Management + + For all of the functions described in this proposal, if a function + retains a reference to a Python object passed as an argument, then the + function will increase the reference count of the object. It is + unnecessary for the caller to increase the reference count of an + argument in anticipation of the object's retention. + + All Python objects returned from functions should be treated as new + objects. Functions that return objects assume that the caller will + retain a reference and the reference count of the object has already + been incremented to account for this fact. A caller that does not + retain a reference to an object that is returned from a function + must decrement the reference count of the object (using + DECREF(object)) to prevent memory leaks. + + Note that the behavior mentioned here is different from the current + behavior for some objects (e.g. lists and tuples) when certain + type-specific routines are called directly (e.g. setlistitem). The + proposed abstraction layer will provide a consistent memory + management interface, correcting for inconsistent behavior for some + built-in types. + +Protocols + +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/ + +/* Object Protocol: */ + + /* Implemented elsewhere: + + int PyObject_Print(PyObject *o, FILE *fp, int flags); + + Print an object, o, on file, fp. Returns -1 on + error. The flags argument is used to enable certain printing + options. The only option currently supported is Py_Print_RAW. + + (What should be said about Py_Print_RAW?) + + */ + + /* Implemented elsewhere: + + int PyObject_HasAttrString(PyObject *o, char *attr_name); + + Returns 1 if o has the attribute attr_name, and 0 otherwise. + This is equivalent to the Python expression: + hasattr(o,attr_name). + + This function always succeeds. + + */ + + /* Implemented elsewhere: + + PyObject* PyObject_GetAttrString(PyObject *o, char *attr_name); + + Retrieve an attributed named attr_name form object o. + Returns the attribute value on success, or NULL on failure. + This is the equivalent of the Python expression: o.attr_name. + + */ + + /* Implemented elsewhere: + + int PyObject_HasAttr(PyObject *o, PyObject *attr_name); + + Returns 1 if o has the attribute attr_name, and 0 otherwise. + This is equivalent to the Python expression: + hasattr(o,attr_name). + + This function always succeeds. + + */ + + /* Implemented elsewhere: + + PyObject* PyObject_GetAttr(PyObject *o, PyObject *attr_name); + + Retrieve an attributed named attr_name form object o. + Returns the attribute value on success, or NULL on failure. + This is the equivalent of the Python expression: o.attr_name. + + */ + + + /* Implemented elsewhere: + + int PyObject_SetAttrString(PyObject *o, char *attr_name, PyObject *v); + + Set the value of the attribute named attr_name, for object o, + to the value, v. Returns -1 on failure. This is + the equivalent of the Python statement: o.attr_name=v. + + */ + + /* Implemented elsewhere: + + int PyObject_SetAttr(PyObject *o, PyObject *attr_name, PyObject *v); + + Set the value of the attribute named attr_name, for object o, + to the value, v. Returns -1 on failure. This is + the equivalent of the Python statement: o.attr_name=v. + + */ + + /* implemented as a macro: + + int PyObject_DelAttrString(PyObject *o, char *attr_name); + + Delete attribute named attr_name, for object o. Returns + -1 on failure. This is the equivalent of the Python + statement: del o.attr_name. + + */ +#define PyObject_DelAttrString(O,A) PyObject_SetAttrString((O),(A),NULL) + + /* implemented as a macro: + + int PyObject_DelAttr(PyObject *o, PyObject *attr_name); + + Delete attribute named attr_name, for object o. Returns -1 + on failure. This is the equivalent of the Python + statement: del o.attr_name. + + */ +#define PyObject_DelAttr(O,A) PyObject_SetAttr((O),(A),NULL) + + PyAPI_FUNC(int) PyObject_Cmp(PyObject *o1, PyObject *o2, int *result); + + /* + Compare the values of o1 and o2 using a routine provided by + o1, if one exists, otherwise with a routine provided by o2. + The result of the comparison is returned in result. Returns + -1 on failure. This is the equivalent of the Python + statement: result=cmp(o1,o2). + + */ + + /* Implemented elsewhere: + + int PyObject_Compare(PyObject *o1, PyObject *o2); + + Compare the values of o1 and o2 using a routine provided by + o1, if one exists, otherwise with a routine provided by o2. + Returns the result of the comparison on success. On error, + the value returned is undefined. This is equivalent to the + Python expression: cmp(o1,o2). + + */ + + /* Implemented elsewhere: + + PyObject *PyObject_Repr(PyObject *o); + + Compute the string representation of object, o. Returns the + string representation on success, NULL on failure. This is + the equivalent of the Python expression: repr(o). + + Called by the repr() built-in function and by reverse quotes. + + */ + + /* Implemented elsewhere: + + PyObject *PyObject_Str(PyObject *o); + + Compute the string representation of object, o. Returns the + string representation on success, NULL on failure. This is + the equivalent of the Python expression: str(o).) + + Called by the str() built-in function and by the print + statement. + + */ + + /* Implemented elsewhere: + + PyObject *PyObject_Unicode(PyObject *o); + + Compute the unicode representation of object, o. Returns the + unicode representation on success, NULL on failure. This is + the equivalent of the Python expression: unistr(o).) + + Called by the unistr() built-in function. + + */ + + /* Declared elsewhere + + PyAPI_FUNC(int) PyCallable_Check(PyObject *o); + + Determine if the object, o, is callable. Return 1 if the + object is callable and 0 otherwise. + + This function always succeeds. + + */ + + + + PyAPI_FUNC(PyObject *) PyObject_Call(PyObject *callable_object, + PyObject *args, PyObject *kw); + + /* + Call a callable Python object, callable_object, with + arguments and keywords arguments. The 'args' argument can not be + NULL, but the 'kw' argument can be NULL. + + */ + + PyAPI_FUNC(PyObject *) PyObject_CallObject(PyObject *callable_object, + PyObject *args); + + /* + Call a callable Python object, callable_object, with + arguments given by the tuple, args. If no arguments are + needed, then args may be NULL. Returns the result of the + call on success, or NULL on failure. This is the equivalent + of the Python expression: apply(o,args). + + */ + + PyAPI_FUNC(PyObject *) PyObject_CallFunction(PyObject *callable_object, + char *format, ...); + + /* + Call a callable Python object, callable_object, with a + variable number of C arguments. The C arguments are described + using a mkvalue-style format string. The format may be NULL, + indicating that no arguments are provided. Returns the + result of the call on success, or NULL on failure. This is + the equivalent of the Python expression: apply(o,args). + + */ + + + PyAPI_FUNC(PyObject *) PyObject_CallMethod(PyObject *o, char *m, + char *format, ...); + + /* + Call the method named m of object o with a variable number of + C arguments. The C arguments are described by a mkvalue + format string. The format may be NULL, indicating that no + arguments are provided. Returns the result of the call on + success, or NULL on failure. This is the equivalent of the + Python expression: o.method(args). + */ + + PyAPI_FUNC(PyObject *) _PyObject_CallFunction_SizeT(PyObject *callable, + char *format, ...); + PyAPI_FUNC(PyObject *) _PyObject_CallMethod_SizeT(PyObject *o, + char *name, + char *format, ...); + + PyAPI_FUNC(PyObject *) PyObject_CallFunctionObjArgs(PyObject *callable, + ...); + + /* + Call a callable Python object, callable_object, with a + variable number of C arguments. The C arguments are provided + as PyObject * values, terminated by a NULL. Returns the + result of the call on success, or NULL on failure. This is + the equivalent of the Python expression: apply(o,args). + */ + + + PyAPI_FUNC(PyObject *) PyObject_CallMethodObjArgs(PyObject *o, + PyObject *m, ...); + + /* + Call the method named m of object o with a variable number of + C arguments. The C arguments are provided as PyObject * + values, terminated by NULL. Returns the result of the call + on success, or NULL on failure. This is the equivalent of + the Python expression: o.method(args). + */ + + + /* Implemented elsewhere: + + long PyObject_Hash(PyObject *o); + + Compute and return the hash, hash_value, of an object, o. On + failure, return -1. This is the equivalent of the Python + expression: hash(o). + + */ + + + /* Implemented elsewhere: + + int PyObject_IsTrue(PyObject *o); + + Returns 1 if the object, o, is considered to be true, 0 if o is + considered to be false and -1 on failure. This is equivalent to the + Python expression: not not o + + */ + + /* Implemented elsewhere: + + int PyObject_Not(PyObject *o); + + Returns 0 if the object, o, is considered to be true, 1 if o is + considered to be false and -1 on failure. This is equivalent to the + Python expression: not o + + */ + + PyAPI_FUNC(PyObject *) PyObject_Type(PyObject *o); + + /* + On success, returns a type object corresponding to the object + type of object o. On failure, returns NULL. This is + equivalent to the Python expression: type(o). + */ + + PyAPI_FUNC(Py_ssize_t) PyObject_Size(PyObject *o); + + /* + Return the size of object o. If the object, o, provides + both sequence and mapping protocols, the sequence size is + returned. On error, -1 is returned. This is the equivalent + to the Python expression: len(o). + + */ + + /* For DLL compatibility */ +#undef PyObject_Length + PyAPI_FUNC(Py_ssize_t) PyObject_Length(PyObject *o); +#define PyObject_Length PyObject_Size + + PyAPI_FUNC(Py_ssize_t) _PyObject_LengthHint(PyObject *o, Py_ssize_t); + + /* + Guess the size of object o using len(o) or o.__length_hint__(). + If neither of those return a non-negative value, then return the + default value. If one of the calls fails, this function returns -1. + */ + + PyAPI_FUNC(PyObject *) PyObject_GetItem(PyObject *o, PyObject *key); + + /* + Return element of o corresponding to the object, key, or NULL + on failure. This is the equivalent of the Python expression: + o[key]. + + */ + + PyAPI_FUNC(int) PyObject_SetItem(PyObject *o, PyObject *key, PyObject *v); + + /* + Map the object, key, to the value, v. Returns + -1 on failure. This is the equivalent of the Python + statement: o[key]=v. + */ + + PyAPI_FUNC(int) PyObject_DelItemString(PyObject *o, char *key); + + /* + Remove the mapping for object, key, from the object *o. + Returns -1 on failure. This is equivalent to + the Python statement: del o[key]. + */ + + PyAPI_FUNC(int) PyObject_DelItem(PyObject *o, PyObject *key); + + /* + Delete the mapping for key from *o. Returns -1 on failure. + This is the equivalent of the Python statement: del o[key]. + */ + + PyAPI_FUNC(int) PyObject_AsCharBuffer(PyObject *obj, + const char **buffer, + Py_ssize_t *buffer_len); + + /* + Takes an arbitrary object which must support the (character, + single segment) buffer interface and returns a pointer to a + read-only memory location useable as character based input + for subsequent processing. + + 0 is returned on success. buffer and buffer_len are only + set in case no error occurs. Otherwise, -1 is returned and + an exception set. + + */ + + PyAPI_FUNC(int) PyObject_CheckReadBuffer(PyObject *obj); + + /* + Checks whether an arbitrary object supports the (character, + single segment) buffer interface. Returns 1 on success, 0 + on failure. + + */ + + PyAPI_FUNC(int) PyObject_AsReadBuffer(PyObject *obj, + const void **buffer, + Py_ssize_t *buffer_len); + + /* + Same as PyObject_AsCharBuffer() except that this API expects + (readable, single segment) buffer interface and returns a + pointer to a read-only memory location which can contain + arbitrary data. + + 0 is returned on success. buffer and buffer_len are only + set in case no error occurs. Otherwise, -1 is returned and + an exception set. + + */ + + PyAPI_FUNC(int) PyObject_AsWriteBuffer(PyObject *obj, + void **buffer, + Py_ssize_t *buffer_len); + + /* + Takes an arbitrary object which must support the (writeable, + single segment) buffer interface and returns a pointer to a + writeable memory location in buffer of size buffer_len. + + 0 is returned on success. buffer and buffer_len are only + set in case no error occurs. Otherwise, -1 is returned and + an exception set. + + */ + + /* new buffer API */ + +#define PyObject_CheckBuffer(obj) \ + (((obj)->ob_type->tp_as_buffer != NULL) && \ + (PyType_HasFeature((obj)->ob_type, Py_TPFLAGS_HAVE_NEWBUFFER)) && \ + ((obj)->ob_type->tp_as_buffer->bf_getbuffer != NULL)) + + /* Return 1 if the getbuffer function is available, otherwise + return 0 */ + + PyAPI_FUNC(int) PyObject_GetBuffer(PyObject *obj, Py_buffer *view, + int flags); + + /* This is a C-API version of the getbuffer function call. It checks + to make sure object has the required function pointer and issues the + call. Returns -1 and raises an error on failure and returns 0 on + success + */ + + + PyAPI_FUNC(void *) PyBuffer_GetPointer(Py_buffer *view, Py_ssize_t *indices); + + /* Get the memory area pointed to by the indices for the buffer given. + Note that view->ndim is the assumed size of indices + */ + + PyAPI_FUNC(int) PyBuffer_SizeFromFormat(const char *); + + /* Return the implied itemsize of the data-format area from a + struct-style description */ + + + + PyAPI_FUNC(int) PyBuffer_ToContiguous(void *buf, Py_buffer *view, + Py_ssize_t len, char fort); + + PyAPI_FUNC(int) PyBuffer_FromContiguous(Py_buffer *view, void *buf, + Py_ssize_t len, char fort); + + + /* Copy len bytes of data from the contiguous chunk of memory + pointed to by buf into the buffer exported by obj. Return + 0 on success and return -1 and raise a PyBuffer_Error on + error (i.e. the object does not have a buffer interface or + it is not working). + + If fort is 'F' and the object is multi-dimensional, + then the data will be copied into the array in + Fortran-style (first dimension varies the fastest). If + fort is 'C', then the data will be copied into the array + in C-style (last dimension varies the fastest). If fort + is 'A', then it does not matter and the copy will be made + in whatever way is more efficient. + + */ + + PyAPI_FUNC(int) PyObject_CopyData(PyObject *dest, PyObject *src); + + /* Copy the data from the src buffer to the buffer of destination + */ + + PyAPI_FUNC(int) PyBuffer_IsContiguous(Py_buffer *view, char fort); + + + PyAPI_FUNC(void) PyBuffer_FillContiguousStrides(int ndims, + Py_ssize_t *shape, + Py_ssize_t *strides, + int itemsize, + char fort); + + /* Fill the strides array with byte-strides of a contiguous + (Fortran-style if fort is 'F' or C-style otherwise) + array of the given shape with the given number of bytes + per element. + */ + + PyAPI_FUNC(int) PyBuffer_FillInfo(Py_buffer *view, PyObject *o, void *buf, + Py_ssize_t len, int readonly, + int flags); + + /* Fills in a buffer-info structure correctly for an exporter + that can only share a contiguous chunk of memory of + "unsigned bytes" of the given length. Returns 0 on success + and -1 (with raising an error) on error. + */ + + PyAPI_FUNC(void) PyBuffer_Release(Py_buffer *view); + + /* Releases a Py_buffer obtained from getbuffer ParseTuple's s*. + */ + + PyAPI_FUNC(PyObject *) PyObject_Format(PyObject* obj, + PyObject *format_spec); + /* + Takes an arbitrary object and returns the result of + calling obj.__format__(format_spec). + */ + +/* Iterators */ + + PyAPI_FUNC(PyObject *) PyObject_GetIter(PyObject *); + /* Takes an object and returns an iterator for it. + This is typically a new iterator but if the argument + is an iterator, this returns itself. */ + +#define PyIter_Check(obj) \ + (PyType_HasFeature((obj)->ob_type, Py_TPFLAGS_HAVE_ITER) && \ + (obj)->ob_type->tp_iternext != NULL && \ + (obj)->ob_type->tp_iternext != &_PyObject_NextNotImplemented) + + PyAPI_FUNC(PyObject *) PyIter_Next(PyObject *); + /* Takes an iterator object and calls its tp_iternext slot, + returning the next value. If the iterator is exhausted, + this returns NULL without setting an exception. + NULL with an exception means an error occurred. */ + +/* Number Protocol:*/ + + PyAPI_FUNC(int) PyNumber_Check(PyObject *o); + + /* + Returns 1 if the object, o, provides numeric protocols, and + false otherwise. + + This function always succeeds. + + */ + + PyAPI_FUNC(PyObject *) PyNumber_Add(PyObject *o1, PyObject *o2); + + /* + Returns the result of adding o1 and o2, or null on failure. + This is the equivalent of the Python expression: o1+o2. + + + */ + + PyAPI_FUNC(PyObject *) PyNumber_Subtract(PyObject *o1, PyObject *o2); + + /* + Returns the result of subtracting o2 from o1, or null on + failure. This is the equivalent of the Python expression: + o1-o2. + + */ + + PyAPI_FUNC(PyObject *) PyNumber_Multiply(PyObject *o1, PyObject *o2); + + /* + Returns the result of multiplying o1 and o2, or null on + failure. This is the equivalent of the Python expression: + o1*o2. + + + */ + + PyAPI_FUNC(PyObject *) PyNumber_Divide(PyObject *o1, PyObject *o2); + + /* + Returns the result of dividing o1 by o2, or null on failure. + This is the equivalent of the Python expression: o1/o2. + + + */ + + PyAPI_FUNC(PyObject *) PyNumber_FloorDivide(PyObject *o1, PyObject *o2); + + /* + Returns the result of dividing o1 by o2 giving an integral result, + or null on failure. + This is the equivalent of the Python expression: o1//o2. + + + */ + + PyAPI_FUNC(PyObject *) PyNumber_TrueDivide(PyObject *o1, PyObject *o2); + + /* + Returns the result of dividing o1 by o2 giving a float result, + or null on failure. + This is the equivalent of the Python expression: o1/o2. + + + */ + + PyAPI_FUNC(PyObject *) PyNumber_Remainder(PyObject *o1, PyObject *o2); + + /* + Returns the remainder of dividing o1 by o2, or null on + failure. This is the equivalent of the Python expression: + o1%o2. + + + */ + + PyAPI_FUNC(PyObject *) PyNumber_Divmod(PyObject *o1, PyObject *o2); + + /* + See the built-in function divmod. Returns NULL on failure. + This is the equivalent of the Python expression: + divmod(o1,o2). + + + */ + + PyAPI_FUNC(PyObject *) PyNumber_Power(PyObject *o1, PyObject *o2, + PyObject *o3); + + /* + See the built-in function pow. Returns NULL on failure. + This is the equivalent of the Python expression: + pow(o1,o2,o3), where o3 is optional. + + */ + + PyAPI_FUNC(PyObject *) PyNumber_Negative(PyObject *o); + + /* + Returns the negation of o on success, or null on failure. + This is the equivalent of the Python expression: -o. + + */ + + PyAPI_FUNC(PyObject *) PyNumber_Positive(PyObject *o); + + /* + Returns the (what?) of o on success, or NULL on failure. + This is the equivalent of the Python expression: +o. + + */ + + PyAPI_FUNC(PyObject *) PyNumber_Absolute(PyObject *o); + + /* + Returns the absolute value of o, or null on failure. This is + the equivalent of the Python expression: abs(o). + + */ + + PyAPI_FUNC(PyObject *) PyNumber_Invert(PyObject *o); + + /* + Returns the bitwise negation of o on success, or NULL on + failure. This is the equivalent of the Python expression: + ~o. + + + */ + + PyAPI_FUNC(PyObject *) PyNumber_Lshift(PyObject *o1, PyObject *o2); + + /* + Returns the result of left shifting o1 by o2 on success, or + NULL on failure. This is the equivalent of the Python + expression: o1 << o2. + + + */ + + PyAPI_FUNC(PyObject *) PyNumber_Rshift(PyObject *o1, PyObject *o2); + + /* + Returns the result of right shifting o1 by o2 on success, or + NULL on failure. This is the equivalent of the Python + expression: o1 >> o2. + + */ + + PyAPI_FUNC(PyObject *) PyNumber_And(PyObject *o1, PyObject *o2); + + /* + Returns the result of bitwise and of o1 and o2 on success, or + NULL on failure. This is the equivalent of the Python + expression: o1&o2. + + + */ + + PyAPI_FUNC(PyObject *) PyNumber_Xor(PyObject *o1, PyObject *o2); + + /* + Returns the bitwise exclusive or of o1 by o2 on success, or + NULL on failure. This is the equivalent of the Python + expression: o1^o2. + + + */ + + PyAPI_FUNC(PyObject *) PyNumber_Or(PyObject *o1, PyObject *o2); + + /* + Returns the result of bitwise or on o1 and o2 on success, or + NULL on failure. This is the equivalent of the Python + expression: o1|o2. + + */ + + /* Implemented elsewhere: + + int PyNumber_Coerce(PyObject **p1, PyObject **p2); + + This function takes the addresses of two variables of type + PyObject*. + + If the objects pointed to by *p1 and *p2 have the same type, + increment their reference count and return 0 (success). + If the objects can be converted to a common numeric type, + replace *p1 and *p2 by their converted value (with 'new' + reference counts), and return 0. + If no conversion is possible, or if some other error occurs, + return -1 (failure) and don't increment the reference counts. + The call PyNumber_Coerce(&o1, &o2) is equivalent to the Python + statement o1, o2 = coerce(o1, o2). + + */ + +#define PyIndex_Check(obj) \ + ((obj)->ob_type->tp_as_number != NULL && \ + PyType_HasFeature((obj)->ob_type, Py_TPFLAGS_HAVE_INDEX) && \ + (obj)->ob_type->tp_as_number->nb_index != NULL) + + PyAPI_FUNC(PyObject *) PyNumber_Index(PyObject *o); + + /* + Returns the object converted to a Python long or int + or NULL with an error raised on failure. + */ + + PyAPI_FUNC(Py_ssize_t) PyNumber_AsSsize_t(PyObject *o, PyObject *exc); + + /* + Returns the Integral instance converted to an int. The + instance is expected to be int or long or have an __int__ + method. Steals integral's reference. error_format will be + used to create the TypeError if integral isn't actually an + Integral instance. error_format should be a format string + that can accept a char* naming integral's type. + */ + + PyAPI_FUNC(PyObject *) _PyNumber_ConvertIntegralToInt( + PyObject *integral, + const char* error_format); + + /* + Returns the object converted to Py_ssize_t by going through + PyNumber_Index first. If an overflow error occurs while + converting the int-or-long to Py_ssize_t, then the second argument + is the error-type to return. If it is NULL, then the overflow error + is cleared and the value is clipped. + */ + + PyAPI_FUNC(PyObject *) PyNumber_Int(PyObject *o); + + /* + Returns the o converted to an integer object on success, or + NULL on failure. This is the equivalent of the Python + expression: int(o). + + */ + + PyAPI_FUNC(PyObject *) PyNumber_Long(PyObject *o); + + /* + Returns the o converted to a long integer object on success, + or NULL on failure. This is the equivalent of the Python + expression: long(o). + + */ + + PyAPI_FUNC(PyObject *) PyNumber_Float(PyObject *o); + + /* + Returns the o converted to a float object on success, or NULL + on failure. This is the equivalent of the Python expression: + float(o). + */ + +/* In-place variants of (some of) the above number protocol functions */ + + PyAPI_FUNC(PyObject *) PyNumber_InPlaceAdd(PyObject *o1, PyObject *o2); + + /* + Returns the result of adding o2 to o1, possibly in-place, or null + on failure. This is the equivalent of the Python expression: + o1 += o2. + + */ + + PyAPI_FUNC(PyObject *) PyNumber_InPlaceSubtract(PyObject *o1, PyObject *o2); + + /* + Returns the result of subtracting o2 from o1, possibly in-place or + null on failure. This is the equivalent of the Python expression: + o1 -= o2. + + */ + + PyAPI_FUNC(PyObject *) PyNumber_InPlaceMultiply(PyObject *o1, PyObject *o2); + + /* + Returns the result of multiplying o1 by o2, possibly in-place, or + null on failure. This is the equivalent of the Python expression: + o1 *= o2. + + */ + + PyAPI_FUNC(PyObject *) PyNumber_InPlaceDivide(PyObject *o1, PyObject *o2); + + /* + Returns the result of dividing o1 by o2, possibly in-place, or null + on failure. This is the equivalent of the Python expression: + o1 /= o2. + + */ + + PyAPI_FUNC(PyObject *) PyNumber_InPlaceFloorDivide(PyObject *o1, + PyObject *o2); + + /* + Returns the result of dividing o1 by o2 giving an integral result, + possibly in-place, or null on failure. + This is the equivalent of the Python expression: + o1 /= o2. + + */ + + PyAPI_FUNC(PyObject *) PyNumber_InPlaceTrueDivide(PyObject *o1, + PyObject *o2); + + /* + Returns the result of dividing o1 by o2 giving a float result, + possibly in-place, or null on failure. + This is the equivalent of the Python expression: + o1 /= o2. + + */ + + PyAPI_FUNC(PyObject *) PyNumber_InPlaceRemainder(PyObject *o1, PyObject *o2); + + /* + Returns the remainder of dividing o1 by o2, possibly in-place, or + null on failure. This is the equivalent of the Python expression: + o1 %= o2. + + */ + + PyAPI_FUNC(PyObject *) PyNumber_InPlacePower(PyObject *o1, PyObject *o2, + PyObject *o3); + + /* + Returns the result of raising o1 to the power of o2, possibly + in-place, or null on failure. This is the equivalent of the Python + expression: o1 **= o2, or pow(o1, o2, o3) if o3 is present. + + */ + + PyAPI_FUNC(PyObject *) PyNumber_InPlaceLshift(PyObject *o1, PyObject *o2); + + /* + Returns the result of left shifting o1 by o2, possibly in-place, or + null on failure. This is the equivalent of the Python expression: + o1 <<= o2. + + */ + + PyAPI_FUNC(PyObject *) PyNumber_InPlaceRshift(PyObject *o1, PyObject *o2); + + /* + Returns the result of right shifting o1 by o2, possibly in-place or + null on failure. This is the equivalent of the Python expression: + o1 >>= o2. + + */ + + PyAPI_FUNC(PyObject *) PyNumber_InPlaceAnd(PyObject *o1, PyObject *o2); + + /* + Returns the result of bitwise and of o1 and o2, possibly in-place, + or null on failure. This is the equivalent of the Python + expression: o1 &= o2. + + */ + + PyAPI_FUNC(PyObject *) PyNumber_InPlaceXor(PyObject *o1, PyObject *o2); + + /* + Returns the bitwise exclusive or of o1 by o2, possibly in-place, or + null on failure. This is the equivalent of the Python expression: + o1 ^= o2. + + */ + + PyAPI_FUNC(PyObject *) PyNumber_InPlaceOr(PyObject *o1, PyObject *o2); + + /* + Returns the result of bitwise or of o1 and o2, possibly in-place, + or null on failure. This is the equivalent of the Python + expression: o1 |= o2. + + */ + + + PyAPI_FUNC(PyObject *) PyNumber_ToBase(PyObject *n, int base); + + /* + Returns the integer n converted to a string with a base, with a base + marker of 0b, 0o or 0x prefixed if applicable. + If n is not an int object, it is converted with PyNumber_Index first. + */ + + +/* Sequence protocol:*/ + + PyAPI_FUNC(int) PySequence_Check(PyObject *o); + + /* + Return 1 if the object provides sequence protocol, and zero + otherwise. + + This function always succeeds. + + */ + + PyAPI_FUNC(Py_ssize_t) PySequence_Size(PyObject *o); + + /* + Return the size of sequence object o, or -1 on failure. + + */ + + /* For DLL compatibility */ +#undef PySequence_Length + PyAPI_FUNC(Py_ssize_t) PySequence_Length(PyObject *o); +#define PySequence_Length PySequence_Size + + + PyAPI_FUNC(PyObject *) PySequence_Concat(PyObject *o1, PyObject *o2); + + /* + Return the concatenation of o1 and o2 on success, and NULL on + failure. This is the equivalent of the Python + expression: o1+o2. + + */ + + PyAPI_FUNC(PyObject *) PySequence_Repeat(PyObject *o, Py_ssize_t count); + + /* + Return the result of repeating sequence object o count times, + or NULL on failure. This is the equivalent of the Python + expression: o1*count. + + */ + + PyAPI_FUNC(PyObject *) PySequence_GetItem(PyObject *o, Py_ssize_t i); + + /* + Return the ith element of o, or NULL on failure. This is the + equivalent of the Python expression: o[i]. + */ + + PyAPI_FUNC(PyObject *) PySequence_GetSlice(PyObject *o, Py_ssize_t i1, Py_ssize_t i2); + + /* + Return the slice of sequence object o between i1 and i2, or + NULL on failure. This is the equivalent of the Python + expression: o[i1:i2]. + + */ + + PyAPI_FUNC(int) PySequence_SetItem(PyObject *o, Py_ssize_t i, PyObject *v); + + /* + Assign object v to the ith element of o. Returns + -1 on failure. This is the equivalent of the Python + statement: o[i]=v. + + */ + + PyAPI_FUNC(int) PySequence_DelItem(PyObject *o, Py_ssize_t i); + + /* + Delete the ith element of object v. Returns + -1 on failure. This is the equivalent of the Python + statement: del o[i]. + */ + + PyAPI_FUNC(int) PySequence_SetSlice(PyObject *o, Py_ssize_t i1, Py_ssize_t i2, + PyObject *v); + + /* + Assign the sequence object, v, to the slice in sequence + object, o, from i1 to i2. Returns -1 on failure. This is the + equivalent of the Python statement: o[i1:i2]=v. + */ + + PyAPI_FUNC(int) PySequence_DelSlice(PyObject *o, Py_ssize_t i1, Py_ssize_t i2); + + /* + Delete the slice in sequence object, o, from i1 to i2. + Returns -1 on failure. This is the equivalent of the Python + statement: del o[i1:i2]. + */ + + PyAPI_FUNC(PyObject *) PySequence_Tuple(PyObject *o); + + /* + Returns the sequence, o, as a tuple on success, and NULL on failure. + This is equivalent to the Python expression: tuple(o) + */ + + + PyAPI_FUNC(PyObject *) PySequence_List(PyObject *o); + /* + Returns the sequence, o, as a list on success, and NULL on failure. + This is equivalent to the Python expression: list(o) + */ + + PyAPI_FUNC(PyObject *) PySequence_Fast(PyObject *o, const char* m); + /* + Returns the sequence, o, as a tuple, unless it's already a + tuple or list. Use PySequence_Fast_GET_ITEM to access the + members of this list, and PySequence_Fast_GET_SIZE to get its length. + + Returns NULL on failure. If the object does not support iteration, + raises a TypeError exception with m as the message text. + */ + +#define PySequence_Fast_GET_SIZE(o) \ + (PyList_Check(o) ? PyList_GET_SIZE(o) : PyTuple_GET_SIZE(o)) + /* + Return the size of o, assuming that o was returned by + PySequence_Fast and is not NULL. + */ + +#define PySequence_Fast_GET_ITEM(o, i)\ + (PyList_Check(o) ? PyList_GET_ITEM(o, i) : PyTuple_GET_ITEM(o, i)) + /* + Return the ith element of o, assuming that o was returned by + PySequence_Fast, and that i is within bounds. + */ + +#define PySequence_ITEM(o, i)\ + ( Py_TYPE(o)->tp_as_sequence->sq_item(o, i) ) + /* Assume tp_as_sequence and sq_item exist and that i does not + need to be corrected for a negative index + */ + +#define PySequence_Fast_ITEMS(sf) \ + (PyList_Check(sf) ? ((PyListObject *)(sf))->ob_item \ + : ((PyTupleObject *)(sf))->ob_item) + /* Return a pointer to the underlying item array for + an object retured by PySequence_Fast */ + + PyAPI_FUNC(Py_ssize_t) PySequence_Count(PyObject *o, PyObject *value); + + /* + Return the number of occurrences on value on o, that is, + return the number of keys for which o[key]==value. On + failure, return -1. This is equivalent to the Python + expression: o.count(value). + */ + + PyAPI_FUNC(int) PySequence_Contains(PyObject *seq, PyObject *ob); + /* + Return -1 if error; 1 if ob in seq; 0 if ob not in seq. + Use __contains__ if possible, else _PySequence_IterSearch(). + */ + +#define PY_ITERSEARCH_COUNT 1 +#define PY_ITERSEARCH_INDEX 2 +#define PY_ITERSEARCH_CONTAINS 3 + PyAPI_FUNC(Py_ssize_t) _PySequence_IterSearch(PyObject *seq, + PyObject *obj, int operation); + /* + Iterate over seq. Result depends on the operation: + PY_ITERSEARCH_COUNT: return # of times obj appears in seq; -1 if + error. + PY_ITERSEARCH_INDEX: return 0-based index of first occurrence of + obj in seq; set ValueError and return -1 if none found; + also return -1 on error. + PY_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on + error. + */ + +/* For DLL-level backwards compatibility */ +#undef PySequence_In + PyAPI_FUNC(int) PySequence_In(PyObject *o, PyObject *value); + +/* For source-level backwards compatibility */ +#define PySequence_In PySequence_Contains + + /* + Determine if o contains value. If an item in o is equal to + X, return 1, otherwise return 0. On error, return -1. This + is equivalent to the Python expression: value in o. + */ + + PyAPI_FUNC(Py_ssize_t) PySequence_Index(PyObject *o, PyObject *value); + + /* + Return the first index for which o[i]=value. On error, + return -1. This is equivalent to the Python + expression: o.index(value). + */ + +/* In-place versions of some of the above Sequence functions. */ + + PyAPI_FUNC(PyObject *) PySequence_InPlaceConcat(PyObject *o1, PyObject *o2); + + /* + Append o2 to o1, in-place when possible. Return the resulting + object, which could be o1, or NULL on failure. This is the + equivalent of the Python expression: o1 += o2. + + */ + + PyAPI_FUNC(PyObject *) PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count); + + /* + Repeat o1 by count, in-place when possible. Return the resulting + object, which could be o1, or NULL on failure. This is the + equivalent of the Python expression: o1 *= count. + + */ + +/* Mapping protocol:*/ + + PyAPI_FUNC(int) PyMapping_Check(PyObject *o); + + /* + Return 1 if the object provides mapping protocol, and zero + otherwise. + + This function always succeeds. + */ + + PyAPI_FUNC(Py_ssize_t) PyMapping_Size(PyObject *o); + + /* + Returns the number of keys in object o on success, and -1 on + failure. For objects that do not provide sequence protocol, + this is equivalent to the Python expression: len(o). + */ + + /* For DLL compatibility */ +#undef PyMapping_Length + PyAPI_FUNC(Py_ssize_t) PyMapping_Length(PyObject *o); +#define PyMapping_Length PyMapping_Size + + + /* implemented as a macro: + + int PyMapping_DelItemString(PyObject *o, char *key); + + Remove the mapping for object, key, from the object *o. + Returns -1 on failure. This is equivalent to + the Python statement: del o[key]. + */ +#define PyMapping_DelItemString(O,K) PyObject_DelItemString((O),(K)) + + /* implemented as a macro: + + int PyMapping_DelItem(PyObject *o, PyObject *key); + + Remove the mapping for object, key, from the object *o. + Returns -1 on failure. This is equivalent to + the Python statement: del o[key]. + */ +#define PyMapping_DelItem(O,K) PyObject_DelItem((O),(K)) + + PyAPI_FUNC(int) PyMapping_HasKeyString(PyObject *o, char *key); + + /* + On success, return 1 if the mapping object has the key, key, + and 0 otherwise. This is equivalent to the Python expression: + o.has_key(key). + + This function always succeeds. + */ + + PyAPI_FUNC(int) PyMapping_HasKey(PyObject *o, PyObject *key); + + /* + Return 1 if the mapping object has the key, key, + and 0 otherwise. This is equivalent to the Python expression: + o.has_key(key). + + This function always succeeds. + + */ + + /* Implemented as macro: + + PyObject *PyMapping_Keys(PyObject *o); + + On success, return a list of the keys in object o. On + failure, return NULL. This is equivalent to the Python + expression: o.keys(). + */ +#define PyMapping_Keys(O) PyObject_CallMethod(O,"keys",NULL) + + /* Implemented as macro: + + PyObject *PyMapping_Values(PyObject *o); + + On success, return a list of the values in object o. On + failure, return NULL. This is equivalent to the Python + expression: o.values(). + */ +#define PyMapping_Values(O) PyObject_CallMethod(O,"values",NULL) + + /* Implemented as macro: + + PyObject *PyMapping_Items(PyObject *o); + + On success, return a list of the items in object o, where + each item is a tuple containing a key-value pair. On + failure, return NULL. This is equivalent to the Python + expression: o.items(). + + */ +#define PyMapping_Items(O) PyObject_CallMethod(O,"items",NULL) + + PyAPI_FUNC(PyObject *) PyMapping_GetItemString(PyObject *o, char *key); + + /* + Return element of o corresponding to the object, key, or NULL + on failure. This is the equivalent of the Python expression: + o[key]. + */ + + PyAPI_FUNC(int) PyMapping_SetItemString(PyObject *o, char *key, + PyObject *value); + + /* + Map the object, key, to the value, v. Returns + -1 on failure. This is the equivalent of the Python + statement: o[key]=v. + */ + + +PyAPI_FUNC(int) PyObject_IsInstance(PyObject *object, PyObject *typeorclass); + /* isinstance(object, typeorclass) */ + +PyAPI_FUNC(int) PyObject_IsSubclass(PyObject *object, PyObject *typeorclass); + /* issubclass(object, typeorclass) */ + + +PyAPI_FUNC(int) _PyObject_RealIsInstance(PyObject *inst, PyObject *cls); + +PyAPI_FUNC(int) _PyObject_RealIsSubclass(PyObject *derived, PyObject *cls); + + +/* For internal use by buffer API functions */ +PyAPI_FUNC(void) _Py_add_one_to_index_F(int nd, Py_ssize_t *index, + const Py_ssize_t *shape); +PyAPI_FUNC(void) _Py_add_one_to_index_C(int nd, Py_ssize_t *index, + const Py_ssize_t *shape); + + +#ifdef __cplusplus +} +#endif +#endif /* Py_ABSTRACTOBJECT_H */ diff --git a/python/include/asdl.h b/python/include/asdl.h new file mode 100644 index 00000000..84e837e7 --- /dev/null +++ b/python/include/asdl.h @@ -0,0 +1,45 @@ +#ifndef Py_ASDL_H +#define Py_ASDL_H + +typedef PyObject * identifier; +typedef PyObject * string; +typedef PyObject * object; + +#ifndef __cplusplus +typedef enum {false, true} bool; +#endif + +/* It would be nice if the code generated by asdl_c.py was completely + independent of Python, but it is a goal the requires too much work + at this stage. So, for example, I'll represent identifiers as + interned Python strings. +*/ + +/* XXX A sequence should be typed so that its use can be typechecked. */ + +typedef struct { + int size; + void *elements[1]; +} asdl_seq; + +typedef struct { + int size; + int elements[1]; +} asdl_int_seq; + +asdl_seq *asdl_seq_new(int size, PyArena *arena); +asdl_int_seq *asdl_int_seq_new(int size, PyArena *arena); + +#define asdl_seq_GET(S, I) (S)->elements[(I)] +#define asdl_seq_LEN(S) ((S) == NULL ? 0 : (S)->size) +#ifdef Py_DEBUG +#define asdl_seq_SET(S, I, V) { \ + int _asdl_i = (I); \ + assert((S) && _asdl_i < (S)->size); \ + (S)->elements[_asdl_i] = (V); \ +} +#else +#define asdl_seq_SET(S, I, V) (S)->elements[I] = (V) +#endif + +#endif /* !Py_ASDL_H */ diff --git a/python/include/ast.h b/python/include/ast.h new file mode 100644 index 00000000..cc14b7fd --- /dev/null +++ b/python/include/ast.h @@ -0,0 +1,13 @@ +#ifndef Py_AST_H +#define Py_AST_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_FUNC(mod_ty) PyAST_FromNode(const node *, PyCompilerFlags *flags, + const char *, PyArena *); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_AST_H */ diff --git a/python/include/bitset.h b/python/include/bitset.h new file mode 100644 index 00000000..faeb4191 --- /dev/null +++ b/python/include/bitset.h @@ -0,0 +1,32 @@ + +#ifndef Py_BITSET_H +#define Py_BITSET_H +#ifdef __cplusplus +extern "C" { +#endif + +/* Bitset interface */ + +#define BYTE char + +typedef BYTE *bitset; + +bitset newbitset(int nbits); +void delbitset(bitset bs); +#define testbit(ss, ibit) (((ss)[BIT2BYTE(ibit)] & BIT2MASK(ibit)) != 0) +int addbit(bitset bs, int ibit); /* Returns 0 if already set */ +int samebitset(bitset bs1, bitset bs2, int nbits); +void mergebitset(bitset bs1, bitset bs2, int nbits); + +#define BITSPERBYTE (8*sizeof(BYTE)) +#define NBYTES(nbits) (((nbits) + BITSPERBYTE - 1) / BITSPERBYTE) + +#define BIT2BYTE(ibit) ((ibit) / BITSPERBYTE) +#define BIT2SHIFT(ibit) ((ibit) % BITSPERBYTE) +#define BIT2MASK(ibit) (1 << BIT2SHIFT(ibit)) +#define BYTE2BIT(ibyte) ((ibyte) * BITSPERBYTE) + +#ifdef __cplusplus +} +#endif +#endif /* !Py_BITSET_H */ diff --git a/python/include/boolobject.h b/python/include/boolobject.h new file mode 100644 index 00000000..74e854f7 --- /dev/null +++ b/python/include/boolobject.h @@ -0,0 +1,36 @@ +/* Boolean object interface */ + +#ifndef Py_BOOLOBJECT_H +#define Py_BOOLOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + + +typedef PyIntObject PyBoolObject; + +PyAPI_DATA(PyTypeObject) PyBool_Type; + +#define PyBool_Check(x) (Py_TYPE(x) == &PyBool_Type) + +/* Py_False and Py_True are the only two bools in existence. +Don't forget to apply Py_INCREF() when returning either!!! */ + +/* Don't use these directly */ +PyAPI_DATA(PyIntObject) _Py_ZeroStruct, _Py_TrueStruct; + +/* Use these macros */ +#define Py_False ((PyObject *) &_Py_ZeroStruct) +#define Py_True ((PyObject *) &_Py_TrueStruct) + +/* Macros for returning Py_True or Py_False, respectively */ +#define Py_RETURN_TRUE return Py_INCREF(Py_True), Py_True +#define Py_RETURN_FALSE return Py_INCREF(Py_False), Py_False + +/* Function to return a bool from a C long */ +PyAPI_FUNC(PyObject *) PyBool_FromLong(long); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_BOOLOBJECT_H */ diff --git a/python/include/bufferobject.h b/python/include/bufferobject.h new file mode 100644 index 00000000..6dd83458 --- /dev/null +++ b/python/include/bufferobject.h @@ -0,0 +1,33 @@ + +/* Buffer object interface */ + +/* Note: the object's structure is private */ + +#ifndef Py_BUFFEROBJECT_H +#define Py_BUFFEROBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + + +PyAPI_DATA(PyTypeObject) PyBuffer_Type; + +#define PyBuffer_Check(op) (Py_TYPE(op) == &PyBuffer_Type) + +#define Py_END_OF_BUFFER (-1) + +PyAPI_FUNC(PyObject *) PyBuffer_FromObject(PyObject *base, + Py_ssize_t offset, Py_ssize_t size); +PyAPI_FUNC(PyObject *) PyBuffer_FromReadWriteObject(PyObject *base, + Py_ssize_t offset, + Py_ssize_t size); + +PyAPI_FUNC(PyObject *) PyBuffer_FromMemory(void *ptr, Py_ssize_t size); +PyAPI_FUNC(PyObject *) PyBuffer_FromReadWriteMemory(void *ptr, Py_ssize_t size); + +PyAPI_FUNC(PyObject *) PyBuffer_New(Py_ssize_t size); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_BUFFEROBJECT_H */ diff --git a/python/include/bytearrayobject.h b/python/include/bytearrayobject.h new file mode 100644 index 00000000..e1281a62 --- /dev/null +++ b/python/include/bytearrayobject.h @@ -0,0 +1,57 @@ +/* ByteArray object interface */ + +#ifndef Py_BYTEARRAYOBJECT_H +#define Py_BYTEARRAYOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/* Type PyByteArrayObject represents a mutable array of bytes. + * The Python API is that of a sequence; + * the bytes are mapped to ints in [0, 256). + * Bytes are not characters; they may be used to encode characters. + * The only way to go between bytes and str/unicode is via encoding + * and decoding. + * For the convenience of C programmers, the bytes type is considered + * to contain a char pointer, not an unsigned char pointer. + */ + +/* Object layout */ +typedef struct { + PyObject_VAR_HEAD + /* XXX(nnorwitz): should ob_exports be Py_ssize_t? */ + int ob_exports; /* how many buffer exports */ + Py_ssize_t ob_alloc; /* How many bytes allocated */ + char *ob_bytes; +} PyByteArrayObject; + +/* Type object */ +PyAPI_DATA(PyTypeObject) PyByteArray_Type; +PyAPI_DATA(PyTypeObject) PyByteArrayIter_Type; + +/* Type check macros */ +#define PyByteArray_Check(self) PyObject_TypeCheck(self, &PyByteArray_Type) +#define PyByteArray_CheckExact(self) (Py_TYPE(self) == &PyByteArray_Type) + +/* Direct API functions */ +PyAPI_FUNC(PyObject *) PyByteArray_FromObject(PyObject *); +PyAPI_FUNC(PyObject *) PyByteArray_Concat(PyObject *, PyObject *); +PyAPI_FUNC(PyObject *) PyByteArray_FromStringAndSize(const char *, Py_ssize_t); +PyAPI_FUNC(Py_ssize_t) PyByteArray_Size(PyObject *); +PyAPI_FUNC(char *) PyByteArray_AsString(PyObject *); +PyAPI_FUNC(int) PyByteArray_Resize(PyObject *, Py_ssize_t); + +/* Macros, trading safety for speed */ +#define PyByteArray_AS_STRING(self) \ + (assert(PyByteArray_Check(self)), \ + Py_SIZE(self) ? ((PyByteArrayObject *)(self))->ob_bytes : _PyByteArray_empty_string) +#define PyByteArray_GET_SIZE(self) (assert(PyByteArray_Check(self)),Py_SIZE(self)) + +PyAPI_DATA(char) _PyByteArray_empty_string[]; + +#ifdef __cplusplus +} +#endif +#endif /* !Py_BYTEARRAYOBJECT_H */ diff --git a/python/include/bytes_methods.h b/python/include/bytes_methods.h new file mode 100644 index 00000000..41256662 --- /dev/null +++ b/python/include/bytes_methods.h @@ -0,0 +1,75 @@ +#ifndef Py_BYTES_CTYPE_H +#define Py_BYTES_CTYPE_H + +/* + * The internal implementation behind PyString (bytes) and PyBytes (buffer) + * methods of the given names, they operate on ASCII byte strings. + */ +extern PyObject* _Py_bytes_isspace(const char *cptr, Py_ssize_t len); +extern PyObject* _Py_bytes_isalpha(const char *cptr, Py_ssize_t len); +extern PyObject* _Py_bytes_isalnum(const char *cptr, Py_ssize_t len); +extern PyObject* _Py_bytes_isdigit(const char *cptr, Py_ssize_t len); +extern PyObject* _Py_bytes_islower(const char *cptr, Py_ssize_t len); +extern PyObject* _Py_bytes_isupper(const char *cptr, Py_ssize_t len); +extern PyObject* _Py_bytes_istitle(const char *cptr, Py_ssize_t len); + +/* These store their len sized answer in the given preallocated *result arg. */ +extern void _Py_bytes_lower(char *result, const char *cptr, Py_ssize_t len); +extern void _Py_bytes_upper(char *result, const char *cptr, Py_ssize_t len); +extern void _Py_bytes_title(char *result, char *s, Py_ssize_t len); +extern void _Py_bytes_capitalize(char *result, char *s, Py_ssize_t len); +extern void _Py_bytes_swapcase(char *result, char *s, Py_ssize_t len); + +/* Shared __doc__ strings. */ +extern const char _Py_isspace__doc__[]; +extern const char _Py_isalpha__doc__[]; +extern const char _Py_isalnum__doc__[]; +extern const char _Py_isdigit__doc__[]; +extern const char _Py_islower__doc__[]; +extern const char _Py_isupper__doc__[]; +extern const char _Py_istitle__doc__[]; +extern const char _Py_lower__doc__[]; +extern const char _Py_upper__doc__[]; +extern const char _Py_title__doc__[]; +extern const char _Py_capitalize__doc__[]; +extern const char _Py_swapcase__doc__[]; + +/* These are left in for backward compatibility and will be removed + in 2.8/3.2 */ +#define ISLOWER(c) Py_ISLOWER(c) +#define ISUPPER(c) Py_ISUPPER(c) +#define ISALPHA(c) Py_ISALPHA(c) +#define ISDIGIT(c) Py_ISDIGIT(c) +#define ISXDIGIT(c) Py_ISXDIGIT(c) +#define ISALNUM(c) Py_ISALNUM(c) +#define ISSPACE(c) Py_ISSPACE(c) + +#undef islower +#define islower(c) undefined_islower(c) +#undef isupper +#define isupper(c) undefined_isupper(c) +#undef isalpha +#define isalpha(c) undefined_isalpha(c) +#undef isdigit +#define isdigit(c) undefined_isdigit(c) +#undef isxdigit +#define isxdigit(c) undefined_isxdigit(c) +#undef isalnum +#define isalnum(c) undefined_isalnum(c) +#undef isspace +#define isspace(c) undefined_isspace(c) + +/* These are left in for backward compatibility and will be removed + in 2.8/3.2 */ +#define TOLOWER(c) Py_TOLOWER(c) +#define TOUPPER(c) Py_TOUPPER(c) + +#undef tolower +#define tolower(c) undefined_tolower(c) +#undef toupper +#define toupper(c) undefined_toupper(c) + +/* this is needed because some docs are shared from the .o, not static */ +#define PyDoc_STRVAR_shared(name,str) const char name[] = PyDoc_STR(str) + +#endif /* !Py_BYTES_CTYPE_H */ diff --git a/python/include/bytesobject.h b/python/include/bytesobject.h new file mode 100644 index 00000000..1083da9c --- /dev/null +++ b/python/include/bytesobject.h @@ -0,0 +1,27 @@ +#define PyBytesObject PyStringObject +#define PyBytes_Type PyString_Type + +#define PyBytes_Check PyString_Check +#define PyBytes_CheckExact PyString_CheckExact +#define PyBytes_CHECK_INTERNED PyString_CHECK_INTERNED +#define PyBytes_AS_STRING PyString_AS_STRING +#define PyBytes_GET_SIZE PyString_GET_SIZE +#define Py_TPFLAGS_BYTES_SUBCLASS Py_TPFLAGS_STRING_SUBCLASS + +#define PyBytes_FromStringAndSize PyString_FromStringAndSize +#define PyBytes_FromString PyString_FromString +#define PyBytes_FromFormatV PyString_FromFormatV +#define PyBytes_FromFormat PyString_FromFormat +#define PyBytes_Size PyString_Size +#define PyBytes_AsString PyString_AsString +#define PyBytes_Repr PyString_Repr +#define PyBytes_Concat PyString_Concat +#define PyBytes_ConcatAndDel PyString_ConcatAndDel +#define _PyBytes_Resize _PyString_Resize +#define _PyBytes_Eq _PyString_Eq +#define PyBytes_Format PyString_Format +#define _PyBytes_FormatLong _PyString_FormatLong +#define PyBytes_DecodeEscape PyString_DecodeEscape +#define _PyBytes_Join _PyString_Join +#define PyBytes_AsStringAndSize PyString_AsStringAndSize +#define _PyBytes_InsertThousandsGrouping _PyString_InsertThousandsGrouping diff --git a/python/include/cStringIO.h b/python/include/cStringIO.h new file mode 100644 index 00000000..6ca44a83 --- /dev/null +++ b/python/include/cStringIO.h @@ -0,0 +1,73 @@ +#ifndef Py_CSTRINGIO_H +#define Py_CSTRINGIO_H +#ifdef __cplusplus +extern "C" { +#endif +/* + + This header provides access to cStringIO objects from C. + Functions are provided for calling cStringIO objects and + macros are provided for testing whether you have cStringIO + objects. + + Before calling any of the functions or macros, you must initialize + the routines with: + + PycString_IMPORT + + This would typically be done in your init function. + +*/ + +#define PycStringIO_CAPSULE_NAME "cStringIO.cStringIO_CAPI" + +#define PycString_IMPORT \ + PycStringIO = ((struct PycStringIO_CAPI*)PyCapsule_Import(\ + PycStringIO_CAPSULE_NAME, 0)) + +/* Basic functions to manipulate cStringIO objects from C */ + +static struct PycStringIO_CAPI { + + /* Read a string from an input object. If the last argument + is -1, the remainder will be read. + */ + int(*cread)(PyObject *, char **, Py_ssize_t); + + /* Read a line from an input object. Returns the length of the read + line as an int and a pointer inside the object buffer as char** (so + the caller doesn't have to provide its own buffer as destination). + */ + int(*creadline)(PyObject *, char **); + + /* Write a string to an output object*/ + int(*cwrite)(PyObject *, const char *, Py_ssize_t); + + /* Get the output object as a Python string (returns new reference). */ + PyObject *(*cgetvalue)(PyObject *); + + /* Create a new output object */ + PyObject *(*NewOutput)(int); + + /* Create an input object from a Python string + (copies the Python string reference). + */ + PyObject *(*NewInput)(PyObject *); + + /* The Python types for cStringIO input and output objects. + Note that you can do input on an output object. + */ + PyTypeObject *InputType, *OutputType; + +} *PycStringIO; + +/* These can be used to test if you have one */ +#define PycStringIO_InputCheck(O) \ + (Py_TYPE(O)==PycStringIO->InputType) +#define PycStringIO_OutputCheck(O) \ + (Py_TYPE(O)==PycStringIO->OutputType) + +#ifdef __cplusplus +} +#endif +#endif /* !Py_CSTRINGIO_H */ diff --git a/python/include/cellobject.h b/python/include/cellobject.h new file mode 100644 index 00000000..c927ee5d --- /dev/null +++ b/python/include/cellobject.h @@ -0,0 +1,28 @@ +/* Cell object interface */ + +#ifndef Py_CELLOBJECT_H +#define Py_CELLOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + PyObject_HEAD + PyObject *ob_ref; /* Content of the cell or NULL when empty */ +} PyCellObject; + +PyAPI_DATA(PyTypeObject) PyCell_Type; + +#define PyCell_Check(op) (Py_TYPE(op) == &PyCell_Type) + +PyAPI_FUNC(PyObject *) PyCell_New(PyObject *); +PyAPI_FUNC(PyObject *) PyCell_Get(PyObject *); +PyAPI_FUNC(int) PyCell_Set(PyObject *, PyObject *); + +#define PyCell_GET(op) (((PyCellObject *)(op))->ob_ref) +#define PyCell_SET(op, v) (((PyCellObject *)(op))->ob_ref = v) + +#ifdef __cplusplus +} +#endif +#endif /* !Py_TUPLEOBJECT_H */ diff --git a/python/include/ceval.h b/python/include/ceval.h new file mode 100644 index 00000000..0e8bd2ab --- /dev/null +++ b/python/include/ceval.h @@ -0,0 +1,153 @@ +#ifndef Py_CEVAL_H +#define Py_CEVAL_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* Interface to random parts in ceval.c */ + +PyAPI_FUNC(PyObject *) PyEval_CallObjectWithKeywords( + PyObject *, PyObject *, PyObject *); + +/* Inline this */ +#define PyEval_CallObject(func,arg) \ + PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL) + +PyAPI_FUNC(PyObject *) PyEval_CallFunction(PyObject *obj, + const char *format, ...); +PyAPI_FUNC(PyObject *) PyEval_CallMethod(PyObject *obj, + const char *methodname, + const char *format, ...); + +PyAPI_FUNC(void) PyEval_SetProfile(Py_tracefunc, PyObject *); +PyAPI_FUNC(void) PyEval_SetTrace(Py_tracefunc, PyObject *); + +struct _frame; /* Avoid including frameobject.h */ + +PyAPI_FUNC(PyObject *) PyEval_GetBuiltins(void); +PyAPI_FUNC(PyObject *) PyEval_GetGlobals(void); +PyAPI_FUNC(PyObject *) PyEval_GetLocals(void); +PyAPI_FUNC(struct _frame *) PyEval_GetFrame(void); +PyAPI_FUNC(int) PyEval_GetRestricted(void); + +/* Look at the current frame's (if any) code's co_flags, and turn on + the corresponding compiler flags in cf->cf_flags. Return 1 if any + flag was set, else return 0. */ +PyAPI_FUNC(int) PyEval_MergeCompilerFlags(PyCompilerFlags *cf); + +PyAPI_FUNC(int) Py_FlushLine(void); + +PyAPI_FUNC(int) Py_AddPendingCall(int (*func)(void *), void *arg); +PyAPI_FUNC(int) Py_MakePendingCalls(void); + +/* Protection against deeply nested recursive calls */ +PyAPI_FUNC(void) Py_SetRecursionLimit(int); +PyAPI_FUNC(int) Py_GetRecursionLimit(void); + +#define Py_EnterRecursiveCall(where) \ + (_Py_MakeRecCheck(PyThreadState_GET()->recursion_depth) && \ + _Py_CheckRecursiveCall(where)) +#define Py_LeaveRecursiveCall() \ + (--PyThreadState_GET()->recursion_depth) +PyAPI_FUNC(int) _Py_CheckRecursiveCall(char *where); +PyAPI_DATA(int) _Py_CheckRecursionLimit; +#ifdef USE_STACKCHECK +# define _Py_MakeRecCheck(x) (++(x) > --_Py_CheckRecursionLimit) +#else +# define _Py_MakeRecCheck(x) (++(x) > _Py_CheckRecursionLimit) +#endif + +PyAPI_FUNC(const char *) PyEval_GetFuncName(PyObject *); +PyAPI_FUNC(const char *) PyEval_GetFuncDesc(PyObject *); + +PyAPI_FUNC(PyObject *) PyEval_GetCallStats(PyObject *); +PyAPI_FUNC(PyObject *) PyEval_EvalFrame(struct _frame *); +PyAPI_FUNC(PyObject *) PyEval_EvalFrameEx(struct _frame *f, int exc); + +/* this used to be handled on a per-thread basis - now just two globals */ +PyAPI_DATA(volatile int) _Py_Ticker; +PyAPI_DATA(int) _Py_CheckInterval; + +/* Interface for threads. + + A module that plans to do a blocking system call (or something else + that lasts a long time and doesn't touch Python data) can allow other + threads to run as follows: + + ...preparations here... + Py_BEGIN_ALLOW_THREADS + ...blocking system call here... + Py_END_ALLOW_THREADS + ...interpret result here... + + The Py_BEGIN_ALLOW_THREADS/Py_END_ALLOW_THREADS pair expands to a + {}-surrounded block. + To leave the block in the middle (e.g., with return), you must insert + a line containing Py_BLOCK_THREADS before the return, e.g. + + if (...premature_exit...) { + Py_BLOCK_THREADS + PyErr_SetFromErrno(PyExc_IOError); + return NULL; + } + + An alternative is: + + Py_BLOCK_THREADS + if (...premature_exit...) { + PyErr_SetFromErrno(PyExc_IOError); + return NULL; + } + Py_UNBLOCK_THREADS + + For convenience, that the value of 'errno' is restored across + Py_END_ALLOW_THREADS and Py_BLOCK_THREADS. + + WARNING: NEVER NEST CALLS TO Py_BEGIN_ALLOW_THREADS AND + Py_END_ALLOW_THREADS!!! + + The function PyEval_InitThreads() should be called only from + initthread() in "threadmodule.c". + + Note that not yet all candidates have been converted to use this + mechanism! +*/ + +PyAPI_FUNC(PyThreadState *) PyEval_SaveThread(void); +PyAPI_FUNC(void) PyEval_RestoreThread(PyThreadState *); + +#ifdef WITH_THREAD + +PyAPI_FUNC(int) PyEval_ThreadsInitialized(void); +PyAPI_FUNC(void) PyEval_InitThreads(void); +PyAPI_FUNC(void) PyEval_AcquireLock(void); +PyAPI_FUNC(void) PyEval_ReleaseLock(void); +PyAPI_FUNC(void) PyEval_AcquireThread(PyThreadState *tstate); +PyAPI_FUNC(void) PyEval_ReleaseThread(PyThreadState *tstate); +PyAPI_FUNC(void) PyEval_ReInitThreads(void); + +#define Py_BEGIN_ALLOW_THREADS { \ + PyThreadState *_save; \ + _save = PyEval_SaveThread(); +#define Py_BLOCK_THREADS PyEval_RestoreThread(_save); +#define Py_UNBLOCK_THREADS _save = PyEval_SaveThread(); +#define Py_END_ALLOW_THREADS PyEval_RestoreThread(_save); \ + } + +#else /* !WITH_THREAD */ + +#define Py_BEGIN_ALLOW_THREADS { +#define Py_BLOCK_THREADS +#define Py_UNBLOCK_THREADS +#define Py_END_ALLOW_THREADS } + +#endif /* !WITH_THREAD */ + +PyAPI_FUNC(int) _PyEval_SliceIndex(PyObject *, Py_ssize_t *); + + +#ifdef __cplusplus +} +#endif +#endif /* !Py_CEVAL_H */ diff --git a/python/include/classobject.h b/python/include/classobject.h new file mode 100644 index 00000000..bc03e0d0 --- /dev/null +++ b/python/include/classobject.h @@ -0,0 +1,83 @@ + +/* Class object interface */ + +/* Revealing some structures (not for general use) */ + +#ifndef Py_CLASSOBJECT_H +#define Py_CLASSOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + PyObject_HEAD + PyObject *cl_bases; /* A tuple of class objects */ + PyObject *cl_dict; /* A dictionary */ + PyObject *cl_name; /* A string */ + /* The following three are functions or NULL */ + PyObject *cl_getattr; + PyObject *cl_setattr; + PyObject *cl_delattr; + PyObject *cl_weakreflist; /* List of weak references */ +} PyClassObject; + +typedef struct { + PyObject_HEAD + PyClassObject *in_class; /* The class object */ + PyObject *in_dict; /* A dictionary */ + PyObject *in_weakreflist; /* List of weak references */ +} PyInstanceObject; + +typedef struct { + PyObject_HEAD + PyObject *im_func; /* The callable object implementing the method */ + PyObject *im_self; /* The instance it is bound to, or NULL */ + PyObject *im_class; /* The class that asked for the method */ + PyObject *im_weakreflist; /* List of weak references */ +} PyMethodObject; + +PyAPI_DATA(PyTypeObject) PyClass_Type, PyInstance_Type, PyMethod_Type; + +#define PyClass_Check(op) ((op)->ob_type == &PyClass_Type) +#define PyInstance_Check(op) ((op)->ob_type == &PyInstance_Type) +#define PyMethod_Check(op) ((op)->ob_type == &PyMethod_Type) + +PyAPI_FUNC(PyObject *) PyClass_New(PyObject *, PyObject *, PyObject *); +PyAPI_FUNC(PyObject *) PyInstance_New(PyObject *, PyObject *, + PyObject *); +PyAPI_FUNC(PyObject *) PyInstance_NewRaw(PyObject *, PyObject *); +PyAPI_FUNC(PyObject *) PyMethod_New(PyObject *, PyObject *, PyObject *); + +PyAPI_FUNC(PyObject *) PyMethod_Function(PyObject *); +PyAPI_FUNC(PyObject *) PyMethod_Self(PyObject *); +PyAPI_FUNC(PyObject *) PyMethod_Class(PyObject *); + +/* Look up attribute with name (a string) on instance object pinst, using + * only the instance and base class dicts. If a descriptor is found in + * a class dict, the descriptor is returned without calling it. + * Returns NULL if nothing found, else a borrowed reference to the + * value associated with name in the dict in which name was found. + * The point of this routine is that it never calls arbitrary Python + * code, so is always "safe": all it does is dict lookups. The function + * can't fail, never sets an exception, and NULL is not an error (it just + * means "not found"). + */ +PyAPI_FUNC(PyObject *) _PyInstance_Lookup(PyObject *pinst, PyObject *name); + +/* Macros for direct access to these values. Type checks are *not* + done, so use with care. */ +#define PyMethod_GET_FUNCTION(meth) \ + (((PyMethodObject *)meth) -> im_func) +#define PyMethod_GET_SELF(meth) \ + (((PyMethodObject *)meth) -> im_self) +#define PyMethod_GET_CLASS(meth) \ + (((PyMethodObject *)meth) -> im_class) + +PyAPI_FUNC(int) PyClass_IsSubclass(PyObject *, PyObject *); + +PyAPI_FUNC(int) PyMethod_ClearFreeList(void); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_CLASSOBJECT_H */ diff --git a/python/include/cobject.h b/python/include/cobject.h new file mode 100644 index 00000000..ad3cd9c9 --- /dev/null +++ b/python/include/cobject.h @@ -0,0 +1,89 @@ +/* + CObjects are marked Pending Deprecation as of Python 2.7. + The full schedule for 2.x is as follows: + - CObjects are marked Pending Deprecation in Python 2.7. + - CObjects will be marked Deprecated in Python 2.8 + (if there is one). + - CObjects will be removed in Python 2.9 (if there is one). + + Additionally, for the Python 3.x series: + - CObjects were marked Deprecated in Python 3.1. + - CObjects will be removed in Python 3.2. + + You should switch all use of CObjects to capsules. Capsules + have a safer and more consistent API. For more information, + see Include/pycapsule.h, or read the "Capsules" topic in + the "Python/C API Reference Manual". + + Python 2.7 no longer uses CObjects itself; all objects which + were formerly CObjects are now capsules. Note that this change + does not by itself break binary compatibility with extensions + built for previous versions of Python--PyCObject_AsVoidPtr() + has been changed to also understand capsules. + +*/ + +/* original file header comment follows: */ + +/* C objects to be exported from one extension module to another. + + C objects are used for communication between extension modules. + They provide a way for an extension module to export a C interface + to other extension modules, so that extension modules can use the + Python import mechanism to link to one another. + +*/ + +#ifndef Py_COBJECT_H +#define Py_COBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_DATA(PyTypeObject) PyCObject_Type; + +#define PyCObject_Check(op) (Py_TYPE(op) == &PyCObject_Type) + +/* Create a PyCObject from a pointer to a C object and an optional + destructor function. If the second argument is non-null, then it + will be called with the first argument if and when the PyCObject is + destroyed. + +*/ +PyAPI_FUNC(PyObject *) PyCObject_FromVoidPtr( + void *cobj, void (*destruct)(void*)); + + +/* Create a PyCObject from a pointer to a C object, a description object, + and an optional destructor function. If the third argument is non-null, + then it will be called with the first and second arguments if and when + the PyCObject is destroyed. +*/ +PyAPI_FUNC(PyObject *) PyCObject_FromVoidPtrAndDesc( + void *cobj, void *desc, void (*destruct)(void*,void*)); + +/* Retrieve a pointer to a C object from a PyCObject. */ +PyAPI_FUNC(void *) PyCObject_AsVoidPtr(PyObject *); + +/* Retrieve a pointer to a description object from a PyCObject. */ +PyAPI_FUNC(void *) PyCObject_GetDesc(PyObject *); + +/* Import a pointer to a C object from a module using a PyCObject. */ +PyAPI_FUNC(void *) PyCObject_Import(char *module_name, char *cobject_name); + +/* Modify a C object. Fails (==0) if object has a destructor. */ +PyAPI_FUNC(int) PyCObject_SetVoidPtr(PyObject *self, void *cobj); + + +typedef struct { + PyObject_HEAD + void *cobject; + void *desc; + void (*destructor)(void *); +} PyCObject; + + +#ifdef __cplusplus +} +#endif +#endif /* !Py_COBJECT_H */ diff --git a/python/include/code.h b/python/include/code.h new file mode 100644 index 00000000..38b29580 --- /dev/null +++ b/python/include/code.h @@ -0,0 +1,107 @@ +/* Definitions for bytecode */ + +#ifndef Py_CODE_H +#define Py_CODE_H +#ifdef __cplusplus +extern "C" { +#endif + +/* Bytecode object */ +typedef struct { + PyObject_HEAD + int co_argcount; /* #arguments, except *args */ + int co_nlocals; /* #local variables */ + int co_stacksize; /* #entries needed for evaluation stack */ + int co_flags; /* CO_..., see below */ + PyObject *co_code; /* instruction opcodes */ + PyObject *co_consts; /* list (constants used) */ + PyObject *co_names; /* list of strings (names used) */ + PyObject *co_varnames; /* tuple of strings (local variable names) */ + PyObject *co_freevars; /* tuple of strings (free variable names) */ + PyObject *co_cellvars; /* tuple of strings (cell variable names) */ + /* The rest doesn't count for hash/cmp */ + PyObject *co_filename; /* string (where it was loaded from) */ + PyObject *co_name; /* string (name, for reference) */ + int co_firstlineno; /* first source line number */ + PyObject *co_lnotab; /* string (encoding addr<->lineno mapping) See + Objects/lnotab_notes.txt for details. */ + void *co_zombieframe; /* for optimization only (see frameobject.c) */ + PyObject *co_weakreflist; /* to support weakrefs to code objects */ +} PyCodeObject; + +/* Masks for co_flags above */ +#define CO_OPTIMIZED 0x0001 +#define CO_NEWLOCALS 0x0002 +#define CO_VARARGS 0x0004 +#define CO_VARKEYWORDS 0x0008 +#define CO_NESTED 0x0010 +#define CO_GENERATOR 0x0020 +/* The CO_NOFREE flag is set if there are no free or cell variables. + This information is redundant, but it allows a single flag test + to determine whether there is any extra work to be done when the + call frame it setup. +*/ +#define CO_NOFREE 0x0040 + +#if 0 +/* This is no longer used. Stopped defining in 2.5, do not re-use. */ +#define CO_GENERATOR_ALLOWED 0x1000 +#endif +#define CO_FUTURE_DIVISION 0x2000 +#define CO_FUTURE_ABSOLUTE_IMPORT 0x4000 /* do absolute imports by default */ +#define CO_FUTURE_WITH_STATEMENT 0x8000 +#define CO_FUTURE_PRINT_FUNCTION 0x10000 +#define CO_FUTURE_UNICODE_LITERALS 0x20000 + +/* This should be defined if a future statement modifies the syntax. + For example, when a keyword is added. +*/ +#if 1 +#define PY_PARSER_REQUIRES_FUTURE_KEYWORD +#endif + +#define CO_MAXBLOCKS 20 /* Max static block nesting within a function */ + +PyAPI_DATA(PyTypeObject) PyCode_Type; + +#define PyCode_Check(op) (Py_TYPE(op) == &PyCode_Type) +#define PyCode_GetNumFree(op) (PyTuple_GET_SIZE((op)->co_freevars)) + +/* Public interface */ +PyAPI_FUNC(PyCodeObject *) PyCode_New( + int, int, int, int, PyObject *, PyObject *, PyObject *, PyObject *, + PyObject *, PyObject *, PyObject *, PyObject *, int, PyObject *); + /* same as struct above */ + +/* Creates a new empty code object with the specified source location. */ +PyAPI_FUNC(PyCodeObject *) +PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno); + +/* Return the line number associated with the specified bytecode index + in this code object. If you just need the line number of a frame, + use PyFrame_GetLineNumber() instead. */ +PyAPI_FUNC(int) PyCode_Addr2Line(PyCodeObject *, int); + +/* for internal use only */ +#define _PyCode_GETCODEPTR(co, pp) \ + ((*Py_TYPE((co)->co_code)->tp_as_buffer->bf_getreadbuffer) \ + ((co)->co_code, 0, (void **)(pp))) + +typedef struct _addr_pair { + int ap_lower; + int ap_upper; +} PyAddrPair; + +/* Update *bounds to describe the first and one-past-the-last instructions in the + same line as lasti. Return the number of that line. +*/ +PyAPI_FUNC(int) _PyCode_CheckLineNumber(PyCodeObject* co, + int lasti, PyAddrPair *bounds); + +PyAPI_FUNC(PyObject*) PyCode_Optimize(PyObject *code, PyObject* consts, + PyObject *names, PyObject *lineno_obj); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_CODE_H */ diff --git a/python/include/codecs.h b/python/include/codecs.h new file mode 100644 index 00000000..c038c6a9 --- /dev/null +++ b/python/include/codecs.h @@ -0,0 +1,167 @@ +#ifndef Py_CODECREGISTRY_H +#define Py_CODECREGISTRY_H +#ifdef __cplusplus +extern "C" { +#endif + +/* ------------------------------------------------------------------------ + + Python Codec Registry and support functions + + +Written by Marc-Andre Lemburg (mal@lemburg.com). + +Copyright (c) Corporation for National Research Initiatives. + + ------------------------------------------------------------------------ */ + +/* Register a new codec search function. + + As side effect, this tries to load the encodings package, if not + yet done, to make sure that it is always first in the list of + search functions. + + The search_function's refcount is incremented by this function. */ + +PyAPI_FUNC(int) PyCodec_Register( + PyObject *search_function + ); + +/* Codec register lookup API. + + Looks up the given encoding and returns a CodecInfo object with + function attributes which implement the different aspects of + processing the encoding. + + The encoding string is looked up converted to all lower-case + characters. This makes encodings looked up through this mechanism + effectively case-insensitive. + + If no codec is found, a KeyError is set and NULL returned. + + As side effect, this tries to load the encodings package, if not + yet done. This is part of the lazy load strategy for the encodings + package. + + */ + +PyAPI_FUNC(PyObject *) _PyCodec_Lookup( + const char *encoding + ); + +/* Generic codec based encoding API. + + object is passed through the encoder function found for the given + encoding using the error handling method defined by errors. errors + may be NULL to use the default method defined for the codec. + + Raises a LookupError in case no encoder can be found. + + */ + +PyAPI_FUNC(PyObject *) PyCodec_Encode( + PyObject *object, + const char *encoding, + const char *errors + ); + +/* Generic codec based decoding API. + + object is passed through the decoder function found for the given + encoding using the error handling method defined by errors. errors + may be NULL to use the default method defined for the codec. + + Raises a LookupError in case no encoder can be found. + + */ + +PyAPI_FUNC(PyObject *) PyCodec_Decode( + PyObject *object, + const char *encoding, + const char *errors + ); + +/* --- Codec Lookup APIs -------------------------------------------------- + + All APIs return a codec object with incremented refcount and are + based on _PyCodec_Lookup(). The same comments w/r to the encoding + name also apply to these APIs. + +*/ + +/* Get an encoder function for the given encoding. */ + +PyAPI_FUNC(PyObject *) PyCodec_Encoder( + const char *encoding + ); + +/* Get a decoder function for the given encoding. */ + +PyAPI_FUNC(PyObject *) PyCodec_Decoder( + const char *encoding + ); + +/* Get a IncrementalEncoder object for the given encoding. */ + +PyAPI_FUNC(PyObject *) PyCodec_IncrementalEncoder( + const char *encoding, + const char *errors + ); + +/* Get a IncrementalDecoder object function for the given encoding. */ + +PyAPI_FUNC(PyObject *) PyCodec_IncrementalDecoder( + const char *encoding, + const char *errors + ); + +/* Get a StreamReader factory function for the given encoding. */ + +PyAPI_FUNC(PyObject *) PyCodec_StreamReader( + const char *encoding, + PyObject *stream, + const char *errors + ); + +/* Get a StreamWriter factory function for the given encoding. */ + +PyAPI_FUNC(PyObject *) PyCodec_StreamWriter( + const char *encoding, + PyObject *stream, + const char *errors + ); + +/* Unicode encoding error handling callback registry API */ + +/* Register the error handling callback function error under the given + name. This function will be called by the codec when it encounters + unencodable characters/undecodable bytes and doesn't know the + callback name, when name is specified as the error parameter + in the call to the encode/decode function. + Return 0 on success, -1 on error */ +PyAPI_FUNC(int) PyCodec_RegisterError(const char *name, PyObject *error); + +/* Lookup the error handling callback function registered under the given + name. As a special case NULL can be passed, in which case + the error handling callback for "strict" will be returned. */ +PyAPI_FUNC(PyObject *) PyCodec_LookupError(const char *name); + +/* raise exc as an exception */ +PyAPI_FUNC(PyObject *) PyCodec_StrictErrors(PyObject *exc); + +/* ignore the unicode error, skipping the faulty input */ +PyAPI_FUNC(PyObject *) PyCodec_IgnoreErrors(PyObject *exc); + +/* replace the unicode encode error with ? or U+FFFD */ +PyAPI_FUNC(PyObject *) PyCodec_ReplaceErrors(PyObject *exc); + +/* replace the unicode encode error with XML character references */ +PyAPI_FUNC(PyObject *) PyCodec_XMLCharRefReplaceErrors(PyObject *exc); + +/* replace the unicode encode error with backslash escapes (\x, \u and \U) */ +PyAPI_FUNC(PyObject *) PyCodec_BackslashReplaceErrors(PyObject *exc); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_CODECREGISTRY_H */ diff --git a/python/include/compile.h b/python/include/compile.h new file mode 100644 index 00000000..61001016 --- /dev/null +++ b/python/include/compile.h @@ -0,0 +1,40 @@ + +#ifndef Py_COMPILE_H +#define Py_COMPILE_H + +#include "code.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Public interface */ +struct _node; /* Declare the existence of this type */ +PyAPI_FUNC(PyCodeObject *) PyNode_Compile(struct _node *, const char *); + +/* Future feature support */ + +typedef struct { + int ff_features; /* flags set by future statements */ + int ff_lineno; /* line number of last future statement */ +} PyFutureFeatures; + +#define FUTURE_NESTED_SCOPES "nested_scopes" +#define FUTURE_GENERATORS "generators" +#define FUTURE_DIVISION "division" +#define FUTURE_ABSOLUTE_IMPORT "absolute_import" +#define FUTURE_WITH_STATEMENT "with_statement" +#define FUTURE_PRINT_FUNCTION "print_function" +#define FUTURE_UNICODE_LITERALS "unicode_literals" + + +struct _mod; /* Declare the existence of this type */ +PyAPI_FUNC(PyCodeObject *) PyAST_Compile(struct _mod *, const char *, + PyCompilerFlags *, PyArena *); +PyAPI_FUNC(PyFutureFeatures *) PyFuture_FromAST(struct _mod *, const char *); + + +#ifdef __cplusplus +} +#endif +#endif /* !Py_COMPILE_H */ diff --git a/python/include/complexobject.h b/python/include/complexobject.h new file mode 100644 index 00000000..c9a9500f --- /dev/null +++ b/python/include/complexobject.h @@ -0,0 +1,66 @@ +/* Complex number structure */ + +#ifndef Py_COMPLEXOBJECT_H +#define Py_COMPLEXOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + double real; + double imag; +} Py_complex; + +/* Operations on complex numbers from complexmodule.c */ + +#define c_sum _Py_c_sum +#define c_diff _Py_c_diff +#define c_neg _Py_c_neg +#define c_prod _Py_c_prod +#define c_quot _Py_c_quot +#define c_pow _Py_c_pow +#define c_abs _Py_c_abs + +PyAPI_FUNC(Py_complex) c_sum(Py_complex, Py_complex); +PyAPI_FUNC(Py_complex) c_diff(Py_complex, Py_complex); +PyAPI_FUNC(Py_complex) c_neg(Py_complex); +PyAPI_FUNC(Py_complex) c_prod(Py_complex, Py_complex); +PyAPI_FUNC(Py_complex) c_quot(Py_complex, Py_complex); +PyAPI_FUNC(Py_complex) c_pow(Py_complex, Py_complex); +PyAPI_FUNC(double) c_abs(Py_complex); + + +/* Complex object interface */ + +/* +PyComplexObject represents a complex number with double-precision +real and imaginary parts. +*/ + +typedef struct { + PyObject_HEAD + Py_complex cval; +} PyComplexObject; + +PyAPI_DATA(PyTypeObject) PyComplex_Type; + +#define PyComplex_Check(op) PyObject_TypeCheck(op, &PyComplex_Type) +#define PyComplex_CheckExact(op) (Py_TYPE(op) == &PyComplex_Type) + +PyAPI_FUNC(PyObject *) PyComplex_FromCComplex(Py_complex); +PyAPI_FUNC(PyObject *) PyComplex_FromDoubles(double real, double imag); + +PyAPI_FUNC(double) PyComplex_RealAsDouble(PyObject *op); +PyAPI_FUNC(double) PyComplex_ImagAsDouble(PyObject *op); +PyAPI_FUNC(Py_complex) PyComplex_AsCComplex(PyObject *op); + +/* Format the object based on the format_spec, as defined in PEP 3101 + (Advanced String Formatting). */ +PyAPI_FUNC(PyObject *) _PyComplex_FormatAdvanced(PyObject *obj, + char *format_spec, + Py_ssize_t format_spec_len); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_COMPLEXOBJECT_H */ diff --git a/python/include/datetime.h b/python/include/datetime.h new file mode 100644 index 00000000..47abe5cb --- /dev/null +++ b/python/include/datetime.h @@ -0,0 +1,239 @@ +/* datetime.h + */ + +#ifndef DATETIME_H +#define DATETIME_H +#ifdef __cplusplus +extern "C" { +#endif + +/* Fields are packed into successive bytes, each viewed as unsigned and + * big-endian, unless otherwise noted: + * + * byte offset + * 0 year 2 bytes, 1-9999 + * 2 month 1 byte, 1-12 + * 3 day 1 byte, 1-31 + * 4 hour 1 byte, 0-23 + * 5 minute 1 byte, 0-59 + * 6 second 1 byte, 0-59 + * 7 usecond 3 bytes, 0-999999 + * 10 + */ + +/* # of bytes for year, month, and day. */ +#define _PyDateTime_DATE_DATASIZE 4 + +/* # of bytes for hour, minute, second, and usecond. */ +#define _PyDateTime_TIME_DATASIZE 6 + +/* # of bytes for year, month, day, hour, minute, second, and usecond. */ +#define _PyDateTime_DATETIME_DATASIZE 10 + + +typedef struct +{ + PyObject_HEAD + long hashcode; /* -1 when unknown */ + int days; /* -MAX_DELTA_DAYS <= days <= MAX_DELTA_DAYS */ + int seconds; /* 0 <= seconds < 24*3600 is invariant */ + int microseconds; /* 0 <= microseconds < 1000000 is invariant */ +} PyDateTime_Delta; + +typedef struct +{ + PyObject_HEAD /* a pure abstract base clase */ +} PyDateTime_TZInfo; + + +/* The datetime and time types have hashcodes, and an optional tzinfo member, + * present if and only if hastzinfo is true. + */ +#define _PyTZINFO_HEAD \ + PyObject_HEAD \ + long hashcode; \ + char hastzinfo; /* boolean flag */ + +/* No _PyDateTime_BaseTZInfo is allocated; it's just to have something + * convenient to cast to, when getting at the hastzinfo member of objects + * starting with _PyTZINFO_HEAD. + */ +typedef struct +{ + _PyTZINFO_HEAD +} _PyDateTime_BaseTZInfo; + +/* All time objects are of PyDateTime_TimeType, but that can be allocated + * in two ways, with or without a tzinfo member. Without is the same as + * tzinfo == None, but consumes less memory. _PyDateTime_BaseTime is an + * internal struct used to allocate the right amount of space for the + * "without" case. + */ +#define _PyDateTime_TIMEHEAD \ + _PyTZINFO_HEAD \ + unsigned char data[_PyDateTime_TIME_DATASIZE]; + +typedef struct +{ + _PyDateTime_TIMEHEAD +} _PyDateTime_BaseTime; /* hastzinfo false */ + +typedef struct +{ + _PyDateTime_TIMEHEAD + PyObject *tzinfo; +} PyDateTime_Time; /* hastzinfo true */ + + +/* All datetime objects are of PyDateTime_DateTimeType, but that can be + * allocated in two ways too, just like for time objects above. In addition, + * the plain date type is a base class for datetime, so it must also have + * a hastzinfo member (although it's unused there). + */ +typedef struct +{ + _PyTZINFO_HEAD + unsigned char data[_PyDateTime_DATE_DATASIZE]; +} PyDateTime_Date; + +#define _PyDateTime_DATETIMEHEAD \ + _PyTZINFO_HEAD \ + unsigned char data[_PyDateTime_DATETIME_DATASIZE]; + +typedef struct +{ + _PyDateTime_DATETIMEHEAD +} _PyDateTime_BaseDateTime; /* hastzinfo false */ + +typedef struct +{ + _PyDateTime_DATETIMEHEAD + PyObject *tzinfo; +} PyDateTime_DateTime; /* hastzinfo true */ + + +/* Apply for date and datetime instances. */ +#define PyDateTime_GET_YEAR(o) ((((PyDateTime_Date*)o)->data[0] << 8) | \ + ((PyDateTime_Date*)o)->data[1]) +#define PyDateTime_GET_MONTH(o) (((PyDateTime_Date*)o)->data[2]) +#define PyDateTime_GET_DAY(o) (((PyDateTime_Date*)o)->data[3]) + +#define PyDateTime_DATE_GET_HOUR(o) (((PyDateTime_DateTime*)o)->data[4]) +#define PyDateTime_DATE_GET_MINUTE(o) (((PyDateTime_DateTime*)o)->data[5]) +#define PyDateTime_DATE_GET_SECOND(o) (((PyDateTime_DateTime*)o)->data[6]) +#define PyDateTime_DATE_GET_MICROSECOND(o) \ + ((((PyDateTime_DateTime*)o)->data[7] << 16) | \ + (((PyDateTime_DateTime*)o)->data[8] << 8) | \ + ((PyDateTime_DateTime*)o)->data[9]) + +/* Apply for time instances. */ +#define PyDateTime_TIME_GET_HOUR(o) (((PyDateTime_Time*)o)->data[0]) +#define PyDateTime_TIME_GET_MINUTE(o) (((PyDateTime_Time*)o)->data[1]) +#define PyDateTime_TIME_GET_SECOND(o) (((PyDateTime_Time*)o)->data[2]) +#define PyDateTime_TIME_GET_MICROSECOND(o) \ + ((((PyDateTime_Time*)o)->data[3] << 16) | \ + (((PyDateTime_Time*)o)->data[4] << 8) | \ + ((PyDateTime_Time*)o)->data[5]) + + +/* Define structure for C API. */ +typedef struct { + /* type objects */ + PyTypeObject *DateType; + PyTypeObject *DateTimeType; + PyTypeObject *TimeType; + PyTypeObject *DeltaType; + PyTypeObject *TZInfoType; + + /* constructors */ + PyObject *(*Date_FromDate)(int, int, int, PyTypeObject*); + PyObject *(*DateTime_FromDateAndTime)(int, int, int, int, int, int, int, + PyObject*, PyTypeObject*); + PyObject *(*Time_FromTime)(int, int, int, int, PyObject*, PyTypeObject*); + PyObject *(*Delta_FromDelta)(int, int, int, int, PyTypeObject*); + + /* constructors for the DB API */ + PyObject *(*DateTime_FromTimestamp)(PyObject*, PyObject*, PyObject*); + PyObject *(*Date_FromTimestamp)(PyObject*, PyObject*); + +} PyDateTime_CAPI; + +#define PyDateTime_CAPSULE_NAME "datetime.datetime_CAPI" + + +/* "magic" constant used to partially protect against developer mistakes. */ +#define DATETIME_API_MAGIC 0x414548d5 + +#ifdef Py_BUILD_CORE + +/* Macros for type checking when building the Python core. */ +#define PyDate_Check(op) PyObject_TypeCheck(op, &PyDateTime_DateType) +#define PyDate_CheckExact(op) (Py_TYPE(op) == &PyDateTime_DateType) + +#define PyDateTime_Check(op) PyObject_TypeCheck(op, &PyDateTime_DateTimeType) +#define PyDateTime_CheckExact(op) (Py_TYPE(op) == &PyDateTime_DateTimeType) + +#define PyTime_Check(op) PyObject_TypeCheck(op, &PyDateTime_TimeType) +#define PyTime_CheckExact(op) (Py_TYPE(op) == &PyDateTime_TimeType) + +#define PyDelta_Check(op) PyObject_TypeCheck(op, &PyDateTime_DeltaType) +#define PyDelta_CheckExact(op) (Py_TYPE(op) == &PyDateTime_DeltaType) + +#define PyTZInfo_Check(op) PyObject_TypeCheck(op, &PyDateTime_TZInfoType) +#define PyTZInfo_CheckExact(op) (Py_TYPE(op) == &PyDateTime_TZInfoType) + +#else + +/* Define global variable for the C API and a macro for setting it. */ +static PyDateTime_CAPI *PyDateTimeAPI = NULL; + +#define PyDateTime_IMPORT \ + PyDateTimeAPI = (PyDateTime_CAPI *)PyCapsule_Import(PyDateTime_CAPSULE_NAME, 0) + +/* Macros for type checking when not building the Python core. */ +#define PyDate_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->DateType) +#define PyDate_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->DateType) + +#define PyDateTime_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->DateTimeType) +#define PyDateTime_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->DateTimeType) + +#define PyTime_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->TimeType) +#define PyTime_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->TimeType) + +#define PyDelta_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->DeltaType) +#define PyDelta_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->DeltaType) + +#define PyTZInfo_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->TZInfoType) +#define PyTZInfo_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->TZInfoType) + +/* Macros for accessing constructors in a simplified fashion. */ +#define PyDate_FromDate(year, month, day) \ + PyDateTimeAPI->Date_FromDate(year, month, day, PyDateTimeAPI->DateType) + +#define PyDateTime_FromDateAndTime(year, month, day, hour, min, sec, usec) \ + PyDateTimeAPI->DateTime_FromDateAndTime(year, month, day, hour, \ + min, sec, usec, Py_None, PyDateTimeAPI->DateTimeType) + +#define PyTime_FromTime(hour, minute, second, usecond) \ + PyDateTimeAPI->Time_FromTime(hour, minute, second, usecond, \ + Py_None, PyDateTimeAPI->TimeType) + +#define PyDelta_FromDSU(days, seconds, useconds) \ + PyDateTimeAPI->Delta_FromDelta(days, seconds, useconds, 1, \ + PyDateTimeAPI->DeltaType) + +/* Macros supporting the DB API. */ +#define PyDateTime_FromTimestamp(args) \ + PyDateTimeAPI->DateTime_FromTimestamp( \ + (PyObject*) (PyDateTimeAPI->DateTimeType), args, NULL) + +#define PyDate_FromTimestamp(args) \ + PyDateTimeAPI->Date_FromTimestamp( \ + (PyObject*) (PyDateTimeAPI->DateType), args) + +#endif /* Py_BUILD_CORE */ + +#ifdef __cplusplus +} +#endif +#endif diff --git a/python/include/descrobject.h b/python/include/descrobject.h new file mode 100644 index 00000000..b542732b --- /dev/null +++ b/python/include/descrobject.h @@ -0,0 +1,94 @@ +/* Descriptors */ +#ifndef Py_DESCROBJECT_H +#define Py_DESCROBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef PyObject *(*getter)(PyObject *, void *); +typedef int (*setter)(PyObject *, PyObject *, void *); + +typedef struct PyGetSetDef { + char *name; + getter get; + setter set; + char *doc; + void *closure; +} PyGetSetDef; + +typedef PyObject *(*wrapperfunc)(PyObject *self, PyObject *args, + void *wrapped); + +typedef PyObject *(*wrapperfunc_kwds)(PyObject *self, PyObject *args, + void *wrapped, PyObject *kwds); + +struct wrapperbase { + char *name; + int offset; + void *function; + wrapperfunc wrapper; + char *doc; + int flags; + PyObject *name_strobj; +}; + +/* Flags for above struct */ +#define PyWrapperFlag_KEYWORDS 1 /* wrapper function takes keyword args */ + +/* Various kinds of descriptor objects */ + +#define PyDescr_COMMON \ + PyObject_HEAD \ + PyTypeObject *d_type; \ + PyObject *d_name + +typedef struct { + PyDescr_COMMON; +} PyDescrObject; + +typedef struct { + PyDescr_COMMON; + PyMethodDef *d_method; +} PyMethodDescrObject; + +typedef struct { + PyDescr_COMMON; + struct PyMemberDef *d_member; +} PyMemberDescrObject; + +typedef struct { + PyDescr_COMMON; + PyGetSetDef *d_getset; +} PyGetSetDescrObject; + +typedef struct { + PyDescr_COMMON; + struct wrapperbase *d_base; + void *d_wrapped; /* This can be any function pointer */ +} PyWrapperDescrObject; + +PyAPI_DATA(PyTypeObject) PyWrapperDescr_Type; +PyAPI_DATA(PyTypeObject) PyDictProxy_Type; +PyAPI_DATA(PyTypeObject) PyGetSetDescr_Type; +PyAPI_DATA(PyTypeObject) PyMemberDescr_Type; + +PyAPI_FUNC(PyObject *) PyDescr_NewMethod(PyTypeObject *, PyMethodDef *); +PyAPI_FUNC(PyObject *) PyDescr_NewClassMethod(PyTypeObject *, PyMethodDef *); +PyAPI_FUNC(PyObject *) PyDescr_NewMember(PyTypeObject *, + struct PyMemberDef *); +PyAPI_FUNC(PyObject *) PyDescr_NewGetSet(PyTypeObject *, + struct PyGetSetDef *); +PyAPI_FUNC(PyObject *) PyDescr_NewWrapper(PyTypeObject *, + struct wrapperbase *, void *); +#define PyDescr_IsData(d) (Py_TYPE(d)->tp_descr_set != NULL) + +PyAPI_FUNC(PyObject *) PyDictProxy_New(PyObject *); +PyAPI_FUNC(PyObject *) PyWrapper_New(PyObject *, PyObject *); + + +PyAPI_DATA(PyTypeObject) PyProperty_Type; +#ifdef __cplusplus +} +#endif +#endif /* !Py_DESCROBJECT_H */ + diff --git a/python/include/dictobject.h b/python/include/dictobject.h new file mode 100644 index 00000000..ece01c64 --- /dev/null +++ b/python/include/dictobject.h @@ -0,0 +1,156 @@ +#ifndef Py_DICTOBJECT_H +#define Py_DICTOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* Dictionary object type -- mapping from hashable object to object */ + +/* The distribution includes a separate file, Objects/dictnotes.txt, + describing explorations into dictionary design and optimization. + It covers typical dictionary use patterns, the parameters for + tuning dictionaries, and several ideas for possible optimizations. +*/ + +/* +There are three kinds of slots in the table: + +1. Unused. me_key == me_value == NULL + Does not hold an active (key, value) pair now and never did. Unused can + transition to Active upon key insertion. This is the only case in which + me_key is NULL, and is each slot's initial state. + +2. Active. me_key != NULL and me_key != dummy and me_value != NULL + Holds an active (key, value) pair. Active can transition to Dummy upon + key deletion. This is the only case in which me_value != NULL. + +3. Dummy. me_key == dummy and me_value == NULL + Previously held an active (key, value) pair, but that was deleted and an + active pair has not yet overwritten the slot. Dummy can transition to + Active upon key insertion. Dummy slots cannot be made Unused again + (cannot have me_key set to NULL), else the probe sequence in case of + collision would have no way to know they were once active. + +Note: .popitem() abuses the me_hash field of an Unused or Dummy slot to +hold a search finger. The me_hash field of Unused or Dummy slots has no +meaning otherwise. +*/ + +/* PyDict_MINSIZE is the minimum size of a dictionary. This many slots are + * allocated directly in the dict object (in the ma_smalltable member). + * It must be a power of 2, and at least 4. 8 allows dicts with no more + * than 5 active entries to live in ma_smalltable (and so avoid an + * additional malloc); instrumentation suggested this suffices for the + * majority of dicts (consisting mostly of usually-small instance dicts and + * usually-small dicts created to pass keyword arguments). + */ +#define PyDict_MINSIZE 8 + +typedef struct { + /* Cached hash code of me_key. Note that hash codes are C longs. + * We have to use Py_ssize_t instead because dict_popitem() abuses + * me_hash to hold a search finger. + */ + Py_ssize_t me_hash; + PyObject *me_key; + PyObject *me_value; +} PyDictEntry; + +/* +To ensure the lookup algorithm terminates, there must be at least one Unused +slot (NULL key) in the table. +The value ma_fill is the number of non-NULL keys (sum of Active and Dummy); +ma_used is the number of non-NULL, non-dummy keys (== the number of non-NULL +values == the number of Active items). +To avoid slowing down lookups on a near-full table, we resize the table when +it's two-thirds full. +*/ +typedef struct _dictobject PyDictObject; +struct _dictobject { + PyObject_HEAD + Py_ssize_t ma_fill; /* # Active + # Dummy */ + Py_ssize_t ma_used; /* # Active */ + + /* The table contains ma_mask + 1 slots, and that's a power of 2. + * We store the mask instead of the size because the mask is more + * frequently needed. + */ + Py_ssize_t ma_mask; + + /* ma_table points to ma_smalltable for small tables, else to + * additional malloc'ed memory. ma_table is never NULL! This rule + * saves repeated runtime null-tests in the workhorse getitem and + * setitem calls. + */ + PyDictEntry *ma_table; + PyDictEntry *(*ma_lookup)(PyDictObject *mp, PyObject *key, long hash); + PyDictEntry ma_smalltable[PyDict_MINSIZE]; +}; + +PyAPI_DATA(PyTypeObject) PyDict_Type; +PyAPI_DATA(PyTypeObject) PyDictIterKey_Type; +PyAPI_DATA(PyTypeObject) PyDictIterValue_Type; +PyAPI_DATA(PyTypeObject) PyDictIterItem_Type; +PyAPI_DATA(PyTypeObject) PyDictKeys_Type; +PyAPI_DATA(PyTypeObject) PyDictItems_Type; +PyAPI_DATA(PyTypeObject) PyDictValues_Type; + +#define PyDict_Check(op) \ + PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_DICT_SUBCLASS) +#define PyDict_CheckExact(op) (Py_TYPE(op) == &PyDict_Type) +#define PyDictKeys_Check(op) (Py_TYPE(op) == &PyDictKeys_Type) +#define PyDictItems_Check(op) (Py_TYPE(op) == &PyDictItems_Type) +#define PyDictValues_Check(op) (Py_TYPE(op) == &PyDictValues_Type) +/* This excludes Values, since they are not sets. */ +# define PyDictViewSet_Check(op) \ + (PyDictKeys_Check(op) || PyDictItems_Check(op)) + +PyAPI_FUNC(PyObject *) PyDict_New(void); +PyAPI_FUNC(PyObject *) PyDict_GetItem(PyObject *mp, PyObject *key); +PyAPI_FUNC(int) PyDict_SetItem(PyObject *mp, PyObject *key, PyObject *item); +PyAPI_FUNC(int) PyDict_DelItem(PyObject *mp, PyObject *key); +PyAPI_FUNC(void) PyDict_Clear(PyObject *mp); +PyAPI_FUNC(int) PyDict_Next( + PyObject *mp, Py_ssize_t *pos, PyObject **key, PyObject **value); +PyAPI_FUNC(int) _PyDict_Next( + PyObject *mp, Py_ssize_t *pos, PyObject **key, PyObject **value, long *hash); +PyAPI_FUNC(PyObject *) PyDict_Keys(PyObject *mp); +PyAPI_FUNC(PyObject *) PyDict_Values(PyObject *mp); +PyAPI_FUNC(PyObject *) PyDict_Items(PyObject *mp); +PyAPI_FUNC(Py_ssize_t) PyDict_Size(PyObject *mp); +PyAPI_FUNC(PyObject *) PyDict_Copy(PyObject *mp); +PyAPI_FUNC(int) PyDict_Contains(PyObject *mp, PyObject *key); +PyAPI_FUNC(int) _PyDict_Contains(PyObject *mp, PyObject *key, long hash); +PyAPI_FUNC(PyObject *) _PyDict_NewPresized(Py_ssize_t minused); +PyAPI_FUNC(void) _PyDict_MaybeUntrack(PyObject *mp); + +/* PyDict_Update(mp, other) is equivalent to PyDict_Merge(mp, other, 1). */ +PyAPI_FUNC(int) PyDict_Update(PyObject *mp, PyObject *other); + +/* PyDict_Merge updates/merges from a mapping object (an object that + supports PyMapping_Keys() and PyObject_GetItem()). If override is true, + the last occurrence of a key wins, else the first. The Python + dict.update(other) is equivalent to PyDict_Merge(dict, other, 1). +*/ +PyAPI_FUNC(int) PyDict_Merge(PyObject *mp, + PyObject *other, + int override); + +/* PyDict_MergeFromSeq2 updates/merges from an iterable object producing + iterable objects of length 2. If override is true, the last occurrence + of a key wins, else the first. The Python dict constructor dict(seq2) + is equivalent to dict={}; PyDict_MergeFromSeq(dict, seq2, 1). +*/ +PyAPI_FUNC(int) PyDict_MergeFromSeq2(PyObject *d, + PyObject *seq2, + int override); + +PyAPI_FUNC(PyObject *) PyDict_GetItemString(PyObject *dp, const char *key); +PyAPI_FUNC(int) PyDict_SetItemString(PyObject *dp, const char *key, PyObject *item); +PyAPI_FUNC(int) PyDict_DelItemString(PyObject *dp, const char *key); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_DICTOBJECT_H */ diff --git a/python/include/dtoa.h b/python/include/dtoa.h new file mode 100644 index 00000000..9b434b77 --- /dev/null +++ b/python/include/dtoa.h @@ -0,0 +1,15 @@ +#ifndef PY_NO_SHORT_FLOAT_REPR +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_FUNC(double) _Py_dg_strtod(const char *str, char **ptr); +PyAPI_FUNC(char *) _Py_dg_dtoa(double d, int mode, int ndigits, + int *decpt, int *sign, char **rve); +PyAPI_FUNC(void) _Py_dg_freedtoa(char *s); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/python/include/enumobject.h b/python/include/enumobject.h new file mode 100644 index 00000000..c14dbfc8 --- /dev/null +++ b/python/include/enumobject.h @@ -0,0 +1,17 @@ +#ifndef Py_ENUMOBJECT_H +#define Py_ENUMOBJECT_H + +/* Enumerate Object */ + +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_DATA(PyTypeObject) PyEnum_Type; +PyAPI_DATA(PyTypeObject) PyReversed_Type; + +#ifdef __cplusplus +} +#endif + +#endif /* !Py_ENUMOBJECT_H */ diff --git a/python/include/errcode.h b/python/include/errcode.h new file mode 100644 index 00000000..becec80c --- /dev/null +++ b/python/include/errcode.h @@ -0,0 +1,36 @@ +#ifndef Py_ERRCODE_H +#define Py_ERRCODE_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* Error codes passed around between file input, tokenizer, parser and + interpreter. This is necessary so we can turn them into Python + exceptions at a higher level. Note that some errors have a + slightly different meaning when passed from the tokenizer to the + parser than when passed from the parser to the interpreter; e.g. + the parser only returns E_EOF when it hits EOF immediately, and it + never returns E_OK. */ + +#define E_OK 10 /* No error */ +#define E_EOF 11 /* End Of File */ +#define E_INTR 12 /* Interrupted */ +#define E_TOKEN 13 /* Bad token */ +#define E_SYNTAX 14 /* Syntax error */ +#define E_NOMEM 15 /* Ran out of memory */ +#define E_DONE 16 /* Parsing complete */ +#define E_ERROR 17 /* Execution error */ +#define E_TABSPACE 18 /* Inconsistent mixing of tabs and spaces */ +#define E_OVERFLOW 19 /* Node had too many children */ +#define E_TOODEEP 20 /* Too many indentation levels */ +#define E_DEDENT 21 /* No matching outer block for dedent */ +#define E_DECODE 22 /* Error in decoding into Unicode */ +#define E_EOFS 23 /* EOF in triple-quoted string */ +#define E_EOLS 24 /* EOL in single-quoted string */ +#define E_LINECONT 25 /* Unexpected characters after a line continuation */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_ERRCODE_H */ diff --git a/python/include/eval.h b/python/include/eval.h new file mode 100644 index 00000000..b78dfe0f --- /dev/null +++ b/python/include/eval.h @@ -0,0 +1,25 @@ + +/* Interface to execute compiled code */ + +#ifndef Py_EVAL_H +#define Py_EVAL_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_FUNC(PyObject *) PyEval_EvalCode(PyCodeObject *, PyObject *, PyObject *); + +PyAPI_FUNC(PyObject *) PyEval_EvalCodeEx(PyCodeObject *co, + PyObject *globals, + PyObject *locals, + PyObject **args, int argc, + PyObject **kwds, int kwdc, + PyObject **defs, int defc, + PyObject *closure); + +PyAPI_FUNC(PyObject *) _PyEval_CallTracing(PyObject *func, PyObject *args); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_EVAL_H */ diff --git a/python/include/fileobject.h b/python/include/fileobject.h new file mode 100644 index 00000000..1b540f90 --- /dev/null +++ b/python/include/fileobject.h @@ -0,0 +1,97 @@ + +/* File object interface */ + +#ifndef Py_FILEOBJECT_H +#define Py_FILEOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + PyObject_HEAD + FILE *f_fp; + PyObject *f_name; + PyObject *f_mode; + int (*f_close)(FILE *); + int f_softspace; /* Flag used by 'print' command */ + int f_binary; /* Flag which indicates whether the file is + open in binary (1) or text (0) mode */ + char* f_buf; /* Allocated readahead buffer */ + char* f_bufend; /* Points after last occupied position */ + char* f_bufptr; /* Current buffer position */ + char *f_setbuf; /* Buffer for setbuf(3) and setvbuf(3) */ + int f_univ_newline; /* Handle any newline convention */ + int f_newlinetypes; /* Types of newlines seen */ + int f_skipnextlf; /* Skip next \n */ + PyObject *f_encoding; + PyObject *f_errors; + PyObject *weakreflist; /* List of weak references */ + int unlocked_count; /* Num. currently running sections of code + using f_fp with the GIL released. */ + int readable; + int writable; +} PyFileObject; + +PyAPI_DATA(PyTypeObject) PyFile_Type; + +#define PyFile_Check(op) PyObject_TypeCheck(op, &PyFile_Type) +#define PyFile_CheckExact(op) (Py_TYPE(op) == &PyFile_Type) + +PyAPI_FUNC(PyObject *) PyFile_FromString(char *, char *); +PyAPI_FUNC(void) PyFile_SetBufSize(PyObject *, int); +PyAPI_FUNC(int) PyFile_SetEncoding(PyObject *, const char *); +PyAPI_FUNC(int) PyFile_SetEncodingAndErrors(PyObject *, const char *, char *errors); +PyAPI_FUNC(PyObject *) PyFile_FromFile(FILE *, char *, char *, + int (*)(FILE *)); +PyAPI_FUNC(FILE *) PyFile_AsFile(PyObject *); +PyAPI_FUNC(void) PyFile_IncUseCount(PyFileObject *); +PyAPI_FUNC(void) PyFile_DecUseCount(PyFileObject *); +PyAPI_FUNC(PyObject *) PyFile_Name(PyObject *); +PyAPI_FUNC(PyObject *) PyFile_GetLine(PyObject *, int); +PyAPI_FUNC(int) PyFile_WriteObject(PyObject *, PyObject *, int); +PyAPI_FUNC(int) PyFile_SoftSpace(PyObject *, int); +PyAPI_FUNC(int) PyFile_WriteString(const char *, PyObject *); +PyAPI_FUNC(int) PyObject_AsFileDescriptor(PyObject *); + +/* The default encoding used by the platform file system APIs + If non-NULL, this is different than the default encoding for strings +*/ +PyAPI_DATA(const char *) Py_FileSystemDefaultEncoding; + +/* Routines to replace fread() and fgets() which accept any of \r, \n + or \r\n as line terminators. +*/ +#define PY_STDIOTEXTMODE "b" +char *Py_UniversalNewlineFgets(char *, int, FILE*, PyObject *); +size_t Py_UniversalNewlineFread(char *, size_t, FILE *, PyObject *); + +/* A routine to do sanity checking on the file mode string. returns + non-zero on if an exception occurred +*/ +int _PyFile_SanitizeMode(char *mode); + +#if defined _MSC_VER && _MSC_VER >= 1400 +/* A routine to check if a file descriptor is valid on Windows. Returns 0 + * and sets errno to EBADF if it isn't. This is to avoid Assertions + * from various functions in the Windows CRT beginning with + * Visual Studio 2005 + */ +int _PyVerify_fd(int fd); +#elif defined _MSC_VER && _MSC_VER >= 1200 +/* fdopen doesn't set errno EBADF and crashes for large fd on debug build */ +#define _PyVerify_fd(fd) (_get_osfhandle(fd) >= 0) +#else +#define _PyVerify_fd(A) (1) /* dummy */ +#endif + +/* A routine to check if a file descriptor can be select()-ed. */ +#ifdef HAVE_SELECT + #define _PyIsSelectable_fd(FD) (((FD) >= 0) && ((FD) < FD_SETSIZE)) +#else + #define _PyIsSelectable_fd(FD) (1) +#endif /* HAVE_SELECT */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_FILEOBJECT_H */ diff --git a/python/include/floatobject.h b/python/include/floatobject.h new file mode 100644 index 00000000..54e88256 --- /dev/null +++ b/python/include/floatobject.h @@ -0,0 +1,140 @@ + +/* Float object interface */ + +/* +PyFloatObject represents a (double precision) floating point number. +*/ + +#ifndef Py_FLOATOBJECT_H +#define Py_FLOATOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + PyObject_HEAD + double ob_fval; +} PyFloatObject; + +PyAPI_DATA(PyTypeObject) PyFloat_Type; + +#define PyFloat_Check(op) PyObject_TypeCheck(op, &PyFloat_Type) +#define PyFloat_CheckExact(op) (Py_TYPE(op) == &PyFloat_Type) + +/* The str() precision PyFloat_STR_PRECISION is chosen so that in most cases, + the rounding noise created by various operations is suppressed, while + giving plenty of precision for practical use. */ + +#define PyFloat_STR_PRECISION 12 + +#ifdef Py_NAN +#define Py_RETURN_NAN return PyFloat_FromDouble(Py_NAN) +#endif + +#define Py_RETURN_INF(sign) do \ + if (copysign(1., sign) == 1.) { \ + return PyFloat_FromDouble(Py_HUGE_VAL); \ + } else { \ + return PyFloat_FromDouble(-Py_HUGE_VAL); \ + } while(0) + +PyAPI_FUNC(double) PyFloat_GetMax(void); +PyAPI_FUNC(double) PyFloat_GetMin(void); +PyAPI_FUNC(PyObject *) PyFloat_GetInfo(void); + +/* Return Python float from string PyObject. Second argument ignored on + input, and, if non-NULL, NULL is stored into *junk (this tried to serve a + purpose once but can't be made to work as intended). */ +PyAPI_FUNC(PyObject *) PyFloat_FromString(PyObject*, char** junk); + +/* Return Python float from C double. */ +PyAPI_FUNC(PyObject *) PyFloat_FromDouble(double); + +/* Extract C double from Python float. The macro version trades safety for + speed. */ +PyAPI_FUNC(double) PyFloat_AsDouble(PyObject *); +#define PyFloat_AS_DOUBLE(op) (((PyFloatObject *)(op))->ob_fval) + +/* Write repr(v) into the char buffer argument, followed by null byte. The + buffer must be "big enough"; >= 100 is very safe. + PyFloat_AsReprString(buf, x) strives to print enough digits so that + PyFloat_FromString(buf) then reproduces x exactly. */ +PyAPI_FUNC(void) PyFloat_AsReprString(char*, PyFloatObject *v); + +/* Write str(v) into the char buffer argument, followed by null byte. The + buffer must be "big enough"; >= 100 is very safe. Note that it's + unusual to be able to get back the float you started with from + PyFloat_AsString's result -- use PyFloat_AsReprString() if you want to + preserve precision across conversions. */ +PyAPI_FUNC(void) PyFloat_AsString(char*, PyFloatObject *v); + +/* _PyFloat_{Pack,Unpack}{4,8} + * + * The struct and pickle (at least) modules need an efficient platform- + * independent way to store floating-point values as byte strings. + * The Pack routines produce a string from a C double, and the Unpack + * routines produce a C double from such a string. The suffix (4 or 8) + * specifies the number of bytes in the string. + * + * On platforms that appear to use (see _PyFloat_Init()) IEEE-754 formats + * these functions work by copying bits. On other platforms, the formats the + * 4- byte format is identical to the IEEE-754 single precision format, and + * the 8-byte format to the IEEE-754 double precision format, although the + * packing of INFs and NaNs (if such things exist on the platform) isn't + * handled correctly, and attempting to unpack a string containing an IEEE + * INF or NaN will raise an exception. + * + * On non-IEEE platforms with more precision, or larger dynamic range, than + * 754 supports, not all values can be packed; on non-IEEE platforms with less + * precision, or smaller dynamic range, not all values can be unpacked. What + * happens in such cases is partly accidental (alas). + */ + +/* The pack routines write 4 or 8 bytes, starting at p. le is a bool + * argument, true if you want the string in little-endian format (exponent + * last, at p+3 or p+7), false if you want big-endian format (exponent + * first, at p). + * Return value: 0 if all is OK, -1 if error (and an exception is + * set, most likely OverflowError). + * There are two problems on non-IEEE platforms: + * 1): What this does is undefined if x is a NaN or infinity. + * 2): -0.0 and +0.0 produce the same string. + */ +PyAPI_FUNC(int) _PyFloat_Pack4(double x, unsigned char *p, int le); +PyAPI_FUNC(int) _PyFloat_Pack8(double x, unsigned char *p, int le); + +/* Used to get the important decimal digits of a double */ +PyAPI_FUNC(int) _PyFloat_Digits(char *buf, double v, int *signum); +PyAPI_FUNC(void) _PyFloat_DigitsInit(void); + +/* The unpack routines read 4 or 8 bytes, starting at p. le is a bool + * argument, true if the string is in little-endian format (exponent + * last, at p+3 or p+7), false if big-endian (exponent first, at p). + * Return value: The unpacked double. On error, this is -1.0 and + * PyErr_Occurred() is true (and an exception is set, most likely + * OverflowError). Note that on a non-IEEE platform this will refuse + * to unpack a string that represents a NaN or infinity. + */ +PyAPI_FUNC(double) _PyFloat_Unpack4(const unsigned char *p, int le); +PyAPI_FUNC(double) _PyFloat_Unpack8(const unsigned char *p, int le); + +/* free list api */ +PyAPI_FUNC(int) PyFloat_ClearFreeList(void); + +/* Format the object based on the format_spec, as defined in PEP 3101 + (Advanced String Formatting). */ +PyAPI_FUNC(PyObject *) _PyFloat_FormatAdvanced(PyObject *obj, + char *format_spec, + Py_ssize_t format_spec_len); + +/* Round a C double x to the closest multiple of 10**-ndigits. Returns a + Python float on success, or NULL (with an appropriate exception set) on + failure. Used in builtin_round in bltinmodule.c. */ +PyAPI_FUNC(PyObject *) _Py_double_round(double x, int ndigits); + + + +#ifdef __cplusplus +} +#endif +#endif /* !Py_FLOATOBJECT_H */ diff --git a/python/include/frameobject.h b/python/include/frameobject.h new file mode 100644 index 00000000..17e7679a --- /dev/null +++ b/python/include/frameobject.h @@ -0,0 +1,89 @@ + +/* Frame object interface */ + +#ifndef Py_FRAMEOBJECT_H +#define Py_FRAMEOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + int b_type; /* what kind of block this is */ + int b_handler; /* where to jump to find handler */ + int b_level; /* value stack level to pop to */ +} PyTryBlock; + +typedef struct _frame { + PyObject_VAR_HEAD + struct _frame *f_back; /* previous frame, or NULL */ + PyCodeObject *f_code; /* code segment */ + PyObject *f_builtins; /* builtin symbol table (PyDictObject) */ + PyObject *f_globals; /* global symbol table (PyDictObject) */ + PyObject *f_locals; /* local symbol table (any mapping) */ + PyObject **f_valuestack; /* points after the last local */ + /* Next free slot in f_valuestack. Frame creation sets to f_valuestack. + Frame evaluation usually NULLs it, but a frame that yields sets it + to the current stack top. */ + PyObject **f_stacktop; + PyObject *f_trace; /* Trace function */ + + /* If an exception is raised in this frame, the next three are used to + * record the exception info (if any) originally in the thread state. See + * comments before set_exc_info() -- it's not obvious. + * Invariant: if _type is NULL, then so are _value and _traceback. + * Desired invariant: all three are NULL, or all three are non-NULL. That + * one isn't currently true, but "should be". + */ + PyObject *f_exc_type, *f_exc_value, *f_exc_traceback; + + PyThreadState *f_tstate; + int f_lasti; /* Last instruction if called */ + /* Call PyFrame_GetLineNumber() instead of reading this field + directly. As of 2.3 f_lineno is only valid when tracing is + active (i.e. when f_trace is set). At other times we use + PyCode_Addr2Line to calculate the line from the current + bytecode index. */ + int f_lineno; /* Current line number */ + int f_iblock; /* index in f_blockstack */ + PyTryBlock f_blockstack[CO_MAXBLOCKS]; /* for try and loop blocks */ + PyObject *f_localsplus[1]; /* locals+stack, dynamically sized */ +} PyFrameObject; + + +/* Standard object interface */ + +PyAPI_DATA(PyTypeObject) PyFrame_Type; + +#define PyFrame_Check(op) ((op)->ob_type == &PyFrame_Type) +#define PyFrame_IsRestricted(f) \ + ((f)->f_builtins != (f)->f_tstate->interp->builtins) + +PyAPI_FUNC(PyFrameObject *) PyFrame_New(PyThreadState *, PyCodeObject *, + PyObject *, PyObject *); + + +/* The rest of the interface is specific for frame objects */ + +/* Block management functions */ + +PyAPI_FUNC(void) PyFrame_BlockSetup(PyFrameObject *, int, int, int); +PyAPI_FUNC(PyTryBlock *) PyFrame_BlockPop(PyFrameObject *); + +/* Extend the value stack */ + +PyAPI_FUNC(PyObject **) PyFrame_ExtendStack(PyFrameObject *, int, int); + +/* Conversions between "fast locals" and locals in dictionary */ + +PyAPI_FUNC(void) PyFrame_LocalsToFast(PyFrameObject *, int); +PyAPI_FUNC(void) PyFrame_FastToLocals(PyFrameObject *); + +PyAPI_FUNC(int) PyFrame_ClearFreeList(void); + +/* Return the line of code the frame is currently executing. */ +PyAPI_FUNC(int) PyFrame_GetLineNumber(PyFrameObject *); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_FRAMEOBJECT_H */ diff --git a/python/include/funcobject.h b/python/include/funcobject.h new file mode 100644 index 00000000..eb19f4c3 --- /dev/null +++ b/python/include/funcobject.h @@ -0,0 +1,76 @@ + +/* Function object interface */ + +#ifndef Py_FUNCOBJECT_H +#define Py_FUNCOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +/* Function objects and code objects should not be confused with each other: + * + * Function objects are created by the execution of the 'def' statement. + * They reference a code object in their func_code attribute, which is a + * purely syntactic object, i.e. nothing more than a compiled version of some + * source code lines. There is one code object per source code "fragment", + * but each code object can be referenced by zero or many function objects + * depending only on how many times the 'def' statement in the source was + * executed so far. + */ + +typedef struct { + PyObject_HEAD + PyObject *func_code; /* A code object */ + PyObject *func_globals; /* A dictionary (other mappings won't do) */ + PyObject *func_defaults; /* NULL or a tuple */ + PyObject *func_closure; /* NULL or a tuple of cell objects */ + PyObject *func_doc; /* The __doc__ attribute, can be anything */ + PyObject *func_name; /* The __name__ attribute, a string object */ + PyObject *func_dict; /* The __dict__ attribute, a dict or NULL */ + PyObject *func_weakreflist; /* List of weak references */ + PyObject *func_module; /* The __module__ attribute, can be anything */ + + /* Invariant: + * func_closure contains the bindings for func_code->co_freevars, so + * PyTuple_Size(func_closure) == PyCode_GetNumFree(func_code) + * (func_closure may be NULL if PyCode_GetNumFree(func_code) == 0). + */ +} PyFunctionObject; + +PyAPI_DATA(PyTypeObject) PyFunction_Type; + +#define PyFunction_Check(op) (Py_TYPE(op) == &PyFunction_Type) + +PyAPI_FUNC(PyObject *) PyFunction_New(PyObject *, PyObject *); +PyAPI_FUNC(PyObject *) PyFunction_GetCode(PyObject *); +PyAPI_FUNC(PyObject *) PyFunction_GetGlobals(PyObject *); +PyAPI_FUNC(PyObject *) PyFunction_GetModule(PyObject *); +PyAPI_FUNC(PyObject *) PyFunction_GetDefaults(PyObject *); +PyAPI_FUNC(int) PyFunction_SetDefaults(PyObject *, PyObject *); +PyAPI_FUNC(PyObject *) PyFunction_GetClosure(PyObject *); +PyAPI_FUNC(int) PyFunction_SetClosure(PyObject *, PyObject *); + +/* Macros for direct access to these values. Type checks are *not* + done, so use with care. */ +#define PyFunction_GET_CODE(func) \ + (((PyFunctionObject *)func) -> func_code) +#define PyFunction_GET_GLOBALS(func) \ + (((PyFunctionObject *)func) -> func_globals) +#define PyFunction_GET_MODULE(func) \ + (((PyFunctionObject *)func) -> func_module) +#define PyFunction_GET_DEFAULTS(func) \ + (((PyFunctionObject *)func) -> func_defaults) +#define PyFunction_GET_CLOSURE(func) \ + (((PyFunctionObject *)func) -> func_closure) + +/* The classmethod and staticmethod types lives here, too */ +PyAPI_DATA(PyTypeObject) PyClassMethod_Type; +PyAPI_DATA(PyTypeObject) PyStaticMethod_Type; + +PyAPI_FUNC(PyObject *) PyClassMethod_New(PyObject *); +PyAPI_FUNC(PyObject *) PyStaticMethod_New(PyObject *); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_FUNCOBJECT_H */ diff --git a/python/include/genobject.h b/python/include/genobject.h new file mode 100644 index 00000000..135561b7 --- /dev/null +++ b/python/include/genobject.h @@ -0,0 +1,40 @@ + +/* Generator object interface */ + +#ifndef Py_GENOBJECT_H +#define Py_GENOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +struct _frame; /* Avoid including frameobject.h */ + +typedef struct { + PyObject_HEAD + /* The gi_ prefix is intended to remind of generator-iterator. */ + + /* Note: gi_frame can be NULL if the generator is "finished" */ + struct _frame *gi_frame; + + /* True if generator is being executed. */ + int gi_running; + + /* The code object backing the generator */ + PyObject *gi_code; + + /* List of weak reference. */ + PyObject *gi_weakreflist; +} PyGenObject; + +PyAPI_DATA(PyTypeObject) PyGen_Type; + +#define PyGen_Check(op) PyObject_TypeCheck(op, &PyGen_Type) +#define PyGen_CheckExact(op) (Py_TYPE(op) == &PyGen_Type) + +PyAPI_FUNC(PyObject *) PyGen_New(struct _frame *); +PyAPI_FUNC(int) PyGen_NeedsFinalizing(PyGenObject *); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_GENOBJECT_H */ diff --git a/python/include/graminit.h b/python/include/graminit.h new file mode 100644 index 00000000..40d531e8 --- /dev/null +++ b/python/include/graminit.h @@ -0,0 +1,87 @@ +/* Generated by Parser/pgen */ + +#define single_input 256 +#define file_input 257 +#define eval_input 258 +#define decorator 259 +#define decorators 260 +#define decorated 261 +#define funcdef 262 +#define parameters 263 +#define varargslist 264 +#define fpdef 265 +#define fplist 266 +#define stmt 267 +#define simple_stmt 268 +#define small_stmt 269 +#define expr_stmt 270 +#define augassign 271 +#define print_stmt 272 +#define del_stmt 273 +#define pass_stmt 274 +#define flow_stmt 275 +#define break_stmt 276 +#define continue_stmt 277 +#define return_stmt 278 +#define yield_stmt 279 +#define raise_stmt 280 +#define import_stmt 281 +#define import_name 282 +#define import_from 283 +#define import_as_name 284 +#define dotted_as_name 285 +#define import_as_names 286 +#define dotted_as_names 287 +#define dotted_name 288 +#define global_stmt 289 +#define exec_stmt 290 +#define assert_stmt 291 +#define compound_stmt 292 +#define if_stmt 293 +#define while_stmt 294 +#define for_stmt 295 +#define try_stmt 296 +#define with_stmt 297 +#define with_item 298 +#define except_clause 299 +#define suite 300 +#define testlist_safe 301 +#define old_test 302 +#define old_lambdef 303 +#define test 304 +#define or_test 305 +#define and_test 306 +#define not_test 307 +#define comparison 308 +#define comp_op 309 +#define expr 310 +#define xor_expr 311 +#define and_expr 312 +#define shift_expr 313 +#define arith_expr 314 +#define term 315 +#define factor 316 +#define power 317 +#define atom 318 +#define listmaker 319 +#define testlist_comp 320 +#define lambdef 321 +#define trailer 322 +#define subscriptlist 323 +#define subscript 324 +#define sliceop 325 +#define exprlist 326 +#define testlist 327 +#define dictorsetmaker 328 +#define classdef 329 +#define arglist 330 +#define argument 331 +#define list_iter 332 +#define list_for 333 +#define list_if 334 +#define comp_iter 335 +#define comp_for 336 +#define comp_if 337 +#define testlist1 338 +#define encoding_decl 339 +#define yield_expr 340 diff --git a/python/include/grammar.h b/python/include/grammar.h new file mode 100644 index 00000000..8426da30 --- /dev/null +++ b/python/include/grammar.h @@ -0,0 +1,93 @@ + +/* Grammar interface */ + +#ifndef Py_GRAMMAR_H +#define Py_GRAMMAR_H +#ifdef __cplusplus +extern "C" { +#endif + +#include "bitset.h" /* Sigh... */ + +/* A label of an arc */ + +typedef struct { + int lb_type; + char *lb_str; +} label; + +#define EMPTY 0 /* Label number 0 is by definition the empty label */ + +/* A list of labels */ + +typedef struct { + int ll_nlabels; + label *ll_label; +} labellist; + +/* An arc from one state to another */ + +typedef struct { + short a_lbl; /* Label of this arc */ + short a_arrow; /* State where this arc goes to */ +} arc; + +/* A state in a DFA */ + +typedef struct { + int s_narcs; + arc *s_arc; /* Array of arcs */ + + /* Optional accelerators */ + int s_lower; /* Lowest label index */ + int s_upper; /* Highest label index */ + int *s_accel; /* Accelerator */ + int s_accept; /* Nonzero for accepting state */ +} state; + +/* A DFA */ + +typedef struct { + int d_type; /* Non-terminal this represents */ + char *d_name; /* For printing */ + int d_initial; /* Initial state */ + int d_nstates; + state *d_state; /* Array of states */ + bitset d_first; +} dfa; + +/* A grammar */ + +typedef struct { + int g_ndfas; + dfa *g_dfa; /* Array of DFAs */ + labellist g_ll; + int g_start; /* Start symbol of the grammar */ + int g_accel; /* Set if accelerators present */ +} grammar; + +/* FUNCTIONS */ + +grammar *newgrammar(int start); +dfa *adddfa(grammar *g, int type, char *name); +int addstate(dfa *d); +void addarc(dfa *d, int from, int to, int lbl); +dfa *PyGrammar_FindDFA(grammar *g, int type); + +int addlabel(labellist *ll, int type, char *str); +int findlabel(labellist *ll, int type, char *str); +char *PyGrammar_LabelRepr(label *lb); +void translatelabels(grammar *g); + +void addfirstsets(grammar *g); + +void PyGrammar_AddAccelerators(grammar *g); +void PyGrammar_RemoveAccelerators(grammar *); + +void printgrammar(grammar *g, FILE *fp); +void printnonterminals(grammar *g, FILE *fp); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_GRAMMAR_H */ diff --git a/python/include/import.h b/python/include/import.h new file mode 100644 index 00000000..1b7fe0a7 --- /dev/null +++ b/python/include/import.h @@ -0,0 +1,71 @@ + +/* Module definition and import interface */ + +#ifndef Py_IMPORT_H +#define Py_IMPORT_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_FUNC(long) PyImport_GetMagicNumber(void); +PyAPI_FUNC(PyObject *) PyImport_ExecCodeModule(char *name, PyObject *co); +PyAPI_FUNC(PyObject *) PyImport_ExecCodeModuleEx( + char *name, PyObject *co, char *pathname); +PyAPI_FUNC(PyObject *) PyImport_GetModuleDict(void); +PyAPI_FUNC(PyObject *) PyImport_AddModule(const char *name); +PyAPI_FUNC(PyObject *) PyImport_ImportModule(const char *name); +PyAPI_FUNC(PyObject *) PyImport_ImportModuleNoBlock(const char *); +PyAPI_FUNC(PyObject *) PyImport_ImportModuleLevel(char *name, + PyObject *globals, PyObject *locals, PyObject *fromlist, int level); + +#define PyImport_ImportModuleEx(n, g, l, f) \ + PyImport_ImportModuleLevel(n, g, l, f, -1) + +PyAPI_FUNC(PyObject *) PyImport_GetImporter(PyObject *path); +PyAPI_FUNC(PyObject *) PyImport_Import(PyObject *name); +PyAPI_FUNC(PyObject *) PyImport_ReloadModule(PyObject *m); +PyAPI_FUNC(void) PyImport_Cleanup(void); +PyAPI_FUNC(int) PyImport_ImportFrozenModule(char *); + +#ifdef WITH_THREAD +PyAPI_FUNC(void) _PyImport_AcquireLock(void); +PyAPI_FUNC(int) _PyImport_ReleaseLock(void); +#else +#define _PyImport_AcquireLock() +#define _PyImport_ReleaseLock() 1 +#endif + +PyAPI_FUNC(struct filedescr *) _PyImport_FindModule( + const char *, PyObject *, char *, size_t, FILE **, PyObject **); +PyAPI_FUNC(int) _PyImport_IsScript(struct filedescr *); +PyAPI_FUNC(void) _PyImport_ReInitLock(void); + +PyAPI_FUNC(PyObject *)_PyImport_FindExtension(char *, char *); +PyAPI_FUNC(PyObject *)_PyImport_FixupExtension(char *, char *); + +struct _inittab { + char *name; + void (*initfunc)(void); +}; + +PyAPI_DATA(PyTypeObject) PyNullImporter_Type; +PyAPI_DATA(struct _inittab *) PyImport_Inittab; + +PyAPI_FUNC(int) PyImport_AppendInittab(const char *name, void (*initfunc)(void)); +PyAPI_FUNC(int) PyImport_ExtendInittab(struct _inittab *newtab); + +struct _frozen { + char *name; + unsigned char *code; + int size; +}; + +/* Embedding apps may change this pointer to point to their favorite + collection of frozen modules: */ + +PyAPI_DATA(struct _frozen *) PyImport_FrozenModules; + +#ifdef __cplusplus +} +#endif +#endif /* !Py_IMPORT_H */ diff --git a/python/include/intobject.h b/python/include/intobject.h new file mode 100644 index 00000000..78746a63 --- /dev/null +++ b/python/include/intobject.h @@ -0,0 +1,80 @@ + +/* Integer object interface */ + +/* +PyIntObject represents a (long) integer. This is an immutable object; +an integer cannot change its value after creation. + +There are functions to create new integer objects, to test an object +for integer-ness, and to get the integer value. The latter functions +returns -1 and sets errno to EBADF if the object is not an PyIntObject. +None of the functions should be applied to nil objects. + +The type PyIntObject is (unfortunately) exposed here so we can declare +_Py_TrueStruct and _Py_ZeroStruct in boolobject.h; don't use this. +*/ + +#ifndef Py_INTOBJECT_H +#define Py_INTOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + PyObject_HEAD + long ob_ival; +} PyIntObject; + +PyAPI_DATA(PyTypeObject) PyInt_Type; + +#define PyInt_Check(op) \ + PyType_FastSubclass((op)->ob_type, Py_TPFLAGS_INT_SUBCLASS) +#define PyInt_CheckExact(op) ((op)->ob_type == &PyInt_Type) + +PyAPI_FUNC(PyObject *) PyInt_FromString(char*, char**, int); +#ifdef Py_USING_UNICODE +PyAPI_FUNC(PyObject *) PyInt_FromUnicode(Py_UNICODE*, Py_ssize_t, int); +#endif +PyAPI_FUNC(PyObject *) PyInt_FromLong(long); +PyAPI_FUNC(PyObject *) PyInt_FromSize_t(size_t); +PyAPI_FUNC(PyObject *) PyInt_FromSsize_t(Py_ssize_t); +PyAPI_FUNC(long) PyInt_AsLong(PyObject *); +PyAPI_FUNC(Py_ssize_t) PyInt_AsSsize_t(PyObject *); +PyAPI_FUNC(unsigned long) PyInt_AsUnsignedLongMask(PyObject *); +#ifdef HAVE_LONG_LONG +PyAPI_FUNC(unsigned PY_LONG_LONG) PyInt_AsUnsignedLongLongMask(PyObject *); +#endif + +PyAPI_FUNC(long) PyInt_GetMax(void); + +/* Macro, trading safety for speed */ +#define PyInt_AS_LONG(op) (((PyIntObject *)(op))->ob_ival) + +/* These aren't really part of the Int object, but they're handy; the protos + * are necessary for systems that need the magic of PyAPI_FUNC and that want + * to have stropmodule as a dynamically loaded module instead of building it + * into the main Python shared library/DLL. Guido thinks I'm weird for + * building it this way. :-) [cjh] + */ +PyAPI_FUNC(unsigned long) PyOS_strtoul(char *, char **, int); +PyAPI_FUNC(long) PyOS_strtol(char *, char **, int); + +/* free list api */ +PyAPI_FUNC(int) PyInt_ClearFreeList(void); + +/* Convert an integer to the given base. Returns a string. + If base is 2, 8 or 16, add the proper prefix '0b', '0o' or '0x'. + If newstyle is zero, then use the pre-2.6 behavior of octal having + a leading "0" */ +PyAPI_FUNC(PyObject*) _PyInt_Format(PyIntObject* v, int base, int newstyle); + +/* Format the object based on the format_spec, as defined in PEP 3101 + (Advanced String Formatting). */ +PyAPI_FUNC(PyObject *) _PyInt_FormatAdvanced(PyObject *obj, + char *format_spec, + Py_ssize_t format_spec_len); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTOBJECT_H */ diff --git a/python/include/intrcheck.h b/python/include/intrcheck.h new file mode 100644 index 00000000..3b67ed0d --- /dev/null +++ b/python/include/intrcheck.h @@ -0,0 +1,15 @@ + +#ifndef Py_INTRCHECK_H +#define Py_INTRCHECK_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_FUNC(int) PyOS_InterruptOccurred(void); +PyAPI_FUNC(void) PyOS_InitInterrupts(void); +PyAPI_FUNC(void) PyOS_AfterFork(void); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTRCHECK_H */ diff --git a/python/include/iterobject.h b/python/include/iterobject.h new file mode 100644 index 00000000..4bd19c29 --- /dev/null +++ b/python/include/iterobject.h @@ -0,0 +1,23 @@ +#ifndef Py_ITEROBJECT_H +#define Py_ITEROBJECT_H +/* Iterators (the basic kind, over a sequence) */ +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_DATA(PyTypeObject) PySeqIter_Type; + +#define PySeqIter_Check(op) (Py_TYPE(op) == &PySeqIter_Type) + +PyAPI_FUNC(PyObject *) PySeqIter_New(PyObject *); + +PyAPI_DATA(PyTypeObject) PyCallIter_Type; + +#define PyCallIter_Check(op) (Py_TYPE(op) == &PyCallIter_Type) + +PyAPI_FUNC(PyObject *) PyCallIter_New(PyObject *, PyObject *); +#ifdef __cplusplus +} +#endif +#endif /* !Py_ITEROBJECT_H */ + diff --git a/python/include/listobject.h b/python/include/listobject.h new file mode 100644 index 00000000..c4458733 --- /dev/null +++ b/python/include/listobject.h @@ -0,0 +1,68 @@ + +/* List object interface */ + +/* +Another generally useful object type is an list of object pointers. +This is a mutable type: the list items can be changed, and items can be +added or removed. Out-of-range indices or non-list objects are ignored. + +*** WARNING *** PyList_SetItem does not increment the new item's reference +count, but does decrement the reference count of the item it replaces, +if not nil. It does *decrement* the reference count if it is *not* +inserted in the list. Similarly, PyList_GetItem does not increment the +returned item's reference count. +*/ + +#ifndef Py_LISTOBJECT_H +#define Py_LISTOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + PyObject_VAR_HEAD + /* Vector of pointers to list elements. list[0] is ob_item[0], etc. */ + PyObject **ob_item; + + /* ob_item contains space for 'allocated' elements. The number + * currently in use is ob_size. + * Invariants: + * 0 <= ob_size <= allocated + * len(list) == ob_size + * ob_item == NULL implies ob_size == allocated == 0 + * list.sort() temporarily sets allocated to -1 to detect mutations. + * + * Items must normally not be NULL, except during construction when + * the list is not yet visible outside the function that builds it. + */ + Py_ssize_t allocated; +} PyListObject; + +PyAPI_DATA(PyTypeObject) PyList_Type; + +#define PyList_Check(op) \ + PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_LIST_SUBCLASS) +#define PyList_CheckExact(op) (Py_TYPE(op) == &PyList_Type) + +PyAPI_FUNC(PyObject *) PyList_New(Py_ssize_t size); +PyAPI_FUNC(Py_ssize_t) PyList_Size(PyObject *); +PyAPI_FUNC(PyObject *) PyList_GetItem(PyObject *, Py_ssize_t); +PyAPI_FUNC(int) PyList_SetItem(PyObject *, Py_ssize_t, PyObject *); +PyAPI_FUNC(int) PyList_Insert(PyObject *, Py_ssize_t, PyObject *); +PyAPI_FUNC(int) PyList_Append(PyObject *, PyObject *); +PyAPI_FUNC(PyObject *) PyList_GetSlice(PyObject *, Py_ssize_t, Py_ssize_t); +PyAPI_FUNC(int) PyList_SetSlice(PyObject *, Py_ssize_t, Py_ssize_t, PyObject *); +PyAPI_FUNC(int) PyList_Sort(PyObject *); +PyAPI_FUNC(int) PyList_Reverse(PyObject *); +PyAPI_FUNC(PyObject *) PyList_AsTuple(PyObject *); +PyAPI_FUNC(PyObject *) _PyList_Extend(PyListObject *, PyObject *); + +/* Macro, trading safety for speed */ +#define PyList_GET_ITEM(op, i) (((PyListObject *)(op))->ob_item[i]) +#define PyList_SET_ITEM(op, i, v) (((PyListObject *)(op))->ob_item[i] = (v)) +#define PyList_GET_SIZE(op) Py_SIZE(op) + +#ifdef __cplusplus +} +#endif +#endif /* !Py_LISTOBJECT_H */ diff --git a/python/include/longintrepr.h b/python/include/longintrepr.h new file mode 100644 index 00000000..6425c30f --- /dev/null +++ b/python/include/longintrepr.h @@ -0,0 +1,103 @@ +#ifndef Py_LONGINTREPR_H +#define Py_LONGINTREPR_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* This is published for the benefit of "friend" marshal.c only. */ + +/* Parameters of the long integer representation. There are two different + sets of parameters: one set for 30-bit digits, stored in an unsigned 32-bit + integer type, and one set for 15-bit digits with each digit stored in an + unsigned short. The value of PYLONG_BITS_IN_DIGIT, defined either at + configure time or in pyport.h, is used to decide which digit size to use. + + Type 'digit' should be able to hold 2*PyLong_BASE-1, and type 'twodigits' + should be an unsigned integer type able to hold all integers up to + PyLong_BASE*PyLong_BASE-1. x_sub assumes that 'digit' is an unsigned type, + and that overflow is handled by taking the result modulo 2**N for some N > + PyLong_SHIFT. The majority of the code doesn't care about the precise + value of PyLong_SHIFT, but there are some notable exceptions: + + - long_pow() requires that PyLong_SHIFT be divisible by 5 + + - PyLong_{As,From}ByteArray require that PyLong_SHIFT be at least 8 + + - long_hash() requires that PyLong_SHIFT is *strictly* less than the number + of bits in an unsigned long, as do the PyLong <-> long (or unsigned long) + conversion functions + + - the long <-> size_t/Py_ssize_t conversion functions expect that + PyLong_SHIFT is strictly less than the number of bits in a size_t + + - the marshal code currently expects that PyLong_SHIFT is a multiple of 15 + + The values 15 and 30 should fit all of the above requirements, on any + platform. +*/ + +#if PYLONG_BITS_IN_DIGIT == 30 +#if !(defined HAVE_UINT64_T && defined HAVE_UINT32_T && \ + defined HAVE_INT64_T && defined HAVE_INT32_T) +#error "30-bit long digits requested, but the necessary types are not available on this platform" +#endif +typedef PY_UINT32_T digit; +typedef PY_INT32_T sdigit; /* signed variant of digit */ +typedef PY_UINT64_T twodigits; +typedef PY_INT64_T stwodigits; /* signed variant of twodigits */ +#define PyLong_SHIFT 30 +#define _PyLong_DECIMAL_SHIFT 9 /* max(e such that 10**e fits in a digit) */ +#define _PyLong_DECIMAL_BASE ((digit)1000000000) /* 10 ** DECIMAL_SHIFT */ +#elif PYLONG_BITS_IN_DIGIT == 15 +typedef unsigned short digit; +typedef short sdigit; /* signed variant of digit */ +typedef unsigned long twodigits; +typedef long stwodigits; /* signed variant of twodigits */ +#define PyLong_SHIFT 15 +#define _PyLong_DECIMAL_SHIFT 4 /* max(e such that 10**e fits in a digit) */ +#define _PyLong_DECIMAL_BASE ((digit)10000) /* 10 ** DECIMAL_SHIFT */ +#else +#error "PYLONG_BITS_IN_DIGIT should be 15 or 30" +#endif +#define PyLong_BASE ((digit)1 << PyLong_SHIFT) +#define PyLong_MASK ((digit)(PyLong_BASE - 1)) + +/* b/w compatibility with Python 2.5 */ +#define SHIFT PyLong_SHIFT +#define BASE PyLong_BASE +#define MASK PyLong_MASK + +#if PyLong_SHIFT % 5 != 0 +#error "longobject.c requires that PyLong_SHIFT be divisible by 5" +#endif + +/* Long integer representation. + The absolute value of a number is equal to + SUM(for i=0 through abs(ob_size)-1) ob_digit[i] * 2**(SHIFT*i) + Negative numbers are represented with ob_size < 0; + zero is represented by ob_size == 0. + In a normalized number, ob_digit[abs(ob_size)-1] (the most significant + digit) is never zero. Also, in all cases, for all valid i, + 0 <= ob_digit[i] <= MASK. + The allocation function takes care of allocating extra memory + so that ob_digit[0] ... ob_digit[abs(ob_size)-1] are actually available. + + CAUTION: Generic code manipulating subtypes of PyVarObject has to + aware that longs abuse ob_size's sign bit. +*/ + +struct _longobject { + PyObject_VAR_HEAD + digit ob_digit[1]; +}; + +PyAPI_FUNC(PyLongObject *) _PyLong_New(Py_ssize_t); + +/* Return a copy of src. */ +PyAPI_FUNC(PyObject *) _PyLong_Copy(PyLongObject *src); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_LONGINTREPR_H */ diff --git a/python/include/longobject.h b/python/include/longobject.h new file mode 100644 index 00000000..2b404612 --- /dev/null +++ b/python/include/longobject.h @@ -0,0 +1,134 @@ +#ifndef Py_LONGOBJECT_H +#define Py_LONGOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* Long (arbitrary precision) integer object interface */ + +typedef struct _longobject PyLongObject; /* Revealed in longintrepr.h */ + +PyAPI_DATA(PyTypeObject) PyLong_Type; + +#define PyLong_Check(op) \ + PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_LONG_SUBCLASS) +#define PyLong_CheckExact(op) (Py_TYPE(op) == &PyLong_Type) + +PyAPI_FUNC(PyObject *) PyLong_FromLong(long); +PyAPI_FUNC(PyObject *) PyLong_FromUnsignedLong(unsigned long); +PyAPI_FUNC(PyObject *) PyLong_FromDouble(double); +PyAPI_FUNC(PyObject *) PyLong_FromSize_t(size_t); +PyAPI_FUNC(PyObject *) PyLong_FromSsize_t(Py_ssize_t); +PyAPI_FUNC(long) PyLong_AsLong(PyObject *); +PyAPI_FUNC(long) PyLong_AsLongAndOverflow(PyObject *, int *); +PyAPI_FUNC(unsigned long) PyLong_AsUnsignedLong(PyObject *); +PyAPI_FUNC(unsigned long) PyLong_AsUnsignedLongMask(PyObject *); +PyAPI_FUNC(Py_ssize_t) PyLong_AsSsize_t(PyObject *); +PyAPI_FUNC(PyObject *) PyLong_GetInfo(void); + +/* For use by intobject.c only */ +#define _PyLong_AsSsize_t PyLong_AsSsize_t +#define _PyLong_FromSize_t PyLong_FromSize_t +#define _PyLong_FromSsize_t PyLong_FromSsize_t +PyAPI_DATA(int) _PyLong_DigitValue[256]; + +/* _PyLong_Frexp returns a double x and an exponent e such that the + true value is approximately equal to x * 2**e. e is >= 0. x is + 0.0 if and only if the input is 0 (in which case, e and x are both + zeroes); otherwise, 0.5 <= abs(x) < 1.0. On overflow, which is + possible if the number of bits doesn't fit into a Py_ssize_t, sets + OverflowError and returns -1.0 for x, 0 for e. */ +PyAPI_FUNC(double) _PyLong_Frexp(PyLongObject *a, Py_ssize_t *e); + +PyAPI_FUNC(double) PyLong_AsDouble(PyObject *); +PyAPI_FUNC(PyObject *) PyLong_FromVoidPtr(void *); +PyAPI_FUNC(void *) PyLong_AsVoidPtr(PyObject *); + +#ifdef HAVE_LONG_LONG +PyAPI_FUNC(PyObject *) PyLong_FromLongLong(PY_LONG_LONG); +PyAPI_FUNC(PyObject *) PyLong_FromUnsignedLongLong(unsigned PY_LONG_LONG); +PyAPI_FUNC(PY_LONG_LONG) PyLong_AsLongLong(PyObject *); +PyAPI_FUNC(unsigned PY_LONG_LONG) PyLong_AsUnsignedLongLong(PyObject *); +PyAPI_FUNC(unsigned PY_LONG_LONG) PyLong_AsUnsignedLongLongMask(PyObject *); +PyAPI_FUNC(PY_LONG_LONG) PyLong_AsLongLongAndOverflow(PyObject *, int *); +#endif /* HAVE_LONG_LONG */ + +PyAPI_FUNC(PyObject *) PyLong_FromString(char *, char **, int); +#ifdef Py_USING_UNICODE +PyAPI_FUNC(PyObject *) PyLong_FromUnicode(Py_UNICODE*, Py_ssize_t, int); +#endif + +/* _PyLong_Sign. Return 0 if v is 0, -1 if v < 0, +1 if v > 0. + v must not be NULL, and must be a normalized long. + There are no error cases. +*/ +PyAPI_FUNC(int) _PyLong_Sign(PyObject *v); + + +/* _PyLong_NumBits. Return the number of bits needed to represent the + absolute value of a long. For example, this returns 1 for 1 and -1, 2 + for 2 and -2, and 2 for 3 and -3. It returns 0 for 0. + v must not be NULL, and must be a normalized long. + (size_t)-1 is returned and OverflowError set if the true result doesn't + fit in a size_t. +*/ +PyAPI_FUNC(size_t) _PyLong_NumBits(PyObject *v); + +/* _PyLong_FromByteArray: View the n unsigned bytes as a binary integer in + base 256, and return a Python long with the same numeric value. + If n is 0, the integer is 0. Else: + If little_endian is 1/true, bytes[n-1] is the MSB and bytes[0] the LSB; + else (little_endian is 0/false) bytes[0] is the MSB and bytes[n-1] the + LSB. + If is_signed is 0/false, view the bytes as a non-negative integer. + If is_signed is 1/true, view the bytes as a 2's-complement integer, + non-negative if bit 0x80 of the MSB is clear, negative if set. + Error returns: + + Return NULL with the appropriate exception set if there's not + enough memory to create the Python long. +*/ +PyAPI_FUNC(PyObject *) _PyLong_FromByteArray( + const unsigned char* bytes, size_t n, + int little_endian, int is_signed); + +/* _PyLong_AsByteArray: Convert the least-significant 8*n bits of long + v to a base-256 integer, stored in array bytes. Normally return 0, + return -1 on error. + If little_endian is 1/true, store the MSB at bytes[n-1] and the LSB at + bytes[0]; else (little_endian is 0/false) store the MSB at bytes[0] and + the LSB at bytes[n-1]. + If is_signed is 0/false, it's an error if v < 0; else (v >= 0) n bytes + are filled and there's nothing special about bit 0x80 of the MSB. + If is_signed is 1/true, bytes is filled with the 2's-complement + representation of v's value. Bit 0x80 of the MSB is the sign bit. + Error returns (-1): + + is_signed is 0 and v < 0. TypeError is set in this case, and bytes + isn't altered. + + n isn't big enough to hold the full mathematical value of v. For + example, if is_signed is 0 and there are more digits in the v than + fit in n; or if is_signed is 1, v < 0, and n is just 1 bit shy of + being large enough to hold a sign bit. OverflowError is set in this + case, but bytes holds the least-signficant n bytes of the true value. +*/ +PyAPI_FUNC(int) _PyLong_AsByteArray(PyLongObject* v, + unsigned char* bytes, size_t n, + int little_endian, int is_signed); + +/* _PyLong_Format: Convert the long to a string object with given base, + appending a base prefix of 0[box] if base is 2, 8 or 16. + Add a trailing "L" if addL is non-zero. + If newstyle is zero, then use the pre-2.6 behavior of octal having + a leading "0", instead of the prefix "0o" */ +PyAPI_FUNC(PyObject *) _PyLong_Format(PyObject *aa, int base, int addL, int newstyle); + +/* Format the object based on the format_spec, as defined in PEP 3101 + (Advanced String Formatting). */ +PyAPI_FUNC(PyObject *) _PyLong_FormatAdvanced(PyObject *obj, + char *format_spec, + Py_ssize_t format_spec_len); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_LONGOBJECT_H */ diff --git a/python/include/marshal.h b/python/include/marshal.h new file mode 100644 index 00000000..411fdca3 --- /dev/null +++ b/python/include/marshal.h @@ -0,0 +1,25 @@ + +/* Interface for marshal.c */ + +#ifndef Py_MARSHAL_H +#define Py_MARSHAL_H +#ifdef __cplusplus +extern "C" { +#endif + +#define Py_MARSHAL_VERSION 2 + +PyAPI_FUNC(void) PyMarshal_WriteLongToFile(long, FILE *, int); +PyAPI_FUNC(void) PyMarshal_WriteObjectToFile(PyObject *, FILE *, int); +PyAPI_FUNC(PyObject *) PyMarshal_WriteObjectToString(PyObject *, int); + +PyAPI_FUNC(long) PyMarshal_ReadLongFromFile(FILE *); +PyAPI_FUNC(int) PyMarshal_ReadShortFromFile(FILE *); +PyAPI_FUNC(PyObject *) PyMarshal_ReadObjectFromFile(FILE *); +PyAPI_FUNC(PyObject *) PyMarshal_ReadLastObjectFromFile(FILE *); +PyAPI_FUNC(PyObject *) PyMarshal_ReadObjectFromString(char *, Py_ssize_t); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_MARSHAL_H */ diff --git a/python/include/memoryobject.h b/python/include/memoryobject.h new file mode 100644 index 00000000..bf0b621a --- /dev/null +++ b/python/include/memoryobject.h @@ -0,0 +1,74 @@ +/* Memory view object. In Python this is available as "memoryview". */ + +#ifndef Py_MEMORYOBJECT_H +#define Py_MEMORYOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_DATA(PyTypeObject) PyMemoryView_Type; + +#define PyMemoryView_Check(op) (Py_TYPE(op) == &PyMemoryView_Type) + +/* Get a pointer to the underlying Py_buffer of a memoryview object. */ +#define PyMemoryView_GET_BUFFER(op) (&((PyMemoryViewObject *)(op))->view) +/* Get a pointer to the PyObject from which originates a memoryview object. */ +#define PyMemoryView_GET_BASE(op) (((PyMemoryViewObject *)(op))->view.obj) + + +PyAPI_FUNC(PyObject *) PyMemoryView_GetContiguous(PyObject *base, + int buffertype, + char fort); + + /* Return a contiguous chunk of memory representing the buffer + from an object in a memory view object. If a copy is made then the + base object for the memory view will be a *new* bytes object. + + Otherwise, the base-object will be the object itself and no + data-copying will be done. + + The buffertype argument can be PyBUF_READ, PyBUF_WRITE, + PyBUF_SHADOW to determine whether the returned buffer + should be READONLY, WRITABLE, or set to update the + original buffer if a copy must be made. If buffertype is + PyBUF_WRITE and the buffer is not contiguous an error will + be raised. In this circumstance, the user can use + PyBUF_SHADOW to ensure that a a writable temporary + contiguous buffer is returned. The contents of this + contiguous buffer will be copied back into the original + object after the memoryview object is deleted as long as + the original object is writable and allows setting an + exclusive write lock. If this is not allowed by the + original object, then a BufferError is raised. + + If the object is multi-dimensional and if fortran is 'F', + the first dimension of the underlying array will vary the + fastest in the buffer. If fortran is 'C', then the last + dimension will vary the fastest (C-style contiguous). If + fortran is 'A', then it does not matter and you will get + whatever the object decides is more efficient. + + A new reference is returned that must be DECREF'd when finished. + */ + +PyAPI_FUNC(PyObject *) PyMemoryView_FromObject(PyObject *base); + +PyAPI_FUNC(PyObject *) PyMemoryView_FromBuffer(Py_buffer *info); + /* create new if bufptr is NULL + will be a new bytesobject in base */ + + +/* The struct is declared here so that macros can work, but it shouldn't + be considered public. Don't access those fields directly, use the macros + and functions instead! */ +typedef struct { + PyObject_HEAD + PyObject *base; + Py_buffer view; +} PyMemoryViewObject; + + +#ifdef __cplusplus +} +#endif +#endif /* !Py_MEMORYOBJECT_H */ diff --git a/python/include/metagrammar.h b/python/include/metagrammar.h new file mode 100644 index 00000000..15c8ef8f --- /dev/null +++ b/python/include/metagrammar.h @@ -0,0 +1,18 @@ +#ifndef Py_METAGRAMMAR_H +#define Py_METAGRAMMAR_H +#ifdef __cplusplus +extern "C" { +#endif + + +#define MSTART 256 +#define RULE 257 +#define RHS 258 +#define ALT 259 +#define ITEM 260 +#define ATOM 261 + +#ifdef __cplusplus +} +#endif +#endif /* !Py_METAGRAMMAR_H */ diff --git a/python/include/methodobject.h b/python/include/methodobject.h new file mode 100644 index 00000000..6e160b63 --- /dev/null +++ b/python/include/methodobject.h @@ -0,0 +1,93 @@ + +/* Method object interface */ + +#ifndef Py_METHODOBJECT_H +#define Py_METHODOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +/* This is about the type 'builtin_function_or_method', + not Python methods in user-defined classes. See classobject.h + for the latter. */ + +PyAPI_DATA(PyTypeObject) PyCFunction_Type; + +#define PyCFunction_Check(op) (Py_TYPE(op) == &PyCFunction_Type) + +typedef PyObject *(*PyCFunction)(PyObject *, PyObject *); +typedef PyObject *(*PyCFunctionWithKeywords)(PyObject *, PyObject *, + PyObject *); +typedef PyObject *(*PyNoArgsFunction)(PyObject *); + +PyAPI_FUNC(PyCFunction) PyCFunction_GetFunction(PyObject *); +PyAPI_FUNC(PyObject *) PyCFunction_GetSelf(PyObject *); +PyAPI_FUNC(int) PyCFunction_GetFlags(PyObject *); + +/* Macros for direct access to these values. Type checks are *not* + done, so use with care. */ +#define PyCFunction_GET_FUNCTION(func) \ + (((PyCFunctionObject *)func) -> m_ml -> ml_meth) +#define PyCFunction_GET_SELF(func) \ + (((PyCFunctionObject *)func) -> m_self) +#define PyCFunction_GET_FLAGS(func) \ + (((PyCFunctionObject *)func) -> m_ml -> ml_flags) +PyAPI_FUNC(PyObject *) PyCFunction_Call(PyObject *, PyObject *, PyObject *); + +struct PyMethodDef { + const char *ml_name; /* The name of the built-in function/method */ + PyCFunction ml_meth; /* The C function that implements it */ + int ml_flags; /* Combination of METH_xxx flags, which mostly + describe the args expected by the C func */ + const char *ml_doc; /* The __doc__ attribute, or NULL */ +}; +typedef struct PyMethodDef PyMethodDef; + +PyAPI_FUNC(PyObject *) Py_FindMethod(PyMethodDef[], PyObject *, const char *); + +#define PyCFunction_New(ML, SELF) PyCFunction_NewEx((ML), (SELF), NULL) +PyAPI_FUNC(PyObject *) PyCFunction_NewEx(PyMethodDef *, PyObject *, + PyObject *); + +/* Flag passed to newmethodobject */ +#define METH_OLDARGS 0x0000 +#define METH_VARARGS 0x0001 +#define METH_KEYWORDS 0x0002 +/* METH_NOARGS and METH_O must not be combined with the flags above. */ +#define METH_NOARGS 0x0004 +#define METH_O 0x0008 + +/* METH_CLASS and METH_STATIC are a little different; these control + the construction of methods for a class. These cannot be used for + functions in modules. */ +#define METH_CLASS 0x0010 +#define METH_STATIC 0x0020 + +/* METH_COEXIST allows a method to be entered eventhough a slot has + already filled the entry. When defined, the flag allows a separate + method, "__contains__" for example, to coexist with a defined + slot like sq_contains. */ + +#define METH_COEXIST 0x0040 + +typedef struct PyMethodChain { + PyMethodDef *methods; /* Methods of this type */ + struct PyMethodChain *link; /* NULL or base type */ +} PyMethodChain; + +PyAPI_FUNC(PyObject *) Py_FindMethodInChain(PyMethodChain *, PyObject *, + const char *); + +typedef struct { + PyObject_HEAD + PyMethodDef *m_ml; /* Description of the C function to call */ + PyObject *m_self; /* Passed as 'self' arg to the C func, can be NULL */ + PyObject *m_module; /* The __module__ attribute, can be anything */ +} PyCFunctionObject; + +PyAPI_FUNC(int) PyCFunction_ClearFreeList(void); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_METHODOBJECT_H */ diff --git a/python/include/modsupport.h b/python/include/modsupport.h new file mode 100644 index 00000000..d4dddef0 --- /dev/null +++ b/python/include/modsupport.h @@ -0,0 +1,134 @@ + +#ifndef Py_MODSUPPORT_H +#define Py_MODSUPPORT_H +#ifdef __cplusplus +extern "C" { +#endif + +/* Module support interface */ + +#include + +/* If PY_SSIZE_T_CLEAN is defined, each functions treats #-specifier + to mean Py_ssize_t */ +#ifdef PY_SSIZE_T_CLEAN +#define PyArg_Parse _PyArg_Parse_SizeT +#define PyArg_ParseTuple _PyArg_ParseTuple_SizeT +#define PyArg_ParseTupleAndKeywords _PyArg_ParseTupleAndKeywords_SizeT +#define PyArg_VaParse _PyArg_VaParse_SizeT +#define PyArg_VaParseTupleAndKeywords _PyArg_VaParseTupleAndKeywords_SizeT +#define Py_BuildValue _Py_BuildValue_SizeT +#define Py_VaBuildValue _Py_VaBuildValue_SizeT +#else +PyAPI_FUNC(PyObject *) _Py_VaBuildValue_SizeT(const char *, va_list); +#endif + +PyAPI_FUNC(int) PyArg_Parse(PyObject *, const char *, ...); +PyAPI_FUNC(int) PyArg_ParseTuple(PyObject *, const char *, ...) Py_FORMAT_PARSETUPLE(PyArg_ParseTuple, 2, 3); +PyAPI_FUNC(int) PyArg_ParseTupleAndKeywords(PyObject *, PyObject *, + const char *, char **, ...); +PyAPI_FUNC(int) PyArg_UnpackTuple(PyObject *, const char *, Py_ssize_t, Py_ssize_t, ...); +PyAPI_FUNC(PyObject *) Py_BuildValue(const char *, ...); +PyAPI_FUNC(PyObject *) _Py_BuildValue_SizeT(const char *, ...); +PyAPI_FUNC(int) _PyArg_NoKeywords(const char *funcname, PyObject *kw); + +PyAPI_FUNC(int) PyArg_VaParse(PyObject *, const char *, va_list); +PyAPI_FUNC(int) PyArg_VaParseTupleAndKeywords(PyObject *, PyObject *, + const char *, char **, va_list); +PyAPI_FUNC(PyObject *) Py_VaBuildValue(const char *, va_list); + +PyAPI_FUNC(int) PyModule_AddObject(PyObject *, const char *, PyObject *); +PyAPI_FUNC(int) PyModule_AddIntConstant(PyObject *, const char *, long); +PyAPI_FUNC(int) PyModule_AddStringConstant(PyObject *, const char *, const char *); +#define PyModule_AddIntMacro(m, c) PyModule_AddIntConstant(m, #c, c) +#define PyModule_AddStringMacro(m, c) PyModule_AddStringConstant(m, #c, c) + +#define PYTHON_API_VERSION 1013 +#define PYTHON_API_STRING "1013" +/* The API version is maintained (independently from the Python version) + so we can detect mismatches between the interpreter and dynamically + loaded modules. These are diagnosed by an error message but + the module is still loaded (because the mismatch can only be tested + after loading the module). The error message is intended to + explain the core dump a few seconds later. + + The symbol PYTHON_API_STRING defines the same value as a string + literal. *** PLEASE MAKE SURE THE DEFINITIONS MATCH. *** + + Please add a line or two to the top of this log for each API + version change: + + 22-Feb-2006 MvL 1013 PEP 353 - long indices for sequence lengths + + 19-Aug-2002 GvR 1012 Changes to string object struct for + interning changes, saving 3 bytes. + + 17-Jul-2001 GvR 1011 Descr-branch, just to be on the safe side + + 25-Jan-2001 FLD 1010 Parameters added to PyCode_New() and + PyFrame_New(); Python 2.1a2 + + 14-Mar-2000 GvR 1009 Unicode API added + + 3-Jan-1999 GvR 1007 Decided to change back! (Don't reuse 1008!) + + 3-Dec-1998 GvR 1008 Python 1.5.2b1 + + 18-Jan-1997 GvR 1007 string interning and other speedups + + 11-Oct-1996 GvR renamed Py_Ellipses to Py_Ellipsis :-( + + 30-Jul-1996 GvR Slice and ellipses syntax added + + 23-Jul-1996 GvR For 1.4 -- better safe than sorry this time :-) + + 7-Nov-1995 GvR Keyword arguments (should've been done at 1.3 :-( ) + + 10-Jan-1995 GvR Renamed globals to new naming scheme + + 9-Jan-1995 GvR Initial version (incompatible with older API) +*/ + +#ifdef MS_WINDOWS +/* Special defines for Windows versions used to live here. Things + have changed, and the "Version" is now in a global string variable. + Reason for this is that this for easier branding of a "custom DLL" + without actually needing a recompile. */ +#endif /* MS_WINDOWS */ + +#if SIZEOF_SIZE_T != SIZEOF_INT +/* On a 64-bit system, rename the Py_InitModule4 so that 2.4 + modules cannot get loaded into a 2.5 interpreter */ +#define Py_InitModule4 Py_InitModule4_64 +#endif + +#ifdef Py_TRACE_REFS + /* When we are tracing reference counts, rename Py_InitModule4 so + modules compiled with incompatible settings will generate a + link-time error. */ + #if SIZEOF_SIZE_T != SIZEOF_INT + #undef Py_InitModule4 + #define Py_InitModule4 Py_InitModule4TraceRefs_64 + #else + #define Py_InitModule4 Py_InitModule4TraceRefs + #endif +#endif + +PyAPI_FUNC(PyObject *) Py_InitModule4(const char *name, PyMethodDef *methods, + const char *doc, PyObject *self, + int apiver); + +#define Py_InitModule(name, methods) \ + Py_InitModule4(name, methods, (char *)NULL, (PyObject *)NULL, \ + PYTHON_API_VERSION) + +#define Py_InitModule3(name, methods, doc) \ + Py_InitModule4(name, methods, doc, (PyObject *)NULL, \ + PYTHON_API_VERSION) + +PyAPI_DATA(char *) _Py_PackageContext; + +#ifdef __cplusplus +} +#endif +#endif /* !Py_MODSUPPORT_H */ diff --git a/python/include/moduleobject.h b/python/include/moduleobject.h new file mode 100644 index 00000000..b387f5bf --- /dev/null +++ b/python/include/moduleobject.h @@ -0,0 +1,24 @@ + +/* Module object interface */ + +#ifndef Py_MODULEOBJECT_H +#define Py_MODULEOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_DATA(PyTypeObject) PyModule_Type; + +#define PyModule_Check(op) PyObject_TypeCheck(op, &PyModule_Type) +#define PyModule_CheckExact(op) (Py_TYPE(op) == &PyModule_Type) + +PyAPI_FUNC(PyObject *) PyModule_New(const char *); +PyAPI_FUNC(PyObject *) PyModule_GetDict(PyObject *); +PyAPI_FUNC(char *) PyModule_GetName(PyObject *); +PyAPI_FUNC(char *) PyModule_GetFilename(PyObject *); +PyAPI_FUNC(void) _PyModule_Clear(PyObject *); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_MODULEOBJECT_H */ diff --git a/python/include/node.h b/python/include/node.h new file mode 100644 index 00000000..e23e709f --- /dev/null +++ b/python/include/node.h @@ -0,0 +1,40 @@ + +/* Parse tree node interface */ + +#ifndef Py_NODE_H +#define Py_NODE_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct _node { + short n_type; + char *n_str; + int n_lineno; + int n_col_offset; + int n_nchildren; + struct _node *n_child; +} node; + +PyAPI_FUNC(node *) PyNode_New(int type); +PyAPI_FUNC(int) PyNode_AddChild(node *n, int type, + char *str, int lineno, int col_offset); +PyAPI_FUNC(void) PyNode_Free(node *n); + +/* Node access functions */ +#define NCH(n) ((n)->n_nchildren) + +#define CHILD(n, i) (&(n)->n_child[i]) +#define RCHILD(n, i) (CHILD(n, NCH(n) + i)) +#define TYPE(n) ((n)->n_type) +#define STR(n) ((n)->n_str) + +/* Assert that the type of a node is what we expect */ +#define REQ(n, type) assert(TYPE(n) == (type)) + +PyAPI_FUNC(void) PyNode_ListTree(node *); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_NODE_H */ diff --git a/python/include/object.h b/python/include/object.h new file mode 100644 index 00000000..edcd3fc2 --- /dev/null +++ b/python/include/object.h @@ -0,0 +1,996 @@ +#ifndef Py_OBJECT_H +#define Py_OBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* Object and type object interface */ + +/* +Objects are structures allocated on the heap. Special rules apply to +the use of objects to ensure they are properly garbage-collected. +Objects are never allocated statically or on the stack; they must be +accessed through special macros and functions only. (Type objects are +exceptions to the first rule; the standard types are represented by +statically initialized type objects, although work on type/class unification +for Python 2.2 made it possible to have heap-allocated type objects too). + +An object has a 'reference count' that is increased or decreased when a +pointer to the object is copied or deleted; when the reference count +reaches zero there are no references to the object left and it can be +removed from the heap. + +An object has a 'type' that determines what it represents and what kind +of data it contains. An object's type is fixed when it is created. +Types themselves are represented as objects; an object contains a +pointer to the corresponding type object. The type itself has a type +pointer pointing to the object representing the type 'type', which +contains a pointer to itself!). + +Objects do not float around in memory; once allocated an object keeps +the same size and address. Objects that must hold variable-size data +can contain pointers to variable-size parts of the object. Not all +objects of the same type have the same size; but the size cannot change +after allocation. (These restrictions are made so a reference to an +object can be simply a pointer -- moving an object would require +updating all the pointers, and changing an object's size would require +moving it if there was another object right next to it.) + +Objects are always accessed through pointers of the type 'PyObject *'. +The type 'PyObject' is a structure that only contains the reference count +and the type pointer. The actual memory allocated for an object +contains other data that can only be accessed after casting the pointer +to a pointer to a longer structure type. This longer type must start +with the reference count and type fields; the macro PyObject_HEAD should be +used for this (to accommodate for future changes). The implementation +of a particular object type can cast the object pointer to the proper +type and back. + +A standard interface exists for objects that contain an array of items +whose size is determined when the object is allocated. +*/ + +/* Py_DEBUG implies Py_TRACE_REFS. */ +#if defined(Py_DEBUG) && !defined(Py_TRACE_REFS) +#define Py_TRACE_REFS +#endif + +/* Py_TRACE_REFS implies Py_REF_DEBUG. */ +#if defined(Py_TRACE_REFS) && !defined(Py_REF_DEBUG) +#define Py_REF_DEBUG +#endif + +#ifdef Py_TRACE_REFS +/* Define pointers to support a doubly-linked list of all live heap objects. */ +#define _PyObject_HEAD_EXTRA \ + struct _object *_ob_next; \ + struct _object *_ob_prev; + +#define _PyObject_EXTRA_INIT 0, 0, + +#else +#define _PyObject_HEAD_EXTRA +#define _PyObject_EXTRA_INIT +#endif + +/* PyObject_HEAD defines the initial segment of every PyObject. */ +#define PyObject_HEAD \ + _PyObject_HEAD_EXTRA \ + Py_ssize_t ob_refcnt; \ + struct _typeobject *ob_type; + +#define PyObject_HEAD_INIT(type) \ + _PyObject_EXTRA_INIT \ + 1, type, + +#define PyVarObject_HEAD_INIT(type, size) \ + PyObject_HEAD_INIT(type) size, + +/* PyObject_VAR_HEAD defines the initial segment of all variable-size + * container objects. These end with a declaration of an array with 1 + * element, but enough space is malloc'ed so that the array actually + * has room for ob_size elements. Note that ob_size is an element count, + * not necessarily a byte count. + */ +#define PyObject_VAR_HEAD \ + PyObject_HEAD \ + Py_ssize_t ob_size; /* Number of items in variable part */ +#define Py_INVALID_SIZE (Py_ssize_t)-1 + +/* Nothing is actually declared to be a PyObject, but every pointer to + * a Python object can be cast to a PyObject*. This is inheritance built + * by hand. Similarly every pointer to a variable-size Python object can, + * in addition, be cast to PyVarObject*. + */ +typedef struct _object { + PyObject_HEAD +} PyObject; + +typedef struct { + PyObject_VAR_HEAD +} PyVarObject; + +#define Py_REFCNT(ob) (((PyObject*)(ob))->ob_refcnt) +#define Py_TYPE(ob) (((PyObject*)(ob))->ob_type) +#define Py_SIZE(ob) (((PyVarObject*)(ob))->ob_size) + +/* +Type objects contain a string containing the type name (to help somewhat +in debugging), the allocation parameters (see PyObject_New() and +PyObject_NewVar()), +and methods for accessing objects of the type. Methods are optional, a +nil pointer meaning that particular kind of access is not available for +this type. The Py_DECREF() macro uses the tp_dealloc method without +checking for a nil pointer; it should always be implemented except if +the implementation can guarantee that the reference count will never +reach zero (e.g., for statically allocated type objects). + +NB: the methods for certain type groups are now contained in separate +method blocks. +*/ + +typedef PyObject * (*unaryfunc)(PyObject *); +typedef PyObject * (*binaryfunc)(PyObject *, PyObject *); +typedef PyObject * (*ternaryfunc)(PyObject *, PyObject *, PyObject *); +typedef int (*inquiry)(PyObject *); +typedef Py_ssize_t (*lenfunc)(PyObject *); +typedef int (*coercion)(PyObject **, PyObject **); +typedef PyObject *(*intargfunc)(PyObject *, int) Py_DEPRECATED(2.5); +typedef PyObject *(*intintargfunc)(PyObject *, int, int) Py_DEPRECATED(2.5); +typedef PyObject *(*ssizeargfunc)(PyObject *, Py_ssize_t); +typedef PyObject *(*ssizessizeargfunc)(PyObject *, Py_ssize_t, Py_ssize_t); +typedef int(*intobjargproc)(PyObject *, int, PyObject *); +typedef int(*intintobjargproc)(PyObject *, int, int, PyObject *); +typedef int(*ssizeobjargproc)(PyObject *, Py_ssize_t, PyObject *); +typedef int(*ssizessizeobjargproc)(PyObject *, Py_ssize_t, Py_ssize_t, PyObject *); +typedef int(*objobjargproc)(PyObject *, PyObject *, PyObject *); + + + +/* int-based buffer interface */ +typedef int (*getreadbufferproc)(PyObject *, int, void **); +typedef int (*getwritebufferproc)(PyObject *, int, void **); +typedef int (*getsegcountproc)(PyObject *, int *); +typedef int (*getcharbufferproc)(PyObject *, int, char **); +/* ssize_t-based buffer interface */ +typedef Py_ssize_t (*readbufferproc)(PyObject *, Py_ssize_t, void **); +typedef Py_ssize_t (*writebufferproc)(PyObject *, Py_ssize_t, void **); +typedef Py_ssize_t (*segcountproc)(PyObject *, Py_ssize_t *); +typedef Py_ssize_t (*charbufferproc)(PyObject *, Py_ssize_t, char **); + + +/* Py3k buffer interface */ +typedef struct bufferinfo { + void *buf; + PyObject *obj; /* owned reference */ + Py_ssize_t len; + Py_ssize_t itemsize; /* This is Py_ssize_t so it can be + pointed to by strides in simple case.*/ + int readonly; + int ndim; + char *format; + Py_ssize_t *shape; + Py_ssize_t *strides; + Py_ssize_t *suboffsets; + Py_ssize_t smalltable[2]; /* static store for shape and strides of + mono-dimensional buffers. */ + void *internal; +} Py_buffer; + +typedef int (*getbufferproc)(PyObject *, Py_buffer *, int); +typedef void (*releasebufferproc)(PyObject *, Py_buffer *); + + /* Flags for getting buffers */ +#define PyBUF_SIMPLE 0 +#define PyBUF_WRITABLE 0x0001 +/* we used to include an E, backwards compatible alias */ +#define PyBUF_WRITEABLE PyBUF_WRITABLE +#define PyBUF_FORMAT 0x0004 +#define PyBUF_ND 0x0008 +#define PyBUF_STRIDES (0x0010 | PyBUF_ND) +#define PyBUF_C_CONTIGUOUS (0x0020 | PyBUF_STRIDES) +#define PyBUF_F_CONTIGUOUS (0x0040 | PyBUF_STRIDES) +#define PyBUF_ANY_CONTIGUOUS (0x0080 | PyBUF_STRIDES) +#define PyBUF_INDIRECT (0x0100 | PyBUF_STRIDES) + +#define PyBUF_CONTIG (PyBUF_ND | PyBUF_WRITABLE) +#define PyBUF_CONTIG_RO (PyBUF_ND) + +#define PyBUF_STRIDED (PyBUF_STRIDES | PyBUF_WRITABLE) +#define PyBUF_STRIDED_RO (PyBUF_STRIDES) + +#define PyBUF_RECORDS (PyBUF_STRIDES | PyBUF_WRITABLE | PyBUF_FORMAT) +#define PyBUF_RECORDS_RO (PyBUF_STRIDES | PyBUF_FORMAT) + +#define PyBUF_FULL (PyBUF_INDIRECT | PyBUF_WRITABLE | PyBUF_FORMAT) +#define PyBUF_FULL_RO (PyBUF_INDIRECT | PyBUF_FORMAT) + + +#define PyBUF_READ 0x100 +#define PyBUF_WRITE 0x200 +#define PyBUF_SHADOW 0x400 +/* end Py3k buffer interface */ + +typedef int (*objobjproc)(PyObject *, PyObject *); +typedef int (*visitproc)(PyObject *, void *); +typedef int (*traverseproc)(PyObject *, visitproc, void *); + +typedef struct { + /* For numbers without flag bit Py_TPFLAGS_CHECKTYPES set, all + arguments are guaranteed to be of the object's type (modulo + coercion hacks -- i.e. if the type's coercion function + returns other types, then these are allowed as well). Numbers that + have the Py_TPFLAGS_CHECKTYPES flag bit set should check *both* + arguments for proper type and implement the necessary conversions + in the slot functions themselves. */ + + binaryfunc nb_add; + binaryfunc nb_subtract; + binaryfunc nb_multiply; + binaryfunc nb_divide; + binaryfunc nb_remainder; + binaryfunc nb_divmod; + ternaryfunc nb_power; + unaryfunc nb_negative; + unaryfunc nb_positive; + unaryfunc nb_absolute; + inquiry nb_nonzero; + unaryfunc nb_invert; + binaryfunc nb_lshift; + binaryfunc nb_rshift; + binaryfunc nb_and; + binaryfunc nb_xor; + binaryfunc nb_or; + coercion nb_coerce; + unaryfunc nb_int; + unaryfunc nb_long; + unaryfunc nb_float; + unaryfunc nb_oct; + unaryfunc nb_hex; + /* Added in release 2.0 */ + binaryfunc nb_inplace_add; + binaryfunc nb_inplace_subtract; + binaryfunc nb_inplace_multiply; + binaryfunc nb_inplace_divide; + binaryfunc nb_inplace_remainder; + ternaryfunc nb_inplace_power; + binaryfunc nb_inplace_lshift; + binaryfunc nb_inplace_rshift; + binaryfunc nb_inplace_and; + binaryfunc nb_inplace_xor; + binaryfunc nb_inplace_or; + + /* Added in release 2.2 */ + /* The following require the Py_TPFLAGS_HAVE_CLASS flag */ + binaryfunc nb_floor_divide; + binaryfunc nb_true_divide; + binaryfunc nb_inplace_floor_divide; + binaryfunc nb_inplace_true_divide; + + /* Added in release 2.5 */ + unaryfunc nb_index; +} PyNumberMethods; + +typedef struct { + lenfunc sq_length; + binaryfunc sq_concat; + ssizeargfunc sq_repeat; + ssizeargfunc sq_item; + ssizessizeargfunc sq_slice; + ssizeobjargproc sq_ass_item; + ssizessizeobjargproc sq_ass_slice; + objobjproc sq_contains; + /* Added in release 2.0 */ + binaryfunc sq_inplace_concat; + ssizeargfunc sq_inplace_repeat; +} PySequenceMethods; + +typedef struct { + lenfunc mp_length; + binaryfunc mp_subscript; + objobjargproc mp_ass_subscript; +} PyMappingMethods; + +typedef struct { + readbufferproc bf_getreadbuffer; + writebufferproc bf_getwritebuffer; + segcountproc bf_getsegcount; + charbufferproc bf_getcharbuffer; + getbufferproc bf_getbuffer; + releasebufferproc bf_releasebuffer; +} PyBufferProcs; + + +typedef void (*freefunc)(void *); +typedef void (*destructor)(PyObject *); +typedef int (*printfunc)(PyObject *, FILE *, int); +typedef PyObject *(*getattrfunc)(PyObject *, char *); +typedef PyObject *(*getattrofunc)(PyObject *, PyObject *); +typedef int (*setattrfunc)(PyObject *, char *, PyObject *); +typedef int (*setattrofunc)(PyObject *, PyObject *, PyObject *); +typedef int (*cmpfunc)(PyObject *, PyObject *); +typedef PyObject *(*reprfunc)(PyObject *); +typedef long (*hashfunc)(PyObject *); +typedef PyObject *(*richcmpfunc) (PyObject *, PyObject *, int); +typedef PyObject *(*getiterfunc) (PyObject *); +typedef PyObject *(*iternextfunc) (PyObject *); +typedef PyObject *(*descrgetfunc) (PyObject *, PyObject *, PyObject *); +typedef int (*descrsetfunc) (PyObject *, PyObject *, PyObject *); +typedef int (*initproc)(PyObject *, PyObject *, PyObject *); +typedef PyObject *(*newfunc)(struct _typeobject *, PyObject *, PyObject *); +typedef PyObject *(*allocfunc)(struct _typeobject *, Py_ssize_t); + +typedef struct _typeobject { + PyObject_VAR_HEAD + const char *tp_name; /* For printing, in format "." */ + Py_ssize_t tp_basicsize, tp_itemsize; /* For allocation */ + + /* Methods to implement standard operations */ + + destructor tp_dealloc; + printfunc tp_print; + getattrfunc tp_getattr; + setattrfunc tp_setattr; + cmpfunc tp_compare; + reprfunc tp_repr; + + /* Method suites for standard classes */ + + PyNumberMethods *tp_as_number; + PySequenceMethods *tp_as_sequence; + PyMappingMethods *tp_as_mapping; + + /* More standard operations (here for binary compatibility) */ + + hashfunc tp_hash; + ternaryfunc tp_call; + reprfunc tp_str; + getattrofunc tp_getattro; + setattrofunc tp_setattro; + + /* Functions to access object as input/output buffer */ + PyBufferProcs *tp_as_buffer; + + /* Flags to define presence of optional/expanded features */ + long tp_flags; + + const char *tp_doc; /* Documentation string */ + + /* Assigned meaning in release 2.0 */ + /* call function for all accessible objects */ + traverseproc tp_traverse; + + /* delete references to contained objects */ + inquiry tp_clear; + + /* Assigned meaning in release 2.1 */ + /* rich comparisons */ + richcmpfunc tp_richcompare; + + /* weak reference enabler */ + Py_ssize_t tp_weaklistoffset; + + /* Added in release 2.2 */ + /* Iterators */ + getiterfunc tp_iter; + iternextfunc tp_iternext; + + /* Attribute descriptor and subclassing stuff */ + struct PyMethodDef *tp_methods; + struct PyMemberDef *tp_members; + struct PyGetSetDef *tp_getset; + struct _typeobject *tp_base; + PyObject *tp_dict; + descrgetfunc tp_descr_get; + descrsetfunc tp_descr_set; + Py_ssize_t tp_dictoffset; + initproc tp_init; + allocfunc tp_alloc; + newfunc tp_new; + freefunc tp_free; /* Low-level free-memory routine */ + inquiry tp_is_gc; /* For PyObject_IS_GC */ + PyObject *tp_bases; + PyObject *tp_mro; /* method resolution order */ + PyObject *tp_cache; + PyObject *tp_subclasses; + PyObject *tp_weaklist; + destructor tp_del; + + /* Type attribute cache version tag. Added in version 2.6 */ + unsigned int tp_version_tag; + +#ifdef COUNT_ALLOCS + /* these must be last and never explicitly initialized */ + Py_ssize_t tp_allocs; + Py_ssize_t tp_frees; + Py_ssize_t tp_maxalloc; + struct _typeobject *tp_prev; + struct _typeobject *tp_next; +#endif +} PyTypeObject; + + +/* The *real* layout of a type object when allocated on the heap */ +typedef struct _heaptypeobject { + /* Note: there's a dependency on the order of these members + in slotptr() in typeobject.c . */ + PyTypeObject ht_type; + PyNumberMethods as_number; + PyMappingMethods as_mapping; + PySequenceMethods as_sequence; /* as_sequence comes after as_mapping, + so that the mapping wins when both + the mapping and the sequence define + a given operator (e.g. __getitem__). + see add_operators() in typeobject.c . */ + PyBufferProcs as_buffer; + PyObject *ht_name, *ht_slots; + /* here are optional user slots, followed by the members. */ +} PyHeapTypeObject; + +/* access macro to the members which are floating "behind" the object */ +#define PyHeapType_GET_MEMBERS(etype) \ + ((PyMemberDef *)(((char *)etype) + Py_TYPE(etype)->tp_basicsize)) + + +/* Generic type check */ +PyAPI_FUNC(int) PyType_IsSubtype(PyTypeObject *, PyTypeObject *); +#define PyObject_TypeCheck(ob, tp) \ + (Py_TYPE(ob) == (tp) || PyType_IsSubtype(Py_TYPE(ob), (tp))) + +PyAPI_DATA(PyTypeObject) PyType_Type; /* built-in 'type' */ +PyAPI_DATA(PyTypeObject) PyBaseObject_Type; /* built-in 'object' */ +PyAPI_DATA(PyTypeObject) PySuper_Type; /* built-in 'super' */ + +#define PyType_Check(op) \ + PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_TYPE_SUBCLASS) +#define PyType_CheckExact(op) (Py_TYPE(op) == &PyType_Type) + +PyAPI_FUNC(int) PyType_Ready(PyTypeObject *); +PyAPI_FUNC(PyObject *) PyType_GenericAlloc(PyTypeObject *, Py_ssize_t); +PyAPI_FUNC(PyObject *) PyType_GenericNew(PyTypeObject *, + PyObject *, PyObject *); +PyAPI_FUNC(PyObject *) _PyType_Lookup(PyTypeObject *, PyObject *); +PyAPI_FUNC(PyObject *) _PyObject_LookupSpecial(PyObject *, char *, PyObject **); +PyAPI_FUNC(unsigned int) PyType_ClearCache(void); +PyAPI_FUNC(void) PyType_Modified(PyTypeObject *); + +/* Generic operations on objects */ +PyAPI_FUNC(int) PyObject_Print(PyObject *, FILE *, int); +PyAPI_FUNC(void) _PyObject_Dump(PyObject *); +PyAPI_FUNC(PyObject *) PyObject_Repr(PyObject *); +PyAPI_FUNC(PyObject *) _PyObject_Str(PyObject *); +PyAPI_FUNC(PyObject *) PyObject_Str(PyObject *); +#define PyObject_Bytes PyObject_Str +#ifdef Py_USING_UNICODE +PyAPI_FUNC(PyObject *) PyObject_Unicode(PyObject *); +#endif +PyAPI_FUNC(int) PyObject_Compare(PyObject *, PyObject *); +PyAPI_FUNC(PyObject *) PyObject_RichCompare(PyObject *, PyObject *, int); +PyAPI_FUNC(int) PyObject_RichCompareBool(PyObject *, PyObject *, int); +PyAPI_FUNC(PyObject *) PyObject_GetAttrString(PyObject *, const char *); +PyAPI_FUNC(int) PyObject_SetAttrString(PyObject *, const char *, PyObject *); +PyAPI_FUNC(int) PyObject_HasAttrString(PyObject *, const char *); +PyAPI_FUNC(PyObject *) PyObject_GetAttr(PyObject *, PyObject *); +PyAPI_FUNC(int) PyObject_SetAttr(PyObject *, PyObject *, PyObject *); +PyAPI_FUNC(int) PyObject_HasAttr(PyObject *, PyObject *); +PyAPI_FUNC(PyObject **) _PyObject_GetDictPtr(PyObject *); +PyAPI_FUNC(PyObject *) PyObject_SelfIter(PyObject *); +PyAPI_FUNC(PyObject *) _PyObject_NextNotImplemented(PyObject *); +PyAPI_FUNC(PyObject *) PyObject_GenericGetAttr(PyObject *, PyObject *); +PyAPI_FUNC(int) PyObject_GenericSetAttr(PyObject *, + PyObject *, PyObject *); +PyAPI_FUNC(long) PyObject_Hash(PyObject *); +PyAPI_FUNC(long) PyObject_HashNotImplemented(PyObject *); +PyAPI_FUNC(int) PyObject_IsTrue(PyObject *); +PyAPI_FUNC(int) PyObject_Not(PyObject *); +PyAPI_FUNC(int) PyCallable_Check(PyObject *); +PyAPI_FUNC(int) PyNumber_Coerce(PyObject **, PyObject **); +PyAPI_FUNC(int) PyNumber_CoerceEx(PyObject **, PyObject **); + +PyAPI_FUNC(void) PyObject_ClearWeakRefs(PyObject *); + +/* A slot function whose address we need to compare */ +extern int _PyObject_SlotCompare(PyObject *, PyObject *); +/* Same as PyObject_Generic{Get,Set}Attr, but passing the attributes + dict as the last parameter. */ +PyAPI_FUNC(PyObject *) +_PyObject_GenericGetAttrWithDict(PyObject *, PyObject *, PyObject *); +PyAPI_FUNC(int) +_PyObject_GenericSetAttrWithDict(PyObject *, PyObject *, + PyObject *, PyObject *); + + +/* PyObject_Dir(obj) acts like Python __builtin__.dir(obj), returning a + list of strings. PyObject_Dir(NULL) is like __builtin__.dir(), + returning the names of the current locals. In this case, if there are + no current locals, NULL is returned, and PyErr_Occurred() is false. +*/ +PyAPI_FUNC(PyObject *) PyObject_Dir(PyObject *); + + +/* Helpers for printing recursive container types */ +PyAPI_FUNC(int) Py_ReprEnter(PyObject *); +PyAPI_FUNC(void) Py_ReprLeave(PyObject *); + +/* Helpers for hash functions */ +PyAPI_FUNC(long) _Py_HashDouble(double); +PyAPI_FUNC(long) _Py_HashPointer(void*); + +typedef struct { + long prefix; + long suffix; +} _Py_HashSecret_t; +PyAPI_DATA(_Py_HashSecret_t) _Py_HashSecret; + +#ifdef Py_DEBUG +PyAPI_DATA(int) _Py_HashSecret_Initialized; +#endif + +/* Helper for passing objects to printf and the like */ +#define PyObject_REPR(obj) PyString_AS_STRING(PyObject_Repr(obj)) + +/* Flag bits for printing: */ +#define Py_PRINT_RAW 1 /* No string quotes etc. */ + +/* +`Type flags (tp_flags) + +These flags are used to extend the type structure in a backwards-compatible +fashion. Extensions can use the flags to indicate (and test) when a given +type structure contains a new feature. The Python core will use these when +introducing new functionality between major revisions (to avoid mid-version +changes in the PYTHON_API_VERSION). + +Arbitration of the flag bit positions will need to be coordinated among +all extension writers who publically release their extensions (this will +be fewer than you might expect!).. + +Python 1.5.2 introduced the bf_getcharbuffer slot into PyBufferProcs. + +Type definitions should use Py_TPFLAGS_DEFAULT for their tp_flags value. + +Code can use PyType_HasFeature(type_ob, flag_value) to test whether the +given type object has a specified feature. + +NOTE: when building the core, Py_TPFLAGS_DEFAULT includes +Py_TPFLAGS_HAVE_VERSION_TAG; outside the core, it doesn't. This is so +that extensions that modify tp_dict of their own types directly don't +break, since this was allowed in 2.5. In 3.0 they will have to +manually remove this flag though! +*/ + +/* PyBufferProcs contains bf_getcharbuffer */ +#define Py_TPFLAGS_HAVE_GETCHARBUFFER (1L<<0) + +/* PySequenceMethods contains sq_contains */ +#define Py_TPFLAGS_HAVE_SEQUENCE_IN (1L<<1) + +/* This is here for backwards compatibility. Extensions that use the old GC + * API will still compile but the objects will not be tracked by the GC. */ +#define Py_TPFLAGS_GC 0 /* used to be (1L<<2) */ + +/* PySequenceMethods and PyNumberMethods contain in-place operators */ +#define Py_TPFLAGS_HAVE_INPLACEOPS (1L<<3) + +/* PyNumberMethods do their own coercion */ +#define Py_TPFLAGS_CHECKTYPES (1L<<4) + +/* tp_richcompare is defined */ +#define Py_TPFLAGS_HAVE_RICHCOMPARE (1L<<5) + +/* Objects which are weakly referencable if their tp_weaklistoffset is >0 */ +#define Py_TPFLAGS_HAVE_WEAKREFS (1L<<6) + +/* tp_iter is defined */ +#define Py_TPFLAGS_HAVE_ITER (1L<<7) + +/* New members introduced by Python 2.2 exist */ +#define Py_TPFLAGS_HAVE_CLASS (1L<<8) + +/* Set if the type object is dynamically allocated */ +#define Py_TPFLAGS_HEAPTYPE (1L<<9) + +/* Set if the type allows subclassing */ +#define Py_TPFLAGS_BASETYPE (1L<<10) + +/* Set if the type is 'ready' -- fully initialized */ +#define Py_TPFLAGS_READY (1L<<12) + +/* Set while the type is being 'readied', to prevent recursive ready calls */ +#define Py_TPFLAGS_READYING (1L<<13) + +/* Objects support garbage collection (see objimp.h) */ +#define Py_TPFLAGS_HAVE_GC (1L<<14) + +/* These two bits are preserved for Stackless Python, next after this is 17 */ +#ifdef STACKLESS +#define Py_TPFLAGS_HAVE_STACKLESS_EXTENSION (3L<<15) +#else +#define Py_TPFLAGS_HAVE_STACKLESS_EXTENSION 0 +#endif + +/* Objects support nb_index in PyNumberMethods */ +#define Py_TPFLAGS_HAVE_INDEX (1L<<17) + +/* Objects support type attribute cache */ +#define Py_TPFLAGS_HAVE_VERSION_TAG (1L<<18) +#define Py_TPFLAGS_VALID_VERSION_TAG (1L<<19) + +/* Type is abstract and cannot be instantiated */ +#define Py_TPFLAGS_IS_ABSTRACT (1L<<20) + +/* Has the new buffer protocol */ +#define Py_TPFLAGS_HAVE_NEWBUFFER (1L<<21) + +/* These flags are used to determine if a type is a subclass. */ +#define Py_TPFLAGS_INT_SUBCLASS (1L<<23) +#define Py_TPFLAGS_LONG_SUBCLASS (1L<<24) +#define Py_TPFLAGS_LIST_SUBCLASS (1L<<25) +#define Py_TPFLAGS_TUPLE_SUBCLASS (1L<<26) +#define Py_TPFLAGS_STRING_SUBCLASS (1L<<27) +#define Py_TPFLAGS_UNICODE_SUBCLASS (1L<<28) +#define Py_TPFLAGS_DICT_SUBCLASS (1L<<29) +#define Py_TPFLAGS_BASE_EXC_SUBCLASS (1L<<30) +#define Py_TPFLAGS_TYPE_SUBCLASS (1L<<31) + +#define Py_TPFLAGS_DEFAULT_EXTERNAL ( \ + Py_TPFLAGS_HAVE_GETCHARBUFFER | \ + Py_TPFLAGS_HAVE_SEQUENCE_IN | \ + Py_TPFLAGS_HAVE_INPLACEOPS | \ + Py_TPFLAGS_HAVE_RICHCOMPARE | \ + Py_TPFLAGS_HAVE_WEAKREFS | \ + Py_TPFLAGS_HAVE_ITER | \ + Py_TPFLAGS_HAVE_CLASS | \ + Py_TPFLAGS_HAVE_STACKLESS_EXTENSION | \ + Py_TPFLAGS_HAVE_INDEX | \ + 0) +#define Py_TPFLAGS_DEFAULT_CORE (Py_TPFLAGS_DEFAULT_EXTERNAL | \ + Py_TPFLAGS_HAVE_VERSION_TAG) + +#ifdef Py_BUILD_CORE +#define Py_TPFLAGS_DEFAULT Py_TPFLAGS_DEFAULT_CORE +#else +#define Py_TPFLAGS_DEFAULT Py_TPFLAGS_DEFAULT_EXTERNAL +#endif + +#define PyType_HasFeature(t,f) (((t)->tp_flags & (f)) != 0) +#define PyType_FastSubclass(t,f) PyType_HasFeature(t,f) + + +/* +The macros Py_INCREF(op) and Py_DECREF(op) are used to increment or decrement +reference counts. Py_DECREF calls the object's deallocator function when +the refcount falls to 0; for +objects that don't contain references to other objects or heap memory +this can be the standard function free(). Both macros can be used +wherever a void expression is allowed. The argument must not be a +NULL pointer. If it may be NULL, use Py_XINCREF/Py_XDECREF instead. +The macro _Py_NewReference(op) initialize reference counts to 1, and +in special builds (Py_REF_DEBUG, Py_TRACE_REFS) performs additional +bookkeeping appropriate to the special build. + +We assume that the reference count field can never overflow; this can +be proven when the size of the field is the same as the pointer size, so +we ignore the possibility. Provided a C int is at least 32 bits (which +is implicitly assumed in many parts of this code), that's enough for +about 2**31 references to an object. + +XXX The following became out of date in Python 2.2, but I'm not sure +XXX what the full truth is now. Certainly, heap-allocated type objects +XXX can and should be deallocated. +Type objects should never be deallocated; the type pointer in an object +is not considered to be a reference to the type object, to save +complications in the deallocation function. (This is actually a +decision that's up to the implementer of each new type so if you want, +you can count such references to the type object.) + +*** WARNING*** The Py_DECREF macro must have a side-effect-free argument +since it may evaluate its argument multiple times. (The alternative +would be to mace it a proper function or assign it to a global temporary +variable first, both of which are slower; and in a multi-threaded +environment the global variable trick is not safe.) +*/ + +/* First define a pile of simple helper macros, one set per special + * build symbol. These either expand to the obvious things, or to + * nothing at all when the special mode isn't in effect. The main + * macros can later be defined just once then, yet expand to different + * things depending on which special build options are and aren't in effect. + * Trust me : while painful, this is 20x easier to understand than, + * e.g, defining _Py_NewReference five different times in a maze of nested + * #ifdefs (we used to do that -- it was impenetrable). + */ +#ifdef Py_REF_DEBUG +PyAPI_DATA(Py_ssize_t) _Py_RefTotal; +PyAPI_FUNC(void) _Py_NegativeRefcount(const char *fname, + int lineno, PyObject *op); +PyAPI_FUNC(PyObject *) _PyDict_Dummy(void); +PyAPI_FUNC(PyObject *) _PySet_Dummy(void); +PyAPI_FUNC(Py_ssize_t) _Py_GetRefTotal(void); +#define _Py_INC_REFTOTAL _Py_RefTotal++ +#define _Py_DEC_REFTOTAL _Py_RefTotal-- +#define _Py_REF_DEBUG_COMMA , +#define _Py_CHECK_REFCNT(OP) \ +{ if (((PyObject*)OP)->ob_refcnt < 0) \ + _Py_NegativeRefcount(__FILE__, __LINE__, \ + (PyObject *)(OP)); \ +} +#else +#define _Py_INC_REFTOTAL +#define _Py_DEC_REFTOTAL +#define _Py_REF_DEBUG_COMMA +#define _Py_CHECK_REFCNT(OP) /* a semicolon */; +#endif /* Py_REF_DEBUG */ + +#ifdef COUNT_ALLOCS +PyAPI_FUNC(void) inc_count(PyTypeObject *); +PyAPI_FUNC(void) dec_count(PyTypeObject *); +#define _Py_INC_TPALLOCS(OP) inc_count(Py_TYPE(OP)) +#define _Py_INC_TPFREES(OP) dec_count(Py_TYPE(OP)) +#define _Py_DEC_TPFREES(OP) Py_TYPE(OP)->tp_frees-- +#define _Py_COUNT_ALLOCS_COMMA , +#else +#define _Py_INC_TPALLOCS(OP) +#define _Py_INC_TPFREES(OP) +#define _Py_DEC_TPFREES(OP) +#define _Py_COUNT_ALLOCS_COMMA +#endif /* COUNT_ALLOCS */ + +#ifdef Py_TRACE_REFS +/* Py_TRACE_REFS is such major surgery that we call external routines. */ +PyAPI_FUNC(void) _Py_NewReference(PyObject *); +PyAPI_FUNC(void) _Py_ForgetReference(PyObject *); +PyAPI_FUNC(void) _Py_Dealloc(PyObject *); +PyAPI_FUNC(void) _Py_PrintReferences(FILE *); +PyAPI_FUNC(void) _Py_PrintReferenceAddresses(FILE *); +PyAPI_FUNC(void) _Py_AddToAllObjects(PyObject *, int force); + +#else +/* Without Py_TRACE_REFS, there's little enough to do that we expand code + * inline. + */ +#define _Py_NewReference(op) ( \ + _Py_INC_TPALLOCS(op) _Py_COUNT_ALLOCS_COMMA \ + _Py_INC_REFTOTAL _Py_REF_DEBUG_COMMA \ + Py_REFCNT(op) = 1) + +#define _Py_ForgetReference(op) _Py_INC_TPFREES(op) + +#define _Py_Dealloc(op) ( \ + _Py_INC_TPFREES(op) _Py_COUNT_ALLOCS_COMMA \ + (*Py_TYPE(op)->tp_dealloc)((PyObject *)(op))) +#endif /* !Py_TRACE_REFS */ + +#define Py_INCREF(op) ( \ + _Py_INC_REFTOTAL _Py_REF_DEBUG_COMMA \ + ((PyObject*)(op))->ob_refcnt++) + +#define Py_DECREF(op) \ + do { \ + if (_Py_DEC_REFTOTAL _Py_REF_DEBUG_COMMA \ + --((PyObject*)(op))->ob_refcnt != 0) \ + _Py_CHECK_REFCNT(op) \ + else \ + _Py_Dealloc((PyObject *)(op)); \ + } while (0) + +/* Safely decref `op` and set `op` to NULL, especially useful in tp_clear + * and tp_dealloc implementatons. + * + * Note that "the obvious" code can be deadly: + * + * Py_XDECREF(op); + * op = NULL; + * + * Typically, `op` is something like self->containee, and `self` is done + * using its `containee` member. In the code sequence above, suppose + * `containee` is non-NULL with a refcount of 1. Its refcount falls to + * 0 on the first line, which can trigger an arbitrary amount of code, + * possibly including finalizers (like __del__ methods or weakref callbacks) + * coded in Python, which in turn can release the GIL and allow other threads + * to run, etc. Such code may even invoke methods of `self` again, or cause + * cyclic gc to trigger, but-- oops! --self->containee still points to the + * object being torn down, and it may be in an insane state while being torn + * down. This has in fact been a rich historic source of miserable (rare & + * hard-to-diagnose) segfaulting (and other) bugs. + * + * The safe way is: + * + * Py_CLEAR(op); + * + * That arranges to set `op` to NULL _before_ decref'ing, so that any code + * triggered as a side-effect of `op` getting torn down no longer believes + * `op` points to a valid object. + * + * There are cases where it's safe to use the naive code, but they're brittle. + * For example, if `op` points to a Python integer, you know that destroying + * one of those can't cause problems -- but in part that relies on that + * Python integers aren't currently weakly referencable. Best practice is + * to use Py_CLEAR() even if you can't think of a reason for why you need to. + */ +#define Py_CLEAR(op) \ + do { \ + if (op) { \ + PyObject *_py_tmp = (PyObject *)(op); \ + (op) = NULL; \ + Py_DECREF(_py_tmp); \ + } \ + } while (0) + +/* Macros to use in case the object pointer may be NULL: */ +#define Py_XINCREF(op) do { if ((op) == NULL) ; else Py_INCREF(op); } while (0) +#define Py_XDECREF(op) do { if ((op) == NULL) ; else Py_DECREF(op); } while (0) + +/* +These are provided as conveniences to Python runtime embedders, so that +they can have object code that is not dependent on Python compilation flags. +*/ +PyAPI_FUNC(void) Py_IncRef(PyObject *); +PyAPI_FUNC(void) Py_DecRef(PyObject *); + +/* +_Py_NoneStruct is an object of undefined type which can be used in contexts +where NULL (nil) is not suitable (since NULL often means 'error'). + +Don't forget to apply Py_INCREF() when returning this value!!! +*/ +PyAPI_DATA(PyObject) _Py_NoneStruct; /* Don't use this directly */ +#define Py_None (&_Py_NoneStruct) + +/* Macro for returning Py_None from a function */ +#define Py_RETURN_NONE return Py_INCREF(Py_None), Py_None + +/* +Py_NotImplemented is a singleton used to signal that an operation is +not implemented for a given type combination. +*/ +PyAPI_DATA(PyObject) _Py_NotImplementedStruct; /* Don't use this directly */ +#define Py_NotImplemented (&_Py_NotImplementedStruct) + +/* Rich comparison opcodes */ +#define Py_LT 0 +#define Py_LE 1 +#define Py_EQ 2 +#define Py_NE 3 +#define Py_GT 4 +#define Py_GE 5 + +/* Maps Py_LT to Py_GT, ..., Py_GE to Py_LE. + * Defined in object.c. + */ +PyAPI_DATA(int) _Py_SwappedOp[]; + +/* +Define staticforward and statichere for source compatibility with old +C extensions. + +The staticforward define was needed to support certain broken C +compilers (notably SCO ODT 3.0, perhaps early AIX as well) botched the +static keyword when it was used with a forward declaration of a static +initialized structure. Standard C allows the forward declaration with +static, and we've decided to stop catering to broken C compilers. +(In fact, we expect that the compilers are all fixed eight years later.) +*/ + +#define staticforward static +#define statichere static + + +/* +More conventions +================ + +Argument Checking +----------------- + +Functions that take objects as arguments normally don't check for nil +arguments, but they do check the type of the argument, and return an +error if the function doesn't apply to the type. + +Failure Modes +------------- + +Functions may fail for a variety of reasons, including running out of +memory. This is communicated to the caller in two ways: an error string +is set (see errors.h), and the function result differs: functions that +normally return a pointer return NULL for failure, functions returning +an integer return -1 (which could be a legal return value too!), and +other functions return 0 for success and -1 for failure. +Callers should always check for errors before using the result. If +an error was set, the caller must either explicitly clear it, or pass +the error on to its caller. + +Reference Counts +---------------- + +It takes a while to get used to the proper usage of reference counts. + +Functions that create an object set the reference count to 1; such new +objects must be stored somewhere or destroyed again with Py_DECREF(). +Some functions that 'store' objects, such as PyTuple_SetItem() and +PyList_SetItem(), +don't increment the reference count of the object, since the most +frequent use is to store a fresh object. Functions that 'retrieve' +objects, such as PyTuple_GetItem() and PyDict_GetItemString(), also +don't increment +the reference count, since most frequently the object is only looked at +quickly. Thus, to retrieve an object and store it again, the caller +must call Py_INCREF() explicitly. + +NOTE: functions that 'consume' a reference count, like +PyList_SetItem(), consume the reference even if the object wasn't +successfully stored, to simplify error handling. + +It seems attractive to make other functions that take an object as +argument consume a reference count; however, this may quickly get +confusing (even the current practice is already confusing). Consider +it carefully, it may save lots of calls to Py_INCREF() and Py_DECREF() at +times. +*/ + + +/* Trashcan mechanism, thanks to Christian Tismer. + +When deallocating a container object, it's possible to trigger an unbounded +chain of deallocations, as each Py_DECREF in turn drops the refcount on "the +next" object in the chain to 0. This can easily lead to stack faults, and +especially in threads (which typically have less stack space to work with). + +A container object that participates in cyclic gc can avoid this by +bracketing the body of its tp_dealloc function with a pair of macros: + +static void +mytype_dealloc(mytype *p) +{ + ... declarations go here ... + + PyObject_GC_UnTrack(p); // must untrack first + Py_TRASHCAN_SAFE_BEGIN(p) + ... The body of the deallocator goes here, including all calls ... + ... to Py_DECREF on contained objects. ... + Py_TRASHCAN_SAFE_END(p) +} + +CAUTION: Never return from the middle of the body! If the body needs to +"get out early", put a label immediately before the Py_TRASHCAN_SAFE_END +call, and goto it. Else the call-depth counter (see below) will stay +above 0 forever, and the trashcan will never get emptied. + +How it works: The BEGIN macro increments a call-depth counter. So long +as this counter is small, the body of the deallocator is run directly without +further ado. But if the counter gets large, it instead adds p to a list of +objects to be deallocated later, skips the body of the deallocator, and +resumes execution after the END macro. The tp_dealloc routine then returns +without deallocating anything (and so unbounded call-stack depth is avoided). + +When the call stack finishes unwinding again, code generated by the END macro +notices this, and calls another routine to deallocate all the objects that +may have been added to the list of deferred deallocations. In effect, a +chain of N deallocations is broken into N / PyTrash_UNWIND_LEVEL pieces, +with the call stack never exceeding a depth of PyTrash_UNWIND_LEVEL. +*/ + +PyAPI_FUNC(void) _PyTrash_deposit_object(PyObject*); +PyAPI_FUNC(void) _PyTrash_destroy_chain(void); +PyAPI_DATA(int) _PyTrash_delete_nesting; +PyAPI_DATA(PyObject *) _PyTrash_delete_later; + +#define PyTrash_UNWIND_LEVEL 50 + +#define Py_TRASHCAN_SAFE_BEGIN(op) \ + if (_PyTrash_delete_nesting < PyTrash_UNWIND_LEVEL) { \ + ++_PyTrash_delete_nesting; + /* The body of the deallocator is here. */ +#define Py_TRASHCAN_SAFE_END(op) \ + --_PyTrash_delete_nesting; \ + if (_PyTrash_delete_later && _PyTrash_delete_nesting <= 0) \ + _PyTrash_destroy_chain(); \ + } \ + else \ + _PyTrash_deposit_object((PyObject*)op); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_OBJECT_H */ diff --git a/python/include/objimpl.h b/python/include/objimpl.h new file mode 100644 index 00000000..55e83ece --- /dev/null +++ b/python/include/objimpl.h @@ -0,0 +1,354 @@ +/* The PyObject_ memory family: high-level object memory interfaces. + See pymem.h for the low-level PyMem_ family. +*/ + +#ifndef Py_OBJIMPL_H +#define Py_OBJIMPL_H + +#include "pymem.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* BEWARE: + + Each interface exports both functions and macros. Extension modules should + use the functions, to ensure binary compatibility across Python versions. + Because the Python implementation is free to change internal details, and + the macros may (or may not) expose details for speed, if you do use the + macros you must recompile your extensions with each Python release. + + Never mix calls to PyObject_ memory functions with calls to the platform + malloc/realloc/ calloc/free, or with calls to PyMem_. +*/ + +/* +Functions and macros for modules that implement new object types. + + - PyObject_New(type, typeobj) allocates memory for a new object of the given + type, and initializes part of it. 'type' must be the C structure type used + to represent the object, and 'typeobj' the address of the corresponding + type object. Reference count and type pointer are filled in; the rest of + the bytes of the object are *undefined*! The resulting expression type is + 'type *'. The size of the object is determined by the tp_basicsize field + of the type object. + + - PyObject_NewVar(type, typeobj, n) is similar but allocates a variable-size + object with room for n items. In addition to the refcount and type pointer + fields, this also fills in the ob_size field. + + - PyObject_Del(op) releases the memory allocated for an object. It does not + run a destructor -- it only frees the memory. PyObject_Free is identical. + + - PyObject_Init(op, typeobj) and PyObject_InitVar(op, typeobj, n) don't + allocate memory. Instead of a 'type' parameter, they take a pointer to a + new object (allocated by an arbitrary allocator), and initialize its object + header fields. + +Note that objects created with PyObject_{New, NewVar} are allocated using the +specialized Python allocator (implemented in obmalloc.c), if WITH_PYMALLOC is +enabled. In addition, a special debugging allocator is used if PYMALLOC_DEBUG +is also #defined. + +In case a specific form of memory management is needed (for example, if you +must use the platform malloc heap(s), or shared memory, or C++ local storage or +operator new), you must first allocate the object with your custom allocator, +then pass its pointer to PyObject_{Init, InitVar} for filling in its Python- +specific fields: reference count, type pointer, possibly others. You should +be aware that Python no control over these objects because they don't +cooperate with the Python memory manager. Such objects may not be eligible +for automatic garbage collection and you have to make sure that they are +released accordingly whenever their destructor gets called (cf. the specific +form of memory management you're using). + +Unless you have specific memory management requirements, use +PyObject_{New, NewVar, Del}. +*/ + +/* + * Raw object memory interface + * =========================== + */ + +/* Functions to call the same malloc/realloc/free as used by Python's + object allocator. If WITH_PYMALLOC is enabled, these may differ from + the platform malloc/realloc/free. The Python object allocator is + designed for fast, cache-conscious allocation of many "small" objects, + and with low hidden memory overhead. + + PyObject_Malloc(0) returns a unique non-NULL pointer if possible. + + PyObject_Realloc(NULL, n) acts like PyObject_Malloc(n). + PyObject_Realloc(p != NULL, 0) does not return NULL, or free the memory + at p. + + Returned pointers must be checked for NULL explicitly; no action is + performed on failure other than to return NULL (no warning it printed, no + exception is set, etc). + + For allocating objects, use PyObject_{New, NewVar} instead whenever + possible. The PyObject_{Malloc, Realloc, Free} family is exposed + so that you can exploit Python's small-block allocator for non-object + uses. If you must use these routines to allocate object memory, make sure + the object gets initialized via PyObject_{Init, InitVar} after obtaining + the raw memory. +*/ +PyAPI_FUNC(void *) PyObject_Malloc(size_t); +PyAPI_FUNC(void *) PyObject_Realloc(void *, size_t); +PyAPI_FUNC(void) PyObject_Free(void *); + + +/* Macros */ +#ifdef WITH_PYMALLOC +#ifdef PYMALLOC_DEBUG /* WITH_PYMALLOC && PYMALLOC_DEBUG */ +PyAPI_FUNC(void *) _PyObject_DebugMalloc(size_t nbytes); +PyAPI_FUNC(void *) _PyObject_DebugRealloc(void *p, size_t nbytes); +PyAPI_FUNC(void) _PyObject_DebugFree(void *p); +PyAPI_FUNC(void) _PyObject_DebugDumpAddress(const void *p); +PyAPI_FUNC(void) _PyObject_DebugCheckAddress(const void *p); +PyAPI_FUNC(void) _PyObject_DebugMallocStats(void); +PyAPI_FUNC(void *) _PyObject_DebugMallocApi(char api, size_t nbytes); +PyAPI_FUNC(void *) _PyObject_DebugReallocApi(char api, void *p, size_t nbytes); +PyAPI_FUNC(void) _PyObject_DebugFreeApi(char api, void *p); +PyAPI_FUNC(void) _PyObject_DebugCheckAddressApi(char api, const void *p); +PyAPI_FUNC(void *) _PyMem_DebugMalloc(size_t nbytes); +PyAPI_FUNC(void *) _PyMem_DebugRealloc(void *p, size_t nbytes); +PyAPI_FUNC(void) _PyMem_DebugFree(void *p); +#define PyObject_MALLOC _PyObject_DebugMalloc +#define PyObject_Malloc _PyObject_DebugMalloc +#define PyObject_REALLOC _PyObject_DebugRealloc +#define PyObject_Realloc _PyObject_DebugRealloc +#define PyObject_FREE _PyObject_DebugFree +#define PyObject_Free _PyObject_DebugFree + +#else /* WITH_PYMALLOC && ! PYMALLOC_DEBUG */ +#define PyObject_MALLOC PyObject_Malloc +#define PyObject_REALLOC PyObject_Realloc +#define PyObject_FREE PyObject_Free +#endif + +#else /* ! WITH_PYMALLOC */ +#define PyObject_MALLOC PyMem_MALLOC +#define PyObject_REALLOC PyMem_REALLOC +#define PyObject_FREE PyMem_FREE + +#endif /* WITH_PYMALLOC */ + +#define PyObject_Del PyObject_Free +#define PyObject_DEL PyObject_FREE + +/* for source compatibility with 2.2 */ +#define _PyObject_Del PyObject_Free + +/* + * Generic object allocator interface + * ================================== + */ + +/* Functions */ +PyAPI_FUNC(PyObject *) PyObject_Init(PyObject *, PyTypeObject *); +PyAPI_FUNC(PyVarObject *) PyObject_InitVar(PyVarObject *, + PyTypeObject *, Py_ssize_t); +PyAPI_FUNC(PyObject *) _PyObject_New(PyTypeObject *); +PyAPI_FUNC(PyVarObject *) _PyObject_NewVar(PyTypeObject *, Py_ssize_t); + +#define PyObject_New(type, typeobj) \ + ( (type *) _PyObject_New(typeobj) ) +#define PyObject_NewVar(type, typeobj, n) \ + ( (type *) _PyObject_NewVar((typeobj), (n)) ) + +/* Macros trading binary compatibility for speed. See also pymem.h. + Note that these macros expect non-NULL object pointers.*/ +#define PyObject_INIT(op, typeobj) \ + ( Py_TYPE(op) = (typeobj), _Py_NewReference((PyObject *)(op)), (op) ) +#define PyObject_INIT_VAR(op, typeobj, size) \ + ( Py_SIZE(op) = (size), PyObject_INIT((op), (typeobj)) ) + +#define _PyObject_SIZE(typeobj) ( (typeobj)->tp_basicsize ) + +/* _PyObject_VAR_SIZE returns the number of bytes (as size_t) allocated for a + vrbl-size object with nitems items, exclusive of gc overhead (if any). The + value is rounded up to the closest multiple of sizeof(void *), in order to + ensure that pointer fields at the end of the object are correctly aligned + for the platform (this is of special importance for subclasses of, e.g., + str or long, so that pointers can be stored after the embedded data). + + Note that there's no memory wastage in doing this, as malloc has to + return (at worst) pointer-aligned memory anyway. +*/ +#if ((SIZEOF_VOID_P - 1) & SIZEOF_VOID_P) != 0 +# error "_PyObject_VAR_SIZE requires SIZEOF_VOID_P be a power of 2" +#endif + +#define _PyObject_VAR_SIZE(typeobj, nitems) \ + (size_t) \ + ( ( (typeobj)->tp_basicsize + \ + (nitems)*(typeobj)->tp_itemsize + \ + (SIZEOF_VOID_P - 1) \ + ) & ~(SIZEOF_VOID_P - 1) \ + ) + +#define PyObject_NEW(type, typeobj) \ +( (type *) PyObject_Init( \ + (PyObject *) PyObject_MALLOC( _PyObject_SIZE(typeobj) ), (typeobj)) ) + +#define PyObject_NEW_VAR(type, typeobj, n) \ +( (type *) PyObject_InitVar( \ + (PyVarObject *) PyObject_MALLOC(_PyObject_VAR_SIZE((typeobj),(n)) ),\ + (typeobj), (n)) ) + +/* This example code implements an object constructor with a custom + allocator, where PyObject_New is inlined, and shows the important + distinction between two steps (at least): + 1) the actual allocation of the object storage; + 2) the initialization of the Python specific fields + in this storage with PyObject_{Init, InitVar}. + + PyObject * + YourObject_New(...) + { + PyObject *op; + + op = (PyObject *) Your_Allocator(_PyObject_SIZE(YourTypeStruct)); + if (op == NULL) + return PyErr_NoMemory(); + + PyObject_Init(op, &YourTypeStruct); + + op->ob_field = value; + ... + return op; + } + + Note that in C++, the use of the new operator usually implies that + the 1st step is performed automatically for you, so in a C++ class + constructor you would start directly with PyObject_Init/InitVar +*/ + +/* + * Garbage Collection Support + * ========================== + */ + +/* C equivalent of gc.collect(). */ +PyAPI_FUNC(Py_ssize_t) PyGC_Collect(void); + +/* Test if a type has a GC head */ +#define PyType_IS_GC(t) PyType_HasFeature((t), Py_TPFLAGS_HAVE_GC) + +/* Test if an object has a GC head */ +#define PyObject_IS_GC(o) (PyType_IS_GC(Py_TYPE(o)) && \ + (Py_TYPE(o)->tp_is_gc == NULL || Py_TYPE(o)->tp_is_gc(o))) + +PyAPI_FUNC(PyVarObject *) _PyObject_GC_Resize(PyVarObject *, Py_ssize_t); +#define PyObject_GC_Resize(type, op, n) \ + ( (type *) _PyObject_GC_Resize((PyVarObject *)(op), (n)) ) + +/* for source compatibility with 2.2 */ +#define _PyObject_GC_Del PyObject_GC_Del + +/* GC information is stored BEFORE the object structure. */ +typedef union _gc_head { + struct { + union _gc_head *gc_next; + union _gc_head *gc_prev; + Py_ssize_t gc_refs; + } gc; + long double dummy; /* force worst-case alignment */ +} PyGC_Head; + +extern PyGC_Head *_PyGC_generation0; + +#define _Py_AS_GC(o) ((PyGC_Head *)(o)-1) + +#define _PyGC_REFS_UNTRACKED (-2) +#define _PyGC_REFS_REACHABLE (-3) +#define _PyGC_REFS_TENTATIVELY_UNREACHABLE (-4) + +/* Tell the GC to track this object. NB: While the object is tracked the + * collector it must be safe to call the ob_traverse method. */ +#define _PyObject_GC_TRACK(o) do { \ + PyGC_Head *g = _Py_AS_GC(o); \ + if (g->gc.gc_refs != _PyGC_REFS_UNTRACKED) \ + Py_FatalError("GC object already tracked"); \ + g->gc.gc_refs = _PyGC_REFS_REACHABLE; \ + g->gc.gc_next = _PyGC_generation0; \ + g->gc.gc_prev = _PyGC_generation0->gc.gc_prev; \ + g->gc.gc_prev->gc.gc_next = g; \ + _PyGC_generation0->gc.gc_prev = g; \ + } while (0); + +/* Tell the GC to stop tracking this object. + * gc_next doesn't need to be set to NULL, but doing so is a good + * way to provoke memory errors if calling code is confused. + */ +#define _PyObject_GC_UNTRACK(o) do { \ + PyGC_Head *g = _Py_AS_GC(o); \ + assert(g->gc.gc_refs != _PyGC_REFS_UNTRACKED); \ + g->gc.gc_refs = _PyGC_REFS_UNTRACKED; \ + g->gc.gc_prev->gc.gc_next = g->gc.gc_next; \ + g->gc.gc_next->gc.gc_prev = g->gc.gc_prev; \ + g->gc.gc_next = NULL; \ + } while (0); + +/* True if the object is currently tracked by the GC. */ +#define _PyObject_GC_IS_TRACKED(o) \ + ((_Py_AS_GC(o))->gc.gc_refs != _PyGC_REFS_UNTRACKED) + +/* True if the object may be tracked by the GC in the future, or already is. + This can be useful to implement some optimizations. */ +#define _PyObject_GC_MAY_BE_TRACKED(obj) \ + (PyObject_IS_GC(obj) && \ + (!PyTuple_CheckExact(obj) || _PyObject_GC_IS_TRACKED(obj))) + + +PyAPI_FUNC(PyObject *) _PyObject_GC_Malloc(size_t); +PyAPI_FUNC(PyObject *) _PyObject_GC_New(PyTypeObject *); +PyAPI_FUNC(PyVarObject *) _PyObject_GC_NewVar(PyTypeObject *, Py_ssize_t); +PyAPI_FUNC(void) PyObject_GC_Track(void *); +PyAPI_FUNC(void) PyObject_GC_UnTrack(void *); +PyAPI_FUNC(void) PyObject_GC_Del(void *); + +#define PyObject_GC_New(type, typeobj) \ + ( (type *) _PyObject_GC_New(typeobj) ) +#define PyObject_GC_NewVar(type, typeobj, n) \ + ( (type *) _PyObject_GC_NewVar((typeobj), (n)) ) + + +/* Utility macro to help write tp_traverse functions. + * To use this macro, the tp_traverse function must name its arguments + * "visit" and "arg". This is intended to keep tp_traverse functions + * looking as much alike as possible. + */ +#define Py_VISIT(op) \ + do { \ + if (op) { \ + int vret = visit((PyObject *)(op), arg); \ + if (vret) \ + return vret; \ + } \ + } while (0) + +/* This is here for the sake of backwards compatibility. Extensions that + * use the old GC API will still compile but the objects will not be + * tracked by the GC. */ +#define PyGC_HEAD_SIZE 0 +#define PyObject_GC_Init(op) +#define PyObject_GC_Fini(op) +#define PyObject_AS_GC(op) (op) +#define PyObject_FROM_GC(op) (op) + + +/* Test if a type supports weak references */ +#define PyType_SUPPORTS_WEAKREFS(t) \ + (PyType_HasFeature((t), Py_TPFLAGS_HAVE_WEAKREFS) \ + && ((t)->tp_weaklistoffset > 0)) + +#define PyObject_GET_WEAKREFS_LISTPTR(o) \ + ((PyObject **) (((char *) (o)) + Py_TYPE(o)->tp_weaklistoffset)) + +#ifdef __cplusplus +} +#endif +#endif /* !Py_OBJIMPL_H */ diff --git a/python/include/opcode.h b/python/include/opcode.h new file mode 100644 index 00000000..9764109a --- /dev/null +++ b/python/include/opcode.h @@ -0,0 +1,162 @@ +#ifndef Py_OPCODE_H +#define Py_OPCODE_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* Instruction opcodes for compiled code */ + +#define STOP_CODE 0 +#define POP_TOP 1 +#define ROT_TWO 2 +#define ROT_THREE 3 +#define DUP_TOP 4 +#define ROT_FOUR 5 +#define NOP 9 + +#define UNARY_POSITIVE 10 +#define UNARY_NEGATIVE 11 +#define UNARY_NOT 12 +#define UNARY_CONVERT 13 + +#define UNARY_INVERT 15 + +#define BINARY_POWER 19 + +#define BINARY_MULTIPLY 20 +#define BINARY_DIVIDE 21 +#define BINARY_MODULO 22 +#define BINARY_ADD 23 +#define BINARY_SUBTRACT 24 +#define BINARY_SUBSCR 25 +#define BINARY_FLOOR_DIVIDE 26 +#define BINARY_TRUE_DIVIDE 27 +#define INPLACE_FLOOR_DIVIDE 28 +#define INPLACE_TRUE_DIVIDE 29 + +#define SLICE 30 +/* Also uses 31-33 */ + +#define STORE_SLICE 40 +/* Also uses 41-43 */ + +#define DELETE_SLICE 50 +/* Also uses 51-53 */ + +#define STORE_MAP 54 +#define INPLACE_ADD 55 +#define INPLACE_SUBTRACT 56 +#define INPLACE_MULTIPLY 57 +#define INPLACE_DIVIDE 58 +#define INPLACE_MODULO 59 +#define STORE_SUBSCR 60 +#define DELETE_SUBSCR 61 + +#define BINARY_LSHIFT 62 +#define BINARY_RSHIFT 63 +#define BINARY_AND 64 +#define BINARY_XOR 65 +#define BINARY_OR 66 +#define INPLACE_POWER 67 +#define GET_ITER 68 + +#define PRINT_EXPR 70 +#define PRINT_ITEM 71 +#define PRINT_NEWLINE 72 +#define PRINT_ITEM_TO 73 +#define PRINT_NEWLINE_TO 74 +#define INPLACE_LSHIFT 75 +#define INPLACE_RSHIFT 76 +#define INPLACE_AND 77 +#define INPLACE_XOR 78 +#define INPLACE_OR 79 +#define BREAK_LOOP 80 +#define WITH_CLEANUP 81 +#define LOAD_LOCALS 82 +#define RETURN_VALUE 83 +#define IMPORT_STAR 84 +#define EXEC_STMT 85 +#define YIELD_VALUE 86 +#define POP_BLOCK 87 +#define END_FINALLY 88 +#define BUILD_CLASS 89 + +#define HAVE_ARGUMENT 90 /* Opcodes from here have an argument: */ + +#define STORE_NAME 90 /* Index in name list */ +#define DELETE_NAME 91 /* "" */ +#define UNPACK_SEQUENCE 92 /* Number of sequence items */ +#define FOR_ITER 93 +#define LIST_APPEND 94 + +#define STORE_ATTR 95 /* Index in name list */ +#define DELETE_ATTR 96 /* "" */ +#define STORE_GLOBAL 97 /* "" */ +#define DELETE_GLOBAL 98 /* "" */ +#define DUP_TOPX 99 /* number of items to duplicate */ +#define LOAD_CONST 100 /* Index in const list */ +#define LOAD_NAME 101 /* Index in name list */ +#define BUILD_TUPLE 102 /* Number of tuple items */ +#define BUILD_LIST 103 /* Number of list items */ +#define BUILD_SET 104 /* Number of set items */ +#define BUILD_MAP 105 /* Always zero for now */ +#define LOAD_ATTR 106 /* Index in name list */ +#define COMPARE_OP 107 /* Comparison operator */ +#define IMPORT_NAME 108 /* Index in name list */ +#define IMPORT_FROM 109 /* Index in name list */ +#define JUMP_FORWARD 110 /* Number of bytes to skip */ + +#define JUMP_IF_FALSE_OR_POP 111 /* Target byte offset from beginning + of code */ +#define JUMP_IF_TRUE_OR_POP 112 /* "" */ +#define JUMP_ABSOLUTE 113 /* "" */ +#define POP_JUMP_IF_FALSE 114 /* "" */ +#define POP_JUMP_IF_TRUE 115 /* "" */ + +#define LOAD_GLOBAL 116 /* Index in name list */ + +#define CONTINUE_LOOP 119 /* Start of loop (absolute) */ +#define SETUP_LOOP 120 /* Target address (relative) */ +#define SETUP_EXCEPT 121 /* "" */ +#define SETUP_FINALLY 122 /* "" */ + +#define LOAD_FAST 124 /* Local variable number */ +#define STORE_FAST 125 /* Local variable number */ +#define DELETE_FAST 126 /* Local variable number */ + +#define RAISE_VARARGS 130 /* Number of raise arguments (1, 2 or 3) */ +/* CALL_FUNCTION_XXX opcodes defined below depend on this definition */ +#define CALL_FUNCTION 131 /* #args + (#kwargs<<8) */ +#define MAKE_FUNCTION 132 /* #defaults */ +#define BUILD_SLICE 133 /* Number of items */ + +#define MAKE_CLOSURE 134 /* #free vars */ +#define LOAD_CLOSURE 135 /* Load free variable from closure */ +#define LOAD_DEREF 136 /* Load and dereference from closure cell */ +#define STORE_DEREF 137 /* Store into cell */ + +/* The next 3 opcodes must be contiguous and satisfy + (CALL_FUNCTION_VAR - CALL_FUNCTION) & 3 == 1 */ +#define CALL_FUNCTION_VAR 140 /* #args + (#kwargs<<8) */ +#define CALL_FUNCTION_KW 141 /* #args + (#kwargs<<8) */ +#define CALL_FUNCTION_VAR_KW 142 /* #args + (#kwargs<<8) */ + +#define SETUP_WITH 143 + +/* Support for opargs more than 16 bits long */ +#define EXTENDED_ARG 145 + +#define SET_ADD 146 +#define MAP_ADD 147 + + +enum cmp_op {PyCmp_LT=Py_LT, PyCmp_LE=Py_LE, PyCmp_EQ=Py_EQ, PyCmp_NE=Py_NE, PyCmp_GT=Py_GT, PyCmp_GE=Py_GE, + PyCmp_IN, PyCmp_NOT_IN, PyCmp_IS, PyCmp_IS_NOT, PyCmp_EXC_MATCH, PyCmp_BAD}; + +#define HAS_ARG(op) ((op) >= HAVE_ARGUMENT) + +#ifdef __cplusplus +} +#endif +#endif /* !Py_OPCODE_H */ diff --git a/python/include/osdefs.h b/python/include/osdefs.h new file mode 100644 index 00000000..69376593 --- /dev/null +++ b/python/include/osdefs.h @@ -0,0 +1,55 @@ +#ifndef Py_OSDEFS_H +#define Py_OSDEFS_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* Operating system dependencies */ + +/* Mod by chrish: QNX has WATCOM, but isn't DOS */ +#if !defined(__QNX__) +#if defined(MS_WINDOWS) || defined(__BORLANDC__) || defined(__WATCOMC__) || defined(__DJGPP__) || defined(PYOS_OS2) +#if defined(PYOS_OS2) && defined(PYCC_GCC) +#define MAXPATHLEN 260 +#define SEP '/' +#define ALTSEP '\\' +#else +#define SEP '\\' +#define ALTSEP '/' +#define MAXPATHLEN 256 +#endif +#define DELIM ';' +#endif +#endif + +#ifdef RISCOS +#define SEP '.' +#define MAXPATHLEN 256 +#define DELIM ',' +#endif + + +/* Filename separator */ +#ifndef SEP +#define SEP '/' +#endif + +/* Max pathname length */ +#ifndef MAXPATHLEN +#if defined(PATH_MAX) && PATH_MAX > 1024 +#define MAXPATHLEN PATH_MAX +#else +#define MAXPATHLEN 1024 +#endif +#endif + +/* Search path entry delimiter */ +#ifndef DELIM +#define DELIM ':' +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_OSDEFS_H */ diff --git a/python/include/parsetok.h b/python/include/parsetok.h new file mode 100644 index 00000000..ec1eb6ff --- /dev/null +++ b/python/include/parsetok.h @@ -0,0 +1,64 @@ + +/* Parser-tokenizer link interface */ + +#ifndef Py_PARSETOK_H +#define Py_PARSETOK_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + int error; + const char *filename; + int lineno; + int offset; + char *text; + int token; + int expected; +} perrdetail; + +#if 0 +#define PyPARSE_YIELD_IS_KEYWORD 0x0001 +#endif + +#define PyPARSE_DONT_IMPLY_DEDENT 0x0002 + +#if 0 +#define PyPARSE_WITH_IS_KEYWORD 0x0003 +#endif + +#define PyPARSE_PRINT_IS_FUNCTION 0x0004 +#define PyPARSE_UNICODE_LITERALS 0x0008 + + + +PyAPI_FUNC(node *) PyParser_ParseString(const char *, grammar *, int, + perrdetail *); +PyAPI_FUNC(node *) PyParser_ParseFile (FILE *, const char *, grammar *, int, + char *, char *, perrdetail *); + +PyAPI_FUNC(node *) PyParser_ParseStringFlags(const char *, grammar *, int, + perrdetail *, int); +PyAPI_FUNC(node *) PyParser_ParseFileFlags(FILE *, const char *, grammar *, + int, char *, char *, + perrdetail *, int); +PyAPI_FUNC(node *) PyParser_ParseFileFlagsEx(FILE *, const char *, grammar *, + int, char *, char *, + perrdetail *, int *); + +PyAPI_FUNC(node *) PyParser_ParseStringFlagsFilename(const char *, + const char *, + grammar *, int, + perrdetail *, int); +PyAPI_FUNC(node *) PyParser_ParseStringFlagsFilenameEx(const char *, + const char *, + grammar *, int, + perrdetail *, int *); + +/* Note that he following function is defined in pythonrun.c not parsetok.c. */ +PyAPI_FUNC(void) PyParser_SetError(perrdetail *); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_PARSETOK_H */ diff --git a/python/include/patchlevel.h b/python/include/patchlevel.h new file mode 100644 index 00000000..0a05696c --- /dev/null +++ b/python/include/patchlevel.h @@ -0,0 +1,43 @@ + +/* Newfangled version identification scheme. + + This scheme was added in Python 1.5.2b2; before that time, only PATCHLEVEL + was available. To test for presence of the scheme, test for + defined(PY_MAJOR_VERSION). + + When the major or minor version changes, the VERSION variable in + configure.in must also be changed. + + There is also (independent) API version information in modsupport.h. +*/ + +/* Values for PY_RELEASE_LEVEL */ +#define PY_RELEASE_LEVEL_ALPHA 0xA +#define PY_RELEASE_LEVEL_BETA 0xB +#define PY_RELEASE_LEVEL_GAMMA 0xC /* For release candidates */ +#define PY_RELEASE_LEVEL_FINAL 0xF /* Serial should be 0 here */ + /* Higher for patch releases */ + +/* Version parsed out into numeric values */ +/*--start constants--*/ +#define PY_MAJOR_VERSION 2 +#define PY_MINOR_VERSION 7 +#define PY_MICRO_VERSION 3 +#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_FINAL +#define PY_RELEASE_SERIAL 0 + +/* Version as a string */ +#define PY_VERSION "2.7.3" +/*--end constants--*/ + +/* Subversion Revision number of this file (not of the repository). Empty + since Mercurial migration. */ +#define PY_PATCHLEVEL_REVISION "" + +/* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. + Use this for numeric comparisons, e.g. #if PY_VERSION_HEX >= ... */ +#define PY_VERSION_HEX ((PY_MAJOR_VERSION << 24) | \ + (PY_MINOR_VERSION << 16) | \ + (PY_MICRO_VERSION << 8) | \ + (PY_RELEASE_LEVEL << 4) | \ + (PY_RELEASE_SERIAL << 0)) diff --git a/python/include/pgen.h b/python/include/pgen.h new file mode 100644 index 00000000..8a325ed0 --- /dev/null +++ b/python/include/pgen.h @@ -0,0 +1,18 @@ +#ifndef Py_PGEN_H +#define Py_PGEN_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* Parser generator interface */ + +extern grammar *meta_grammar(void); + +struct _node; +extern grammar *pgen(struct _node *); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_PGEN_H */ diff --git a/python/include/pgenheaders.h b/python/include/pgenheaders.h new file mode 100644 index 00000000..2049ae32 --- /dev/null +++ b/python/include/pgenheaders.h @@ -0,0 +1,42 @@ +#ifndef Py_PGENHEADERS_H +#define Py_PGENHEADERS_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* Include files and extern declarations used by most of the parser. */ + +#include "Python.h" + +PyAPI_FUNC(void) PySys_WriteStdout(const char *format, ...) + Py_GCC_ATTRIBUTE((format(printf, 1, 2))); +PyAPI_FUNC(void) PySys_WriteStderr(const char *format, ...) + Py_GCC_ATTRIBUTE((format(printf, 1, 2))); + +#define addarc _Py_addarc +#define addbit _Py_addbit +#define adddfa _Py_adddfa +#define addfirstsets _Py_addfirstsets +#define addlabel _Py_addlabel +#define addstate _Py_addstate +#define delbitset _Py_delbitset +#define dumptree _Py_dumptree +#define findlabel _Py_findlabel +#define mergebitset _Py_mergebitset +#define meta_grammar _Py_meta_grammar +#define newbitset _Py_newbitset +#define newgrammar _Py_newgrammar +#define pgen _Py_pgen +#define printgrammar _Py_printgrammar +#define printnonterminals _Py_printnonterminals +#define printtree _Py_printtree +#define samebitset _Py_samebitset +#define showtree _Py_showtree +#define tok_dump _Py_tok_dump +#define translatelabels _Py_translatelabels + +#ifdef __cplusplus +} +#endif +#endif /* !Py_PGENHEADERS_H */ diff --git a/python/include/py_curses.h b/python/include/py_curses.h new file mode 100644 index 00000000..657816cb --- /dev/null +++ b/python/include/py_curses.h @@ -0,0 +1,176 @@ + +#ifndef Py_CURSES_H +#define Py_CURSES_H + +#ifdef __APPLE__ +/* +** On Mac OS X 10.2 [n]curses.h and stdlib.h use different guards +** against multiple definition of wchar_t. +*/ +#ifdef _BSD_WCHAR_T_DEFINED_ +#define _WCHAR_T +#endif + +/* the following define is necessary for OS X 10.6; without it, the + Apple-supplied ncurses.h sets NCURSES_OPAQUE to 1, and then Python + can't get at the WINDOW flags field. */ +#define NCURSES_OPAQUE 0 +#endif /* __APPLE__ */ + +#ifdef __FreeBSD__ +/* +** On FreeBSD, [n]curses.h and stdlib.h/wchar.h use different guards +** against multiple definition of wchar_t and wint_t. +*/ +#ifdef _XOPEN_SOURCE_EXTENDED +#ifndef __FreeBSD_version +#include +#endif +#if __FreeBSD_version >= 500000 +#ifndef __wchar_t +#define __wchar_t +#endif +#ifndef __wint_t +#define __wint_t +#endif +#else +#ifndef _WCHAR_T +#define _WCHAR_T +#endif +#ifndef _WINT_T +#define _WINT_T +#endif +#endif +#endif +#endif + +#ifdef HAVE_NCURSES_H +#include +#else +#include +#ifdef HAVE_TERM_H +/* for tigetstr, which is not declared in SysV curses */ +#include +#endif +#endif + +#ifdef HAVE_NCURSES_H +/* configure was checking , but we will + use , which has all these features. */ +#ifndef WINDOW_HAS_FLAGS +#define WINDOW_HAS_FLAGS 1 +#endif +#ifndef MVWDELCH_IS_EXPRESSION +#define MVWDELCH_IS_EXPRESSION 1 +#endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define PyCurses_API_pointers 4 + +/* Type declarations */ + +typedef struct { + PyObject_HEAD + WINDOW *win; +} PyCursesWindowObject; + +#define PyCursesWindow_Check(v) (Py_TYPE(v) == &PyCursesWindow_Type) + +#define PyCurses_CAPSULE_NAME "_curses._C_API" + + +#ifdef CURSES_MODULE +/* This section is used when compiling _cursesmodule.c */ + +#else +/* This section is used in modules that use the _cursesmodule API */ + +static void **PyCurses_API; + +#define PyCursesWindow_Type (*(PyTypeObject *) PyCurses_API[0]) +#define PyCursesSetupTermCalled {if (! ((int (*)(void))PyCurses_API[1]) () ) return NULL;} +#define PyCursesInitialised {if (! ((int (*)(void))PyCurses_API[2]) () ) return NULL;} +#define PyCursesInitialisedColor {if (! ((int (*)(void))PyCurses_API[3]) () ) return NULL;} + +#define import_curses() \ + PyCurses_API = (void **)PyCapsule_Import(PyCurses_CAPSULE_NAME, 1); + +#endif + +/* general error messages */ +static char *catchall_ERR = "curses function returned ERR"; +static char *catchall_NULL = "curses function returned NULL"; + +/* Function Prototype Macros - They are ugly but very, very useful. ;-) + + X - function name + TYPE - parameter Type + ERGSTR - format string for construction of the return value + PARSESTR - format string for argument parsing + */ + +#define NoArgNoReturnFunction(X) \ +static PyObject *PyCurses_ ## X (PyObject *self) \ +{ \ + PyCursesInitialised \ + return PyCursesCheckERR(X(), # X); } + +#define NoArgOrFlagNoReturnFunction(X) \ +static PyObject *PyCurses_ ## X (PyObject *self, PyObject *args) \ +{ \ + int flag = 0; \ + PyCursesInitialised \ + switch(PyTuple_Size(args)) { \ + case 0: \ + return PyCursesCheckERR(X(), # X); \ + case 1: \ + if (!PyArg_ParseTuple(args, "i;True(1) or False(0)", &flag)) return NULL; \ + if (flag) return PyCursesCheckERR(X(), # X); \ + else return PyCursesCheckERR(no ## X (), # X); \ + default: \ + PyErr_SetString(PyExc_TypeError, # X " requires 0 or 1 arguments"); \ + return NULL; } } + +#define NoArgReturnIntFunction(X) \ +static PyObject *PyCurses_ ## X (PyObject *self) \ +{ \ + PyCursesInitialised \ + return PyInt_FromLong((long) X()); } + + +#define NoArgReturnStringFunction(X) \ +static PyObject *PyCurses_ ## X (PyObject *self) \ +{ \ + PyCursesInitialised \ + return PyString_FromString(X()); } + +#define NoArgTrueFalseFunction(X) \ +static PyObject *PyCurses_ ## X (PyObject *self) \ +{ \ + PyCursesInitialised \ + if (X () == FALSE) { \ + Py_INCREF(Py_False); \ + return Py_False; \ + } \ + Py_INCREF(Py_True); \ + return Py_True; } + +#define NoArgNoReturnVoidFunction(X) \ +static PyObject *PyCurses_ ## X (PyObject *self) \ +{ \ + PyCursesInitialised \ + X(); \ + Py_INCREF(Py_None); \ + return Py_None; } + +#ifdef __cplusplus +} +#endif + +#endif /* !defined(Py_CURSES_H) */ + + diff --git a/python/include/pyarena.h b/python/include/pyarena.h new file mode 100644 index 00000000..5f193fec --- /dev/null +++ b/python/include/pyarena.h @@ -0,0 +1,62 @@ +/* An arena-like memory interface for the compiler. + */ + +#ifndef Py_PYARENA_H +#define Py_PYARENA_H + +#ifdef __cplusplus +extern "C" { +#endif + + typedef struct _arena PyArena; + + /* PyArena_New() and PyArena_Free() create a new arena and free it, + respectively. Once an arena has been created, it can be used + to allocate memory via PyArena_Malloc(). Pointers to PyObject can + also be registered with the arena via PyArena_AddPyObject(), and the + arena will ensure that the PyObjects stay alive at least until + PyArena_Free() is called. When an arena is freed, all the memory it + allocated is freed, the arena releases internal references to registered + PyObject*, and none of its pointers are valid. + XXX (tim) What does "none of its pointers are valid" mean? Does it + XXX mean that pointers previously obtained via PyArena_Malloc() are + XXX no longer valid? (That's clearly true, but not sure that's what + XXX the text is trying to say.) + + PyArena_New() returns an arena pointer. On error, it + returns a negative number and sets an exception. + XXX (tim): Not true. On error, PyArena_New() actually returns NULL, + XXX and looks like it may or may not set an exception (e.g., if the + XXX internal PyList_New(0) returns NULL, PyArena_New() passes that on + XXX and an exception is set; OTOH, if the internal + XXX block_new(DEFAULT_BLOCK_SIZE) returns NULL, that's passed on but + XXX an exception is not set in that case). + */ + PyAPI_FUNC(PyArena *) PyArena_New(void); + PyAPI_FUNC(void) PyArena_Free(PyArena *); + + /* Mostly like malloc(), return the address of a block of memory spanning + * `size` bytes, or return NULL (without setting an exception) if enough + * new memory can't be obtained. Unlike malloc(0), PyArena_Malloc() with + * size=0 does not guarantee to return a unique pointer (the pointer + * returned may equal one or more other pointers obtained from + * PyArena_Malloc()). + * Note that pointers obtained via PyArena_Malloc() must never be passed to + * the system free() or realloc(), or to any of Python's similar memory- + * management functions. PyArena_Malloc()-obtained pointers remain valid + * until PyArena_Free(ar) is called, at which point all pointers obtained + * from the arena `ar` become invalid simultaneously. + */ + PyAPI_FUNC(void *) PyArena_Malloc(PyArena *, size_t size); + + /* This routine isn't a proper arena allocation routine. It takes + * a PyObject* and records it so that it can be DECREFed when the + * arena is freed. + */ + PyAPI_FUNC(int) PyArena_AddPyObject(PyArena *, PyObject *); + +#ifdef __cplusplus +} +#endif + +#endif /* !Py_PYARENA_H */ diff --git a/python/include/pycapsule.h b/python/include/pycapsule.h new file mode 100644 index 00000000..cd682fc7 --- /dev/null +++ b/python/include/pycapsule.h @@ -0,0 +1,56 @@ + +/* Capsule objects let you wrap a C "void *" pointer in a Python + object. They're a way of passing data through the Python interpreter + without creating your own custom type. + + Capsules are used for communication between extension modules. + They provide a way for an extension module to export a C interface + to other extension modules, so that extension modules can use the + Python import mechanism to link to one another. + + For more information, please see "c-api/capsule.html" in the + documentation. +*/ + +#ifndef Py_CAPSULE_H +#define Py_CAPSULE_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_DATA(PyTypeObject) PyCapsule_Type; + +typedef void (*PyCapsule_Destructor)(PyObject *); + +#define PyCapsule_CheckExact(op) (Py_TYPE(op) == &PyCapsule_Type) + + +PyAPI_FUNC(PyObject *) PyCapsule_New( + void *pointer, + const char *name, + PyCapsule_Destructor destructor); + +PyAPI_FUNC(void *) PyCapsule_GetPointer(PyObject *capsule, const char *name); + +PyAPI_FUNC(PyCapsule_Destructor) PyCapsule_GetDestructor(PyObject *capsule); + +PyAPI_FUNC(const char *) PyCapsule_GetName(PyObject *capsule); + +PyAPI_FUNC(void *) PyCapsule_GetContext(PyObject *capsule); + +PyAPI_FUNC(int) PyCapsule_IsValid(PyObject *capsule, const char *name); + +PyAPI_FUNC(int) PyCapsule_SetPointer(PyObject *capsule, void *pointer); + +PyAPI_FUNC(int) PyCapsule_SetDestructor(PyObject *capsule, PyCapsule_Destructor destructor); + +PyAPI_FUNC(int) PyCapsule_SetName(PyObject *capsule, const char *name); + +PyAPI_FUNC(int) PyCapsule_SetContext(PyObject *capsule, void *context); + +PyAPI_FUNC(void *) PyCapsule_Import(const char *name, int no_block); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_CAPSULE_H */ diff --git a/python/include/pyconfig.h b/python/include/pyconfig.h new file mode 100644 index 00000000..1cfc59b8 --- /dev/null +++ b/python/include/pyconfig.h @@ -0,0 +1,759 @@ +#ifndef Py_CONFIG_H +#define Py_CONFIG_H + +/* pyconfig.h. NOT Generated automatically by configure. + +This is a manually maintained version used for the Watcom, +Borland and Microsoft Visual C++ compilers. It is a +standard part of the Python distribution. + +WINDOWS DEFINES: +The code specific to Windows should be wrapped around one of +the following #defines + +MS_WIN64 - Code specific to the MS Win64 API +MS_WIN32 - Code specific to the MS Win32 (and Win64) API (obsolete, this covers all supported APIs) +MS_WINDOWS - Code specific to Windows, but all versions. +MS_WINCE - Code specific to Windows CE +Py_ENABLE_SHARED - Code if the Python core is built as a DLL. + +Also note that neither "_M_IX86" or "_MSC_VER" should be used for +any purpose other than "Windows Intel x86 specific" and "Microsoft +compiler specific". Therefore, these should be very rare. + + +NOTE: The following symbols are deprecated: +NT, USE_DL_EXPORT, USE_DL_IMPORT, DL_EXPORT, DL_IMPORT +MS_CORE_DLL. + +WIN32 is still required for the locale module. + +*/ + +#ifdef _WIN32_WCE +#define MS_WINCE +#endif + +/* Deprecated USE_DL_EXPORT macro - please use Py_BUILD_CORE */ +#ifdef USE_DL_EXPORT +# define Py_BUILD_CORE +#endif /* USE_DL_EXPORT */ + +/* Visual Studio 2005 introduces deprecation warnings for + "insecure" and POSIX functions. The insecure functions should + be replaced by *_s versions (according to Microsoft); the + POSIX functions by _* versions (which, according to Microsoft, + would be ISO C conforming). Neither renaming is feasible, so + we just silence the warnings. */ + +#ifndef _CRT_SECURE_NO_DEPRECATE +#define _CRT_SECURE_NO_DEPRECATE 1 +#endif +#ifndef _CRT_NONSTDC_NO_DEPRECATE +#define _CRT_NONSTDC_NO_DEPRECATE 1 +#endif + +/* Windows CE does not have these */ +#ifndef MS_WINCE +#define HAVE_IO_H +#define HAVE_SYS_UTIME_H +#define HAVE_TEMPNAM +#define HAVE_TMPFILE +#define HAVE_TMPNAM +#define HAVE_CLOCK +#define HAVE_STRERROR +#endif + +#ifdef HAVE_IO_H +#include +#endif + +#define HAVE_HYPOT +#define HAVE_STRFTIME +#define DONT_HAVE_SIG_ALARM +#define DONT_HAVE_SIG_PAUSE +#define LONG_BIT 32 +#define WORD_BIT 32 +#define PREFIX "" +#define EXEC_PREFIX "" + +#define MS_WIN32 /* only support win32 and greater. */ +#define MS_WINDOWS +#ifndef PYTHONPATH +# define PYTHONPATH ".\\DLLs;.\\lib;.\\lib\\plat-win;.\\lib\\lib-tk" +#endif +#define NT_THREADS +#define WITH_THREAD +#ifndef NETSCAPE_PI +#define USE_SOCKET +#endif + +/* CE6 doesn't have strdup() but _strdup(). Assume the same for earlier versions. */ +#if defined(MS_WINCE) +# include +# define strdup _strdup +#endif + +#ifdef MS_WINCE +/* Windows CE does not support environment variables */ +#define getenv(v) (NULL) +#define environ (NULL) +#endif + +/* Compiler specific defines */ + +/* ------------------------------------------------------------------------*/ +/* Microsoft C defines _MSC_VER */ +#ifdef _MSC_VER + +/* We want COMPILER to expand to a string containing _MSC_VER's *value*. + * This is horridly tricky, because the stringization operator only works + * on macro arguments, and doesn't evaluate macros passed *as* arguments. + * Attempts simpler than the following appear doomed to produce "_MSC_VER" + * literally in the string. + */ +#define _Py_PASTE_VERSION(SUFFIX) \ + ("[MSC v." _Py_STRINGIZE(_MSC_VER) " " SUFFIX "]") +/* e.g., this produces, after compile-time string catenation, + * ("[MSC v.1200 32 bit (Intel)]") + * + * _Py_STRINGIZE(_MSC_VER) expands to + * _Py_STRINGIZE1((_MSC_VER)) expands to + * _Py_STRINGIZE2(_MSC_VER) but as this call is the result of token-pasting + * it's scanned again for macros and so further expands to (under MSVC 6) + * _Py_STRINGIZE2(1200) which then expands to + * "1200" + */ +#define _Py_STRINGIZE(X) _Py_STRINGIZE1((X)) +#define _Py_STRINGIZE1(X) _Py_STRINGIZE2 ## X +#define _Py_STRINGIZE2(X) #X + +/* MSVC defines _WINxx to differentiate the windows platform types + + Note that for compatibility reasons _WIN32 is defined on Win32 + *and* on Win64. For the same reasons, in Python, MS_WIN32 is + defined on Win32 *and* Win64. Win32 only code must therefore be + guarded as follows: + #if defined(MS_WIN32) && !defined(MS_WIN64) + Some modules are disabled on Itanium processors, therefore we + have MS_WINI64 set for those targets, otherwise MS_WINX64 +*/ +#ifdef _WIN64 +#define MS_WIN64 +#endif + +/* set the COMPILER */ +#ifdef MS_WIN64 +#if defined(_M_IA64) +#define COMPILER _Py_PASTE_VERSION("64 bit (Itanium)") +#define MS_WINI64 +#elif defined(_M_X64) || defined(_M_AMD64) +#define COMPILER _Py_PASTE_VERSION("64 bit (AMD64)") +#define MS_WINX64 +#else +#define COMPILER _Py_PASTE_VERSION("64 bit (Unknown)") +#endif +#endif /* MS_WIN64 */ + +/* set the version macros for the windows headers */ +#ifdef MS_WINX64 +/* 64 bit only runs on XP or greater */ +#define Py_WINVER _WIN32_WINNT_WINXP +#define Py_NTDDI NTDDI_WINXP +#else +/* Python 2.6+ requires Windows 2000 or greater */ +#ifdef _WIN32_WINNT_WIN2K +#define Py_WINVER _WIN32_WINNT_WIN2K +#else +#define Py_WINVER 0x0500 +#endif +#define Py_NTDDI NTDDI_WIN2KSP4 +#endif + +/* We only set these values when building Python - we don't want to force + these values on extensions, as that will affect the prototypes and + structures exposed in the Windows headers. Even when building Python, we + allow a single source file to override this - they may need access to + structures etc so it can optionally use new Windows features if it + determines at runtime they are available. +*/ +#if defined(Py_BUILD_CORE) || defined(Py_BUILD_CORE_MODULE) +#ifndef NTDDI_VERSION +#define NTDDI_VERSION Py_NTDDI +#endif +#ifndef WINVER +#define WINVER Py_WINVER +#endif +#ifndef _WIN32_WINNT +#define _WIN32_WINNT Py_WINVER +#endif +#endif + +/* _W64 is not defined for VC6 or eVC4 */ +#ifndef _W64 +#define _W64 +#endif + +/* Define like size_t, omitting the "unsigned" */ +#ifdef MS_WIN64 +typedef __int64 ssize_t; +#else +typedef _W64 int ssize_t; +#endif +#define HAVE_SSIZE_T 1 + +#if defined(MS_WIN32) && !defined(MS_WIN64) +#ifdef _M_IX86 +#define COMPILER _Py_PASTE_VERSION("32 bit (Intel)") +#else +#define COMPILER _Py_PASTE_VERSION("32 bit (Unknown)") +#endif +#endif /* MS_WIN32 && !MS_WIN64 */ + +typedef int pid_t; + +#include +#define Py_IS_NAN _isnan +#define Py_IS_INFINITY(X) (!_finite(X) && !_isnan(X)) +#define Py_IS_FINITE(X) _finite(X) +#define copysign _copysign +#define hypot _hypot + +#endif /* _MSC_VER */ + +/* define some ANSI types that are not defined in earlier Win headers */ +#if defined(_MSC_VER) && _MSC_VER >= 1200 +/* This file only exists in VC 6.0 or higher */ +#include +#endif + +/* ------------------------------------------------------------------------*/ +/* The Borland compiler defines __BORLANDC__ */ +/* XXX These defines are likely incomplete, but should be easy to fix. */ +#ifdef __BORLANDC__ +#define COMPILER "[Borland]" + +#ifdef _WIN32 +/* tested with BCC 5.5 (__BORLANDC__ >= 0x0550) + */ + +typedef int pid_t; +/* BCC55 seems to understand __declspec(dllimport), it is used in its + own header files (winnt.h, ...) - so we can do nothing and get the default*/ + +#undef HAVE_SYS_UTIME_H +#define HAVE_UTIME_H +#define HAVE_DIRENT_H + +/* rename a few functions for the Borland compiler */ +#include +#define _chsize chsize +#define _setmode setmode + +#else /* !_WIN32 */ +#error "Only Win32 and later are supported" +#endif /* !_WIN32 */ + +#endif /* BORLANDC */ + +/* ------------------------------------------------------------------------*/ +/* egcs/gnu-win32 defines __GNUC__ and _WIN32 */ +#if defined(__GNUC__) && defined(_WIN32) +/* XXX These defines are likely incomplete, but should be easy to fix. + They should be complete enough to build extension modules. */ +/* Suggested by Rene Liebscher to avoid a GCC 2.91.* + bug that requires structure imports. More recent versions of the + compiler don't exhibit this bug. +*/ +#if (__GNUC__==2) && (__GNUC_MINOR__<=91) +#warning "Please use an up-to-date version of gcc! (>2.91 recommended)" +#endif + +#define COMPILER "[gcc]" +#define hypot _hypot +#define PY_LONG_LONG long long +#define PY_LLONG_MIN LLONG_MIN +#define PY_LLONG_MAX LLONG_MAX +#define PY_ULLONG_MAX ULLONG_MAX +#endif /* GNUC */ + +/* ------------------------------------------------------------------------*/ +/* lcc-win32 defines __LCC__ */ +#if defined(__LCC__) +/* XXX These defines are likely incomplete, but should be easy to fix. + They should be complete enough to build extension modules. */ + +#define COMPILER "[lcc-win32]" +typedef int pid_t; +/* __declspec() is supported here too - do nothing to get the defaults */ + +#endif /* LCC */ + +/* ------------------------------------------------------------------------*/ +/* End of compilers - finish up */ + +#ifndef NO_STDIO_H +# include +#endif + +/* 64 bit ints are usually spelt __int64 unless compiler has overridden */ +#define HAVE_LONG_LONG 1 +#ifndef PY_LONG_LONG +# define PY_LONG_LONG __int64 +# define PY_LLONG_MAX _I64_MAX +# define PY_LLONG_MIN _I64_MIN +# define PY_ULLONG_MAX _UI64_MAX +#endif + +/* For Windows the Python core is in a DLL by default. Test +Py_NO_ENABLE_SHARED to find out. Also support MS_NO_COREDLL for b/w compat */ +#if !defined(MS_NO_COREDLL) && !defined(Py_NO_ENABLE_SHARED) +# define Py_ENABLE_SHARED 1 /* standard symbol for shared library */ +# define MS_COREDLL /* deprecated old symbol */ +#endif /* !MS_NO_COREDLL && ... */ + +/* All windows compilers that use this header support __declspec */ +#define HAVE_DECLSPEC_DLL + +/* For an MSVC DLL, we can nominate the .lib files used by extensions */ +#ifdef MS_COREDLL +# ifndef Py_BUILD_CORE /* not building the core - must be an ext */ +# if defined(_MSC_VER) + /* So MSVC users need not specify the .lib file in + their Makefile (other compilers are generally + taken care of by distutils.) */ +# ifdef _DEBUG +# pragma comment(lib,"python27_d.lib") +# else +# pragma comment(lib,"python27.lib") +# endif /* _DEBUG */ +# endif /* _MSC_VER */ +# endif /* Py_BUILD_CORE */ +#endif /* MS_COREDLL */ + +#if defined(MS_WIN64) +/* maintain "win32" sys.platform for backward compatibility of Python code, + the Win64 API should be close enough to the Win32 API to make this + preferable */ +# define PLATFORM "win32" +# define SIZEOF_VOID_P 8 +# define SIZEOF_TIME_T 8 +# define SIZEOF_OFF_T 4 +# define SIZEOF_FPOS_T 8 +# define SIZEOF_HKEY 8 +# define SIZEOF_SIZE_T 8 +/* configure.in defines HAVE_LARGEFILE_SUPPORT iff HAVE_LONG_LONG, + sizeof(off_t) > sizeof(long), and sizeof(PY_LONG_LONG) >= sizeof(off_t). + On Win64 the second condition is not true, but if fpos_t replaces off_t + then this is true. The uses of HAVE_LARGEFILE_SUPPORT imply that Win64 + should define this. */ +# define HAVE_LARGEFILE_SUPPORT +#elif defined(MS_WIN32) +# define PLATFORM "win32" +# define HAVE_LARGEFILE_SUPPORT +# define SIZEOF_VOID_P 4 +# define SIZEOF_OFF_T 4 +# define SIZEOF_FPOS_T 8 +# define SIZEOF_HKEY 4 +# define SIZEOF_SIZE_T 4 + /* MS VS2005 changes time_t to an 64-bit type on all platforms */ +# if defined(_MSC_VER) && _MSC_VER >= 1400 +# define SIZEOF_TIME_T 8 +# else +# define SIZEOF_TIME_T 4 +# endif +#endif + +#ifdef _DEBUG +# define Py_DEBUG +#endif + + +#ifdef MS_WIN32 + +#define SIZEOF_SHORT 2 +#define SIZEOF_INT 4 +#define SIZEOF_LONG 4 +#define SIZEOF_LONG_LONG 8 +#define SIZEOF_DOUBLE 8 +#define SIZEOF_FLOAT 4 + +/* VC 7.1 has them and VC 6.0 does not. VC 6.0 has a version number of 1200. + Microsoft eMbedded Visual C++ 4.0 has a version number of 1201 and doesn't + define these. + If some compiler does not provide them, modify the #if appropriately. */ +#if defined(_MSC_VER) +#if _MSC_VER > 1300 +#define HAVE_UINTPTR_T 1 +#define HAVE_INTPTR_T 1 +#else +/* VC6, VS 2002 and eVC4 don't support the C99 LL suffix for 64-bit integer literals */ +#define Py_LL(x) x##I64 +#endif /* _MSC_VER > 1200 */ +#endif /* _MSC_VER */ + +#endif + +/* define signed and unsigned exact-width 32-bit and 64-bit types, used in the + implementation of Python long integers. */ +#ifndef PY_UINT32_T +#if SIZEOF_INT == 4 +#define HAVE_UINT32_T 1 +#define PY_UINT32_T unsigned int +#elif SIZEOF_LONG == 4 +#define HAVE_UINT32_T 1 +#define PY_UINT32_T unsigned long +#endif +#endif + +#ifndef PY_UINT64_T +#if SIZEOF_LONG_LONG == 8 +#define HAVE_UINT64_T 1 +#define PY_UINT64_T unsigned PY_LONG_LONG +#endif +#endif + +#ifndef PY_INT32_T +#if SIZEOF_INT == 4 +#define HAVE_INT32_T 1 +#define PY_INT32_T int +#elif SIZEOF_LONG == 4 +#define HAVE_INT32_T 1 +#define PY_INT32_T long +#endif +#endif + +#ifndef PY_INT64_T +#if SIZEOF_LONG_LONG == 8 +#define HAVE_INT64_T 1 +#define PY_INT64_T PY_LONG_LONG +#endif +#endif + +/* Fairly standard from here! */ + +/* Define to 1 if you have the `copysign' function. */ +#define HAVE_COPYSIGN 1 + +/* Define to 1 if you have the `isinf' macro. */ +#define HAVE_DECL_ISINF 1 + +/* Define to 1 if you have the `isnan' function. */ +#define HAVE_DECL_ISNAN 1 + +/* Define if on AIX 3. + System headers sometimes define this. + We just want to avoid a redefinition error message. */ +#ifndef _ALL_SOURCE +/* #undef _ALL_SOURCE */ +#endif + +/* Define to empty if the keyword does not work. */ +/* #define const */ + +/* Define to 1 if you have the header file. */ +#ifndef MS_WINCE +#define HAVE_CONIO_H 1 +#endif + +/* Define to 1 if you have the header file. */ +#ifndef MS_WINCE +#define HAVE_DIRECT_H 1 +#endif + +/* Define if you have dirent.h. */ +/* #define DIRENT 1 */ + +/* Define to the type of elements in the array set by `getgroups'. + Usually this is either `int' or `gid_t'. */ +/* #undef GETGROUPS_T */ + +/* Define to `int' if doesn't define. */ +/* #undef gid_t */ + +/* Define if your struct tm has tm_zone. */ +/* #undef HAVE_TM_ZONE */ + +/* Define if you don't have tm_zone but do have the external array + tzname. */ +#define HAVE_TZNAME + +/* Define to `int' if doesn't define. */ +/* #undef mode_t */ + +/* Define if you don't have dirent.h, but have ndir.h. */ +/* #undef NDIR */ + +/* Define to `long' if doesn't define. */ +/* #undef off_t */ + +/* Define to `int' if doesn't define. */ +/* #undef pid_t */ + +/* Define if the system does not provide POSIX.1 features except + with this defined. */ +/* #undef _POSIX_1_SOURCE */ + +/* Define if you need to in order for stat and other things to work. */ +/* #undef _POSIX_SOURCE */ + +/* Define as the return type of signal handlers (int or void). */ +#define RETSIGTYPE void + +/* Define to `unsigned' if doesn't define. */ +/* #undef size_t */ + +/* Define if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define if you don't have dirent.h, but have sys/dir.h. */ +/* #undef SYSDIR */ + +/* Define if you don't have dirent.h, but have sys/ndir.h. */ +/* #undef SYSNDIR */ + +/* Define if you can safely include both and . */ +/* #undef TIME_WITH_SYS_TIME */ + +/* Define if your declares struct tm. */ +/* #define TM_IN_SYS_TIME 1 */ + +/* Define to `int' if doesn't define. */ +/* #undef uid_t */ + +/* Define if the closedir function returns void instead of int. */ +/* #undef VOID_CLOSEDIR */ + +/* Define if getpgrp() must be called as getpgrp(0) + and (consequently) setpgrp() as setpgrp(0, 0). */ +/* #undef GETPGRP_HAVE_ARGS */ + +/* Define this if your time.h defines altzone */ +/* #define HAVE_ALTZONE */ + +/* Define if you have the putenv function. */ +#ifndef MS_WINCE +#define HAVE_PUTENV +#endif + +/* Define if your compiler supports function prototypes */ +#define HAVE_PROTOTYPES + +/* Define if you can safely include both and + (which you can't on SCO ODT 3.0). */ +/* #undef SYS_SELECT_WITH_SYS_TIME */ + +/* Define if you want documentation strings in extension modules */ +#define WITH_DOC_STRINGS 1 + +/* Define if you want to compile in rudimentary thread support */ +/* #undef WITH_THREAD */ + +/* Define if you want to use the GNU readline library */ +/* #define WITH_READLINE 1 */ + +/* Define if you want to have a Unicode type. */ +#define Py_USING_UNICODE + +/* Define as the size of the unicode type. */ +/* This is enough for unicodeobject.h to do the "right thing" on Windows. */ +#define Py_UNICODE_SIZE 2 + +/* Use Python's own small-block memory-allocator. */ +#define WITH_PYMALLOC 1 + +/* Define if you have clock. */ +/* #define HAVE_CLOCK */ + +/* Define when any dynamic module loading is enabled */ +#define HAVE_DYNAMIC_LOADING + +/* Define if you have ftime. */ +#ifndef MS_WINCE +#define HAVE_FTIME +#endif + +/* Define if you have getpeername. */ +#define HAVE_GETPEERNAME + +/* Define if you have getpgrp. */ +/* #undef HAVE_GETPGRP */ + +/* Define if you have getpid. */ +#ifndef MS_WINCE +#define HAVE_GETPID +#endif + +/* Define if you have gettimeofday. */ +/* #undef HAVE_GETTIMEOFDAY */ + +/* Define if you have getwd. */ +/* #undef HAVE_GETWD */ + +/* Define if you have lstat. */ +/* #undef HAVE_LSTAT */ + +/* Define if you have the mktime function. */ +#define HAVE_MKTIME + +/* Define if you have nice. */ +/* #undef HAVE_NICE */ + +/* Define if you have readlink. */ +/* #undef HAVE_READLINK */ + +/* Define if you have select. */ +/* #undef HAVE_SELECT */ + +/* Define if you have setpgid. */ +/* #undef HAVE_SETPGID */ + +/* Define if you have setpgrp. */ +/* #undef HAVE_SETPGRP */ + +/* Define if you have setsid. */ +/* #undef HAVE_SETSID */ + +/* Define if you have setvbuf. */ +#define HAVE_SETVBUF + +/* Define if you have siginterrupt. */ +/* #undef HAVE_SIGINTERRUPT */ + +/* Define if you have symlink. */ +/* #undef HAVE_SYMLINK */ + +/* Define if you have tcgetpgrp. */ +/* #undef HAVE_TCGETPGRP */ + +/* Define if you have tcsetpgrp. */ +/* #undef HAVE_TCSETPGRP */ + +/* Define if you have times. */ +/* #undef HAVE_TIMES */ + +/* Define if you have uname. */ +/* #undef HAVE_UNAME */ + +/* Define if you have waitpid. */ +/* #undef HAVE_WAITPID */ + +/* Define to 1 if you have the `wcscoll' function. */ +#ifndef MS_WINCE +#define HAVE_WCSCOLL 1 +#endif + +/* Define if the zlib library has inflateCopy */ +#define HAVE_ZLIB_COPY 1 + +/* Define if you have the header file. */ +/* #undef HAVE_DLFCN_H */ + +/* Define to 1 if you have the header file. */ +#ifndef MS_WINCE +#define HAVE_ERRNO_H 1 +#endif + +/* Define if you have the header file. */ +#ifndef MS_WINCE +#define HAVE_FCNTL_H 1 +#endif + +/* Define to 1 if you have the header file. */ +#ifndef MS_WINCE +#define HAVE_PROCESS_H 1 +#endif + +/* Define to 1 if you have the header file. */ +#ifndef MS_WINCE +#define HAVE_SIGNAL_H 1 +#endif + +/* Define if you have the prototypes. */ +#define HAVE_STDARG_PROTOTYPES + +/* Define if you have the header file. */ +#define HAVE_STDDEF_H 1 + +/* Define if you have the header file. */ +/* #undef HAVE_SYS_AUDIOIO_H */ + +/* Define if you have the header file. */ +/* #define HAVE_SYS_PARAM_H 1 */ + +/* Define if you have the header file. */ +/* #define HAVE_SYS_SELECT_H 1 */ + +/* Define to 1 if you have the header file. */ +#ifndef MS_WINCE +#define HAVE_SYS_STAT_H 1 +#endif + +/* Define if you have the header file. */ +/* #define HAVE_SYS_TIME_H 1 */ + +/* Define if you have the header file. */ +/* #define HAVE_SYS_TIMES_H 1 */ + +/* Define to 1 if you have the header file. */ +#ifndef MS_WINCE +#define HAVE_SYS_TYPES_H 1 +#endif + +/* Define if you have the header file. */ +/* #define HAVE_SYS_UN_H 1 */ + +/* Define if you have the header file. */ +/* #define HAVE_SYS_UTIME_H 1 */ + +/* Define if you have the header file. */ +/* #define HAVE_SYS_UTSNAME_H 1 */ + +/* Define if you have the header file. */ +/* #undef HAVE_THREAD_H */ + +/* Define if you have the header file. */ +/* #define HAVE_UNISTD_H 1 */ + +/* Define if you have the header file. */ +/* #define HAVE_UTIME_H 1 */ + +/* Define if the compiler provides a wchar.h header file. */ +#define HAVE_WCHAR_H 1 + +/* Define if you have the dl library (-ldl). */ +/* #undef HAVE_LIBDL */ + +/* Define if you have the mpc library (-lmpc). */ +/* #undef HAVE_LIBMPC */ + +/* Define if you have the nsl library (-lnsl). */ +#define HAVE_LIBNSL 1 + +/* Define if you have the seq library (-lseq). */ +/* #undef HAVE_LIBSEQ */ + +/* Define if you have the socket library (-lsocket). */ +#define HAVE_LIBSOCKET 1 + +/* Define if you have the sun library (-lsun). */ +/* #undef HAVE_LIBSUN */ + +/* Define if you have the termcap library (-ltermcap). */ +/* #undef HAVE_LIBTERMCAP */ + +/* Define if you have the termlib library (-ltermlib). */ +/* #undef HAVE_LIBTERMLIB */ + +/* Define if you have the thread library (-lthread). */ +/* #undef HAVE_LIBTHREAD */ + +/* WinSock does not use a bitmask in select, and uses + socket handles greater than FD_SETSIZE */ +#define Py_SOCKET_FD_CAN_BE_GE_FD_SETSIZE + +/* Define if C doubles are 64-bit IEEE 754 binary format, stored with the + least significant byte first */ +#define DOUBLE_IS_LITTLE_ENDIAN_IEEE754 1 + +#endif /* !Py_CONFIG_H */ diff --git a/python/include/pyctype.h b/python/include/pyctype.h new file mode 100644 index 00000000..673cf2eb --- /dev/null +++ b/python/include/pyctype.h @@ -0,0 +1,31 @@ +#ifndef PYCTYPE_H +#define PYCTYPE_H + +#define PY_CTF_LOWER 0x01 +#define PY_CTF_UPPER 0x02 +#define PY_CTF_ALPHA (PY_CTF_LOWER|PY_CTF_UPPER) +#define PY_CTF_DIGIT 0x04 +#define PY_CTF_ALNUM (PY_CTF_ALPHA|PY_CTF_DIGIT) +#define PY_CTF_SPACE 0x08 +#define PY_CTF_XDIGIT 0x10 + +PyAPI_DATA(const unsigned int) _Py_ctype_table[256]; + +/* Unlike their C counterparts, the following macros are not meant to + * handle an int with any of the values [EOF, 0-UCHAR_MAX]. The argument + * must be a signed/unsigned char. */ +#define Py_ISLOWER(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_LOWER) +#define Py_ISUPPER(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_UPPER) +#define Py_ISALPHA(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_ALPHA) +#define Py_ISDIGIT(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_DIGIT) +#define Py_ISXDIGIT(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_XDIGIT) +#define Py_ISALNUM(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_ALNUM) +#define Py_ISSPACE(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_SPACE) + +PyAPI_DATA(const unsigned char) _Py_ctype_tolower[256]; +PyAPI_DATA(const unsigned char) _Py_ctype_toupper[256]; + +#define Py_TOLOWER(c) (_Py_ctype_tolower[Py_CHARMASK(c)]) +#define Py_TOUPPER(c) (_Py_ctype_toupper[Py_CHARMASK(c)]) + +#endif /* !PYCTYPE_H */ diff --git a/python/include/pydebug.h b/python/include/pydebug.h new file mode 100644 index 00000000..0f45960f --- /dev/null +++ b/python/include/pydebug.h @@ -0,0 +1,41 @@ + +#ifndef Py_PYDEBUG_H +#define Py_PYDEBUG_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_DATA(int) Py_DebugFlag; +PyAPI_DATA(int) Py_VerboseFlag; +PyAPI_DATA(int) Py_InteractiveFlag; +PyAPI_DATA(int) Py_InspectFlag; +PyAPI_DATA(int) Py_OptimizeFlag; +PyAPI_DATA(int) Py_NoSiteFlag; +PyAPI_DATA(int) Py_BytesWarningFlag; +PyAPI_DATA(int) Py_UseClassExceptionsFlag; +PyAPI_DATA(int) Py_FrozenFlag; +PyAPI_DATA(int) Py_TabcheckFlag; +PyAPI_DATA(int) Py_UnicodeFlag; +PyAPI_DATA(int) Py_IgnoreEnvironmentFlag; +PyAPI_DATA(int) Py_DivisionWarningFlag; +PyAPI_DATA(int) Py_DontWriteBytecodeFlag; +PyAPI_DATA(int) Py_NoUserSiteDirectory; +/* _XXX Py_QnewFlag should go away in 3.0. It's true iff -Qnew is passed, + on the command line, and is used in 2.2 by ceval.c to make all "/" divisions + true divisions (which they will be in 3.0). */ +PyAPI_DATA(int) _Py_QnewFlag; +/* Warn about 3.x issues */ +PyAPI_DATA(int) Py_Py3kWarningFlag; +PyAPI_DATA(int) Py_HashRandomizationFlag; + +/* this is a wrapper around getenv() that pays attention to + Py_IgnoreEnvironmentFlag. It should be used for getting variables like + PYTHONPATH and PYTHONHOME from the environment */ +#define Py_GETENV(s) (Py_IgnoreEnvironmentFlag ? NULL : getenv(s)) + +PyAPI_FUNC(void) Py_FatalError(const char *message); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_PYDEBUG_H */ diff --git a/python/include/pyerrors.h b/python/include/pyerrors.h new file mode 100644 index 00000000..dbe3bfa5 --- /dev/null +++ b/python/include/pyerrors.h @@ -0,0 +1,328 @@ +#ifndef Py_ERRORS_H +#define Py_ERRORS_H +#ifdef __cplusplus +extern "C" { +#endif + +/* Error objects */ + +typedef struct { + PyObject_HEAD + PyObject *dict; + PyObject *args; + PyObject *message; +} PyBaseExceptionObject; + +typedef struct { + PyObject_HEAD + PyObject *dict; + PyObject *args; + PyObject *message; + PyObject *msg; + PyObject *filename; + PyObject *lineno; + PyObject *offset; + PyObject *text; + PyObject *print_file_and_line; +} PySyntaxErrorObject; + +#ifdef Py_USING_UNICODE +typedef struct { + PyObject_HEAD + PyObject *dict; + PyObject *args; + PyObject *message; + PyObject *encoding; + PyObject *object; + Py_ssize_t start; + Py_ssize_t end; + PyObject *reason; +} PyUnicodeErrorObject; +#endif + +typedef struct { + PyObject_HEAD + PyObject *dict; + PyObject *args; + PyObject *message; + PyObject *code; +} PySystemExitObject; + +typedef struct { + PyObject_HEAD + PyObject *dict; + PyObject *args; + PyObject *message; + PyObject *myerrno; + PyObject *strerror; + PyObject *filename; +} PyEnvironmentErrorObject; + +#ifdef MS_WINDOWS +typedef struct { + PyObject_HEAD + PyObject *dict; + PyObject *args; + PyObject *message; + PyObject *myerrno; + PyObject *strerror; + PyObject *filename; + PyObject *winerror; +} PyWindowsErrorObject; +#endif + +/* Error handling definitions */ + +PyAPI_FUNC(void) PyErr_SetNone(PyObject *); +PyAPI_FUNC(void) PyErr_SetObject(PyObject *, PyObject *); +PyAPI_FUNC(void) PyErr_SetString(PyObject *, const char *); +PyAPI_FUNC(PyObject *) PyErr_Occurred(void); +PyAPI_FUNC(void) PyErr_Clear(void); +PyAPI_FUNC(void) PyErr_Fetch(PyObject **, PyObject **, PyObject **); +PyAPI_FUNC(void) PyErr_Restore(PyObject *, PyObject *, PyObject *); + +#ifdef Py_DEBUG +#define _PyErr_OCCURRED() PyErr_Occurred() +#else +#define _PyErr_OCCURRED() (_PyThreadState_Current->curexc_type) +#endif + +/* Error testing and normalization */ +PyAPI_FUNC(int) PyErr_GivenExceptionMatches(PyObject *, PyObject *); +PyAPI_FUNC(int) PyErr_ExceptionMatches(PyObject *); +PyAPI_FUNC(void) PyErr_NormalizeException(PyObject**, PyObject**, PyObject**); + +/* */ + +#define PyExceptionClass_Check(x) \ + (PyClass_Check((x)) || (PyType_Check((x)) && \ + PyType_FastSubclass((PyTypeObject*)(x), Py_TPFLAGS_BASE_EXC_SUBCLASS))) + +#define PyExceptionInstance_Check(x) \ + (PyInstance_Check((x)) || \ + PyType_FastSubclass((x)->ob_type, Py_TPFLAGS_BASE_EXC_SUBCLASS)) + +#define PyExceptionClass_Name(x) \ + (PyClass_Check((x)) \ + ? PyString_AS_STRING(((PyClassObject*)(x))->cl_name) \ + : (char *)(((PyTypeObject*)(x))->tp_name)) + +#define PyExceptionInstance_Class(x) \ + ((PyInstance_Check((x)) \ + ? (PyObject*)((PyInstanceObject*)(x))->in_class \ + : (PyObject*)((x)->ob_type))) + + +/* Predefined exceptions */ + +PyAPI_DATA(PyObject *) PyExc_BaseException; +PyAPI_DATA(PyObject *) PyExc_Exception; +PyAPI_DATA(PyObject *) PyExc_StopIteration; +PyAPI_DATA(PyObject *) PyExc_GeneratorExit; +PyAPI_DATA(PyObject *) PyExc_StandardError; +PyAPI_DATA(PyObject *) PyExc_ArithmeticError; +PyAPI_DATA(PyObject *) PyExc_LookupError; + +PyAPI_DATA(PyObject *) PyExc_AssertionError; +PyAPI_DATA(PyObject *) PyExc_AttributeError; +PyAPI_DATA(PyObject *) PyExc_EOFError; +PyAPI_DATA(PyObject *) PyExc_FloatingPointError; +PyAPI_DATA(PyObject *) PyExc_EnvironmentError; +PyAPI_DATA(PyObject *) PyExc_IOError; +PyAPI_DATA(PyObject *) PyExc_OSError; +PyAPI_DATA(PyObject *) PyExc_ImportError; +PyAPI_DATA(PyObject *) PyExc_IndexError; +PyAPI_DATA(PyObject *) PyExc_KeyError; +PyAPI_DATA(PyObject *) PyExc_KeyboardInterrupt; +PyAPI_DATA(PyObject *) PyExc_MemoryError; +PyAPI_DATA(PyObject *) PyExc_NameError; +PyAPI_DATA(PyObject *) PyExc_OverflowError; +PyAPI_DATA(PyObject *) PyExc_RuntimeError; +PyAPI_DATA(PyObject *) PyExc_NotImplementedError; +PyAPI_DATA(PyObject *) PyExc_SyntaxError; +PyAPI_DATA(PyObject *) PyExc_IndentationError; +PyAPI_DATA(PyObject *) PyExc_TabError; +PyAPI_DATA(PyObject *) PyExc_ReferenceError; +PyAPI_DATA(PyObject *) PyExc_SystemError; +PyAPI_DATA(PyObject *) PyExc_SystemExit; +PyAPI_DATA(PyObject *) PyExc_TypeError; +PyAPI_DATA(PyObject *) PyExc_UnboundLocalError; +PyAPI_DATA(PyObject *) PyExc_UnicodeError; +PyAPI_DATA(PyObject *) PyExc_UnicodeEncodeError; +PyAPI_DATA(PyObject *) PyExc_UnicodeDecodeError; +PyAPI_DATA(PyObject *) PyExc_UnicodeTranslateError; +PyAPI_DATA(PyObject *) PyExc_ValueError; +PyAPI_DATA(PyObject *) PyExc_ZeroDivisionError; +#ifdef MS_WINDOWS +PyAPI_DATA(PyObject *) PyExc_WindowsError; +#endif +#ifdef __VMS +PyAPI_DATA(PyObject *) PyExc_VMSError; +#endif + +PyAPI_DATA(PyObject *) PyExc_BufferError; + +PyAPI_DATA(PyObject *) PyExc_MemoryErrorInst; +PyAPI_DATA(PyObject *) PyExc_RecursionErrorInst; + +/* Predefined warning categories */ +PyAPI_DATA(PyObject *) PyExc_Warning; +PyAPI_DATA(PyObject *) PyExc_UserWarning; +PyAPI_DATA(PyObject *) PyExc_DeprecationWarning; +PyAPI_DATA(PyObject *) PyExc_PendingDeprecationWarning; +PyAPI_DATA(PyObject *) PyExc_SyntaxWarning; +PyAPI_DATA(PyObject *) PyExc_RuntimeWarning; +PyAPI_DATA(PyObject *) PyExc_FutureWarning; +PyAPI_DATA(PyObject *) PyExc_ImportWarning; +PyAPI_DATA(PyObject *) PyExc_UnicodeWarning; +PyAPI_DATA(PyObject *) PyExc_BytesWarning; + + +/* Convenience functions */ + +PyAPI_FUNC(int) PyErr_BadArgument(void); +PyAPI_FUNC(PyObject *) PyErr_NoMemory(void); +PyAPI_FUNC(PyObject *) PyErr_SetFromErrno(PyObject *); +PyAPI_FUNC(PyObject *) PyErr_SetFromErrnoWithFilenameObject( + PyObject *, PyObject *); +PyAPI_FUNC(PyObject *) PyErr_SetFromErrnoWithFilename( + PyObject *, const char *); +#ifdef MS_WINDOWS +PyAPI_FUNC(PyObject *) PyErr_SetFromErrnoWithUnicodeFilename( + PyObject *, const Py_UNICODE *); +#endif /* MS_WINDOWS */ + +PyAPI_FUNC(PyObject *) PyErr_Format(PyObject *, const char *, ...) + Py_GCC_ATTRIBUTE((format(printf, 2, 3))); + +#ifdef MS_WINDOWS +PyAPI_FUNC(PyObject *) PyErr_SetFromWindowsErrWithFilenameObject( + int, const char *); +PyAPI_FUNC(PyObject *) PyErr_SetFromWindowsErrWithFilename( + int, const char *); +PyAPI_FUNC(PyObject *) PyErr_SetFromWindowsErrWithUnicodeFilename( + int, const Py_UNICODE *); +PyAPI_FUNC(PyObject *) PyErr_SetFromWindowsErr(int); +PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErrWithFilenameObject( + PyObject *,int, PyObject *); +PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErrWithFilename( + PyObject *,int, const char *); +PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErrWithUnicodeFilename( + PyObject *,int, const Py_UNICODE *); +PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErr(PyObject *, int); +#endif /* MS_WINDOWS */ + +/* Export the old function so that the existing API remains available: */ +PyAPI_FUNC(void) PyErr_BadInternalCall(void); +PyAPI_FUNC(void) _PyErr_BadInternalCall(char *filename, int lineno); +/* Mask the old API with a call to the new API for code compiled under + Python 2.0: */ +#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__) + +/* Function to create a new exception */ +PyAPI_FUNC(PyObject *) PyErr_NewException( + char *name, PyObject *base, PyObject *dict); +PyAPI_FUNC(PyObject *) PyErr_NewExceptionWithDoc( + char *name, char *doc, PyObject *base, PyObject *dict); +PyAPI_FUNC(void) PyErr_WriteUnraisable(PyObject *); + +/* In sigcheck.c or signalmodule.c */ +PyAPI_FUNC(int) PyErr_CheckSignals(void); +PyAPI_FUNC(void) PyErr_SetInterrupt(void); + +/* In signalmodule.c */ +int PySignal_SetWakeupFd(int fd); + +/* Support for adding program text to SyntaxErrors */ +PyAPI_FUNC(void) PyErr_SyntaxLocation(const char *, int); +PyAPI_FUNC(PyObject *) PyErr_ProgramText(const char *, int); + +#ifdef Py_USING_UNICODE +/* The following functions are used to create and modify unicode + exceptions from C */ + +/* create a UnicodeDecodeError object */ +PyAPI_FUNC(PyObject *) PyUnicodeDecodeError_Create( + const char *, const char *, Py_ssize_t, Py_ssize_t, Py_ssize_t, const char *); + +/* create a UnicodeEncodeError object */ +PyAPI_FUNC(PyObject *) PyUnicodeEncodeError_Create( + const char *, const Py_UNICODE *, Py_ssize_t, Py_ssize_t, Py_ssize_t, const char *); + +/* create a UnicodeTranslateError object */ +PyAPI_FUNC(PyObject *) PyUnicodeTranslateError_Create( + const Py_UNICODE *, Py_ssize_t, Py_ssize_t, Py_ssize_t, const char *); + +/* get the encoding attribute */ +PyAPI_FUNC(PyObject *) PyUnicodeEncodeError_GetEncoding(PyObject *); +PyAPI_FUNC(PyObject *) PyUnicodeDecodeError_GetEncoding(PyObject *); + +/* get the object attribute */ +PyAPI_FUNC(PyObject *) PyUnicodeEncodeError_GetObject(PyObject *); +PyAPI_FUNC(PyObject *) PyUnicodeDecodeError_GetObject(PyObject *); +PyAPI_FUNC(PyObject *) PyUnicodeTranslateError_GetObject(PyObject *); + +/* get the value of the start attribute (the int * may not be NULL) + return 0 on success, -1 on failure */ +PyAPI_FUNC(int) PyUnicodeEncodeError_GetStart(PyObject *, Py_ssize_t *); +PyAPI_FUNC(int) PyUnicodeDecodeError_GetStart(PyObject *, Py_ssize_t *); +PyAPI_FUNC(int) PyUnicodeTranslateError_GetStart(PyObject *, Py_ssize_t *); + +/* assign a new value to the start attribute + return 0 on success, -1 on failure */ +PyAPI_FUNC(int) PyUnicodeEncodeError_SetStart(PyObject *, Py_ssize_t); +PyAPI_FUNC(int) PyUnicodeDecodeError_SetStart(PyObject *, Py_ssize_t); +PyAPI_FUNC(int) PyUnicodeTranslateError_SetStart(PyObject *, Py_ssize_t); + +/* get the value of the end attribute (the int *may not be NULL) + return 0 on success, -1 on failure */ +PyAPI_FUNC(int) PyUnicodeEncodeError_GetEnd(PyObject *, Py_ssize_t *); +PyAPI_FUNC(int) PyUnicodeDecodeError_GetEnd(PyObject *, Py_ssize_t *); +PyAPI_FUNC(int) PyUnicodeTranslateError_GetEnd(PyObject *, Py_ssize_t *); + +/* assign a new value to the end attribute + return 0 on success, -1 on failure */ +PyAPI_FUNC(int) PyUnicodeEncodeError_SetEnd(PyObject *, Py_ssize_t); +PyAPI_FUNC(int) PyUnicodeDecodeError_SetEnd(PyObject *, Py_ssize_t); +PyAPI_FUNC(int) PyUnicodeTranslateError_SetEnd(PyObject *, Py_ssize_t); + +/* get the value of the reason attribute */ +PyAPI_FUNC(PyObject *) PyUnicodeEncodeError_GetReason(PyObject *); +PyAPI_FUNC(PyObject *) PyUnicodeDecodeError_GetReason(PyObject *); +PyAPI_FUNC(PyObject *) PyUnicodeTranslateError_GetReason(PyObject *); + +/* assign a new value to the reason attribute + return 0 on success, -1 on failure */ +PyAPI_FUNC(int) PyUnicodeEncodeError_SetReason( + PyObject *, const char *); +PyAPI_FUNC(int) PyUnicodeDecodeError_SetReason( + PyObject *, const char *); +PyAPI_FUNC(int) PyUnicodeTranslateError_SetReason( + PyObject *, const char *); +#endif + + +/* These APIs aren't really part of the error implementation, but + often needed to format error messages; the native C lib APIs are + not available on all platforms, which is why we provide emulations + for those platforms in Python/mysnprintf.c, + WARNING: The return value of snprintf varies across platforms; do + not rely on any particular behavior; eventually the C99 defn may + be reliable. +*/ +#if defined(MS_WIN32) && !defined(HAVE_SNPRINTF) +# define HAVE_SNPRINTF +# define snprintf _snprintf +# define vsnprintf _vsnprintf +#endif + +#include +PyAPI_FUNC(int) PyOS_snprintf(char *str, size_t size, const char *format, ...) + Py_GCC_ATTRIBUTE((format(printf, 3, 4))); +PyAPI_FUNC(int) PyOS_vsnprintf(char *str, size_t size, const char *format, va_list va) + Py_GCC_ATTRIBUTE((format(printf, 3, 0))); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_ERRORS_H */ diff --git a/python/include/pyexpat.h b/python/include/pyexpat.h new file mode 100644 index 00000000..5340ef5f --- /dev/null +++ b/python/include/pyexpat.h @@ -0,0 +1,48 @@ +/* Stuff to export relevant 'expat' entry points from pyexpat to other + * parser modules, such as cElementTree. */ + +/* note: you must import expat.h before importing this module! */ + +#define PyExpat_CAPI_MAGIC "pyexpat.expat_CAPI 1.0" +#define PyExpat_CAPSULE_NAME "pyexpat.expat_CAPI" + +struct PyExpat_CAPI +{ + char* magic; /* set to PyExpat_CAPI_MAGIC */ + int size; /* set to sizeof(struct PyExpat_CAPI) */ + int MAJOR_VERSION; + int MINOR_VERSION; + int MICRO_VERSION; + /* pointers to selected expat functions. add new functions at + the end, if needed */ + const XML_LChar * (*ErrorString)(enum XML_Error code); + enum XML_Error (*GetErrorCode)(XML_Parser parser); + XML_Size (*GetErrorColumnNumber)(XML_Parser parser); + XML_Size (*GetErrorLineNumber)(XML_Parser parser); + enum XML_Status (*Parse)( + XML_Parser parser, const char *s, int len, int isFinal); + XML_Parser (*ParserCreate_MM)( + const XML_Char *encoding, const XML_Memory_Handling_Suite *memsuite, + const XML_Char *namespaceSeparator); + void (*ParserFree)(XML_Parser parser); + void (*SetCharacterDataHandler)( + XML_Parser parser, XML_CharacterDataHandler handler); + void (*SetCommentHandler)( + XML_Parser parser, XML_CommentHandler handler); + void (*SetDefaultHandlerExpand)( + XML_Parser parser, XML_DefaultHandler handler); + void (*SetElementHandler)( + XML_Parser parser, XML_StartElementHandler start, + XML_EndElementHandler end); + void (*SetNamespaceDeclHandler)( + XML_Parser parser, XML_StartNamespaceDeclHandler start, + XML_EndNamespaceDeclHandler end); + void (*SetProcessingInstructionHandler)( + XML_Parser parser, XML_ProcessingInstructionHandler handler); + void (*SetUnknownEncodingHandler)( + XML_Parser parser, XML_UnknownEncodingHandler handler, + void *encodingHandlerData); + void (*SetUserData)(XML_Parser parser, void *userData); + /* always add new stuff to the end! */ +}; + diff --git a/python/include/pyfpe.h b/python/include/pyfpe.h new file mode 100644 index 00000000..19110ab0 --- /dev/null +++ b/python/include/pyfpe.h @@ -0,0 +1,176 @@ +#ifndef Py_PYFPE_H +#define Py_PYFPE_H +#ifdef __cplusplus +extern "C" { +#endif +/* + --------------------------------------------------------------------- + / Copyright (c) 1996. \ + | The Regents of the University of California. | + | All rights reserved. | + | | + | Permission to use, copy, modify, and distribute this software for | + | any purpose without fee is hereby granted, provided that this en- | + | tire notice is included in all copies of any software which is or | + | includes a copy or modification of this software and in all | + | copies of the supporting documentation for such software. | + | | + | This work was produced at the University of California, Lawrence | + | Livermore National Laboratory under contract no. W-7405-ENG-48 | + | between the U.S. Department of Energy and The Regents of the | + | University of California for the operation of UC LLNL. | + | | + | DISCLAIMER | + | | + | This software was prepared as an account of work sponsored by an | + | agency of the United States Government. Neither the United States | + | Government nor the University of California nor any of their em- | + | ployees, makes any warranty, express or implied, or assumes any | + | liability or responsibility for the accuracy, completeness, or | + | usefulness of any information, apparatus, product, or process | + | disclosed, or represents that its use would not infringe | + | privately-owned rights. Reference herein to any specific commer- | + | cial products, process, or service by trade name, trademark, | + | manufacturer, or otherwise, does not necessarily constitute or | + | imply its endorsement, recommendation, or favoring by the United | + | States Government or the University of California. The views and | + | opinions of authors expressed herein do not necessarily state or | + | reflect those of the United States Government or the University | + | of California, and shall not be used for advertising or product | + \ endorsement purposes. / + --------------------------------------------------------------------- +*/ + +/* + * Define macros for handling SIGFPE. + * Lee Busby, LLNL, November, 1996 + * busby1@llnl.gov + * + ********************************************* + * Overview of the system for handling SIGFPE: + * + * This file (Include/pyfpe.h) defines a couple of "wrapper" macros for + * insertion into your Python C code of choice. Their proper use is + * discussed below. The file Python/pyfpe.c defines a pair of global + * variables PyFPE_jbuf and PyFPE_counter which are used by the signal + * handler for SIGFPE to decide if a particular exception was protected + * by the macros. The signal handler itself, and code for enabling the + * generation of SIGFPE in the first place, is in a (new) Python module + * named fpectl. This module is standard in every respect. It can be loaded + * either statically or dynamically as you choose, and like any other + * Python module, has no effect until you import it. + * + * In the general case, there are three steps toward handling SIGFPE in any + * Python code: + * + * 1) Add the *_PROTECT macros to your C code as required to protect + * dangerous floating point sections. + * + * 2) Turn on the inclusion of the code by adding the ``--with-fpectl'' + * flag at the time you run configure. If the fpectl or other modules + * which use the *_PROTECT macros are to be dynamically loaded, be + * sure they are compiled with WANT_SIGFPE_HANDLER defined. + * + * 3) When python is built and running, import fpectl, and execute + * fpectl.turnon_sigfpe(). This sets up the signal handler and enables + * generation of SIGFPE whenever an exception occurs. From this point + * on, any properly trapped SIGFPE should result in the Python + * FloatingPointError exception. + * + * Step 1 has been done already for the Python kernel code, and should be + * done soon for the NumPy array package. Step 2 is usually done once at + * python install time. Python's behavior with respect to SIGFPE is not + * changed unless you also do step 3. Thus you can control this new + * facility at compile time, or run time, or both. + * + ******************************** + * Using the macros in your code: + * + * static PyObject *foobar(PyObject *self,PyObject *args) + * { + * .... + * PyFPE_START_PROTECT("Error in foobar", return 0) + * result = dangerous_op(somearg1, somearg2, ...); + * PyFPE_END_PROTECT(result) + * .... + * } + * + * If a floating point error occurs in dangerous_op, foobar returns 0 (NULL), + * after setting the associated value of the FloatingPointError exception to + * "Error in foobar". ``Dangerous_op'' can be a single operation, or a block + * of code, function calls, or any combination, so long as no alternate + * return is possible before the PyFPE_END_PROTECT macro is reached. + * + * The macros can only be used in a function context where an error return + * can be recognized as signaling a Python exception. (Generally, most + * functions that return a PyObject * will qualify.) + * + * Guido's original design suggestion for PyFPE_START_PROTECT and + * PyFPE_END_PROTECT had them open and close a local block, with a locally + * defined jmp_buf and jmp_buf pointer. This would allow recursive nesting + * of the macros. The Ansi C standard makes it clear that such local + * variables need to be declared with the "volatile" type qualifier to keep + * setjmp from corrupting their values. Some current implementations seem + * to be more restrictive. For example, the HPUX man page for setjmp says + * + * Upon the return from a setjmp() call caused by a longjmp(), the + * values of any non-static local variables belonging to the routine + * from which setjmp() was called are undefined. Code which depends on + * such values is not guaranteed to be portable. + * + * I therefore decided on a more limited form of nesting, using a counter + * variable (PyFPE_counter) to keep track of any recursion. If an exception + * occurs in an ``inner'' pair of macros, the return will apparently + * come from the outermost level. + * + */ + +#ifdef WANT_SIGFPE_HANDLER +#include +#include +#include +extern jmp_buf PyFPE_jbuf; +extern int PyFPE_counter; +extern double PyFPE_dummy(void *); + +#define PyFPE_START_PROTECT(err_string, leave_stmt) \ +if (!PyFPE_counter++ && setjmp(PyFPE_jbuf)) { \ + PyErr_SetString(PyExc_FloatingPointError, err_string); \ + PyFPE_counter = 0; \ + leave_stmt; \ +} + +/* + * This (following) is a heck of a way to decrement a counter. However, + * unless the macro argument is provided, code optimizers will sometimes move + * this statement so that it gets executed *before* the unsafe expression + * which we're trying to protect. That pretty well messes things up, + * of course. + * + * If the expression(s) you're trying to protect don't happen to return a + * value, you will need to manufacture a dummy result just to preserve the + * correct ordering of statements. Note that the macro passes the address + * of its argument (so you need to give it something which is addressable). + * If your expression returns multiple results, pass the last such result + * to PyFPE_END_PROTECT. + * + * Note that PyFPE_dummy returns a double, which is cast to int. + * This seeming insanity is to tickle the Floating Point Unit (FPU). + * If an exception has occurred in a preceding floating point operation, + * some architectures (notably Intel 80x86) will not deliver the interrupt + * until the *next* floating point operation. This is painful if you've + * already decremented PyFPE_counter. + */ +#define PyFPE_END_PROTECT(v) PyFPE_counter -= (int)PyFPE_dummy(&(v)); + +#else + +#define PyFPE_START_PROTECT(err_string, leave_stmt) +#define PyFPE_END_PROTECT(v) + +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_PYFPE_H */ diff --git a/python/include/pygetopt.h b/python/include/pygetopt.h new file mode 100644 index 00000000..9860d360 --- /dev/null +++ b/python/include/pygetopt.h @@ -0,0 +1,18 @@ + +#ifndef Py_PYGETOPT_H +#define Py_PYGETOPT_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_DATA(int) _PyOS_opterr; +PyAPI_DATA(int) _PyOS_optind; +PyAPI_DATA(char *) _PyOS_optarg; + +PyAPI_FUNC(void) _PyOS_ResetGetOpt(void); +PyAPI_FUNC(int) _PyOS_GetOpt(int argc, char **argv, char *optstring); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_PYGETOPT_H */ diff --git a/python/include/pymacconfig.h b/python/include/pymacconfig.h new file mode 100644 index 00000000..24e7b8da --- /dev/null +++ b/python/include/pymacconfig.h @@ -0,0 +1,102 @@ +#ifndef PYMACCONFIG_H +#define PYMACCONFIG_H + /* + * This file moves some of the autoconf magic to compile-time + * when building on MacOSX. This is needed for building 4-way + * universal binaries and for 64-bit universal binaries because + * the values redefined below aren't configure-time constant but + * only compile-time constant in these scenarios. + */ + +#if defined(__APPLE__) + +# undef SIZEOF_LONG +# undef SIZEOF_PTHREAD_T +# undef SIZEOF_SIZE_T +# undef SIZEOF_TIME_T +# undef SIZEOF_VOID_P +# undef SIZEOF__BOOL +# undef SIZEOF_UINTPTR_T +# undef SIZEOF_PTHREAD_T +# undef WORDS_BIGENDIAN +# undef DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754 +# undef DOUBLE_IS_BIG_ENDIAN_IEEE754 +# undef DOUBLE_IS_LITTLE_ENDIAN_IEEE754 +# undef HAVE_GCC_ASM_FOR_X87 + +# undef VA_LIST_IS_ARRAY +# if defined(__LP64__) && defined(__x86_64__) +# define VA_LIST_IS_ARRAY 1 +# endif + +# undef HAVE_LARGEFILE_SUPPORT +# ifndef __LP64__ +# define HAVE_LARGEFILE_SUPPORT 1 +# endif + +# undef SIZEOF_LONG +# ifdef __LP64__ +# define SIZEOF__BOOL 1 +# define SIZEOF__BOOL 1 +# define SIZEOF_LONG 8 +# define SIZEOF_PTHREAD_T 8 +# define SIZEOF_SIZE_T 8 +# define SIZEOF_TIME_T 8 +# define SIZEOF_VOID_P 8 +# define SIZEOF_UINTPTR_T 8 +# define SIZEOF_PTHREAD_T 8 +# else +# ifdef __ppc__ +# define SIZEOF__BOOL 4 +# else +# define SIZEOF__BOOL 1 +# endif +# define SIZEOF_LONG 4 +# define SIZEOF_PTHREAD_T 4 +# define SIZEOF_SIZE_T 4 +# define SIZEOF_TIME_T 4 +# define SIZEOF_VOID_P 4 +# define SIZEOF_UINTPTR_T 4 +# define SIZEOF_PTHREAD_T 4 +# endif + +# if defined(__LP64__) + /* MacOSX 10.4 (the first release to support 64-bit code + * at all) only supports 64-bit in the UNIX layer. + * Therefore surpress the toolbox-glue in 64-bit mode. + */ + + /* In 64-bit mode setpgrp always has no argments, in 32-bit + * mode that depends on the compilation environment + */ +# undef SETPGRP_HAVE_ARG + +# endif + +#ifdef __BIG_ENDIAN__ +#define WORDS_BIGENDIAN 1 +#define DOUBLE_IS_BIG_ENDIAN_IEEE754 +#else +#define DOUBLE_IS_LITTLE_ENDIAN_IEEE754 +#endif /* __BIG_ENDIAN */ + +#ifdef __i386__ +# define HAVE_GCC_ASM_FOR_X87 +#endif + + /* + * The definition in pyconfig.h is only valid on the OS release + * where configure ran on and not necessarily for all systems where + * the executable can be used on. + * + * Specifically: OSX 10.4 has limited supported for '%zd', while + * 10.5 has full support for '%zd'. A binary built on 10.5 won't + * work properly on 10.4 unless we surpress the definition + * of PY_FORMAT_SIZE_T + */ +#undef PY_FORMAT_SIZE_T + + +#endif /* defined(_APPLE__) */ + +#endif /* PYMACCONFIG_H */ diff --git a/python/include/pymactoolbox.h b/python/include/pymactoolbox.h new file mode 100644 index 00000000..fd159752 --- /dev/null +++ b/python/include/pymactoolbox.h @@ -0,0 +1,217 @@ +/* +** pymactoolbox.h - globals defined in mactoolboxglue.c +*/ +#ifndef Py_PYMACTOOLBOX_H +#define Py_PYMACTOOLBOX_H +#ifdef __cplusplus + extern "C" { +#endif + +#include + +#ifndef __LP64__ +#include +#endif /* !__LP64__ */ + +/* +** Helper routines for error codes and such. +*/ +char *PyMac_StrError(int); /* strerror with mac errors */ +extern PyObject *PyMac_OSErrException; /* Exception for OSErr */ +PyObject *PyMac_GetOSErrException(void); /* Initialize & return it */ +PyObject *PyErr_Mac(PyObject *, int); /* Exception with a mac error */ +PyObject *PyMac_Error(OSErr); /* Uses PyMac_GetOSErrException */ +#ifndef __LP64__ +extern OSErr PyMac_GetFullPathname(FSSpec *, char *, int); /* convert + fsspec->path */ +#endif /* __LP64__ */ + +/* +** These conversion routines are defined in mactoolboxglue.c itself. +*/ +int PyMac_GetOSType(PyObject *, OSType *); /* argument parser for OSType */ +PyObject *PyMac_BuildOSType(OSType); /* Convert OSType to PyObject */ + +PyObject *PyMac_BuildNumVersion(NumVersion);/* Convert NumVersion to PyObject */ + +int PyMac_GetStr255(PyObject *, Str255); /* argument parser for Str255 */ +PyObject *PyMac_BuildStr255(Str255); /* Convert Str255 to PyObject */ +PyObject *PyMac_BuildOptStr255(Str255); /* Convert Str255 to PyObject, + NULL to None */ + +int PyMac_GetRect(PyObject *, Rect *); /* argument parser for Rect */ +PyObject *PyMac_BuildRect(Rect *); /* Convert Rect to PyObject */ + +int PyMac_GetPoint(PyObject *, Point *); /* argument parser for Point */ +PyObject *PyMac_BuildPoint(Point); /* Convert Point to PyObject */ + +int PyMac_GetEventRecord(PyObject *, EventRecord *); /* argument parser for + EventRecord */ +PyObject *PyMac_BuildEventRecord(EventRecord *); /* Convert EventRecord to + PyObject */ + +int PyMac_GetFixed(PyObject *, Fixed *); /* argument parser for Fixed */ +PyObject *PyMac_BuildFixed(Fixed); /* Convert Fixed to PyObject */ +int PyMac_Getwide(PyObject *, wide *); /* argument parser for wide */ +PyObject *PyMac_Buildwide(wide *); /* Convert wide to PyObject */ + +/* +** The rest of the routines are implemented by extension modules. If they are +** dynamically loaded mactoolboxglue will contain a stub implementation of the +** routine, which imports the module, whereupon the module's init routine will +** communicate the routine pointer back to the stub. +** If USE_TOOLBOX_OBJECT_GLUE is not defined there is no glue code, and the +** extension modules simply declare the routine. This is the case for static +** builds (and could be the case for MacPython CFM builds, because CFM extension +** modules can reference each other without problems). +*/ + +#ifdef USE_TOOLBOX_OBJECT_GLUE +/* +** These macros are used in the module init code. If we use toolbox object glue +** it sets the function pointer to point to the real function. +*/ +#define PyMac_INIT_TOOLBOX_OBJECT_NEW(object, rtn) { \ + extern PyObject *(*PyMacGluePtr_##rtn)(object); \ + PyMacGluePtr_##rtn = _##rtn; \ +} +#define PyMac_INIT_TOOLBOX_OBJECT_CONVERT(object, rtn) { \ + extern int (*PyMacGluePtr_##rtn)(PyObject *, object *); \ + PyMacGluePtr_##rtn = _##rtn; \ +} +#else +/* +** If we don't use toolbox object glue the init macros are empty. Moreover, we define +** _xxx_New to be the same as xxx_New, and the code in mactoolboxglue isn't included. +*/ +#define PyMac_INIT_TOOLBOX_OBJECT_NEW(object, rtn) +#define PyMac_INIT_TOOLBOX_OBJECT_CONVERT(object, rtn) +#endif /* USE_TOOLBOX_OBJECT_GLUE */ + +/* macfs exports */ +#ifndef __LP64__ +int PyMac_GetFSSpec(PyObject *, FSSpec *); /* argument parser for FSSpec */ +PyObject *PyMac_BuildFSSpec(FSSpec *); /* Convert FSSpec to PyObject */ +#endif /* !__LP64__ */ + +int PyMac_GetFSRef(PyObject *, FSRef *); /* argument parser for FSRef */ +PyObject *PyMac_BuildFSRef(FSRef *); /* Convert FSRef to PyObject */ + +/* AE exports */ +extern PyObject *AEDesc_New(AppleEvent *); /* XXXX Why passed by address?? */ +extern PyObject *AEDesc_NewBorrowed(AppleEvent *); +extern int AEDesc_Convert(PyObject *, AppleEvent *); + +/* Cm exports */ +extern PyObject *CmpObj_New(Component); +extern int CmpObj_Convert(PyObject *, Component *); +extern PyObject *CmpInstObj_New(ComponentInstance); +extern int CmpInstObj_Convert(PyObject *, ComponentInstance *); + +/* Ctl exports */ +#ifndef __LP64__ +extern PyObject *CtlObj_New(ControlHandle); +extern int CtlObj_Convert(PyObject *, ControlHandle *); +#endif /* !__LP64__ */ + +/* Dlg exports */ +#ifndef __LP64__ +extern PyObject *DlgObj_New(DialogPtr); +extern int DlgObj_Convert(PyObject *, DialogPtr *); +extern PyObject *DlgObj_WhichDialog(DialogPtr); +#endif /* !__LP64__ */ + +/* Drag exports */ +#ifndef __LP64__ +extern PyObject *DragObj_New(DragReference); +extern int DragObj_Convert(PyObject *, DragReference *); +#endif /* !__LP64__ */ + +/* List exports */ +#ifndef __LP64__ +extern PyObject *ListObj_New(ListHandle); +extern int ListObj_Convert(PyObject *, ListHandle *); +#endif /* !__LP64__ */ + +/* Menu exports */ +#ifndef __LP64__ +extern PyObject *MenuObj_New(MenuHandle); +extern int MenuObj_Convert(PyObject *, MenuHandle *); +#endif /* !__LP64__ */ + +/* Qd exports */ +#ifndef __LP64__ +extern PyObject *GrafObj_New(GrafPtr); +extern int GrafObj_Convert(PyObject *, GrafPtr *); +extern PyObject *BMObj_New(BitMapPtr); +extern int BMObj_Convert(PyObject *, BitMapPtr *); +extern PyObject *QdRGB_New(RGBColor *); +extern int QdRGB_Convert(PyObject *, RGBColor *); +#endif /* !__LP64__ */ + +/* Qdoffs exports */ +#ifndef __LP64__ +extern PyObject *GWorldObj_New(GWorldPtr); +extern int GWorldObj_Convert(PyObject *, GWorldPtr *); +#endif /* !__LP64__ */ + +/* Qt exports */ +#ifndef __LP64__ +extern PyObject *TrackObj_New(Track); +extern int TrackObj_Convert(PyObject *, Track *); +extern PyObject *MovieObj_New(Movie); +extern int MovieObj_Convert(PyObject *, Movie *); +extern PyObject *MovieCtlObj_New(MovieController); +extern int MovieCtlObj_Convert(PyObject *, MovieController *); +extern PyObject *TimeBaseObj_New(TimeBase); +extern int TimeBaseObj_Convert(PyObject *, TimeBase *); +extern PyObject *UserDataObj_New(UserData); +extern int UserDataObj_Convert(PyObject *, UserData *); +extern PyObject *MediaObj_New(Media); +extern int MediaObj_Convert(PyObject *, Media *); +#endif /* !__LP64__ */ + +/* Res exports */ +extern PyObject *ResObj_New(Handle); +extern int ResObj_Convert(PyObject *, Handle *); +extern PyObject *OptResObj_New(Handle); +extern int OptResObj_Convert(PyObject *, Handle *); + +/* TE exports */ +#ifndef __LP64__ +extern PyObject *TEObj_New(TEHandle); +extern int TEObj_Convert(PyObject *, TEHandle *); +#endif /* !__LP64__ */ + +/* Win exports */ +#ifndef __LP64__ +extern PyObject *WinObj_New(WindowPtr); +extern int WinObj_Convert(PyObject *, WindowPtr *); +extern PyObject *WinObj_WhichWindow(WindowPtr); +#endif /* !__LP64__ */ + +/* CF exports */ +extern PyObject *CFObj_New(CFTypeRef); +extern int CFObj_Convert(PyObject *, CFTypeRef *); +extern PyObject *CFTypeRefObj_New(CFTypeRef); +extern int CFTypeRefObj_Convert(PyObject *, CFTypeRef *); +extern PyObject *CFStringRefObj_New(CFStringRef); +extern int CFStringRefObj_Convert(PyObject *, CFStringRef *); +extern PyObject *CFMutableStringRefObj_New(CFMutableStringRef); +extern int CFMutableStringRefObj_Convert(PyObject *, CFMutableStringRef *); +extern PyObject *CFArrayRefObj_New(CFArrayRef); +extern int CFArrayRefObj_Convert(PyObject *, CFArrayRef *); +extern PyObject *CFMutableArrayRefObj_New(CFMutableArrayRef); +extern int CFMutableArrayRefObj_Convert(PyObject *, CFMutableArrayRef *); +extern PyObject *CFDictionaryRefObj_New(CFDictionaryRef); +extern int CFDictionaryRefObj_Convert(PyObject *, CFDictionaryRef *); +extern PyObject *CFMutableDictionaryRefObj_New(CFMutableDictionaryRef); +extern int CFMutableDictionaryRefObj_Convert(PyObject *, CFMutableDictionaryRef *); +extern PyObject *CFURLRefObj_New(CFURLRef); +extern int CFURLRefObj_Convert(PyObject *, CFURLRef *); +extern int OptionalCFURLRefObj_Convert(PyObject *, CFURLRef *); + +#ifdef __cplusplus + } +#endif +#endif diff --git a/python/include/pymath.h b/python/include/pymath.h new file mode 100644 index 00000000..f77ce930 --- /dev/null +++ b/python/include/pymath.h @@ -0,0 +1,192 @@ +#ifndef Py_PYMATH_H +#define Py_PYMATH_H + +#include "pyconfig.h" /* include for defines */ + +/************************************************************************** +Symbols and macros to supply platform-independent interfaces to mathematical +functions and constants +**************************************************************************/ + +/* Python provides implementations for copysign, round and hypot in + * Python/pymath.c just in case your math library doesn't provide the + * functions. + * + *Note: PC/pyconfig.h defines copysign as _copysign + */ +#ifndef HAVE_COPYSIGN +extern double copysign(double, double); +#endif + +#ifndef HAVE_ROUND +extern double round(double); +#endif + +#ifndef HAVE_HYPOT +extern double hypot(double, double); +#endif + +/* extra declarations */ +#ifndef _MSC_VER +#ifndef __STDC__ +//extern double fmod (double, double); +//extern double frexp (double, int *); +//extern double ldexp (double, int); +//extern double modf (double, double *); +//extern double pow(double, double); +#endif /* __STDC__ */ +#endif /* _MSC_VER */ + +#ifdef _OSF_SOURCE +/* OSF1 5.1 doesn't make these available with XOPEN_SOURCE_EXTENDED defined */ +extern int finite(double); +extern double copysign(double, double); +#endif + +/* High precision defintion of pi and e (Euler) + * The values are taken from libc6's math.h. + */ +#ifndef Py_MATH_PIl +#define Py_MATH_PIl 3.1415926535897932384626433832795029L +#endif +#ifndef Py_MATH_PI +#define Py_MATH_PI 3.14159265358979323846 +#endif + +#ifndef Py_MATH_El +#define Py_MATH_El 2.7182818284590452353602874713526625L +#endif + +#ifndef Py_MATH_E +#define Py_MATH_E 2.7182818284590452354 +#endif + +/* On x86, Py_FORCE_DOUBLE forces a floating-point number out of an x87 FPU + register and into a 64-bit memory location, rounding from extended + precision to double precision in the process. On other platforms it does + nothing. */ + +/* we take double rounding as evidence of x87 usage */ +#ifndef Py_FORCE_DOUBLE +# ifdef X87_DOUBLE_ROUNDING +PyAPI_FUNC(double) _Py_force_double(double); +# define Py_FORCE_DOUBLE(X) (_Py_force_double(X)) +# else +# define Py_FORCE_DOUBLE(X) (X) +# endif +#endif + +#ifdef HAVE_GCC_ASM_FOR_X87 +PyAPI_FUNC(unsigned short) _Py_get_387controlword(void); +PyAPI_FUNC(void) _Py_set_387controlword(unsigned short); +#endif + +/* Py_IS_NAN(X) + * Return 1 if float or double arg is a NaN, else 0. + * Caution: + * X is evaluated more than once. + * This may not work on all platforms. Each platform has *some* + * way to spell this, though -- override in pyconfig.h if you have + * a platform where it doesn't work. + * Note: PC/pyconfig.h defines Py_IS_NAN as _isnan + */ +#ifndef Py_IS_NAN +#if defined HAVE_DECL_ISNAN && HAVE_DECL_ISNAN == 1 +#define Py_IS_NAN(X) isnan(X) +#else +#define Py_IS_NAN(X) ((X) != (X)) +#endif +#endif + +/* Py_IS_INFINITY(X) + * Return 1 if float or double arg is an infinity, else 0. + * Caution: + * X is evaluated more than once. + * This implementation may set the underflow flag if |X| is very small; + * it really can't be implemented correctly (& easily) before C99. + * Override in pyconfig.h if you have a better spelling on your platform. + * Py_FORCE_DOUBLE is used to avoid getting false negatives from a + * non-infinite value v sitting in an 80-bit x87 register such that + * v becomes infinite when spilled from the register to 64-bit memory. + * Note: PC/pyconfig.h defines Py_IS_INFINITY as _isinf + */ +#ifndef Py_IS_INFINITY +# if defined HAVE_DECL_ISINF && HAVE_DECL_ISINF == 1 +# define Py_IS_INFINITY(X) isinf(X) +# else +# define Py_IS_INFINITY(X) ((X) && \ + (Py_FORCE_DOUBLE(X)*0.5 == Py_FORCE_DOUBLE(X))) +# endif +#endif + +/* Py_IS_FINITE(X) + * Return 1 if float or double arg is neither infinite nor NAN, else 0. + * Some compilers (e.g. VisualStudio) have intrisics for this, so a special + * macro for this particular test is useful + * Note: PC/pyconfig.h defines Py_IS_FINITE as _finite + */ +#ifndef Py_IS_FINITE +#if defined HAVE_DECL_ISFINITE && HAVE_DECL_ISFINITE == 1 +#define Py_IS_FINITE(X) isfinite(X) +#elif defined HAVE_FINITE +#define Py_IS_FINITE(X) finite(X) +#else +#define Py_IS_FINITE(X) (!Py_IS_INFINITY(X) && !Py_IS_NAN(X)) +#endif +#endif + +/* HUGE_VAL is supposed to expand to a positive double infinity. Python + * uses Py_HUGE_VAL instead because some platforms are broken in this + * respect. We used to embed code in pyport.h to try to worm around that, + * but different platforms are broken in conflicting ways. If you're on + * a platform where HUGE_VAL is defined incorrectly, fiddle your Python + * config to #define Py_HUGE_VAL to something that works on your platform. + */ +#ifndef Py_HUGE_VAL +#define Py_HUGE_VAL HUGE_VAL +#endif + +/* Py_NAN + * A value that evaluates to a NaN. On IEEE 754 platforms INF*0 or + * INF/INF works. Define Py_NO_NAN in pyconfig.h if your platform + * doesn't support NaNs. + */ +#if !defined(Py_NAN) && !defined(Py_NO_NAN) +#define Py_NAN (Py_HUGE_VAL * 0.) +#endif + +/* Py_OVERFLOWED(X) + * Return 1 iff a libm function overflowed. Set errno to 0 before calling + * a libm function, and invoke this macro after, passing the function + * result. + * Caution: + * This isn't reliable. C99 no longer requires libm to set errno under + * any exceptional condition, but does require +- HUGE_VAL return + * values on overflow. A 754 box *probably* maps HUGE_VAL to a + * double infinity, and we're cool if that's so, unless the input + * was an infinity and an infinity is the expected result. A C89 + * system sets errno to ERANGE, so we check for that too. We're + * out of luck if a C99 754 box doesn't map HUGE_VAL to +Inf, or + * if the returned result is a NaN, or if a C89 box returns HUGE_VAL + * in non-overflow cases. + * X is evaluated more than once. + * Some platforms have better way to spell this, so expect some #ifdef'ery. + * + * OpenBSD uses 'isinf()' because a compiler bug on that platform causes + * the longer macro version to be mis-compiled. This isn't optimal, and + * should be removed once a newer compiler is available on that platform. + * The system that had the failure was running OpenBSD 3.2 on Intel, with + * gcc 2.95.3. + * + * According to Tim's checkin, the FreeBSD systems use isinf() to work + * around a FPE bug on that platform. + */ +#if defined(__FreeBSD__) || defined(__OpenBSD__) +#define Py_OVERFLOWED(X) isinf(X) +#else +#define Py_OVERFLOWED(X) ((X) != 0.0 && (errno == ERANGE || \ + (X) == Py_HUGE_VAL || \ + (X) == -Py_HUGE_VAL)) +#endif + +#endif /* Py_PYMATH_H */ diff --git a/python/include/pymem.h b/python/include/pymem.h new file mode 100644 index 00000000..10b5bea5 --- /dev/null +++ b/python/include/pymem.h @@ -0,0 +1,122 @@ +/* The PyMem_ family: low-level memory allocation interfaces. + See objimpl.h for the PyObject_ memory family. +*/ + +#ifndef Py_PYMEM_H +#define Py_PYMEM_H + +#include "pyport.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* BEWARE: + + Each interface exports both functions and macros. Extension modules should + use the functions, to ensure binary compatibility across Python versions. + Because the Python implementation is free to change internal details, and + the macros may (or may not) expose details for speed, if you do use the + macros you must recompile your extensions with each Python release. + + Never mix calls to PyMem_ with calls to the platform malloc/realloc/ + calloc/free. For example, on Windows different DLLs may end up using + different heaps, and if you use PyMem_Malloc you'll get the memory from the + heap used by the Python DLL; it could be a disaster if you free()'ed that + directly in your own extension. Using PyMem_Free instead ensures Python + can return the memory to the proper heap. As another example, in + PYMALLOC_DEBUG mode, Python wraps all calls to all PyMem_ and PyObject_ + memory functions in special debugging wrappers that add additional + debugging info to dynamic memory blocks. The system routines have no idea + what to do with that stuff, and the Python wrappers have no idea what to do + with raw blocks obtained directly by the system routines then. + + The GIL must be held when using these APIs. +*/ + +/* + * Raw memory interface + * ==================== + */ + +/* Functions + + Functions supplying platform-independent semantics for malloc/realloc/ + free. These functions make sure that allocating 0 bytes returns a distinct + non-NULL pointer (whenever possible -- if we're flat out of memory, NULL + may be returned), even if the platform malloc and realloc don't. + Returned pointers must be checked for NULL explicitly. No action is + performed on failure (no exception is set, no warning is printed, etc). +*/ + +PyAPI_FUNC(void *) PyMem_Malloc(size_t); +PyAPI_FUNC(void *) PyMem_Realloc(void *, size_t); +PyAPI_FUNC(void) PyMem_Free(void *); + +/* Starting from Python 1.6, the wrappers Py_{Malloc,Realloc,Free} are + no longer supported. They used to call PyErr_NoMemory() on failure. */ + +/* Macros. */ +#ifdef PYMALLOC_DEBUG +/* Redirect all memory operations to Python's debugging allocator. */ +#define PyMem_MALLOC _PyMem_DebugMalloc +#define PyMem_REALLOC _PyMem_DebugRealloc +#define PyMem_FREE _PyMem_DebugFree + +#else /* ! PYMALLOC_DEBUG */ + +/* PyMem_MALLOC(0) means malloc(1). Some systems would return NULL + for malloc(0), which would be treated as an error. Some platforms + would return a pointer with no memory behind it, which would break + pymalloc. To solve these problems, allocate an extra byte. */ +/* Returns NULL to indicate error if a negative size or size larger than + Py_ssize_t can represent is supplied. Helps prevents security holes. */ +#define PyMem_MALLOC(n) ((size_t)(n) > (size_t)PY_SSIZE_T_MAX ? NULL \ + : malloc((n) ? (n) : 1)) +#define PyMem_REALLOC(p, n) ((size_t)(n) > (size_t)PY_SSIZE_T_MAX ? NULL \ + : realloc((p), (n) ? (n) : 1)) +#define PyMem_FREE free + +#endif /* PYMALLOC_DEBUG */ + +/* + * Type-oriented memory interface + * ============================== + * + * Allocate memory for n objects of the given type. Returns a new pointer + * or NULL if the request was too large or memory allocation failed. Use + * these macros rather than doing the multiplication yourself so that proper + * overflow checking is always done. + */ + +#define PyMem_New(type, n) \ + ( ((size_t)(n) > PY_SSIZE_T_MAX / sizeof(type)) ? NULL : \ + ( (type *) PyMem_Malloc((n) * sizeof(type)) ) ) +#define PyMem_NEW(type, n) \ + ( ((size_t)(n) > PY_SSIZE_T_MAX / sizeof(type)) ? NULL : \ + ( (type *) PyMem_MALLOC((n) * sizeof(type)) ) ) + +/* + * The value of (p) is always clobbered by this macro regardless of success. + * The caller MUST check if (p) is NULL afterwards and deal with the memory + * error if so. This means the original value of (p) MUST be saved for the + * caller's memory error handler to not lose track of it. + */ +#define PyMem_Resize(p, type, n) \ + ( (p) = ((size_t)(n) > PY_SSIZE_T_MAX / sizeof(type)) ? NULL : \ + (type *) PyMem_Realloc((p), (n) * sizeof(type)) ) +#define PyMem_RESIZE(p, type, n) \ + ( (p) = ((size_t)(n) > PY_SSIZE_T_MAX / sizeof(type)) ? NULL : \ + (type *) PyMem_REALLOC((p), (n) * sizeof(type)) ) + +/* PyMem{Del,DEL} are left over from ancient days, and shouldn't be used + * anymore. They're just confusing aliases for PyMem_{Free,FREE} now. + */ +#define PyMem_Del PyMem_Free +#define PyMem_DEL PyMem_FREE + +#ifdef __cplusplus +} +#endif + +#endif /* !Py_PYMEM_H */ diff --git a/python/include/pyport.h b/python/include/pyport.h new file mode 100644 index 00000000..1abc14c5 --- /dev/null +++ b/python/include/pyport.h @@ -0,0 +1,904 @@ +#ifndef Py_PYPORT_H +#define Py_PYPORT_H + +#include "pyconfig.h" /* include for defines */ + +/* Some versions of HP-UX & Solaris need inttypes.h for int32_t, + INT32_MAX, etc. */ +#ifdef HAVE_INTTYPES_H +#include +#endif + +#ifdef HAVE_STDINT_H +#include +#endif + +/************************************************************************** +Symbols and macros to supply platform-independent interfaces to basic +C language & library operations whose spellings vary across platforms. + +Please try to make documentation here as clear as possible: by definition, +the stuff here is trying to illuminate C's darkest corners. + +Config #defines referenced here: + +SIGNED_RIGHT_SHIFT_ZERO_FILLS +Meaning: To be defined iff i>>j does not extend the sign bit when i is a + signed integral type and i < 0. +Used in: Py_ARITHMETIC_RIGHT_SHIFT + +Py_DEBUG +Meaning: Extra checks compiled in for debug mode. +Used in: Py_SAFE_DOWNCAST + +HAVE_UINTPTR_T +Meaning: The C9X type uintptr_t is supported by the compiler +Used in: Py_uintptr_t + +HAVE_LONG_LONG +Meaning: The compiler supports the C type "long long" +Used in: PY_LONG_LONG + +**************************************************************************/ + + +/* For backward compatibility only. Obsolete, do not use. */ +#ifdef HAVE_PROTOTYPES +#define Py_PROTO(x) x +#else +#define Py_PROTO(x) () +#endif +#ifndef Py_FPROTO +#define Py_FPROTO(x) Py_PROTO(x) +#endif + +/* typedefs for some C9X-defined synonyms for integral types. + * + * The names in Python are exactly the same as the C9X names, except with a + * Py_ prefix. Until C9X is universally implemented, this is the only way + * to ensure that Python gets reliable names that don't conflict with names + * in non-Python code that are playing their own tricks to define the C9X + * names. + * + * NOTE: don't go nuts here! Python has no use for *most* of the C9X + * integral synonyms. Only define the ones we actually need. + */ + +#ifdef HAVE_LONG_LONG +#ifndef PY_LONG_LONG +#define PY_LONG_LONG long long +#if defined(LLONG_MAX) +/* If LLONG_MAX is defined in limits.h, use that. */ +#define PY_LLONG_MIN LLONG_MIN +#define PY_LLONG_MAX LLONG_MAX +#define PY_ULLONG_MAX ULLONG_MAX +#elif defined(__LONG_LONG_MAX__) +/* Otherwise, if GCC has a builtin define, use that. */ +#define PY_LLONG_MAX __LONG_LONG_MAX__ +#define PY_LLONG_MIN (-PY_LLONG_MAX-1) +#define PY_ULLONG_MAX (__LONG_LONG_MAX__*2ULL + 1ULL) +#else +/* Otherwise, rely on two's complement. */ +#define PY_ULLONG_MAX (~0ULL) +#define PY_LLONG_MAX ((long long)(PY_ULLONG_MAX>>1)) +#define PY_LLONG_MIN (-PY_LLONG_MAX-1) +#endif /* LLONG_MAX */ +#endif +#endif /* HAVE_LONG_LONG */ + +/* a build with 30-bit digits for Python long integers needs an exact-width + * 32-bit unsigned integer type to store those digits. (We could just use + * type 'unsigned long', but that would be wasteful on a system where longs + * are 64-bits.) On Unix systems, the autoconf macro AC_TYPE_UINT32_T defines + * uint32_t to be such a type unless stdint.h or inttypes.h defines uint32_t. + * However, it doesn't set HAVE_UINT32_T, so we do that here. + */ +#if (defined UINT32_MAX || defined uint32_t) +#ifndef PY_UINT32_T +#define HAVE_UINT32_T 1 +#define PY_UINT32_T uint32_t +#endif +#endif + +/* Macros for a 64-bit unsigned integer type; used for type 'twodigits' in the + * long integer implementation, when 30-bit digits are enabled. + */ +#if (defined UINT64_MAX || defined uint64_t) +#ifndef PY_UINT64_T +#define HAVE_UINT64_T 1 +#define PY_UINT64_T uint64_t +#endif +#endif + +/* Signed variants of the above */ +#if (defined INT32_MAX || defined int32_t) +#ifndef PY_INT32_T +#define HAVE_INT32_T 1 +#define PY_INT32_T int32_t +#endif +#endif +#if (defined INT64_MAX || defined int64_t) +#ifndef PY_INT64_T +#define HAVE_INT64_T 1 +#define PY_INT64_T int64_t +#endif +#endif + +/* If PYLONG_BITS_IN_DIGIT is not defined then we'll use 30-bit digits if all + the necessary integer types are available, and we're on a 64-bit platform + (as determined by SIZEOF_VOID_P); otherwise we use 15-bit digits. */ + +#ifndef PYLONG_BITS_IN_DIGIT +#if (defined HAVE_UINT64_T && defined HAVE_INT64_T && \ + defined HAVE_UINT32_T && defined HAVE_INT32_T && SIZEOF_VOID_P >= 8) +#define PYLONG_BITS_IN_DIGIT 30 +#else +#define PYLONG_BITS_IN_DIGIT 15 +#endif +#endif + +/* uintptr_t is the C9X name for an unsigned integral type such that a + * legitimate void* can be cast to uintptr_t and then back to void* again + * without loss of information. Similarly for intptr_t, wrt a signed + * integral type. + */ +#ifdef HAVE_UINTPTR_T +typedef uintptr_t Py_uintptr_t; +typedef intptr_t Py_intptr_t; + +#elif SIZEOF_VOID_P <= SIZEOF_INT +typedef unsigned int Py_uintptr_t; +typedef int Py_intptr_t; + +#elif SIZEOF_VOID_P <= SIZEOF_LONG +typedef unsigned long Py_uintptr_t; +typedef long Py_intptr_t; + +#elif defined(HAVE_LONG_LONG) && (SIZEOF_VOID_P <= SIZEOF_LONG_LONG) +typedef unsigned PY_LONG_LONG Py_uintptr_t; +typedef PY_LONG_LONG Py_intptr_t; + +#else +# error "Python needs a typedef for Py_uintptr_t in pyport.h." +#endif /* HAVE_UINTPTR_T */ + +/* Py_ssize_t is a signed integral type such that sizeof(Py_ssize_t) == + * sizeof(size_t). C99 doesn't define such a thing directly (size_t is an + * unsigned integral type). See PEP 353 for details. + */ +#ifdef HAVE_SSIZE_T +typedef ssize_t Py_ssize_t; +#elif SIZEOF_VOID_P == SIZEOF_SIZE_T +typedef Py_intptr_t Py_ssize_t; +#else +# error "Python needs a typedef for Py_ssize_t in pyport.h." +#endif + +/* Largest possible value of size_t. + SIZE_MAX is part of C99, so it might be defined on some + platforms. If it is not defined, (size_t)-1 is a portable + definition for C89, due to the way signed->unsigned + conversion is defined. */ +#ifdef SIZE_MAX +#define PY_SIZE_MAX SIZE_MAX +#else +#define PY_SIZE_MAX ((size_t)-1) +#endif + +/* Largest positive value of type Py_ssize_t. */ +#define PY_SSIZE_T_MAX ((Py_ssize_t)(((size_t)-1)>>1)) +/* Smallest negative value of type Py_ssize_t. */ +#define PY_SSIZE_T_MIN (-PY_SSIZE_T_MAX-1) + +#if SIZEOF_PID_T > SIZEOF_LONG +# error "Python doesn't support sizeof(pid_t) > sizeof(long)" +#endif + +/* PY_FORMAT_SIZE_T is a platform-specific modifier for use in a printf + * format to convert an argument with the width of a size_t or Py_ssize_t. + * C99 introduced "z" for this purpose, but not all platforms support that; + * e.g., MS compilers use "I" instead. + * + * These "high level" Python format functions interpret "z" correctly on + * all platforms (Python interprets the format string itself, and does whatever + * the platform C requires to convert a size_t/Py_ssize_t argument): + * + * PyString_FromFormat + * PyErr_Format + * PyString_FromFormatV + * + * Lower-level uses require that you interpolate the correct format modifier + * yourself (e.g., calling printf, fprintf, sprintf, PyOS_snprintf); for + * example, + * + * Py_ssize_t index; + * fprintf(stderr, "index %" PY_FORMAT_SIZE_T "d sucks\n", index); + * + * That will expand to %ld, or %Id, or to something else correct for a + * Py_ssize_t on the platform. + */ +#ifndef PY_FORMAT_SIZE_T +# if SIZEOF_SIZE_T == SIZEOF_INT && !defined(__APPLE__) +# define PY_FORMAT_SIZE_T "" +# elif SIZEOF_SIZE_T == SIZEOF_LONG +# define PY_FORMAT_SIZE_T "l" +# elif defined(MS_WINDOWS) +# define PY_FORMAT_SIZE_T "I" +# else +# error "This platform's pyconfig.h needs to define PY_FORMAT_SIZE_T" +# endif +#endif + +/* PY_FORMAT_LONG_LONG is analogous to PY_FORMAT_SIZE_T above, but for + * the long long type instead of the size_t type. It's only available + * when HAVE_LONG_LONG is defined. The "high level" Python format + * functions listed above will interpret "lld" or "llu" correctly on + * all platforms. + */ +#ifdef HAVE_LONG_LONG +# ifndef PY_FORMAT_LONG_LONG +# if defined(MS_WIN64) || defined(MS_WINDOWS) +# define PY_FORMAT_LONG_LONG "I64" +# else +# error "This platform's pyconfig.h needs to define PY_FORMAT_LONG_LONG" +# endif +# endif +#endif + +/* Py_LOCAL can be used instead of static to get the fastest possible calling + * convention for functions that are local to a given module. + * + * Py_LOCAL_INLINE does the same thing, and also explicitly requests inlining, + * for platforms that support that. + * + * If PY_LOCAL_AGGRESSIVE is defined before python.h is included, more + * "aggressive" inlining/optimizaion is enabled for the entire module. This + * may lead to code bloat, and may slow things down for those reasons. It may + * also lead to errors, if the code relies on pointer aliasing. Use with + * care. + * + * NOTE: You can only use this for functions that are entirely local to a + * module; functions that are exported via method tables, callbacks, etc, + * should keep using static. + */ + +#undef USE_INLINE /* XXX - set via configure? */ + +#if defined(_MSC_VER) +#if defined(PY_LOCAL_AGGRESSIVE) +/* enable more aggressive optimization for visual studio */ +#pragma optimize("agtw", on) +#endif +/* ignore warnings if the compiler decides not to inline a function */ +#pragma warning(disable: 4710) +/* fastest possible local call under MSVC */ +#define Py_LOCAL(type) static type __fastcall +#define Py_LOCAL_INLINE(type) static __inline type __fastcall +#elif defined(USE_INLINE) +#define Py_LOCAL(type) static type +#define Py_LOCAL_INLINE(type) static inline type +#else +#define Py_LOCAL(type) static type +#define Py_LOCAL_INLINE(type) static type +#endif + +/* Py_MEMCPY can be used instead of memcpy in cases where the copied blocks + * are often very short. While most platforms have highly optimized code for + * large transfers, the setup costs for memcpy are often quite high. MEMCPY + * solves this by doing short copies "in line". + */ + +#if defined(_MSC_VER) +#define Py_MEMCPY(target, source, length) do { \ + size_t i_, n_ = (length); \ + char *t_ = (void*) (target); \ + const char *s_ = (void*) (source); \ + if (n_ >= 16) \ + memcpy(t_, s_, n_); \ + else \ + for (i_ = 0; i_ < n_; i_++) \ + t_[i_] = s_[i_]; \ + } while (0) +#else +#define Py_MEMCPY memcpy +#endif + +#include + +#ifdef HAVE_IEEEFP_H +#include /* needed for 'finite' declaration on some platforms */ +#endif + +#include /* Moved here from the math section, before extern "C" */ + +/******************************************** + * WRAPPER FOR and/or * + ********************************************/ + +#ifdef TIME_WITH_SYS_TIME +#include +#include +#else /* !TIME_WITH_SYS_TIME */ +#ifdef HAVE_SYS_TIME_H +#include +#else /* !HAVE_SYS_TIME_H */ +#include +#endif /* !HAVE_SYS_TIME_H */ +#endif /* !TIME_WITH_SYS_TIME */ + + +/****************************** + * WRAPPER FOR * + ******************************/ + +/* NB caller must include */ + +#ifdef HAVE_SYS_SELECT_H + +#include + +#endif /* !HAVE_SYS_SELECT_H */ + +/******************************* + * stat() and fstat() fiddling * + *******************************/ + +/* We expect that stat and fstat exist on most systems. + * It's confirmed on Unix, Mac and Windows. + * If you don't have them, add + * #define DONT_HAVE_STAT + * and/or + * #define DONT_HAVE_FSTAT + * to your pyconfig.h. Python code beyond this should check HAVE_STAT and + * HAVE_FSTAT instead. + * Also + * #define HAVE_SYS_STAT_H + * if exists on your platform, and + * #define HAVE_STAT_H + * if does. + */ +#ifndef DONT_HAVE_STAT +#define HAVE_STAT +#endif + +#ifndef DONT_HAVE_FSTAT +#define HAVE_FSTAT +#endif + +#ifdef RISCOS +#include +#include "unixstuff.h" +#endif + +#ifdef HAVE_SYS_STAT_H +#if defined(PYOS_OS2) && defined(PYCC_GCC) +#include +#endif +#include +#elif defined(HAVE_STAT_H) +#include +#endif + +#if defined(PYCC_VACPP) +/* VisualAge C/C++ Failed to Define MountType Field in sys/stat.h */ +#define S_IFMT (S_IFDIR|S_IFCHR|S_IFREG) +#endif + +#ifndef S_ISREG +#define S_ISREG(x) (((x) & S_IFMT) == S_IFREG) +#endif + +#ifndef S_ISDIR +#define S_ISDIR(x) (((x) & S_IFMT) == S_IFDIR) +#endif + + +#ifdef __cplusplus +/* Move this down here since some C++ #include's don't like to be included + inside an extern "C" */ +extern "C" { +#endif + + +/* Py_ARITHMETIC_RIGHT_SHIFT + * C doesn't define whether a right-shift of a signed integer sign-extends + * or zero-fills. Here a macro to force sign extension: + * Py_ARITHMETIC_RIGHT_SHIFT(TYPE, I, J) + * Return I >> J, forcing sign extension. Arithmetically, return the + * floor of I/2**J. + * Requirements: + * I should have signed integer type. In the terminology of C99, this can + * be either one of the five standard signed integer types (signed char, + * short, int, long, long long) or an extended signed integer type. + * J is an integer >= 0 and strictly less than the number of bits in the + * type of I (because C doesn't define what happens for J outside that + * range either). + * TYPE used to specify the type of I, but is now ignored. It's been left + * in for backwards compatibility with versions <= 2.6 or 3.0. + * Caution: + * I may be evaluated more than once. + */ +#ifdef SIGNED_RIGHT_SHIFT_ZERO_FILLS +#define Py_ARITHMETIC_RIGHT_SHIFT(TYPE, I, J) \ + ((I) < 0 ? -1-((-1-(I)) >> (J)) : (I) >> (J)) +#else +#define Py_ARITHMETIC_RIGHT_SHIFT(TYPE, I, J) ((I) >> (J)) +#endif + +/* Py_FORCE_EXPANSION(X) + * "Simply" returns its argument. However, macro expansions within the + * argument are evaluated. This unfortunate trickery is needed to get + * token-pasting to work as desired in some cases. + */ +#define Py_FORCE_EXPANSION(X) X + +/* Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) + * Cast VALUE to type NARROW from type WIDE. In Py_DEBUG mode, this + * assert-fails if any information is lost. + * Caution: + * VALUE may be evaluated more than once. + */ +#ifdef Py_DEBUG +#define Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) \ + (assert((WIDE)(NARROW)(VALUE) == (VALUE)), (NARROW)(VALUE)) +#else +#define Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) (NARROW)(VALUE) +#endif + +/* Py_SET_ERRNO_ON_MATH_ERROR(x) + * If a libm function did not set errno, but it looks like the result + * overflowed or not-a-number, set errno to ERANGE or EDOM. Set errno + * to 0 before calling a libm function, and invoke this macro after, + * passing the function result. + * Caution: + * This isn't reliable. See Py_OVERFLOWED comments. + * X is evaluated more than once. + */ +#if defined(__FreeBSD__) || defined(__OpenBSD__) || (defined(__hpux) && defined(__ia64)) +#define _Py_SET_EDOM_FOR_NAN(X) if (isnan(X)) errno = EDOM; +#else +#define _Py_SET_EDOM_FOR_NAN(X) ; +#endif +#define Py_SET_ERRNO_ON_MATH_ERROR(X) \ + do { \ + if (errno == 0) { \ + if ((X) == Py_HUGE_VAL || (X) == -Py_HUGE_VAL) \ + errno = ERANGE; \ + else _Py_SET_EDOM_FOR_NAN(X) \ + } \ + } while(0) + +/* Py_SET_ERANGE_ON_OVERFLOW(x) + * An alias of Py_SET_ERRNO_ON_MATH_ERROR for backward-compatibility. + */ +#define Py_SET_ERANGE_IF_OVERFLOW(X) Py_SET_ERRNO_ON_MATH_ERROR(X) + +/* Py_ADJUST_ERANGE1(x) + * Py_ADJUST_ERANGE2(x, y) + * Set errno to 0 before calling a libm function, and invoke one of these + * macros after, passing the function result(s) (Py_ADJUST_ERANGE2 is useful + * for functions returning complex results). This makes two kinds of + * adjustments to errno: (A) If it looks like the platform libm set + * errno=ERANGE due to underflow, clear errno. (B) If it looks like the + * platform libm overflowed but didn't set errno, force errno to ERANGE. In + * effect, we're trying to force a useful implementation of C89 errno + * behavior. + * Caution: + * This isn't reliable. See Py_OVERFLOWED comments. + * X and Y may be evaluated more than once. + */ +#define Py_ADJUST_ERANGE1(X) \ + do { \ + if (errno == 0) { \ + if ((X) == Py_HUGE_VAL || (X) == -Py_HUGE_VAL) \ + errno = ERANGE; \ + } \ + else if (errno == ERANGE && (X) == 0.0) \ + errno = 0; \ + } while(0) + +#define Py_ADJUST_ERANGE2(X, Y) \ + do { \ + if ((X) == Py_HUGE_VAL || (X) == -Py_HUGE_VAL || \ + (Y) == Py_HUGE_VAL || (Y) == -Py_HUGE_VAL) { \ + if (errno == 0) \ + errno = ERANGE; \ + } \ + else if (errno == ERANGE) \ + errno = 0; \ + } while(0) + +/* The functions _Py_dg_strtod and _Py_dg_dtoa in Python/dtoa.c (which are + * required to support the short float repr introduced in Python 3.1) require + * that the floating-point unit that's being used for arithmetic operations + * on C doubles is set to use 53-bit precision. It also requires that the + * FPU rounding mode is round-half-to-even, but that's less often an issue. + * + * If your FPU isn't already set to 53-bit precision/round-half-to-even, and + * you want to make use of _Py_dg_strtod and _Py_dg_dtoa, then you should + * + * #define HAVE_PY_SET_53BIT_PRECISION 1 + * + * and also give appropriate definitions for the following three macros: + * + * _PY_SET_53BIT_PRECISION_START : store original FPU settings, and + * set FPU to 53-bit precision/round-half-to-even + * _PY_SET_53BIT_PRECISION_END : restore original FPU settings + * _PY_SET_53BIT_PRECISION_HEADER : any variable declarations needed to + * use the two macros above. + * + * The macros are designed to be used within a single C function: see + * Python/pystrtod.c for an example of their use. + */ + +/* get and set x87 control word for gcc/x86 */ +#ifdef HAVE_GCC_ASM_FOR_X87 +#define HAVE_PY_SET_53BIT_PRECISION 1 +/* _Py_get/set_387controlword functions are defined in Python/pymath.c */ +#define _Py_SET_53BIT_PRECISION_HEADER \ + unsigned short old_387controlword, new_387controlword +#define _Py_SET_53BIT_PRECISION_START \ + do { \ + old_387controlword = _Py_get_387controlword(); \ + new_387controlword = (old_387controlword & ~0x0f00) | 0x0200; \ + if (new_387controlword != old_387controlword) \ + _Py_set_387controlword(new_387controlword); \ + } while (0) +#define _Py_SET_53BIT_PRECISION_END \ + if (new_387controlword != old_387controlword) \ + _Py_set_387controlword(old_387controlword) +#endif + +/* default definitions are empty */ +#ifndef HAVE_PY_SET_53BIT_PRECISION +#define _Py_SET_53BIT_PRECISION_HEADER +#define _Py_SET_53BIT_PRECISION_START +#define _Py_SET_53BIT_PRECISION_END +#endif + +/* If we can't guarantee 53-bit precision, don't use the code + in Python/dtoa.c, but fall back to standard code. This + means that repr of a float will be long (17 sig digits). + + Realistically, there are two things that could go wrong: + + (1) doubles aren't IEEE 754 doubles, or + (2) we're on x86 with the rounding precision set to 64-bits + (extended precision), and we don't know how to change + the rounding precision. + */ + +#if !defined(DOUBLE_IS_LITTLE_ENDIAN_IEEE754) && \ + !defined(DOUBLE_IS_BIG_ENDIAN_IEEE754) && \ + !defined(DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754) +#define PY_NO_SHORT_FLOAT_REPR +#endif + +/* double rounding is symptomatic of use of extended precision on x86. If + we're seeing double rounding, and we don't have any mechanism available for + changing the FPU rounding precision, then don't use Python/dtoa.c. */ +#if defined(X87_DOUBLE_ROUNDING) && !defined(HAVE_PY_SET_53BIT_PRECISION) +#define PY_NO_SHORT_FLOAT_REPR +#endif + +/* Py_DEPRECATED(version) + * Declare a variable, type, or function deprecated. + * Usage: + * extern int old_var Py_DEPRECATED(2.3); + * typedef int T1 Py_DEPRECATED(2.4); + * extern int x() Py_DEPRECATED(2.5); + */ +#if defined(__GNUC__) && ((__GNUC__ >= 4) || \ + (__GNUC__ == 3) && (__GNUC_MINOR__ >= 1)) +#define Py_DEPRECATED(VERSION_UNUSED) __attribute__((__deprecated__)) +#else +#define Py_DEPRECATED(VERSION_UNUSED) +#endif + +/************************************************************************** +Prototypes that are missing from the standard include files on some systems +(and possibly only some versions of such systems.) + +Please be conservative with adding new ones, document them and enclose them +in platform-specific #ifdefs. +**************************************************************************/ + +#ifdef SOLARIS +/* Unchecked */ +extern int gethostname(char *, int); +#endif + +#ifdef __BEOS__ +/* Unchecked */ +/* It's in the libs, but not the headers... - [cjh] */ +int shutdown( int, int ); +#endif + +#ifdef HAVE__GETPTY +#include /* we need to import mode_t */ +extern char * _getpty(int *, int, mode_t, int); +#endif + +/* On QNX 6, struct termio must be declared by including sys/termio.h + if TCGETA, TCSETA, TCSETAW, or TCSETAF are used. sys/termio.h must + be included before termios.h or it will generate an error. */ +#ifdef HAVE_SYS_TERMIO_H +#include +#endif + +#if defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY) +#if !defined(HAVE_PTY_H) && !defined(HAVE_LIBUTIL_H) && !defined(HAVE_UTIL_H) +/* BSDI does not supply a prototype for the 'openpty' and 'forkpty' + functions, even though they are included in libutil. */ +#include +extern int openpty(int *, int *, char *, struct termios *, struct winsize *); +extern pid_t forkpty(int *, char *, struct termios *, struct winsize *); +#endif /* !defined(HAVE_PTY_H) && !defined(HAVE_LIBUTIL_H) */ +#endif /* defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY) */ + + +/* These are pulled from various places. It isn't obvious on what platforms + they are necessary, nor what the exact prototype should look like (which + is likely to vary between platforms!) If you find you need one of these + declarations, please move them to a platform-specific block and include + proper prototypes. */ +#if 0 + +/* From Modules/resource.c */ +extern int getrusage(); +extern int getpagesize(); + +/* From Python/sysmodule.c and Modules/posixmodule.c */ +extern int fclose(FILE *); + +/* From Modules/posixmodule.c */ +extern int fdatasync(int); +#endif /* 0 */ + + +/* On 4.4BSD-descendants, ctype functions serves the whole range of + * wchar_t character set rather than single byte code points only. + * This characteristic can break some operations of string object + * including str.upper() and str.split() on UTF-8 locales. This + * workaround was provided by Tim Robbins of FreeBSD project. + */ + +#ifdef __FreeBSD__ +#include +#if __FreeBSD_version > 500039 +# define _PY_PORT_CTYPE_UTF8_ISSUE +#endif +#endif + + +#if defined(__APPLE__) +# define _PY_PORT_CTYPE_UTF8_ISSUE +#endif + +#ifdef _PY_PORT_CTYPE_UTF8_ISSUE +#include +#include +#undef isalnum +#define isalnum(c) iswalnum(btowc(c)) +#undef isalpha +#define isalpha(c) iswalpha(btowc(c)) +#undef islower +#define islower(c) iswlower(btowc(c)) +#undef isspace +#define isspace(c) iswspace(btowc(c)) +#undef isupper +#define isupper(c) iswupper(btowc(c)) +#undef tolower +#define tolower(c) towlower(btowc(c)) +#undef toupper +#define toupper(c) towupper(btowc(c)) +#endif + + +/* Declarations for symbol visibility. + + PyAPI_FUNC(type): Declares a public Python API function and return type + PyAPI_DATA(type): Declares public Python data and its type + PyMODINIT_FUNC: A Python module init function. If these functions are + inside the Python core, they are private to the core. + If in an extension module, it may be declared with + external linkage depending on the platform. + + As a number of platforms support/require "__declspec(dllimport/dllexport)", + we support a HAVE_DECLSPEC_DLL macro to save duplication. +*/ + +/* + All windows ports, except cygwin, are handled in PC/pyconfig.h. + + BeOS and cygwin are the only other autoconf platform requiring special + linkage handling and both of these use __declspec(). +*/ +#if defined(__CYGWIN__) || defined(__BEOS__) +# define HAVE_DECLSPEC_DLL +#endif + +/* only get special linkage if built as shared or platform is Cygwin */ +#if defined(Py_ENABLE_SHARED) || defined(__CYGWIN__) +# if defined(HAVE_DECLSPEC_DLL) +# ifdef Py_BUILD_CORE +# define PyAPI_FUNC(RTYPE) __declspec(dllexport) RTYPE +# define PyAPI_DATA(RTYPE) extern __declspec(dllexport) RTYPE + /* module init functions inside the core need no external linkage */ + /* except for Cygwin to handle embedding (FIXME: BeOS too?) */ +# if defined(__CYGWIN__) +# define PyMODINIT_FUNC __declspec(dllexport) void +# else /* __CYGWIN__ */ +# define PyMODINIT_FUNC void +# endif /* __CYGWIN__ */ +# else /* Py_BUILD_CORE */ + /* Building an extension module, or an embedded situation */ + /* public Python functions and data are imported */ + /* Under Cygwin, auto-import functions to prevent compilation */ + /* failures similar to those described at the bottom of 4.1: */ + /* http://docs.python.org/extending/windows.html#a-cookbook-approach */ +# if !defined(__CYGWIN__) +# define PyAPI_FUNC(RTYPE) __declspec(dllimport) RTYPE +# endif /* !__CYGWIN__ */ +# define PyAPI_DATA(RTYPE) extern __declspec(dllimport) RTYPE + /* module init functions outside the core must be exported */ +# if defined(__cplusplus) +# define PyMODINIT_FUNC extern "C" __declspec(dllexport) void +# else /* __cplusplus */ +# define PyMODINIT_FUNC __declspec(dllexport) void +# endif /* __cplusplus */ +# endif /* Py_BUILD_CORE */ +# endif /* HAVE_DECLSPEC */ +#endif /* Py_ENABLE_SHARED */ + +/* If no external linkage macros defined by now, create defaults */ +#ifndef PyAPI_FUNC +# define PyAPI_FUNC(RTYPE) RTYPE +#endif +#ifndef PyAPI_DATA +# define PyAPI_DATA(RTYPE) extern RTYPE +#endif +#ifndef PyMODINIT_FUNC +# if defined(__cplusplus) +# define PyMODINIT_FUNC extern "C" void +# else /* __cplusplus */ +# define PyMODINIT_FUNC void +# endif /* __cplusplus */ +#endif + +/* Deprecated DL_IMPORT and DL_EXPORT macros */ +#if defined(Py_ENABLE_SHARED) && defined (HAVE_DECLSPEC_DLL) +# if defined(Py_BUILD_CORE) +# define DL_IMPORT(RTYPE) __declspec(dllexport) RTYPE +# define DL_EXPORT(RTYPE) __declspec(dllexport) RTYPE +# else +# define DL_IMPORT(RTYPE) __declspec(dllimport) RTYPE +# define DL_EXPORT(RTYPE) __declspec(dllexport) RTYPE +# endif +#endif +#ifndef DL_EXPORT +# define DL_EXPORT(RTYPE) RTYPE +#endif +#ifndef DL_IMPORT +# define DL_IMPORT(RTYPE) RTYPE +#endif +/* End of deprecated DL_* macros */ + +/* If the fd manipulation macros aren't defined, + here is a set that should do the job */ + +#if 0 /* disabled and probably obsolete */ + +#ifndef FD_SETSIZE +#define FD_SETSIZE 256 +#endif + +#ifndef FD_SET + +typedef long fd_mask; + +#define NFDBITS (sizeof(fd_mask) * NBBY) /* bits per mask */ +#ifndef howmany +#define howmany(x, y) (((x)+((y)-1))/(y)) +#endif /* howmany */ + +typedef struct fd_set { + fd_mask fds_bits[howmany(FD_SETSIZE, NFDBITS)]; +} fd_set; + +#define FD_SET(n, p) ((p)->fds_bits[(n)/NFDBITS] |= (1 << ((n) % NFDBITS))) +#define FD_CLR(n, p) ((p)->fds_bits[(n)/NFDBITS] &= ~(1 << ((n) % NFDBITS))) +#define FD_ISSET(n, p) ((p)->fds_bits[(n)/NFDBITS] & (1 << ((n) % NFDBITS))) +#define FD_ZERO(p) memset((char *)(p), '\0', sizeof(*(p))) + +#endif /* FD_SET */ + +#endif /* fd manipulation macros */ + + +/* limits.h constants that may be missing */ + +#ifndef INT_MAX +#define INT_MAX 2147483647 +#endif + +#ifndef LONG_MAX +#if SIZEOF_LONG == 4 +#define LONG_MAX 0X7FFFFFFFL +#elif SIZEOF_LONG == 8 +#define LONG_MAX 0X7FFFFFFFFFFFFFFFL +#else +#error "could not set LONG_MAX in pyport.h" +#endif +#endif + +#ifndef LONG_MIN +#define LONG_MIN (-LONG_MAX-1) +#endif + +#ifndef LONG_BIT +#define LONG_BIT (8 * SIZEOF_LONG) +#endif + +#if LONG_BIT != 8 * SIZEOF_LONG +/* 04-Oct-2000 LONG_BIT is apparently (mis)defined as 64 on some recent + * 32-bit platforms using gcc. We try to catch that here at compile-time + * rather than waiting for integer multiplication to trigger bogus + * overflows. + */ +#error "LONG_BIT definition appears wrong for platform (bad gcc/glibc config?)." +#endif + +#ifdef __cplusplus +} +#endif + +/* + * Hide GCC attributes from compilers that don't support them. + */ +#if (!defined(__GNUC__) || __GNUC__ < 2 || \ + (__GNUC__ == 2 && __GNUC_MINOR__ < 7) ) && \ + !defined(RISCOS) +#define Py_GCC_ATTRIBUTE(x) +#else +#define Py_GCC_ATTRIBUTE(x) __attribute__(x) +#endif + +/* + * Add PyArg_ParseTuple format where available. + */ +#ifdef HAVE_ATTRIBUTE_FORMAT_PARSETUPLE +#define Py_FORMAT_PARSETUPLE(func,p1,p2) __attribute__((format(func,p1,p2))) +#else +#define Py_FORMAT_PARSETUPLE(func,p1,p2) +#endif + +/* + * Specify alignment on compilers that support it. + */ +#if defined(__GNUC__) && __GNUC__ >= 3 +#define Py_ALIGNED(x) __attribute__((aligned(x))) +#else +#define Py_ALIGNED(x) +#endif + +/* Eliminate end-of-loop code not reached warnings from SunPro C + * when using do{...}while(0) macros + */ +#ifdef __SUNPRO_C +#pragma error_messages (off,E_END_OF_LOOP_CODE_NOT_REACHED) +#endif + +/* + * Older Microsoft compilers don't support the C99 long long literal suffixes, + * so these will be defined in PC/pyconfig.h for those compilers. + */ +#ifndef Py_LL +#define Py_LL(x) x##LL +#endif + +#ifndef Py_ULL +#define Py_ULL(x) Py_LL(x##U) +#endif + +#endif /* Py_PYPORT_H */ diff --git a/python/include/pystate.h b/python/include/pystate.h new file mode 100644 index 00000000..8d74940f --- /dev/null +++ b/python/include/pystate.h @@ -0,0 +1,197 @@ + +/* Thread and interpreter state structures and their interfaces */ + + +#ifndef Py_PYSTATE_H +#define Py_PYSTATE_H +#ifdef __cplusplus +extern "C" { +#endif + +/* State shared between threads */ + +struct _ts; /* Forward */ +struct _is; /* Forward */ + +typedef struct _is { + + struct _is *next; + struct _ts *tstate_head; + + PyObject *modules; + PyObject *sysdict; + PyObject *builtins; + PyObject *modules_reloading; + + PyObject *codec_search_path; + PyObject *codec_search_cache; + PyObject *codec_error_registry; + +#ifdef HAVE_DLOPEN + int dlopenflags; +#endif +#ifdef WITH_TSC + int tscdump; +#endif + +} PyInterpreterState; + + +/* State unique per thread */ + +struct _frame; /* Avoid including frameobject.h */ + +/* Py_tracefunc return -1 when raising an exception, or 0 for success. */ +typedef int (*Py_tracefunc)(PyObject *, struct _frame *, int, PyObject *); + +/* The following values are used for 'what' for tracefunc functions: */ +#define PyTrace_CALL 0 +#define PyTrace_EXCEPTION 1 +#define PyTrace_LINE 2 +#define PyTrace_RETURN 3 +#define PyTrace_C_CALL 4 +#define PyTrace_C_EXCEPTION 5 +#define PyTrace_C_RETURN 6 + +typedef struct _ts { + /* See Python/ceval.c for comments explaining most fields */ + + struct _ts *next; + PyInterpreterState *interp; + + struct _frame *frame; + int recursion_depth; + /* 'tracing' keeps track of the execution depth when tracing/profiling. + This is to prevent the actual trace/profile code from being recorded in + the trace/profile. */ + int tracing; + int use_tracing; + + Py_tracefunc c_profilefunc; + Py_tracefunc c_tracefunc; + PyObject *c_profileobj; + PyObject *c_traceobj; + + PyObject *curexc_type; + PyObject *curexc_value; + PyObject *curexc_traceback; + + PyObject *exc_type; + PyObject *exc_value; + PyObject *exc_traceback; + + PyObject *dict; /* Stores per-thread state */ + + /* tick_counter is incremented whenever the check_interval ticker + * reaches zero. The purpose is to give a useful measure of the number + * of interpreted bytecode instructions in a given thread. This + * extremely lightweight statistic collector may be of interest to + * profilers (like psyco.jit()), although nothing in the core uses it. + */ + int tick_counter; + + int gilstate_counter; + + PyObject *async_exc; /* Asynchronous exception to raise */ + long thread_id; /* Thread id where this tstate was created */ + + /* XXX signal handlers should also be here */ + +} PyThreadState; + + +PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_New(void); +PyAPI_FUNC(void) PyInterpreterState_Clear(PyInterpreterState *); +PyAPI_FUNC(void) PyInterpreterState_Delete(PyInterpreterState *); + +PyAPI_FUNC(PyThreadState *) PyThreadState_New(PyInterpreterState *); +PyAPI_FUNC(PyThreadState *) _PyThreadState_Prealloc(PyInterpreterState *); +PyAPI_FUNC(void) _PyThreadState_Init(PyThreadState *); +PyAPI_FUNC(void) PyThreadState_Clear(PyThreadState *); +PyAPI_FUNC(void) PyThreadState_Delete(PyThreadState *); +#ifdef WITH_THREAD +PyAPI_FUNC(void) PyThreadState_DeleteCurrent(void); +#endif + +PyAPI_FUNC(PyThreadState *) PyThreadState_Get(void); +PyAPI_FUNC(PyThreadState *) PyThreadState_Swap(PyThreadState *); +PyAPI_FUNC(PyObject *) PyThreadState_GetDict(void); +PyAPI_FUNC(int) PyThreadState_SetAsyncExc(long, PyObject *); + + +/* Variable and macro for in-line access to current thread state */ + +PyAPI_DATA(PyThreadState *) _PyThreadState_Current; + +#ifdef Py_DEBUG +#define PyThreadState_GET() PyThreadState_Get() +#else +#define PyThreadState_GET() (_PyThreadState_Current) +#endif + +typedef + enum {PyGILState_LOCKED, PyGILState_UNLOCKED} + PyGILState_STATE; + +/* Ensure that the current thread is ready to call the Python + C API, regardless of the current state of Python, or of its + thread lock. This may be called as many times as desired + by a thread so long as each call is matched with a call to + PyGILState_Release(). In general, other thread-state APIs may + be used between _Ensure() and _Release() calls, so long as the + thread-state is restored to its previous state before the Release(). + For example, normal use of the Py_BEGIN_ALLOW_THREADS/ + Py_END_ALLOW_THREADS macros are acceptable. + + The return value is an opaque "handle" to the thread state when + PyGILState_Ensure() was called, and must be passed to + PyGILState_Release() to ensure Python is left in the same state. Even + though recursive calls are allowed, these handles can *not* be shared - + each unique call to PyGILState_Ensure must save the handle for its + call to PyGILState_Release. + + When the function returns, the current thread will hold the GIL. + + Failure is a fatal error. +*/ +PyAPI_FUNC(PyGILState_STATE) PyGILState_Ensure(void); + +/* Release any resources previously acquired. After this call, Python's + state will be the same as it was prior to the corresponding + PyGILState_Ensure() call (but generally this state will be unknown to + the caller, hence the use of the GILState API.) + + Every call to PyGILState_Ensure must be matched by a call to + PyGILState_Release on the same thread. +*/ +PyAPI_FUNC(void) PyGILState_Release(PyGILState_STATE); + +/* Helper/diagnostic function - get the current thread state for + this thread. May return NULL if no GILState API has been used + on the current thread. Note that the main thread always has such a + thread-state, even if no auto-thread-state call has been made + on the main thread. +*/ +PyAPI_FUNC(PyThreadState *) PyGILState_GetThisThreadState(void); + +/* The implementation of sys._current_frames() Returns a dict mapping + thread id to that thread's current frame. +*/ +PyAPI_FUNC(PyObject *) _PyThread_CurrentFrames(void); + +/* Routines for advanced debuggers, requested by David Beazley. + Don't use unless you know what you are doing! */ +PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_Head(void); +PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_Next(PyInterpreterState *); +PyAPI_FUNC(PyThreadState *) PyInterpreterState_ThreadHead(PyInterpreterState *); +PyAPI_FUNC(PyThreadState *) PyThreadState_Next(PyThreadState *); + +typedef struct _frame *(*PyThreadFrameGetter)(PyThreadState *self_); + +/* hook for PyEval_GetFrame(), requested for Psyco */ +PyAPI_DATA(PyThreadFrameGetter) _PyThreadState_GetFrame; + +#ifdef __cplusplus +} +#endif +#endif /* !Py_PYSTATE_H */ diff --git a/python/include/pystrcmp.h b/python/include/pystrcmp.h new file mode 100644 index 00000000..369c7e77 --- /dev/null +++ b/python/include/pystrcmp.h @@ -0,0 +1,23 @@ +#ifndef Py_STRCMP_H +#define Py_STRCMP_H + +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_FUNC(int) PyOS_mystrnicmp(const char *, const char *, Py_ssize_t); +PyAPI_FUNC(int) PyOS_mystricmp(const char *, const char *); + +#if defined(MS_WINDOWS) || defined(PYOS_OS2) +#define PyOS_strnicmp strnicmp +#define PyOS_stricmp stricmp +#else +#define PyOS_strnicmp PyOS_mystrnicmp +#define PyOS_stricmp PyOS_mystricmp +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* !Py_STRCMP_H */ diff --git a/python/include/pystrtod.h b/python/include/pystrtod.h new file mode 100644 index 00000000..eec434f1 --- /dev/null +++ b/python/include/pystrtod.h @@ -0,0 +1,45 @@ +#ifndef Py_STRTOD_H +#define Py_STRTOD_H + +#ifdef __cplusplus +extern "C" { +#endif + + +PyAPI_FUNC(double) PyOS_ascii_strtod(const char *str, char **ptr); +PyAPI_FUNC(double) PyOS_ascii_atof(const char *str); + +/* Deprecated in 2.7 and 3.1. Will disappear in 2.8 (if it exists) and 3.2 */ +PyAPI_FUNC(char *) PyOS_ascii_formatd(char *buffer, size_t buf_len, + const char *format, double d); +PyAPI_FUNC(double) PyOS_string_to_double(const char *str, + char **endptr, + PyObject *overflow_exception); + +/* The caller is responsible for calling PyMem_Free to free the buffer + that's is returned. */ +PyAPI_FUNC(char *) PyOS_double_to_string(double val, + char format_code, + int precision, + int flags, + int *type); + +PyAPI_FUNC(double) _Py_parse_inf_or_nan(const char *p, char **endptr); + + +/* PyOS_double_to_string's "flags" parameter can be set to 0 or more of: */ +#define Py_DTSF_SIGN 0x01 /* always add the sign */ +#define Py_DTSF_ADD_DOT_0 0x02 /* if the result is an integer add ".0" */ +#define Py_DTSF_ALT 0x04 /* "alternate" formatting. it's format_code + specific */ + +/* PyOS_double_to_string's "type", if non-NULL, will be set to one of: */ +#define Py_DTST_FINITE 0 +#define Py_DTST_INFINITE 1 +#define Py_DTST_NAN 2 + +#ifdef __cplusplus +} +#endif + +#endif /* !Py_STRTOD_H */ diff --git a/python/include/pythonrun.h b/python/include/pythonrun.h new file mode 100644 index 00000000..6bfc1750 --- /dev/null +++ b/python/include/pythonrun.h @@ -0,0 +1,181 @@ + +/* Interfaces to parse and execute pieces of python code */ + +#ifndef Py_PYTHONRUN_H +#define Py_PYTHONRUN_H +#ifdef __cplusplus +extern "C" { +#endif + +#define PyCF_MASK (CO_FUTURE_DIVISION | CO_FUTURE_ABSOLUTE_IMPORT | \ + CO_FUTURE_WITH_STATEMENT | CO_FUTURE_PRINT_FUNCTION | \ + CO_FUTURE_UNICODE_LITERALS) +#define PyCF_MASK_OBSOLETE (CO_NESTED) +#define PyCF_SOURCE_IS_UTF8 0x0100 +#define PyCF_DONT_IMPLY_DEDENT 0x0200 +#define PyCF_ONLY_AST 0x0400 + +typedef struct { + int cf_flags; /* bitmask of CO_xxx flags relevant to future */ +} PyCompilerFlags; + +PyAPI_FUNC(void) Py_SetProgramName(char *); +PyAPI_FUNC(char *) Py_GetProgramName(void); + +PyAPI_FUNC(void) Py_SetPythonHome(char *); +PyAPI_FUNC(char *) Py_GetPythonHome(void); + +PyAPI_FUNC(void) Py_Initialize(void); +PyAPI_FUNC(void) Py_InitializeEx(int); +PyAPI_FUNC(void) Py_Finalize(void); +PyAPI_FUNC(int) Py_IsInitialized(void); +PyAPI_FUNC(PyThreadState *) Py_NewInterpreter(void); +PyAPI_FUNC(void) Py_EndInterpreter(PyThreadState *); + +PyAPI_FUNC(int) PyRun_AnyFileFlags(FILE *, const char *, PyCompilerFlags *); +PyAPI_FUNC(int) PyRun_AnyFileExFlags(FILE *, const char *, int, PyCompilerFlags *); +PyAPI_FUNC(int) PyRun_SimpleStringFlags(const char *, PyCompilerFlags *); +PyAPI_FUNC(int) PyRun_SimpleFileExFlags(FILE *, const char *, int, PyCompilerFlags *); +PyAPI_FUNC(int) PyRun_InteractiveOneFlags(FILE *, const char *, PyCompilerFlags *); +PyAPI_FUNC(int) PyRun_InteractiveLoopFlags(FILE *, const char *, PyCompilerFlags *); + +PyAPI_FUNC(struct _mod *) PyParser_ASTFromString(const char *, const char *, + int, PyCompilerFlags *flags, + PyArena *); +PyAPI_FUNC(struct _mod *) PyParser_ASTFromFile(FILE *, const char *, int, + char *, char *, + PyCompilerFlags *, int *, + PyArena *); +#define PyParser_SimpleParseString(S, B) \ + PyParser_SimpleParseStringFlags(S, B, 0) +#define PyParser_SimpleParseFile(FP, S, B) \ + PyParser_SimpleParseFileFlags(FP, S, B, 0) +PyAPI_FUNC(struct _node *) PyParser_SimpleParseStringFlags(const char *, int, + int); +PyAPI_FUNC(struct _node *) PyParser_SimpleParseFileFlags(FILE *, const char *, + int, int); + +PyAPI_FUNC(PyObject *) PyRun_StringFlags(const char *, int, PyObject *, + PyObject *, PyCompilerFlags *); + +PyAPI_FUNC(PyObject *) PyRun_FileExFlags(FILE *, const char *, int, + PyObject *, PyObject *, int, + PyCompilerFlags *); + +#define Py_CompileString(str, p, s) Py_CompileStringFlags(str, p, s, NULL) +PyAPI_FUNC(PyObject *) Py_CompileStringFlags(const char *, const char *, int, + PyCompilerFlags *); +PyAPI_FUNC(struct symtable *) Py_SymtableString(const char *, const char *, int); + +PyAPI_FUNC(void) PyErr_Print(void); +PyAPI_FUNC(void) PyErr_PrintEx(int); +PyAPI_FUNC(void) PyErr_Display(PyObject *, PyObject *, PyObject *); + +PyAPI_FUNC(int) Py_AtExit(void (*func)(void)); + +PyAPI_FUNC(void) Py_Exit(int); + +PyAPI_FUNC(int) Py_FdIsInteractive(FILE *, const char *); + +/* Bootstrap */ +PyAPI_FUNC(int) Py_Main(int argc, char **argv); + +/* Use macros for a bunch of old variants */ +#define PyRun_String(str, s, g, l) PyRun_StringFlags(str, s, g, l, NULL) +#define PyRun_AnyFile(fp, name) PyRun_AnyFileExFlags(fp, name, 0, NULL) +#define PyRun_AnyFileEx(fp, name, closeit) \ + PyRun_AnyFileExFlags(fp, name, closeit, NULL) +#define PyRun_AnyFileFlags(fp, name, flags) \ + PyRun_AnyFileExFlags(fp, name, 0, flags) +#define PyRun_SimpleString(s) PyRun_SimpleStringFlags(s, NULL) +#define PyRun_SimpleFile(f, p) PyRun_SimpleFileExFlags(f, p, 0, NULL) +#define PyRun_SimpleFileEx(f, p, c) PyRun_SimpleFileExFlags(f, p, c, NULL) +#define PyRun_InteractiveOne(f, p) PyRun_InteractiveOneFlags(f, p, NULL) +#define PyRun_InteractiveLoop(f, p) PyRun_InteractiveLoopFlags(f, p, NULL) +#define PyRun_File(fp, p, s, g, l) \ + PyRun_FileExFlags(fp, p, s, g, l, 0, NULL) +#define PyRun_FileEx(fp, p, s, g, l, c) \ + PyRun_FileExFlags(fp, p, s, g, l, c, NULL) +#define PyRun_FileFlags(fp, p, s, g, l, flags) \ + PyRun_FileExFlags(fp, p, s, g, l, 0, flags) + +/* In getpath.c */ +PyAPI_FUNC(char *) Py_GetProgramFullPath(void); +PyAPI_FUNC(char *) Py_GetPrefix(void); +PyAPI_FUNC(char *) Py_GetExecPrefix(void); +PyAPI_FUNC(char *) Py_GetPath(void); + +/* In their own files */ +PyAPI_FUNC(const char *) Py_GetVersion(void); +PyAPI_FUNC(const char *) Py_GetPlatform(void); +PyAPI_FUNC(const char *) Py_GetCopyright(void); +PyAPI_FUNC(const char *) Py_GetCompiler(void); +PyAPI_FUNC(const char *) Py_GetBuildInfo(void); +PyAPI_FUNC(const char *) _Py_svnversion(void); +PyAPI_FUNC(const char *) Py_SubversionRevision(void); +PyAPI_FUNC(const char *) Py_SubversionShortBranch(void); +PyAPI_FUNC(const char *) _Py_hgidentifier(void); +PyAPI_FUNC(const char *) _Py_hgversion(void); + +/* Internal -- various one-time initializations */ +PyAPI_FUNC(PyObject *) _PyBuiltin_Init(void); +PyAPI_FUNC(PyObject *) _PySys_Init(void); +PyAPI_FUNC(void) _PyImport_Init(void); +PyAPI_FUNC(void) _PyExc_Init(void); +PyAPI_FUNC(void) _PyImportHooks_Init(void); +PyAPI_FUNC(int) _PyFrame_Init(void); +PyAPI_FUNC(int) _PyInt_Init(void); +PyAPI_FUNC(int) _PyLong_Init(void); +PyAPI_FUNC(void) _PyFloat_Init(void); +PyAPI_FUNC(int) PyByteArray_Init(void); +PyAPI_FUNC(void) _PyRandom_Init(void); + +/* Various internal finalizers */ +PyAPI_FUNC(void) _PyExc_Fini(void); +PyAPI_FUNC(void) _PyImport_Fini(void); +PyAPI_FUNC(void) PyMethod_Fini(void); +PyAPI_FUNC(void) PyFrame_Fini(void); +PyAPI_FUNC(void) PyCFunction_Fini(void); +PyAPI_FUNC(void) PyDict_Fini(void); +PyAPI_FUNC(void) PyTuple_Fini(void); +PyAPI_FUNC(void) PyList_Fini(void); +PyAPI_FUNC(void) PySet_Fini(void); +PyAPI_FUNC(void) PyString_Fini(void); +PyAPI_FUNC(void) PyInt_Fini(void); +PyAPI_FUNC(void) PyFloat_Fini(void); +PyAPI_FUNC(void) PyOS_FiniInterrupts(void); +PyAPI_FUNC(void) PyByteArray_Fini(void); + +/* Stuff with no proper home (yet) */ +PyAPI_FUNC(char *) PyOS_Readline(FILE *, FILE *, char *); +PyAPI_DATA(int) (*PyOS_InputHook)(void); +PyAPI_DATA(char) *(*PyOS_ReadlineFunctionPointer)(FILE *, FILE *, char *); +PyAPI_DATA(PyThreadState*) _PyOS_ReadlineTState; + +/* Stack size, in "pointers" (so we get extra safety margins + on 64-bit platforms). On a 32-bit platform, this translates + to a 8k margin. */ +#define PYOS_STACK_MARGIN 2048 + +#if defined(WIN32) && !defined(MS_WIN64) && defined(_MSC_VER) && _MSC_VER >= 1300 +/* Enable stack checking under Microsoft C */ +#define USE_STACKCHECK +#endif + +#ifdef USE_STACKCHECK +/* Check that we aren't overflowing our stack */ +PyAPI_FUNC(int) PyOS_CheckStack(void); +#endif + +/* Signals */ +typedef void (*PyOS_sighandler_t)(int); +PyAPI_FUNC(PyOS_sighandler_t) PyOS_getsig(int); +PyAPI_FUNC(PyOS_sighandler_t) PyOS_setsig(int, PyOS_sighandler_t); + +/* Random */ +PyAPI_FUNC(int) _PyOS_URandom (void *buffer, Py_ssize_t size); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_PYTHONRUN_H */ diff --git a/python/include/pythread.h b/python/include/pythread.h new file mode 100644 index 00000000..dfd61575 --- /dev/null +++ b/python/include/pythread.h @@ -0,0 +1,41 @@ + +#ifndef Py_PYTHREAD_H +#define Py_PYTHREAD_H + +typedef void *PyThread_type_lock; +typedef void *PyThread_type_sema; + +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_FUNC(void) PyThread_init_thread(void); +PyAPI_FUNC(long) PyThread_start_new_thread(void (*)(void *), void *); +PyAPI_FUNC(void) PyThread_exit_thread(void); +PyAPI_FUNC(long) PyThread_get_thread_ident(void); + +PyAPI_FUNC(PyThread_type_lock) PyThread_allocate_lock(void); +PyAPI_FUNC(void) PyThread_free_lock(PyThread_type_lock); +PyAPI_FUNC(int) PyThread_acquire_lock(PyThread_type_lock, int); +#define WAIT_LOCK 1 +#define NOWAIT_LOCK 0 +PyAPI_FUNC(void) PyThread_release_lock(PyThread_type_lock); + +PyAPI_FUNC(size_t) PyThread_get_stacksize(void); +PyAPI_FUNC(int) PyThread_set_stacksize(size_t); + +/* Thread Local Storage (TLS) API */ +PyAPI_FUNC(int) PyThread_create_key(void); +PyAPI_FUNC(void) PyThread_delete_key(int); +PyAPI_FUNC(int) PyThread_set_key_value(int, void *); +PyAPI_FUNC(void *) PyThread_get_key_value(int); +PyAPI_FUNC(void) PyThread_delete_key_value(int key); + +/* Cleanup after a fork */ +PyAPI_FUNC(void) PyThread_ReInitTLS(void); + +#ifdef __cplusplus +} +#endif + +#endif /* !Py_PYTHREAD_H */ diff --git a/python/include/rangeobject.h b/python/include/rangeobject.h new file mode 100644 index 00000000..36c9cee5 --- /dev/null +++ b/python/include/rangeobject.h @@ -0,0 +1,28 @@ + +/* Range object interface */ + +#ifndef Py_RANGEOBJECT_H +#define Py_RANGEOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +/* This is about the type 'xrange', not the built-in function range(), which + returns regular lists. */ + +/* +A range object represents an integer range. This is an immutable object; +a range cannot change its value after creation. + +Range objects behave like the corresponding tuple objects except that +they are represented by a start, stop, and step datamembers. +*/ + +PyAPI_DATA(PyTypeObject) PyRange_Type; + +#define PyRange_Check(op) (Py_TYPE(op) == &PyRange_Type) + +#ifdef __cplusplus +} +#endif +#endif /* !Py_RANGEOBJECT_H */ diff --git a/python/include/setobject.h b/python/include/setobject.h new file mode 100644 index 00000000..52b07d52 --- /dev/null +++ b/python/include/setobject.h @@ -0,0 +1,99 @@ +/* Set object interface */ + +#ifndef Py_SETOBJECT_H +#define Py_SETOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* +There are three kinds of slots in the table: + +1. Unused: key == NULL +2. Active: key != NULL and key != dummy +3. Dummy: key == dummy + +Note: .pop() abuses the hash field of an Unused or Dummy slot to +hold a search finger. The hash field of Unused or Dummy slots has +no meaning otherwise. +*/ + +#define PySet_MINSIZE 8 + +typedef struct { + long hash; /* cached hash code for the entry key */ + PyObject *key; +} setentry; + + +/* +This data structure is shared by set and frozenset objects. +*/ + +typedef struct _setobject PySetObject; +struct _setobject { + PyObject_HEAD + + Py_ssize_t fill; /* # Active + # Dummy */ + Py_ssize_t used; /* # Active */ + + /* The table contains mask + 1 slots, and that's a power of 2. + * We store the mask instead of the size because the mask is more + * frequently needed. + */ + Py_ssize_t mask; + + /* table points to smalltable for small tables, else to + * additional malloc'ed memory. table is never NULL! This rule + * saves repeated runtime null-tests. + */ + setentry *table; + setentry *(*lookup)(PySetObject *so, PyObject *key, long hash); + setentry smalltable[PySet_MINSIZE]; + + long hash; /* only used by frozenset objects */ + PyObject *weakreflist; /* List of weak references */ +}; + +PyAPI_DATA(PyTypeObject) PySet_Type; +PyAPI_DATA(PyTypeObject) PyFrozenSet_Type; + +/* Invariants for frozensets: + * data is immutable. + * hash is the hash of the frozenset or -1 if not computed yet. + * Invariants for sets: + * hash is -1 + */ + +#define PyFrozenSet_CheckExact(ob) (Py_TYPE(ob) == &PyFrozenSet_Type) +#define PyAnySet_CheckExact(ob) \ + (Py_TYPE(ob) == &PySet_Type || Py_TYPE(ob) == &PyFrozenSet_Type) +#define PyAnySet_Check(ob) \ + (Py_TYPE(ob) == &PySet_Type || Py_TYPE(ob) == &PyFrozenSet_Type || \ + PyType_IsSubtype(Py_TYPE(ob), &PySet_Type) || \ + PyType_IsSubtype(Py_TYPE(ob), &PyFrozenSet_Type)) +#define PySet_Check(ob) \ + (Py_TYPE(ob) == &PySet_Type || \ + PyType_IsSubtype(Py_TYPE(ob), &PySet_Type)) +#define PyFrozenSet_Check(ob) \ + (Py_TYPE(ob) == &PyFrozenSet_Type || \ + PyType_IsSubtype(Py_TYPE(ob), &PyFrozenSet_Type)) + +PyAPI_FUNC(PyObject *) PySet_New(PyObject *); +PyAPI_FUNC(PyObject *) PyFrozenSet_New(PyObject *); +PyAPI_FUNC(Py_ssize_t) PySet_Size(PyObject *anyset); +#define PySet_GET_SIZE(so) (((PySetObject *)(so))->used) +PyAPI_FUNC(int) PySet_Clear(PyObject *set); +PyAPI_FUNC(int) PySet_Contains(PyObject *anyset, PyObject *key); +PyAPI_FUNC(int) PySet_Discard(PyObject *set, PyObject *key); +PyAPI_FUNC(int) PySet_Add(PyObject *set, PyObject *key); +PyAPI_FUNC(int) _PySet_Next(PyObject *set, Py_ssize_t *pos, PyObject **key); +PyAPI_FUNC(int) _PySet_NextEntry(PyObject *set, Py_ssize_t *pos, PyObject **key, long *hash); +PyAPI_FUNC(PyObject *) PySet_Pop(PyObject *set); +PyAPI_FUNC(int) _PySet_Update(PyObject *set, PyObject *iterable); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_SETOBJECT_H */ diff --git a/python/include/sliceobject.h b/python/include/sliceobject.h new file mode 100644 index 00000000..8ab62dd4 --- /dev/null +++ b/python/include/sliceobject.h @@ -0,0 +1,44 @@ +#ifndef Py_SLICEOBJECT_H +#define Py_SLICEOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +/* The unique ellipsis object "..." */ + +PyAPI_DATA(PyObject) _Py_EllipsisObject; /* Don't use this directly */ + +#define Py_Ellipsis (&_Py_EllipsisObject) + +/* Slice object interface */ + +/* + +A slice object containing start, stop, and step data members (the +names are from range). After much talk with Guido, it was decided to +let these be any arbitrary python type. Py_None stands for omitted values. +*/ + +typedef struct { + PyObject_HEAD + PyObject *start, *stop, *step; /* not NULL */ +} PySliceObject; + +PyAPI_DATA(PyTypeObject) PySlice_Type; +PyAPI_DATA(PyTypeObject) PyEllipsis_Type; + +#define PySlice_Check(op) (Py_TYPE(op) == &PySlice_Type) + +PyAPI_FUNC(PyObject *) PySlice_New(PyObject* start, PyObject* stop, + PyObject* step); +PyAPI_FUNC(PyObject *) _PySlice_FromIndices(Py_ssize_t start, Py_ssize_t stop); +PyAPI_FUNC(int) PySlice_GetIndices(PySliceObject *r, Py_ssize_t length, + Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step); +PyAPI_FUNC(int) PySlice_GetIndicesEx(PySliceObject *r, Py_ssize_t length, + Py_ssize_t *start, Py_ssize_t *stop, + Py_ssize_t *step, Py_ssize_t *slicelength); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_SLICEOBJECT_H */ diff --git a/python/include/stringobject.h b/python/include/stringobject.h new file mode 100644 index 00000000..18b5b411 --- /dev/null +++ b/python/include/stringobject.h @@ -0,0 +1,210 @@ + +/* String (str/bytes) object interface */ + +#ifndef Py_STRINGOBJECT_H +#define Py_STRINGOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/* +Type PyStringObject represents a character string. An extra zero byte is +reserved at the end to ensure it is zero-terminated, but a size is +present so strings with null bytes in them can be represented. This +is an immutable object type. + +There are functions to create new string objects, to test +an object for string-ness, and to get the +string value. The latter function returns a null pointer +if the object is not of the proper type. +There is a variant that takes an explicit size as well as a +variant that assumes a zero-terminated string. Note that none of the +functions should be applied to nil objects. +*/ + +/* Caching the hash (ob_shash) saves recalculation of a string's hash value. + Interning strings (ob_sstate) tries to ensure that only one string + object with a given value exists, so equality tests can be one pointer + comparison. This is generally restricted to strings that "look like" + Python identifiers, although the intern() builtin can be used to force + interning of any string. + Together, these sped the interpreter by up to 20%. */ + +typedef struct { + PyObject_VAR_HEAD + long ob_shash; + int ob_sstate; + char ob_sval[1]; + + /* Invariants: + * ob_sval contains space for 'ob_size+1' elements. + * ob_sval[ob_size] == 0. + * ob_shash is the hash of the string or -1 if not computed yet. + * ob_sstate != 0 iff the string object is in stringobject.c's + * 'interned' dictionary; in this case the two references + * from 'interned' to this object are *not counted* in ob_refcnt. + */ +} PyStringObject; + +#define SSTATE_NOT_INTERNED 0 +#define SSTATE_INTERNED_MORTAL 1 +#define SSTATE_INTERNED_IMMORTAL 2 + +PyAPI_DATA(PyTypeObject) PyBaseString_Type; +PyAPI_DATA(PyTypeObject) PyString_Type; + +#define PyString_Check(op) \ + PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_STRING_SUBCLASS) +#define PyString_CheckExact(op) (Py_TYPE(op) == &PyString_Type) + +PyAPI_FUNC(PyObject *) PyString_FromStringAndSize(const char *, Py_ssize_t); +PyAPI_FUNC(PyObject *) PyString_FromString(const char *); +PyAPI_FUNC(PyObject *) PyString_FromFormatV(const char*, va_list) + Py_GCC_ATTRIBUTE((format(printf, 1, 0))); +PyAPI_FUNC(PyObject *) PyString_FromFormat(const char*, ...) + Py_GCC_ATTRIBUTE((format(printf, 1, 2))); +PyAPI_FUNC(Py_ssize_t) PyString_Size(PyObject *); +PyAPI_FUNC(char *) PyString_AsString(PyObject *); +PyAPI_FUNC(PyObject *) PyString_Repr(PyObject *, int); +PyAPI_FUNC(void) PyString_Concat(PyObject **, PyObject *); +PyAPI_FUNC(void) PyString_ConcatAndDel(PyObject **, PyObject *); +PyAPI_FUNC(int) _PyString_Resize(PyObject **, Py_ssize_t); +PyAPI_FUNC(int) _PyString_Eq(PyObject *, PyObject*); +PyAPI_FUNC(PyObject *) PyString_Format(PyObject *, PyObject *); +PyAPI_FUNC(PyObject *) _PyString_FormatLong(PyObject*, int, int, + int, char**, int*); +PyAPI_FUNC(PyObject *) PyString_DecodeEscape(const char *, Py_ssize_t, + const char *, Py_ssize_t, + const char *); + +PyAPI_FUNC(void) PyString_InternInPlace(PyObject **); +PyAPI_FUNC(void) PyString_InternImmortal(PyObject **); +PyAPI_FUNC(PyObject *) PyString_InternFromString(const char *); +PyAPI_FUNC(void) _Py_ReleaseInternedStrings(void); + +/* Use only if you know it's a string */ +#define PyString_CHECK_INTERNED(op) (((PyStringObject *)(op))->ob_sstate) + +/* Macro, trading safety for speed */ +#define PyString_AS_STRING(op) (((PyStringObject *)(op))->ob_sval) +#define PyString_GET_SIZE(op) Py_SIZE(op) + +/* _PyString_Join(sep, x) is like sep.join(x). sep must be PyStringObject*, + x must be an iterable object. */ +PyAPI_FUNC(PyObject *) _PyString_Join(PyObject *sep, PyObject *x); + +/* --- Generic Codecs ----------------------------------------------------- */ + +/* Create an object by decoding the encoded string s of the + given size. */ + +PyAPI_FUNC(PyObject*) PyString_Decode( + const char *s, /* encoded string */ + Py_ssize_t size, /* size of buffer */ + const char *encoding, /* encoding */ + const char *errors /* error handling */ + ); + +/* Encodes a char buffer of the given size and returns a + Python object. */ + +PyAPI_FUNC(PyObject*) PyString_Encode( + const char *s, /* string char buffer */ + Py_ssize_t size, /* number of chars to encode */ + const char *encoding, /* encoding */ + const char *errors /* error handling */ + ); + +/* Encodes a string object and returns the result as Python + object. */ + +PyAPI_FUNC(PyObject*) PyString_AsEncodedObject( + PyObject *str, /* string object */ + const char *encoding, /* encoding */ + const char *errors /* error handling */ + ); + +/* Encodes a string object and returns the result as Python string + object. + + If the codec returns an Unicode object, the object is converted + back to a string using the default encoding. + + DEPRECATED - use PyString_AsEncodedObject() instead. */ + +PyAPI_FUNC(PyObject*) PyString_AsEncodedString( + PyObject *str, /* string object */ + const char *encoding, /* encoding */ + const char *errors /* error handling */ + ); + +/* Decodes a string object and returns the result as Python + object. */ + +PyAPI_FUNC(PyObject*) PyString_AsDecodedObject( + PyObject *str, /* string object */ + const char *encoding, /* encoding */ + const char *errors /* error handling */ + ); + +/* Decodes a string object and returns the result as Python string + object. + + If the codec returns an Unicode object, the object is converted + back to a string using the default encoding. + + DEPRECATED - use PyString_AsDecodedObject() instead. */ + +PyAPI_FUNC(PyObject*) PyString_AsDecodedString( + PyObject *str, /* string object */ + const char *encoding, /* encoding */ + const char *errors /* error handling */ + ); + +/* Provides access to the internal data buffer and size of a string + object or the default encoded version of an Unicode object. Passing + NULL as *len parameter will force the string buffer to be + 0-terminated (passing a string with embedded NULL characters will + cause an exception). */ + +PyAPI_FUNC(int) PyString_AsStringAndSize( + register PyObject *obj, /* string or Unicode object */ + register char **s, /* pointer to buffer variable */ + register Py_ssize_t *len /* pointer to length variable or NULL + (only possible for 0-terminated + strings) */ + ); + + +/* Using the current locale, insert the thousands grouping + into the string pointed to by buffer. For the argument descriptions, + see Objects/stringlib/localeutil.h */ +PyAPI_FUNC(Py_ssize_t) _PyString_InsertThousandsGroupingLocale(char *buffer, + Py_ssize_t n_buffer, + char *digits, + Py_ssize_t n_digits, + Py_ssize_t min_width); + +/* Using explicit passed-in values, insert the thousands grouping + into the string pointed to by buffer. For the argument descriptions, + see Objects/stringlib/localeutil.h */ +PyAPI_FUNC(Py_ssize_t) _PyString_InsertThousandsGrouping(char *buffer, + Py_ssize_t n_buffer, + char *digits, + Py_ssize_t n_digits, + Py_ssize_t min_width, + const char *grouping, + const char *thousands_sep); + +/* Format the object based on the format_spec, as defined in PEP 3101 + (Advanced String Formatting). */ +PyAPI_FUNC(PyObject *) _PyBytes_FormatAdvanced(PyObject *obj, + char *format_spec, + Py_ssize_t format_spec_len); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_STRINGOBJECT_H */ diff --git a/python/include/structmember.h b/python/include/structmember.h new file mode 100644 index 00000000..fe5b44ea --- /dev/null +++ b/python/include/structmember.h @@ -0,0 +1,99 @@ +#ifndef Py_STRUCTMEMBER_H +#define Py_STRUCTMEMBER_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* Interface to map C struct members to Python object attributes */ + +#include /* For offsetof */ + +/* The offsetof() macro calculates the offset of a structure member + in its structure. Unfortunately this cannot be written down + portably, hence it is provided by a Standard C header file. + For pre-Standard C compilers, here is a version that usually works + (but watch out!): */ + +#ifndef offsetof +#define offsetof(type, member) ( (int) & ((type*)0) -> member ) +#endif + +/* An array of memberlist structures defines the name, type and offset + of selected members of a C structure. These can be read by + PyMember_Get() and set by PyMember_Set() (except if their READONLY flag + is set). The array must be terminated with an entry whose name + pointer is NULL. */ + +struct memberlist { + /* Obsolete version, for binary backwards compatibility */ + char *name; + int type; + int offset; + int flags; +}; + +typedef struct PyMemberDef { + /* Current version, use this */ + char *name; + int type; + Py_ssize_t offset; + int flags; + char *doc; +} PyMemberDef; + +/* Types */ +#define T_SHORT 0 +#define T_INT 1 +#define T_LONG 2 +#define T_FLOAT 3 +#define T_DOUBLE 4 +#define T_STRING 5 +#define T_OBJECT 6 +/* XXX the ordering here is weird for binary compatibility */ +#define T_CHAR 7 /* 1-character string */ +#define T_BYTE 8 /* 8-bit signed int */ +/* unsigned variants: */ +#define T_UBYTE 9 +#define T_USHORT 10 +#define T_UINT 11 +#define T_ULONG 12 + +/* Added by Jack: strings contained in the structure */ +#define T_STRING_INPLACE 13 + +/* Added by Lillo: bools contained in the structure (assumed char) */ +#define T_BOOL 14 + +#define T_OBJECT_EX 16 /* Like T_OBJECT, but raises AttributeError + when the value is NULL, instead of + converting to None. */ +#ifdef HAVE_LONG_LONG +#define T_LONGLONG 17 +#define T_ULONGLONG 18 +#endif /* HAVE_LONG_LONG */ + +#define T_PYSSIZET 19 /* Py_ssize_t */ + + +/* Flags */ +#define READONLY 1 +#define RO READONLY /* Shorthand */ +#define READ_RESTRICTED 2 +#define PY_WRITE_RESTRICTED 4 +#define RESTRICTED (READ_RESTRICTED | PY_WRITE_RESTRICTED) + + +/* Obsolete API, for binary backwards compatibility */ +PyAPI_FUNC(PyObject *) PyMember_Get(const char *, struct memberlist *, const char *); +PyAPI_FUNC(int) PyMember_Set(char *, struct memberlist *, const char *, PyObject *); + +/* Current API, use this */ +PyAPI_FUNC(PyObject *) PyMember_GetOne(const char *, struct PyMemberDef *); +PyAPI_FUNC(int) PyMember_SetOne(char *, struct PyMemberDef *, PyObject *); + + +#ifdef __cplusplus +} +#endif +#endif /* !Py_STRUCTMEMBER_H */ diff --git a/python/include/structseq.h b/python/include/structseq.h new file mode 100644 index 00000000..e662916f --- /dev/null +++ b/python/include/structseq.h @@ -0,0 +1,41 @@ + +/* Tuple object interface */ + +#ifndef Py_STRUCTSEQ_H +#define Py_STRUCTSEQ_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct PyStructSequence_Field { + char *name; + char *doc; +} PyStructSequence_Field; + +typedef struct PyStructSequence_Desc { + char *name; + char *doc; + struct PyStructSequence_Field *fields; + int n_in_sequence; +} PyStructSequence_Desc; + +extern char* PyStructSequence_UnnamedField; + +PyAPI_FUNC(void) PyStructSequence_InitType(PyTypeObject *type, + PyStructSequence_Desc *desc); + +PyAPI_FUNC(PyObject *) PyStructSequence_New(PyTypeObject* type); + +typedef struct { + PyObject_VAR_HEAD + PyObject *ob_item[1]; +} PyStructSequence; + +/* Macro, *only* to be used to fill in brand new objects */ +#define PyStructSequence_SET_ITEM(op, i, v) \ + (((PyStructSequence *)(op))->ob_item[i] = v) + +#ifdef __cplusplus +} +#endif +#endif /* !Py_STRUCTSEQ_H */ diff --git a/python/include/symtable.h b/python/include/symtable.h new file mode 100644 index 00000000..e0a0be41 --- /dev/null +++ b/python/include/symtable.h @@ -0,0 +1,98 @@ +#ifndef Py_SYMTABLE_H +#define Py_SYMTABLE_H + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum _block_type { FunctionBlock, ClassBlock, ModuleBlock } + _Py_block_ty; + +struct _symtable_entry; + +struct symtable { + const char *st_filename; /* name of file being compiled */ + struct _symtable_entry *st_cur; /* current symbol table entry */ + struct _symtable_entry *st_top; /* module entry */ + PyObject *st_symbols; /* dictionary of symbol table entries */ + PyObject *st_stack; /* stack of namespace info */ + PyObject *st_global; /* borrowed ref to MODULE in st_symbols */ + int st_nblocks; /* number of blocks */ + PyObject *st_private; /* name of current class or NULL */ + PyFutureFeatures *st_future; /* module's future features */ +}; + +typedef struct _symtable_entry { + PyObject_HEAD + PyObject *ste_id; /* int: key in st_symbols */ + PyObject *ste_symbols; /* dict: name to flags */ + PyObject *ste_name; /* string: name of block */ + PyObject *ste_varnames; /* list of variable names */ + PyObject *ste_children; /* list of child ids */ + _Py_block_ty ste_type; /* module, class, or function */ + int ste_unoptimized; /* false if namespace is optimized */ + int ste_nested; /* true if block is nested */ + unsigned ste_free : 1; /* true if block has free variables */ + unsigned ste_child_free : 1; /* true if a child block has free vars, + including free refs to globals */ + unsigned ste_generator : 1; /* true if namespace is a generator */ + unsigned ste_varargs : 1; /* true if block has varargs */ + unsigned ste_varkeywords : 1; /* true if block has varkeywords */ + unsigned ste_returns_value : 1; /* true if namespace uses return with + an argument */ + int ste_lineno; /* first line of block */ + int ste_opt_lineno; /* lineno of last exec or import * */ + int ste_tmpname; /* counter for listcomp temp vars */ + struct symtable *ste_table; +} PySTEntryObject; + +PyAPI_DATA(PyTypeObject) PySTEntry_Type; + +#define PySTEntry_Check(op) (Py_TYPE(op) == &PySTEntry_Type) + +PyAPI_FUNC(int) PyST_GetScope(PySTEntryObject *, PyObject *); + +PyAPI_FUNC(struct symtable *) PySymtable_Build(mod_ty, const char *, + PyFutureFeatures *); +PyAPI_FUNC(PySTEntryObject *) PySymtable_Lookup(struct symtable *, void *); + +PyAPI_FUNC(void) PySymtable_Free(struct symtable *); + +/* Flags for def-use information */ + +#define DEF_GLOBAL 1 /* global stmt */ +#define DEF_LOCAL 2 /* assignment in code block */ +#define DEF_PARAM 2<<1 /* formal parameter */ +#define USE 2<<2 /* name is used */ +#define DEF_FREE 2<<3 /* name used but not defined in nested block */ +#define DEF_FREE_CLASS 2<<4 /* free variable from class's method */ +#define DEF_IMPORT 2<<5 /* assignment occurred via import */ + +#define DEF_BOUND (DEF_LOCAL | DEF_PARAM | DEF_IMPORT) + +/* GLOBAL_EXPLICIT and GLOBAL_IMPLICIT are used internally by the symbol + table. GLOBAL is returned from PyST_GetScope() for either of them. + It is stored in ste_symbols at bits 12-14. +*/ +#define SCOPE_OFF 11 +#define SCOPE_MASK 7 + +#define LOCAL 1 +#define GLOBAL_EXPLICIT 2 +#define GLOBAL_IMPLICIT 3 +#define FREE 4 +#define CELL 5 + +/* The following three names are used for the ste_unoptimized bit field */ +#define OPT_IMPORT_STAR 1 +#define OPT_EXEC 2 +#define OPT_BARE_EXEC 4 +#define OPT_TOPLEVEL 8 /* top-level names, including eval and exec */ + +#define GENERATOR 1 +#define GENERATOR_EXPRESSION 2 + +#ifdef __cplusplus +} +#endif +#endif /* !Py_SYMTABLE_H */ diff --git a/python/include/sysmodule.h b/python/include/sysmodule.h new file mode 100644 index 00000000..16af1196 --- /dev/null +++ b/python/include/sysmodule.h @@ -0,0 +1,32 @@ + +/* System module interface */ + +#ifndef Py_SYSMODULE_H +#define Py_SYSMODULE_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_FUNC(PyObject *) PySys_GetObject(char *); +PyAPI_FUNC(int) PySys_SetObject(char *, PyObject *); +PyAPI_FUNC(FILE *) PySys_GetFile(char *, FILE *); +PyAPI_FUNC(void) PySys_SetArgv(int, char **); +PyAPI_FUNC(void) PySys_SetArgvEx(int, char **, int); +PyAPI_FUNC(void) PySys_SetPath(char *); + +PyAPI_FUNC(void) PySys_WriteStdout(const char *format, ...) + Py_GCC_ATTRIBUTE((format(printf, 1, 2))); +PyAPI_FUNC(void) PySys_WriteStderr(const char *format, ...) + Py_GCC_ATTRIBUTE((format(printf, 1, 2))); + +PyAPI_DATA(PyObject *) _PySys_TraceFunc, *_PySys_ProfileFunc; +PyAPI_DATA(int) _PySys_CheckInterval; + +PyAPI_FUNC(void) PySys_ResetWarnOptions(void); +PyAPI_FUNC(void) PySys_AddWarnOption(char *); +PyAPI_FUNC(int) PySys_HasWarnOptions(void); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_SYSMODULE_H */ diff --git a/python/include/timefuncs.h b/python/include/timefuncs.h new file mode 100644 index 00000000..553142db --- /dev/null +++ b/python/include/timefuncs.h @@ -0,0 +1,23 @@ +/* timefuncs.h + */ + +/* Utility function related to timemodule.c. */ + +#ifndef TIMEFUNCS_H +#define TIMEFUNCS_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* Cast double x to time_t, but raise ValueError if x is too large + * to fit in a time_t. ValueError is set on return iff the return + * value is (time_t)-1 and PyErr_Occurred(). + */ +PyAPI_FUNC(time_t) _PyTime_DoubleToTimet(double x); + + +#ifdef __cplusplus +} +#endif +#endif /* TIMEFUNCS_H */ diff --git a/python/include/token.h b/python/include/token.h new file mode 100644 index 00000000..72659ac0 --- /dev/null +++ b/python/include/token.h @@ -0,0 +1,85 @@ + +/* Token types */ + +#ifndef Py_TOKEN_H +#define Py_TOKEN_H +#ifdef __cplusplus +extern "C" { +#endif + +#undef TILDE /* Prevent clash of our definition with system macro. Ex AIX, ioctl.h */ + +#define ENDMARKER 0 +#define NAME 1 +#define NUMBER 2 +#define STRING 3 +#define NEWLINE 4 +#define INDENT 5 +#define DEDENT 6 +#define LPAR 7 +#define RPAR 8 +#define LSQB 9 +#define RSQB 10 +#define COLON 11 +#define COMMA 12 +#define SEMI 13 +#define PLUS 14 +#define MINUS 15 +#define STAR 16 +#define SLASH 17 +#define VBAR 18 +#define AMPER 19 +#define LESS 20 +#define GREATER 21 +#define EQUAL 22 +#define DOT 23 +#define PERCENT 24 +#define BACKQUOTE 25 +#define LBRACE 26 +#define RBRACE 27 +#define EQEQUAL 28 +#define NOTEQUAL 29 +#define LESSEQUAL 30 +#define GREATEREQUAL 31 +#define TILDE 32 +#define CIRCUMFLEX 33 +#define LEFTSHIFT 34 +#define RIGHTSHIFT 35 +#define DOUBLESTAR 36 +#define PLUSEQUAL 37 +#define MINEQUAL 38 +#define STAREQUAL 39 +#define SLASHEQUAL 40 +#define PERCENTEQUAL 41 +#define AMPEREQUAL 42 +#define VBAREQUAL 43 +#define CIRCUMFLEXEQUAL 44 +#define LEFTSHIFTEQUAL 45 +#define RIGHTSHIFTEQUAL 46 +#define DOUBLESTAREQUAL 47 +#define DOUBLESLASH 48 +#define DOUBLESLASHEQUAL 49 +#define AT 50 +/* Don't forget to update the table _PyParser_TokenNames in tokenizer.c! */ +#define OP 51 +#define ERRORTOKEN 52 +#define N_TOKENS 53 + +/* Special definitions for cooperation with parser */ + +#define NT_OFFSET 256 + +#define ISTERMINAL(x) ((x) < NT_OFFSET) +#define ISNONTERMINAL(x) ((x) >= NT_OFFSET) +#define ISEOF(x) ((x) == ENDMARKER) + + +PyAPI_DATA(char *) _PyParser_TokenNames[]; /* Token names */ +PyAPI_FUNC(int) PyToken_OneChar(int); +PyAPI_FUNC(int) PyToken_TwoChars(int, int); +PyAPI_FUNC(int) PyToken_ThreeChars(int, int, int); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_TOKEN_H */ diff --git a/python/include/traceback.h b/python/include/traceback.h new file mode 100644 index 00000000..e7943dae --- /dev/null +++ b/python/include/traceback.h @@ -0,0 +1,31 @@ + +#ifndef Py_TRACEBACK_H +#define Py_TRACEBACK_H +#ifdef __cplusplus +extern "C" { +#endif + +struct _frame; + +/* Traceback interface */ + +typedef struct _traceback { + PyObject_HEAD + struct _traceback *tb_next; + struct _frame *tb_frame; + int tb_lasti; + int tb_lineno; +} PyTracebackObject; + +PyAPI_FUNC(int) PyTraceBack_Here(struct _frame *); +PyAPI_FUNC(int) PyTraceBack_Print(PyObject *, PyObject *); +PyAPI_FUNC(int) _Py_DisplaySourceLine(PyObject *, const char *, int, int); + +/* Reveal traceback type so we can typecheck traceback objects */ +PyAPI_DATA(PyTypeObject) PyTraceBack_Type; +#define PyTraceBack_Check(v) (Py_TYPE(v) == &PyTraceBack_Type) + +#ifdef __cplusplus +} +#endif +#endif /* !Py_TRACEBACK_H */ diff --git a/python/include/tupleobject.h b/python/include/tupleobject.h new file mode 100644 index 00000000..a5ab7332 --- /dev/null +++ b/python/include/tupleobject.h @@ -0,0 +1,61 @@ + +/* Tuple object interface */ + +#ifndef Py_TUPLEOBJECT_H +#define Py_TUPLEOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +/* +Another generally useful object type is a tuple of object pointers. +For Python, this is an immutable type. C code can change the tuple items +(but not their number), and even use tuples are general-purpose arrays of +object references, but in general only brand new tuples should be mutated, +not ones that might already have been exposed to Python code. + +*** WARNING *** PyTuple_SetItem does not increment the new item's reference +count, but does decrement the reference count of the item it replaces, +if not nil. It does *decrement* the reference count if it is *not* +inserted in the tuple. Similarly, PyTuple_GetItem does not increment the +returned item's reference count. +*/ + +typedef struct { + PyObject_VAR_HEAD + PyObject *ob_item[1]; + + /* ob_item contains space for 'ob_size' elements. + * Items must normally not be NULL, except during construction when + * the tuple is not yet visible outside the function that builds it. + */ +} PyTupleObject; + +PyAPI_DATA(PyTypeObject) PyTuple_Type; + +#define PyTuple_Check(op) \ + PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_TUPLE_SUBCLASS) +#define PyTuple_CheckExact(op) (Py_TYPE(op) == &PyTuple_Type) + +PyAPI_FUNC(PyObject *) PyTuple_New(Py_ssize_t size); +PyAPI_FUNC(Py_ssize_t) PyTuple_Size(PyObject *); +PyAPI_FUNC(PyObject *) PyTuple_GetItem(PyObject *, Py_ssize_t); +PyAPI_FUNC(int) PyTuple_SetItem(PyObject *, Py_ssize_t, PyObject *); +PyAPI_FUNC(PyObject *) PyTuple_GetSlice(PyObject *, Py_ssize_t, Py_ssize_t); +PyAPI_FUNC(int) _PyTuple_Resize(PyObject **, Py_ssize_t); +PyAPI_FUNC(PyObject *) PyTuple_Pack(Py_ssize_t, ...); +PyAPI_FUNC(void) _PyTuple_MaybeUntrack(PyObject *); + +/* Macro, trading safety for speed */ +#define PyTuple_GET_ITEM(op, i) (((PyTupleObject *)(op))->ob_item[i]) +#define PyTuple_GET_SIZE(op) Py_SIZE(op) + +/* Macro, *only* to be used to fill in brand new tuples */ +#define PyTuple_SET_ITEM(op, i, v) (((PyTupleObject *)(op))->ob_item[i] = v) + +PyAPI_FUNC(int) PyTuple_ClearFreeList(void); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_TUPLEOBJECT_H */ diff --git a/python/include/ucnhash.h b/python/include/ucnhash.h new file mode 100644 index 00000000..69b7774a --- /dev/null +++ b/python/include/ucnhash.h @@ -0,0 +1,33 @@ +/* Unicode name database interface */ + +#ifndef Py_UCNHASH_H +#define Py_UCNHASH_H +#ifdef __cplusplus +extern "C" { +#endif + +/* revised ucnhash CAPI interface (exported through a "wrapper") */ + +#define PyUnicodeData_CAPSULE_NAME "unicodedata.ucnhash_CAPI" + +typedef struct { + + /* Size of this struct */ + int size; + + /* Get name for a given character code. Returns non-zero if + success, zero if not. Does not set Python exceptions. + If self is NULL, data come from the default version of the database. + If it is not NULL, it should be a unicodedata.ucd_X_Y_Z object */ + int (*getname)(PyObject *self, Py_UCS4 code, char* buffer, int buflen); + + /* Get character code for a given name. Same error handling + as for getname. */ + int (*getcode)(PyObject *self, const char* name, int namelen, Py_UCS4* code); + +} _PyUnicode_Name_CAPI; + +#ifdef __cplusplus +} +#endif +#endif /* !Py_UCNHASH_H */ diff --git a/python/include/unicodeobject.h b/python/include/unicodeobject.h new file mode 100644 index 00000000..9ab724aa --- /dev/null +++ b/python/include/unicodeobject.h @@ -0,0 +1,1413 @@ +#ifndef Py_UNICODEOBJECT_H +#define Py_UNICODEOBJECT_H + +#include + +/* + +Unicode implementation based on original code by Fredrik Lundh, +modified by Marc-Andre Lemburg (mal@lemburg.com) according to the +Unicode Integration Proposal (see file Misc/unicode.txt). + +Copyright (c) Corporation for National Research Initiatives. + + + Original header: + -------------------------------------------------------------------- + + * Yet another Unicode string type for Python. This type supports the + * 16-bit Basic Multilingual Plane (BMP) only. + * + * Written by Fredrik Lundh, January 1999. + * + * Copyright (c) 1999 by Secret Labs AB. + * Copyright (c) 1999 by Fredrik Lundh. + * + * fredrik@pythonware.com + * http://www.pythonware.com + * + * -------------------------------------------------------------------- + * This Unicode String Type is + * + * Copyright (c) 1999 by Secret Labs AB + * Copyright (c) 1999 by Fredrik Lundh + * + * By obtaining, using, and/or copying this software and/or its + * associated documentation, you agree that you have read, understood, + * and will comply with the following terms and conditions: + * + * Permission to use, copy, modify, and distribute this software and its + * associated documentation for any purpose and without fee is hereby + * granted, provided that the above copyright notice appears in all + * copies, and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of Secret Labs + * AB or the author not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. + * + * SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO + * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT + * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * -------------------------------------------------------------------- */ + +#include + +/* === Internal API ======================================================= */ + +/* --- Internal Unicode Format -------------------------------------------- */ + +#ifndef Py_USING_UNICODE + +#define PyUnicode_Check(op) 0 +#define PyUnicode_CheckExact(op) 0 + +#else + +/* FIXME: MvL's new implementation assumes that Py_UNICODE_SIZE is + properly set, but the default rules below doesn't set it. I'll + sort this out some other day -- fredrik@pythonware.com */ + +#ifndef Py_UNICODE_SIZE +#error Must define Py_UNICODE_SIZE +#endif + +/* Setting Py_UNICODE_WIDE enables UCS-4 storage. Otherwise, Unicode + strings are stored as UCS-2 (with limited support for UTF-16) */ + +#if Py_UNICODE_SIZE >= 4 +#define Py_UNICODE_WIDE +#endif + +/* Set these flags if the platform has "wchar.h", "wctype.h" and the + wchar_t type is a 16-bit unsigned type */ +/* #define HAVE_WCHAR_H */ +/* #define HAVE_USABLE_WCHAR_T */ + +/* Defaults for various platforms */ +#ifndef PY_UNICODE_TYPE + +/* Windows has a usable wchar_t type (unless we're using UCS-4) */ +# if defined(MS_WIN32) && Py_UNICODE_SIZE == 2 +# define HAVE_USABLE_WCHAR_T +# define PY_UNICODE_TYPE wchar_t +# endif + +# if defined(Py_UNICODE_WIDE) +# define PY_UNICODE_TYPE Py_UCS4 +# endif + +#endif + +/* If the compiler provides a wchar_t type we try to support it + through the interface functions PyUnicode_FromWideChar() and + PyUnicode_AsWideChar(). */ + +#ifdef HAVE_USABLE_WCHAR_T +# ifndef HAVE_WCHAR_H +# define HAVE_WCHAR_H +# endif +#endif + +#ifdef HAVE_WCHAR_H +/* Work around a cosmetic bug in BSDI 4.x wchar.h; thanks to Thomas Wouters */ +# ifdef _HAVE_BSDI +# include +# endif +# include +#endif + +/* + * Use this typedef when you need to represent a UTF-16 surrogate pair + * as single unsigned integer. + */ +#if SIZEOF_INT >= 4 +typedef unsigned int Py_UCS4; +#elif SIZEOF_LONG >= 4 +typedef unsigned long Py_UCS4; +#endif + +/* Py_UNICODE is the native Unicode storage format (code unit) used by + Python and represents a single Unicode element in the Unicode + type. */ + +typedef PY_UNICODE_TYPE Py_UNICODE; + +/* --- UCS-2/UCS-4 Name Mangling ------------------------------------------ */ + +/* Unicode API names are mangled to assure that UCS-2 and UCS-4 builds + produce different external names and thus cause import errors in + case Python interpreters and extensions with mixed compiled in + Unicode width assumptions are combined. */ + +#ifndef Py_UNICODE_WIDE + +# define PyUnicode_AsASCIIString PyUnicodeUCS2_AsASCIIString +# define PyUnicode_AsCharmapString PyUnicodeUCS2_AsCharmapString +# define PyUnicode_AsEncodedObject PyUnicodeUCS2_AsEncodedObject +# define PyUnicode_AsEncodedString PyUnicodeUCS2_AsEncodedString +# define PyUnicode_AsLatin1String PyUnicodeUCS2_AsLatin1String +# define PyUnicode_AsRawUnicodeEscapeString PyUnicodeUCS2_AsRawUnicodeEscapeString +# define PyUnicode_AsUTF32String PyUnicodeUCS2_AsUTF32String +# define PyUnicode_AsUTF16String PyUnicodeUCS2_AsUTF16String +# define PyUnicode_AsUTF8String PyUnicodeUCS2_AsUTF8String +# define PyUnicode_AsUnicode PyUnicodeUCS2_AsUnicode +# define PyUnicode_AsUnicodeEscapeString PyUnicodeUCS2_AsUnicodeEscapeString +# define PyUnicode_AsWideChar PyUnicodeUCS2_AsWideChar +# define PyUnicode_ClearFreeList PyUnicodeUCS2_ClearFreelist +# define PyUnicode_Compare PyUnicodeUCS2_Compare +# define PyUnicode_Concat PyUnicodeUCS2_Concat +# define PyUnicode_Contains PyUnicodeUCS2_Contains +# define PyUnicode_Count PyUnicodeUCS2_Count +# define PyUnicode_Decode PyUnicodeUCS2_Decode +# define PyUnicode_DecodeASCII PyUnicodeUCS2_DecodeASCII +# define PyUnicode_DecodeCharmap PyUnicodeUCS2_DecodeCharmap +# define PyUnicode_DecodeLatin1 PyUnicodeUCS2_DecodeLatin1 +# define PyUnicode_DecodeRawUnicodeEscape PyUnicodeUCS2_DecodeRawUnicodeEscape +# define PyUnicode_DecodeUTF32 PyUnicodeUCS2_DecodeUTF32 +# define PyUnicode_DecodeUTF32Stateful PyUnicodeUCS2_DecodeUTF32Stateful +# define PyUnicode_DecodeUTF16 PyUnicodeUCS2_DecodeUTF16 +# define PyUnicode_DecodeUTF16Stateful PyUnicodeUCS2_DecodeUTF16Stateful +# define PyUnicode_DecodeUTF8 PyUnicodeUCS2_DecodeUTF8 +# define PyUnicode_DecodeUTF8Stateful PyUnicodeUCS2_DecodeUTF8Stateful +# define PyUnicode_DecodeUnicodeEscape PyUnicodeUCS2_DecodeUnicodeEscape +# define PyUnicode_Encode PyUnicodeUCS2_Encode +# define PyUnicode_EncodeASCII PyUnicodeUCS2_EncodeASCII +# define PyUnicode_EncodeCharmap PyUnicodeUCS2_EncodeCharmap +# define PyUnicode_EncodeDecimal PyUnicodeUCS2_EncodeDecimal +# define PyUnicode_EncodeLatin1 PyUnicodeUCS2_EncodeLatin1 +# define PyUnicode_EncodeRawUnicodeEscape PyUnicodeUCS2_EncodeRawUnicodeEscape +# define PyUnicode_EncodeUTF32 PyUnicodeUCS2_EncodeUTF32 +# define PyUnicode_EncodeUTF16 PyUnicodeUCS2_EncodeUTF16 +# define PyUnicode_EncodeUTF8 PyUnicodeUCS2_EncodeUTF8 +# define PyUnicode_EncodeUnicodeEscape PyUnicodeUCS2_EncodeUnicodeEscape +# define PyUnicode_Find PyUnicodeUCS2_Find +# define PyUnicode_Format PyUnicodeUCS2_Format +# define PyUnicode_FromEncodedObject PyUnicodeUCS2_FromEncodedObject +# define PyUnicode_FromFormat PyUnicodeUCS2_FromFormat +# define PyUnicode_FromFormatV PyUnicodeUCS2_FromFormatV +# define PyUnicode_FromObject PyUnicodeUCS2_FromObject +# define PyUnicode_FromOrdinal PyUnicodeUCS2_FromOrdinal +# define PyUnicode_FromString PyUnicodeUCS2_FromString +# define PyUnicode_FromStringAndSize PyUnicodeUCS2_FromStringAndSize +# define PyUnicode_FromUnicode PyUnicodeUCS2_FromUnicode +# define PyUnicode_FromWideChar PyUnicodeUCS2_FromWideChar +# define PyUnicode_GetDefaultEncoding PyUnicodeUCS2_GetDefaultEncoding +# define PyUnicode_GetMax PyUnicodeUCS2_GetMax +# define PyUnicode_GetSize PyUnicodeUCS2_GetSize +# define PyUnicode_Join PyUnicodeUCS2_Join +# define PyUnicode_Partition PyUnicodeUCS2_Partition +# define PyUnicode_RPartition PyUnicodeUCS2_RPartition +# define PyUnicode_RSplit PyUnicodeUCS2_RSplit +# define PyUnicode_Replace PyUnicodeUCS2_Replace +# define PyUnicode_Resize PyUnicodeUCS2_Resize +# define PyUnicode_RichCompare PyUnicodeUCS2_RichCompare +# define PyUnicode_SetDefaultEncoding PyUnicodeUCS2_SetDefaultEncoding +# define PyUnicode_Split PyUnicodeUCS2_Split +# define PyUnicode_Splitlines PyUnicodeUCS2_Splitlines +# define PyUnicode_Tailmatch PyUnicodeUCS2_Tailmatch +# define PyUnicode_Translate PyUnicodeUCS2_Translate +# define PyUnicode_TranslateCharmap PyUnicodeUCS2_TranslateCharmap +# define _PyUnicode_AsDefaultEncodedString _PyUnicodeUCS2_AsDefaultEncodedString +# define _PyUnicode_Fini _PyUnicodeUCS2_Fini +# define _PyUnicode_Init _PyUnicodeUCS2_Init +# define _PyUnicode_IsAlpha _PyUnicodeUCS2_IsAlpha +# define _PyUnicode_IsDecimalDigit _PyUnicodeUCS2_IsDecimalDigit +# define _PyUnicode_IsDigit _PyUnicodeUCS2_IsDigit +# define _PyUnicode_IsLinebreak _PyUnicodeUCS2_IsLinebreak +# define _PyUnicode_IsLowercase _PyUnicodeUCS2_IsLowercase +# define _PyUnicode_IsNumeric _PyUnicodeUCS2_IsNumeric +# define _PyUnicode_IsTitlecase _PyUnicodeUCS2_IsTitlecase +# define _PyUnicode_IsUppercase _PyUnicodeUCS2_IsUppercase +# define _PyUnicode_IsWhitespace _PyUnicodeUCS2_IsWhitespace +# define _PyUnicode_ToDecimalDigit _PyUnicodeUCS2_ToDecimalDigit +# define _PyUnicode_ToDigit _PyUnicodeUCS2_ToDigit +# define _PyUnicode_ToLowercase _PyUnicodeUCS2_ToLowercase +# define _PyUnicode_ToNumeric _PyUnicodeUCS2_ToNumeric +# define _PyUnicode_ToTitlecase _PyUnicodeUCS2_ToTitlecase +# define _PyUnicode_ToUppercase _PyUnicodeUCS2_ToUppercase + +#else + +# define PyUnicode_AsASCIIString PyUnicodeUCS4_AsASCIIString +# define PyUnicode_AsCharmapString PyUnicodeUCS4_AsCharmapString +# define PyUnicode_AsEncodedObject PyUnicodeUCS4_AsEncodedObject +# define PyUnicode_AsEncodedString PyUnicodeUCS4_AsEncodedString +# define PyUnicode_AsLatin1String PyUnicodeUCS4_AsLatin1String +# define PyUnicode_AsRawUnicodeEscapeString PyUnicodeUCS4_AsRawUnicodeEscapeString +# define PyUnicode_AsUTF32String PyUnicodeUCS4_AsUTF32String +# define PyUnicode_AsUTF16String PyUnicodeUCS4_AsUTF16String +# define PyUnicode_AsUTF8String PyUnicodeUCS4_AsUTF8String +# define PyUnicode_AsUnicode PyUnicodeUCS4_AsUnicode +# define PyUnicode_AsUnicodeEscapeString PyUnicodeUCS4_AsUnicodeEscapeString +# define PyUnicode_AsWideChar PyUnicodeUCS4_AsWideChar +# define PyUnicode_ClearFreeList PyUnicodeUCS4_ClearFreelist +# define PyUnicode_Compare PyUnicodeUCS4_Compare +# define PyUnicode_Concat PyUnicodeUCS4_Concat +# define PyUnicode_Contains PyUnicodeUCS4_Contains +# define PyUnicode_Count PyUnicodeUCS4_Count +# define PyUnicode_Decode PyUnicodeUCS4_Decode +# define PyUnicode_DecodeASCII PyUnicodeUCS4_DecodeASCII +# define PyUnicode_DecodeCharmap PyUnicodeUCS4_DecodeCharmap +# define PyUnicode_DecodeLatin1 PyUnicodeUCS4_DecodeLatin1 +# define PyUnicode_DecodeRawUnicodeEscape PyUnicodeUCS4_DecodeRawUnicodeEscape +# define PyUnicode_DecodeUTF32 PyUnicodeUCS4_DecodeUTF32 +# define PyUnicode_DecodeUTF32Stateful PyUnicodeUCS4_DecodeUTF32Stateful +# define PyUnicode_DecodeUTF16 PyUnicodeUCS4_DecodeUTF16 +# define PyUnicode_DecodeUTF16Stateful PyUnicodeUCS4_DecodeUTF16Stateful +# define PyUnicode_DecodeUTF8 PyUnicodeUCS4_DecodeUTF8 +# define PyUnicode_DecodeUTF8Stateful PyUnicodeUCS4_DecodeUTF8Stateful +# define PyUnicode_DecodeUnicodeEscape PyUnicodeUCS4_DecodeUnicodeEscape +# define PyUnicode_Encode PyUnicodeUCS4_Encode +# define PyUnicode_EncodeASCII PyUnicodeUCS4_EncodeASCII +# define PyUnicode_EncodeCharmap PyUnicodeUCS4_EncodeCharmap +# define PyUnicode_EncodeDecimal PyUnicodeUCS4_EncodeDecimal +# define PyUnicode_EncodeLatin1 PyUnicodeUCS4_EncodeLatin1 +# define PyUnicode_EncodeRawUnicodeEscape PyUnicodeUCS4_EncodeRawUnicodeEscape +# define PyUnicode_EncodeUTF32 PyUnicodeUCS4_EncodeUTF32 +# define PyUnicode_EncodeUTF16 PyUnicodeUCS4_EncodeUTF16 +# define PyUnicode_EncodeUTF8 PyUnicodeUCS4_EncodeUTF8 +# define PyUnicode_EncodeUnicodeEscape PyUnicodeUCS4_EncodeUnicodeEscape +# define PyUnicode_Find PyUnicodeUCS4_Find +# define PyUnicode_Format PyUnicodeUCS4_Format +# define PyUnicode_FromEncodedObject PyUnicodeUCS4_FromEncodedObject +# define PyUnicode_FromFormat PyUnicodeUCS4_FromFormat +# define PyUnicode_FromFormatV PyUnicodeUCS4_FromFormatV +# define PyUnicode_FromObject PyUnicodeUCS4_FromObject +# define PyUnicode_FromOrdinal PyUnicodeUCS4_FromOrdinal +# define PyUnicode_FromString PyUnicodeUCS4_FromString +# define PyUnicode_FromStringAndSize PyUnicodeUCS4_FromStringAndSize +# define PyUnicode_FromUnicode PyUnicodeUCS4_FromUnicode +# define PyUnicode_FromWideChar PyUnicodeUCS4_FromWideChar +# define PyUnicode_GetDefaultEncoding PyUnicodeUCS4_GetDefaultEncoding +# define PyUnicode_GetMax PyUnicodeUCS4_GetMax +# define PyUnicode_GetSize PyUnicodeUCS4_GetSize +# define PyUnicode_Join PyUnicodeUCS4_Join +# define PyUnicode_Partition PyUnicodeUCS4_Partition +# define PyUnicode_RPartition PyUnicodeUCS4_RPartition +# define PyUnicode_RSplit PyUnicodeUCS4_RSplit +# define PyUnicode_Replace PyUnicodeUCS4_Replace +# define PyUnicode_Resize PyUnicodeUCS4_Resize +# define PyUnicode_RichCompare PyUnicodeUCS4_RichCompare +# define PyUnicode_SetDefaultEncoding PyUnicodeUCS4_SetDefaultEncoding +# define PyUnicode_Split PyUnicodeUCS4_Split +# define PyUnicode_Splitlines PyUnicodeUCS4_Splitlines +# define PyUnicode_Tailmatch PyUnicodeUCS4_Tailmatch +# define PyUnicode_Translate PyUnicodeUCS4_Translate +# define PyUnicode_TranslateCharmap PyUnicodeUCS4_TranslateCharmap +# define _PyUnicode_AsDefaultEncodedString _PyUnicodeUCS4_AsDefaultEncodedString +# define _PyUnicode_Fini _PyUnicodeUCS4_Fini +# define _PyUnicode_Init _PyUnicodeUCS4_Init +# define _PyUnicode_IsAlpha _PyUnicodeUCS4_IsAlpha +# define _PyUnicode_IsDecimalDigit _PyUnicodeUCS4_IsDecimalDigit +# define _PyUnicode_IsDigit _PyUnicodeUCS4_IsDigit +# define _PyUnicode_IsLinebreak _PyUnicodeUCS4_IsLinebreak +# define _PyUnicode_IsLowercase _PyUnicodeUCS4_IsLowercase +# define _PyUnicode_IsNumeric _PyUnicodeUCS4_IsNumeric +# define _PyUnicode_IsTitlecase _PyUnicodeUCS4_IsTitlecase +# define _PyUnicode_IsUppercase _PyUnicodeUCS4_IsUppercase +# define _PyUnicode_IsWhitespace _PyUnicodeUCS4_IsWhitespace +# define _PyUnicode_ToDecimalDigit _PyUnicodeUCS4_ToDecimalDigit +# define _PyUnicode_ToDigit _PyUnicodeUCS4_ToDigit +# define _PyUnicode_ToLowercase _PyUnicodeUCS4_ToLowercase +# define _PyUnicode_ToNumeric _PyUnicodeUCS4_ToNumeric +# define _PyUnicode_ToTitlecase _PyUnicodeUCS4_ToTitlecase +# define _PyUnicode_ToUppercase _PyUnicodeUCS4_ToUppercase + + +#endif + +/* --- Internal Unicode Operations ---------------------------------------- */ + +/* If you want Python to use the compiler's wctype.h functions instead + of the ones supplied with Python, define WANT_WCTYPE_FUNCTIONS or + configure Python using --with-wctype-functions. This reduces the + interpreter's code size. */ + +#if defined(HAVE_USABLE_WCHAR_T) && defined(WANT_WCTYPE_FUNCTIONS) + +#include + +#define Py_UNICODE_ISSPACE(ch) iswspace(ch) + +#define Py_UNICODE_ISLOWER(ch) iswlower(ch) +#define Py_UNICODE_ISUPPER(ch) iswupper(ch) +#define Py_UNICODE_ISTITLE(ch) _PyUnicode_IsTitlecase(ch) +#define Py_UNICODE_ISLINEBREAK(ch) _PyUnicode_IsLinebreak(ch) + +#define Py_UNICODE_TOLOWER(ch) towlower(ch) +#define Py_UNICODE_TOUPPER(ch) towupper(ch) +#define Py_UNICODE_TOTITLE(ch) _PyUnicode_ToTitlecase(ch) + +#define Py_UNICODE_ISDECIMAL(ch) _PyUnicode_IsDecimalDigit(ch) +#define Py_UNICODE_ISDIGIT(ch) _PyUnicode_IsDigit(ch) +#define Py_UNICODE_ISNUMERIC(ch) _PyUnicode_IsNumeric(ch) + +#define Py_UNICODE_TODECIMAL(ch) _PyUnicode_ToDecimalDigit(ch) +#define Py_UNICODE_TODIGIT(ch) _PyUnicode_ToDigit(ch) +#define Py_UNICODE_TONUMERIC(ch) _PyUnicode_ToNumeric(ch) + +#define Py_UNICODE_ISALPHA(ch) iswalpha(ch) + +#else + +/* Since splitting on whitespace is an important use case, and + whitespace in most situations is solely ASCII whitespace, we + optimize for the common case by using a quick look-up table + _Py_ascii_whitespace (see below) with an inlined check. + + */ +#define Py_UNICODE_ISSPACE(ch) \ + ((ch) < 128U ? _Py_ascii_whitespace[(ch)] : _PyUnicode_IsWhitespace(ch)) + +#define Py_UNICODE_ISLOWER(ch) _PyUnicode_IsLowercase(ch) +#define Py_UNICODE_ISUPPER(ch) _PyUnicode_IsUppercase(ch) +#define Py_UNICODE_ISTITLE(ch) _PyUnicode_IsTitlecase(ch) +#define Py_UNICODE_ISLINEBREAK(ch) _PyUnicode_IsLinebreak(ch) + +#define Py_UNICODE_TOLOWER(ch) _PyUnicode_ToLowercase(ch) +#define Py_UNICODE_TOUPPER(ch) _PyUnicode_ToUppercase(ch) +#define Py_UNICODE_TOTITLE(ch) _PyUnicode_ToTitlecase(ch) + +#define Py_UNICODE_ISDECIMAL(ch) _PyUnicode_IsDecimalDigit(ch) +#define Py_UNICODE_ISDIGIT(ch) _PyUnicode_IsDigit(ch) +#define Py_UNICODE_ISNUMERIC(ch) _PyUnicode_IsNumeric(ch) + +#define Py_UNICODE_TODECIMAL(ch) _PyUnicode_ToDecimalDigit(ch) +#define Py_UNICODE_TODIGIT(ch) _PyUnicode_ToDigit(ch) +#define Py_UNICODE_TONUMERIC(ch) _PyUnicode_ToNumeric(ch) + +#define Py_UNICODE_ISALPHA(ch) _PyUnicode_IsAlpha(ch) + +#endif + +#define Py_UNICODE_ISALNUM(ch) \ + (Py_UNICODE_ISALPHA(ch) || \ + Py_UNICODE_ISDECIMAL(ch) || \ + Py_UNICODE_ISDIGIT(ch) || \ + Py_UNICODE_ISNUMERIC(ch)) + +#define Py_UNICODE_COPY(target, source, length) \ + Py_MEMCPY((target), (source), (length)*sizeof(Py_UNICODE)) + +#define Py_UNICODE_FILL(target, value, length) \ + do {Py_ssize_t i_; Py_UNICODE *t_ = (target); Py_UNICODE v_ = (value);\ + for (i_ = 0; i_ < (length); i_++) t_[i_] = v_;\ + } while (0) + +/* Check if substring matches at given offset. the offset must be + valid, and the substring must not be empty */ + +#define Py_UNICODE_MATCH(string, offset, substring) \ + ((*((string)->str + (offset)) == *((substring)->str)) && \ + ((*((string)->str + (offset) + (substring)->length-1) == *((substring)->str + (substring)->length-1))) && \ + !memcmp((string)->str + (offset), (substring)->str, (substring)->length*sizeof(Py_UNICODE))) + +#ifdef __cplusplus +extern "C" { +#endif + +/* --- Unicode Type ------------------------------------------------------- */ + +typedef struct { + PyObject_HEAD + Py_ssize_t length; /* Length of raw Unicode data in buffer */ + Py_UNICODE *str; /* Raw Unicode buffer */ + long hash; /* Hash value; -1 if not set */ + PyObject *defenc; /* (Default) Encoded version as Python + string, or NULL; this is used for + implementing the buffer protocol */ +} PyUnicodeObject; + +PyAPI_DATA(PyTypeObject) PyUnicode_Type; + +#define PyUnicode_Check(op) \ + PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_UNICODE_SUBCLASS) +#define PyUnicode_CheckExact(op) (Py_TYPE(op) == &PyUnicode_Type) + +/* Fast access macros */ +#define PyUnicode_GET_SIZE(op) \ + (((PyUnicodeObject *)(op))->length) +#define PyUnicode_GET_DATA_SIZE(op) \ + (((PyUnicodeObject *)(op))->length * sizeof(Py_UNICODE)) +#define PyUnicode_AS_UNICODE(op) \ + (((PyUnicodeObject *)(op))->str) +#define PyUnicode_AS_DATA(op) \ + ((const char *)((PyUnicodeObject *)(op))->str) + +/* --- Constants ---------------------------------------------------------- */ + +/* This Unicode character will be used as replacement character during + decoding if the errors argument is set to "replace". Note: the + Unicode character U+FFFD is the official REPLACEMENT CHARACTER in + Unicode 3.0. */ + +#define Py_UNICODE_REPLACEMENT_CHARACTER ((Py_UNICODE) 0xFFFD) + +/* === Public API ========================================================= */ + +/* --- Plain Py_UNICODE --------------------------------------------------- */ + +/* Create a Unicode Object from the Py_UNICODE buffer u of the given + size. + + u may be NULL which causes the contents to be undefined. It is the + user's responsibility to fill in the needed data afterwards. Note + that modifying the Unicode object contents after construction is + only allowed if u was set to NULL. + + The buffer is copied into the new object. */ + +PyAPI_FUNC(PyObject*) PyUnicode_FromUnicode( + const Py_UNICODE *u, /* Unicode buffer */ + Py_ssize_t size /* size of buffer */ + ); + +/* Similar to PyUnicode_FromUnicode(), but u points to Latin-1 encoded bytes */ +PyAPI_FUNC(PyObject*) PyUnicode_FromStringAndSize( + const char *u, /* char buffer */ + Py_ssize_t size /* size of buffer */ + ); + +/* Similar to PyUnicode_FromUnicode(), but u points to null-terminated + Latin-1 encoded bytes */ +PyAPI_FUNC(PyObject*) PyUnicode_FromString( + const char *u /* string */ + ); + +/* Return a read-only pointer to the Unicode object's internal + Py_UNICODE buffer. */ + +PyAPI_FUNC(Py_UNICODE *) PyUnicode_AsUnicode( + PyObject *unicode /* Unicode object */ + ); + +/* Get the length of the Unicode object. */ + +PyAPI_FUNC(Py_ssize_t) PyUnicode_GetSize( + PyObject *unicode /* Unicode object */ + ); + +/* Get the maximum ordinal for a Unicode character. */ +PyAPI_FUNC(Py_UNICODE) PyUnicode_GetMax(void); + +/* Resize an already allocated Unicode object to the new size length. + + *unicode is modified to point to the new (resized) object and 0 + returned on success. + + This API may only be called by the function which also called the + Unicode constructor. The refcount on the object must be 1. Otherwise, + an error is returned. + + Error handling is implemented as follows: an exception is set, -1 + is returned and *unicode left untouched. + +*/ + +PyAPI_FUNC(int) PyUnicode_Resize( + PyObject **unicode, /* Pointer to the Unicode object */ + Py_ssize_t length /* New length */ + ); + +/* Coerce obj to an Unicode object and return a reference with + *incremented* refcount. + + Coercion is done in the following way: + + 1. String and other char buffer compatible objects are decoded + under the assumptions that they contain data using the current + default encoding. Decoding is done in "strict" mode. + + 2. All other objects (including Unicode objects) raise an + exception. + + The API returns NULL in case of an error. The caller is responsible + for decref'ing the returned objects. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_FromEncodedObject( + register PyObject *obj, /* Object */ + const char *encoding, /* encoding */ + const char *errors /* error handling */ + ); + +/* Coerce obj to an Unicode object and return a reference with + *incremented* refcount. + + Unicode objects are passed back as-is (subclasses are converted to + true Unicode objects), all other objects are delegated to + PyUnicode_FromEncodedObject(obj, NULL, "strict") which results in + using the default encoding as basis for decoding the object. + + The API returns NULL in case of an error. The caller is responsible + for decref'ing the returned objects. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_FromObject( + register PyObject *obj /* Object */ + ); + +PyAPI_FUNC(PyObject *) PyUnicode_FromFormatV(const char*, va_list); +PyAPI_FUNC(PyObject *) PyUnicode_FromFormat(const char*, ...); + +/* Format the object based on the format_spec, as defined in PEP 3101 + (Advanced String Formatting). */ +PyAPI_FUNC(PyObject *) _PyUnicode_FormatAdvanced(PyObject *obj, + Py_UNICODE *format_spec, + Py_ssize_t format_spec_len); + +/* --- wchar_t support for platforms which support it --------------------- */ + +#ifdef HAVE_WCHAR_H + +/* Create a Unicode Object from the whcar_t buffer w of the given + size. + + The buffer is copied into the new object. */ + +PyAPI_FUNC(PyObject*) PyUnicode_FromWideChar( + register const wchar_t *w, /* wchar_t buffer */ + Py_ssize_t size /* size of buffer */ + ); + +/* Copies the Unicode Object contents into the wchar_t buffer w. At + most size wchar_t characters are copied. + + Note that the resulting wchar_t string may or may not be + 0-terminated. It is the responsibility of the caller to make sure + that the wchar_t string is 0-terminated in case this is required by + the application. + + Returns the number of wchar_t characters copied (excluding a + possibly trailing 0-termination character) or -1 in case of an + error. */ + +PyAPI_FUNC(Py_ssize_t) PyUnicode_AsWideChar( + PyUnicodeObject *unicode, /* Unicode object */ + register wchar_t *w, /* wchar_t buffer */ + Py_ssize_t size /* size of buffer */ + ); + +#endif + +/* --- Unicode ordinals --------------------------------------------------- */ + +/* Create a Unicode Object from the given Unicode code point ordinal. + + The ordinal must be in range(0x10000) on narrow Python builds + (UCS2), and range(0x110000) on wide builds (UCS4). A ValueError is + raised in case it is not. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_FromOrdinal(int ordinal); + +/* --- Free-list management ----------------------------------------------- */ + +/* Clear the free list used by the Unicode implementation. + + This can be used to release memory used for objects on the free + list back to the Python memory allocator. + +*/ + +PyAPI_FUNC(int) PyUnicode_ClearFreeList(void); + +/* === Builtin Codecs ===================================================== + + Many of these APIs take two arguments encoding and errors. These + parameters encoding and errors have the same semantics as the ones + of the builtin unicode() API. + + Setting encoding to NULL causes the default encoding to be used. + + Error handling is set by errors which may also be set to NULL + meaning to use the default handling defined for the codec. Default + error handling for all builtin codecs is "strict" (ValueErrors are + raised). + + The codecs all use a similar interface. Only deviation from the + generic ones are documented. + +*/ + +/* --- Manage the default encoding ---------------------------------------- */ + +/* Return a Python string holding the default encoded value of the + Unicode object. + + The resulting string is cached in the Unicode object for subsequent + usage by this function. The cached version is needed to implement + the character buffer interface and will live (at least) as long as + the Unicode object itself. + + The refcount of the string is *not* incremented. + + *** Exported for internal use by the interpreter only !!! *** + +*/ + +PyAPI_FUNC(PyObject *) _PyUnicode_AsDefaultEncodedString( + PyObject *, const char *); + +/* Returns the currently active default encoding. + + The default encoding is currently implemented as run-time settable + process global. This may change in future versions of the + interpreter to become a parameter which is managed on a per-thread + basis. + + */ + +PyAPI_FUNC(const char*) PyUnicode_GetDefaultEncoding(void); + +/* Sets the currently active default encoding. + + Returns 0 on success, -1 in case of an error. + + */ + +PyAPI_FUNC(int) PyUnicode_SetDefaultEncoding( + const char *encoding /* Encoding name in standard form */ + ); + +/* --- Generic Codecs ----------------------------------------------------- */ + +/* Create a Unicode object by decoding the encoded string s of the + given size. */ + +PyAPI_FUNC(PyObject*) PyUnicode_Decode( + const char *s, /* encoded string */ + Py_ssize_t size, /* size of buffer */ + const char *encoding, /* encoding */ + const char *errors /* error handling */ + ); + +/* Encodes a Py_UNICODE buffer of the given size and returns a + Python string object. */ + +PyAPI_FUNC(PyObject*) PyUnicode_Encode( + const Py_UNICODE *s, /* Unicode char buffer */ + Py_ssize_t size, /* number of Py_UNICODE chars to encode */ + const char *encoding, /* encoding */ + const char *errors /* error handling */ + ); + +/* Encodes a Unicode object and returns the result as Python + object. */ + +PyAPI_FUNC(PyObject*) PyUnicode_AsEncodedObject( + PyObject *unicode, /* Unicode object */ + const char *encoding, /* encoding */ + const char *errors /* error handling */ + ); + +/* Encodes a Unicode object and returns the result as Python string + object. */ + +PyAPI_FUNC(PyObject*) PyUnicode_AsEncodedString( + PyObject *unicode, /* Unicode object */ + const char *encoding, /* encoding */ + const char *errors /* error handling */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_BuildEncodingMap( + PyObject* string /* 256 character map */ + ); + + +/* --- UTF-7 Codecs ------------------------------------------------------- */ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeUTF7( + const char *string, /* UTF-7 encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors /* error handling */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeUTF7Stateful( + const char *string, /* UTF-7 encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors, /* error handling */ + Py_ssize_t *consumed /* bytes consumed */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_EncodeUTF7( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length, /* number of Py_UNICODE chars to encode */ + int base64SetO, /* Encode RFC2152 Set O characters in base64 */ + int base64WhiteSpace, /* Encode whitespace (sp, ht, nl, cr) in base64 */ + const char *errors /* error handling */ + ); + +/* --- UTF-8 Codecs ------------------------------------------------------- */ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeUTF8( + const char *string, /* UTF-8 encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors /* error handling */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeUTF8Stateful( + const char *string, /* UTF-8 encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors, /* error handling */ + Py_ssize_t *consumed /* bytes consumed */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_AsUTF8String( + PyObject *unicode /* Unicode object */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_EncodeUTF8( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length, /* number of Py_UNICODE chars to encode */ + const char *errors /* error handling */ + ); + +/* --- UTF-32 Codecs ------------------------------------------------------ */ + +/* Decodes length bytes from a UTF-32 encoded buffer string and returns + the corresponding Unicode object. + + errors (if non-NULL) defines the error handling. It defaults + to "strict". + + If byteorder is non-NULL, the decoder starts decoding using the + given byte order: + + *byteorder == -1: little endian + *byteorder == 0: native order + *byteorder == 1: big endian + + In native mode, the first four bytes of the stream are checked for a + BOM mark. If found, the BOM mark is analysed, the byte order + adjusted and the BOM skipped. In the other modes, no BOM mark + interpretation is done. After completion, *byteorder is set to the + current byte order at the end of input data. + + If byteorder is NULL, the codec starts in native order mode. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeUTF32( + const char *string, /* UTF-32 encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors, /* error handling */ + int *byteorder /* pointer to byteorder to use + 0=native;-1=LE,1=BE; updated on + exit */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeUTF32Stateful( + const char *string, /* UTF-32 encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors, /* error handling */ + int *byteorder, /* pointer to byteorder to use + 0=native;-1=LE,1=BE; updated on + exit */ + Py_ssize_t *consumed /* bytes consumed */ + ); + +/* Returns a Python string using the UTF-32 encoding in native byte + order. The string always starts with a BOM mark. */ + +PyAPI_FUNC(PyObject*) PyUnicode_AsUTF32String( + PyObject *unicode /* Unicode object */ + ); + +/* Returns a Python string object holding the UTF-32 encoded value of + the Unicode data. + + If byteorder is not 0, output is written according to the following + byte order: + + byteorder == -1: little endian + byteorder == 0: native byte order (writes a BOM mark) + byteorder == 1: big endian + + If byteorder is 0, the output string will always start with the + Unicode BOM mark (U+FEFF). In the other two modes, no BOM mark is + prepended. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_EncodeUTF32( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length, /* number of Py_UNICODE chars to encode */ + const char *errors, /* error handling */ + int byteorder /* byteorder to use 0=BOM+native;-1=LE,1=BE */ + ); + +/* --- UTF-16 Codecs ------------------------------------------------------ */ + +/* Decodes length bytes from a UTF-16 encoded buffer string and returns + the corresponding Unicode object. + + errors (if non-NULL) defines the error handling. It defaults + to "strict". + + If byteorder is non-NULL, the decoder starts decoding using the + given byte order: + + *byteorder == -1: little endian + *byteorder == 0: native order + *byteorder == 1: big endian + + In native mode, the first two bytes of the stream are checked for a + BOM mark. If found, the BOM mark is analysed, the byte order + adjusted and the BOM skipped. In the other modes, no BOM mark + interpretation is done. After completion, *byteorder is set to the + current byte order at the end of input data. + + If byteorder is NULL, the codec starts in native order mode. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeUTF16( + const char *string, /* UTF-16 encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors, /* error handling */ + int *byteorder /* pointer to byteorder to use + 0=native;-1=LE,1=BE; updated on + exit */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeUTF16Stateful( + const char *string, /* UTF-16 encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors, /* error handling */ + int *byteorder, /* pointer to byteorder to use + 0=native;-1=LE,1=BE; updated on + exit */ + Py_ssize_t *consumed /* bytes consumed */ + ); + +/* Returns a Python string using the UTF-16 encoding in native byte + order. The string always starts with a BOM mark. */ + +PyAPI_FUNC(PyObject*) PyUnicode_AsUTF16String( + PyObject *unicode /* Unicode object */ + ); + +/* Returns a Python string object holding the UTF-16 encoded value of + the Unicode data. + + If byteorder is not 0, output is written according to the following + byte order: + + byteorder == -1: little endian + byteorder == 0: native byte order (writes a BOM mark) + byteorder == 1: big endian + + If byteorder is 0, the output string will always start with the + Unicode BOM mark (U+FEFF). In the other two modes, no BOM mark is + prepended. + + Note that Py_UNICODE data is being interpreted as UTF-16 reduced to + UCS-2. This trick makes it possible to add full UTF-16 capabilities + at a later point without compromising the APIs. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_EncodeUTF16( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length, /* number of Py_UNICODE chars to encode */ + const char *errors, /* error handling */ + int byteorder /* byteorder to use 0=BOM+native;-1=LE,1=BE */ + ); + +/* --- Unicode-Escape Codecs ---------------------------------------------- */ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeUnicodeEscape( + const char *string, /* Unicode-Escape encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors /* error handling */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_AsUnicodeEscapeString( + PyObject *unicode /* Unicode object */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_EncodeUnicodeEscape( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length /* Number of Py_UNICODE chars to encode */ + ); + +/* --- Raw-Unicode-Escape Codecs ------------------------------------------ */ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeRawUnicodeEscape( + const char *string, /* Raw-Unicode-Escape encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors /* error handling */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_AsRawUnicodeEscapeString( + PyObject *unicode /* Unicode object */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_EncodeRawUnicodeEscape( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length /* Number of Py_UNICODE chars to encode */ + ); + +/* --- Unicode Internal Codec --------------------------------------------- + + Only for internal use in _codecsmodule.c */ + +PyObject *_PyUnicode_DecodeUnicodeInternal( + const char *string, + Py_ssize_t length, + const char *errors + ); + +/* --- Latin-1 Codecs ----------------------------------------------------- + + Note: Latin-1 corresponds to the first 256 Unicode ordinals. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeLatin1( + const char *string, /* Latin-1 encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors /* error handling */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_AsLatin1String( + PyObject *unicode /* Unicode object */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_EncodeLatin1( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length, /* Number of Py_UNICODE chars to encode */ + const char *errors /* error handling */ + ); + +/* --- ASCII Codecs ------------------------------------------------------- + + Only 7-bit ASCII data is excepted. All other codes generate errors. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeASCII( + const char *string, /* ASCII encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors /* error handling */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_AsASCIIString( + PyObject *unicode /* Unicode object */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_EncodeASCII( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length, /* Number of Py_UNICODE chars to encode */ + const char *errors /* error handling */ + ); + +/* --- Character Map Codecs ----------------------------------------------- + + This codec uses mappings to encode and decode characters. + + Decoding mappings must map single string characters to single + Unicode characters, integers (which are then interpreted as Unicode + ordinals) or None (meaning "undefined mapping" and causing an + error). + + Encoding mappings must map single Unicode characters to single + string characters, integers (which are then interpreted as Latin-1 + ordinals) or None (meaning "undefined mapping" and causing an + error). + + If a character lookup fails with a LookupError, the character is + copied as-is meaning that its ordinal value will be interpreted as + Unicode or Latin-1 ordinal resp. Because of this mappings only need + to contain those mappings which map characters to different code + points. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeCharmap( + const char *string, /* Encoded string */ + Py_ssize_t length, /* size of string */ + PyObject *mapping, /* character mapping + (char ordinal -> unicode ordinal) */ + const char *errors /* error handling */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_AsCharmapString( + PyObject *unicode, /* Unicode object */ + PyObject *mapping /* character mapping + (unicode ordinal -> char ordinal) */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_EncodeCharmap( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length, /* Number of Py_UNICODE chars to encode */ + PyObject *mapping, /* character mapping + (unicode ordinal -> char ordinal) */ + const char *errors /* error handling */ + ); + +/* Translate a Py_UNICODE buffer of the given length by applying a + character mapping table to it and return the resulting Unicode + object. + + The mapping table must map Unicode ordinal integers to Unicode + ordinal integers or None (causing deletion of the character). + + Mapping tables may be dictionaries or sequences. Unmapped character + ordinals (ones which cause a LookupError) are left untouched and + are copied as-is. + +*/ + +PyAPI_FUNC(PyObject *) PyUnicode_TranslateCharmap( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length, /* Number of Py_UNICODE chars to encode */ + PyObject *table, /* Translate table */ + const char *errors /* error handling */ + ); + +#ifdef MS_WIN32 + +/* --- MBCS codecs for Windows -------------------------------------------- */ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeMBCS( + const char *string, /* MBCS encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors /* error handling */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeMBCSStateful( + const char *string, /* MBCS encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors, /* error handling */ + Py_ssize_t *consumed /* bytes consumed */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_AsMBCSString( + PyObject *unicode /* Unicode object */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_EncodeMBCS( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length, /* Number of Py_UNICODE chars to encode */ + const char *errors /* error handling */ + ); + +#endif /* MS_WIN32 */ + +/* --- Decimal Encoder ---------------------------------------------------- */ + +/* Takes a Unicode string holding a decimal value and writes it into + an output buffer using standard ASCII digit codes. + + The output buffer has to provide at least length+1 bytes of storage + area. The output string is 0-terminated. + + The encoder converts whitespace to ' ', decimal characters to their + corresponding ASCII digit and all other Latin-1 characters except + \0 as-is. Characters outside this range (Unicode ordinals 1-256) + are treated as errors. This includes embedded NULL bytes. + + Error handling is defined by the errors argument: + + NULL or "strict": raise a ValueError + "ignore": ignore the wrong characters (these are not copied to the + output buffer) + "replace": replaces illegal characters with '?' + + Returns 0 on success, -1 on failure. + +*/ + +PyAPI_FUNC(int) PyUnicode_EncodeDecimal( + Py_UNICODE *s, /* Unicode buffer */ + Py_ssize_t length, /* Number of Py_UNICODE chars to encode */ + char *output, /* Output buffer; must have size >= length */ + const char *errors /* error handling */ + ); + +/* --- Methods & Slots ---------------------------------------------------- + + These are capable of handling Unicode objects and strings on input + (we refer to them as strings in the descriptions) and return + Unicode objects or integers as apporpriate. */ + +/* Concat two strings giving a new Unicode string. */ + +PyAPI_FUNC(PyObject*) PyUnicode_Concat( + PyObject *left, /* Left string */ + PyObject *right /* Right string */ + ); + +/* Split a string giving a list of Unicode strings. + + If sep is NULL, splitting will be done at all whitespace + substrings. Otherwise, splits occur at the given separator. + + At most maxsplit splits will be done. If negative, no limit is set. + + Separators are not included in the resulting list. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_Split( + PyObject *s, /* String to split */ + PyObject *sep, /* String separator */ + Py_ssize_t maxsplit /* Maxsplit count */ + ); + +/* Dito, but split at line breaks. + + CRLF is considered to be one line break. Line breaks are not + included in the resulting list. */ + +PyAPI_FUNC(PyObject*) PyUnicode_Splitlines( + PyObject *s, /* String to split */ + int keepends /* If true, line end markers are included */ + ); + +/* Partition a string using a given separator. */ + +PyAPI_FUNC(PyObject*) PyUnicode_Partition( + PyObject *s, /* String to partition */ + PyObject *sep /* String separator */ + ); + +/* Partition a string using a given separator, searching from the end of the + string. */ + +PyAPI_FUNC(PyObject*) PyUnicode_RPartition( + PyObject *s, /* String to partition */ + PyObject *sep /* String separator */ + ); + +/* Split a string giving a list of Unicode strings. + + If sep is NULL, splitting will be done at all whitespace + substrings. Otherwise, splits occur at the given separator. + + At most maxsplit splits will be done. But unlike PyUnicode_Split + PyUnicode_RSplit splits from the end of the string. If negative, + no limit is set. + + Separators are not included in the resulting list. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_RSplit( + PyObject *s, /* String to split */ + PyObject *sep, /* String separator */ + Py_ssize_t maxsplit /* Maxsplit count */ + ); + +/* Translate a string by applying a character mapping table to it and + return the resulting Unicode object. + + The mapping table must map Unicode ordinal integers to Unicode + ordinal integers or None (causing deletion of the character). + + Mapping tables may be dictionaries or sequences. Unmapped character + ordinals (ones which cause a LookupError) are left untouched and + are copied as-is. + +*/ + +PyAPI_FUNC(PyObject *) PyUnicode_Translate( + PyObject *str, /* String */ + PyObject *table, /* Translate table */ + const char *errors /* error handling */ + ); + +/* Join a sequence of strings using the given separator and return + the resulting Unicode string. */ + +PyAPI_FUNC(PyObject*) PyUnicode_Join( + PyObject *separator, /* Separator string */ + PyObject *seq /* Sequence object */ + ); + +/* Return 1 if substr matches str[start:end] at the given tail end, 0 + otherwise. */ + +PyAPI_FUNC(Py_ssize_t) PyUnicode_Tailmatch( + PyObject *str, /* String */ + PyObject *substr, /* Prefix or Suffix string */ + Py_ssize_t start, /* Start index */ + Py_ssize_t end, /* Stop index */ + int direction /* Tail end: -1 prefix, +1 suffix */ + ); + +/* Return the first position of substr in str[start:end] using the + given search direction or -1 if not found. -2 is returned in case + an error occurred and an exception is set. */ + +PyAPI_FUNC(Py_ssize_t) PyUnicode_Find( + PyObject *str, /* String */ + PyObject *substr, /* Substring to find */ + Py_ssize_t start, /* Start index */ + Py_ssize_t end, /* Stop index */ + int direction /* Find direction: +1 forward, -1 backward */ + ); + +/* Count the number of occurrences of substr in str[start:end]. */ + +PyAPI_FUNC(Py_ssize_t) PyUnicode_Count( + PyObject *str, /* String */ + PyObject *substr, /* Substring to count */ + Py_ssize_t start, /* Start index */ + Py_ssize_t end /* Stop index */ + ); + +/* Replace at most maxcount occurrences of substr in str with replstr + and return the resulting Unicode object. */ + +PyAPI_FUNC(PyObject *) PyUnicode_Replace( + PyObject *str, /* String */ + PyObject *substr, /* Substring to find */ + PyObject *replstr, /* Substring to replace */ + Py_ssize_t maxcount /* Max. number of replacements to apply; + -1 = all */ + ); + +/* Compare two strings and return -1, 0, 1 for less than, equal, + greater than resp. */ + +PyAPI_FUNC(int) PyUnicode_Compare( + PyObject *left, /* Left string */ + PyObject *right /* Right string */ + ); + +/* Rich compare two strings and return one of the following: + + - NULL in case an exception was raised + - Py_True or Py_False for successfuly comparisons + - Py_NotImplemented in case the type combination is unknown + + Note that Py_EQ and Py_NE comparisons can cause a UnicodeWarning in + case the conversion of the arguments to Unicode fails with a + UnicodeDecodeError. + + Possible values for op: + + Py_GT, Py_GE, Py_EQ, Py_NE, Py_LT, Py_LE + +*/ + +PyAPI_FUNC(PyObject *) PyUnicode_RichCompare( + PyObject *left, /* Left string */ + PyObject *right, /* Right string */ + int op /* Operation: Py_EQ, Py_NE, Py_GT, etc. */ + ); + +/* Apply a argument tuple or dictionary to a format string and return + the resulting Unicode string. */ + +PyAPI_FUNC(PyObject *) PyUnicode_Format( + PyObject *format, /* Format string */ + PyObject *args /* Argument tuple or dictionary */ + ); + +/* Checks whether element is contained in container and return 1/0 + accordingly. + + element has to coerce to an one element Unicode string. -1 is + returned in case of an error. */ + +PyAPI_FUNC(int) PyUnicode_Contains( + PyObject *container, /* Container string */ + PyObject *element /* Element string */ + ); + +/* Externally visible for str.strip(unicode) */ +PyAPI_FUNC(PyObject *) _PyUnicode_XStrip( + PyUnicodeObject *self, + int striptype, + PyObject *sepobj + ); + +/* === Characters Type APIs =============================================== */ + +/* Helper array used by Py_UNICODE_ISSPACE(). */ + +PyAPI_DATA(const unsigned char) _Py_ascii_whitespace[]; + +/* These should not be used directly. Use the Py_UNICODE_IS* and + Py_UNICODE_TO* macros instead. + + These APIs are implemented in Objects/unicodectype.c. + +*/ + +PyAPI_FUNC(int) _PyUnicode_IsLowercase( + Py_UNICODE ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsUppercase( + Py_UNICODE ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsTitlecase( + Py_UNICODE ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsWhitespace( + const Py_UNICODE ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsLinebreak( + const Py_UNICODE ch /* Unicode character */ + ); + +PyAPI_FUNC(Py_UNICODE) _PyUnicode_ToLowercase( + Py_UNICODE ch /* Unicode character */ + ); + +PyAPI_FUNC(Py_UNICODE) _PyUnicode_ToUppercase( + Py_UNICODE ch /* Unicode character */ + ); + +PyAPI_FUNC(Py_UNICODE) _PyUnicode_ToTitlecase( + Py_UNICODE ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_ToDecimalDigit( + Py_UNICODE ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_ToDigit( + Py_UNICODE ch /* Unicode character */ + ); + +PyAPI_FUNC(double) _PyUnicode_ToNumeric( + Py_UNICODE ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsDecimalDigit( + Py_UNICODE ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsDigit( + Py_UNICODE ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsNumeric( + Py_UNICODE ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsAlpha( + Py_UNICODE ch /* Unicode character */ + ); + +#ifdef __cplusplus +} +#endif +#endif /* Py_USING_UNICODE */ +#endif /* !Py_UNICODEOBJECT_H */ diff --git a/python/include/warnings.h b/python/include/warnings.h new file mode 100644 index 00000000..0818d7a1 --- /dev/null +++ b/python/include/warnings.h @@ -0,0 +1,23 @@ +#ifndef Py_WARNINGS_H +#define Py_WARNINGS_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_FUNC(void) _PyWarnings_Init(void); + +PyAPI_FUNC(int) PyErr_WarnEx(PyObject *, const char *, Py_ssize_t); +PyAPI_FUNC(int) PyErr_WarnExplicit(PyObject *, const char *, const char *, int, + const char *, PyObject *); + +#define PyErr_WarnPy3k(msg, stacklevel) \ + (Py_Py3kWarningFlag ? PyErr_WarnEx(PyExc_DeprecationWarning, msg, stacklevel) : 0) + +/* DEPRECATED: Use PyErr_WarnEx() instead. */ +#define PyErr_Warn(category, msg) PyErr_WarnEx(category, msg, 1) + +#ifdef __cplusplus +} +#endif +#endif /* !Py_WARNINGS_H */ + diff --git a/python/include/weakrefobject.h b/python/include/weakrefobject.h new file mode 100644 index 00000000..f15c9d9c --- /dev/null +++ b/python/include/weakrefobject.h @@ -0,0 +1,75 @@ +/* Weak references objects for Python. */ + +#ifndef Py_WEAKREFOBJECT_H +#define Py_WEAKREFOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + + +typedef struct _PyWeakReference PyWeakReference; + +/* PyWeakReference is the base struct for the Python ReferenceType, ProxyType, + * and CallableProxyType. + */ +struct _PyWeakReference { + PyObject_HEAD + + /* The object to which this is a weak reference, or Py_None if none. + * Note that this is a stealth reference: wr_object's refcount is + * not incremented to reflect this pointer. + */ + PyObject *wr_object; + + /* A callable to invoke when wr_object dies, or NULL if none. */ + PyObject *wr_callback; + + /* A cache for wr_object's hash code. As usual for hashes, this is -1 + * if the hash code isn't known yet. + */ + long hash; + + /* If wr_object is weakly referenced, wr_object has a doubly-linked NULL- + * terminated list of weak references to it. These are the list pointers. + * If wr_object goes away, wr_object is set to Py_None, and these pointers + * have no meaning then. + */ + PyWeakReference *wr_prev; + PyWeakReference *wr_next; +}; + +PyAPI_DATA(PyTypeObject) _PyWeakref_RefType; +PyAPI_DATA(PyTypeObject) _PyWeakref_ProxyType; +PyAPI_DATA(PyTypeObject) _PyWeakref_CallableProxyType; + +#define PyWeakref_CheckRef(op) PyObject_TypeCheck(op, &_PyWeakref_RefType) +#define PyWeakref_CheckRefExact(op) \ + (Py_TYPE(op) == &_PyWeakref_RefType) +#define PyWeakref_CheckProxy(op) \ + ((Py_TYPE(op) == &_PyWeakref_ProxyType) || \ + (Py_TYPE(op) == &_PyWeakref_CallableProxyType)) + +/* This macro calls PyWeakref_CheckRef() last since that can involve a + function call; this makes it more likely that the function call + will be avoided. */ +#define PyWeakref_Check(op) \ + (PyWeakref_CheckRef(op) || PyWeakref_CheckProxy(op)) + + +PyAPI_FUNC(PyObject *) PyWeakref_NewRef(PyObject *ob, + PyObject *callback); +PyAPI_FUNC(PyObject *) PyWeakref_NewProxy(PyObject *ob, + PyObject *callback); +PyAPI_FUNC(PyObject *) PyWeakref_GetObject(PyObject *ref); + +PyAPI_FUNC(Py_ssize_t) _PyWeakref_GetWeakrefCount(PyWeakReference *head); + +PyAPI_FUNC(void) _PyWeakref_ClearRef(PyWeakReference *self); + +#define PyWeakref_GET_OBJECT(ref) (((PyWeakReference *)(ref))->wr_object) + + +#ifdef __cplusplus +} +#endif +#endif /* !Py_WEAKREFOBJECT_H */ diff --git a/wavread.cpp b/wavread.cpp index 92d86f46..930bbcf6 100644 --- a/wavread.cpp +++ b/wavread.cpp @@ -44,7 +44,7 @@ http://mozilla.org/MPL/2.0/. //----------------------------------------------------------------------------- HRESULT ReadMMIO(HMMIO hmmioIn, MMCKINFO *pckInRIFF, WAVEFORMATEX **ppwfxInfo) { - MMCKINFO ckIn; // chunk info. for general use. + MMCKINFO ckIn; // chunk info. for general use. PCMWAVEFORMAT pcmWaveFormat; // Temp PCM structure to load in. *ppwfxInfo = NULL; @@ -216,7 +216,10 @@ HRESULT WaveReadFile(HMMIO hmmioIn, UINT cbRead, BYTE *pbDest, MMCKINFO *pckIn, // Name: CWaveSoundRead() // Desc: Constructs the class //----------------------------------------------------------------------------- -CWaveSoundRead::CWaveSoundRead() { m_pwfx = NULL; } +CWaveSoundRead::CWaveSoundRead() +{ + m_pwfx = NULL; +} //----------------------------------------------------------------------------- // Name: ~CWaveSoundRead() @@ -252,7 +255,10 @@ HRESULT CWaveSoundRead::Open(CHAR *strFilename) // Desc: Resets the internal m_ckIn pointer so reading starts from the // beginning of the file again //----------------------------------------------------------------------------- -HRESULT CWaveSoundRead::Reset() { return WaveStartDataRead(&m_hmmioIn, &m_ckIn, &m_ckInRiff); } +HRESULT CWaveSoundRead::Reset() +{ + return WaveStartDataRead(&m_hmmioIn, &m_ckIn, &m_ckInRiff); +} //----------------------------------------------------------------------------- // Name: Read() diff --git a/wavread.h b/wavread.h index 01c3759e..c2f3aa93 100644 --- a/wavread.h +++ b/wavread.h @@ -34,9 +34,9 @@ class CWaveSoundRead { public: WAVEFORMATEX *m_pwfx; // Pointer to WAVEFORMATEX structure - HMMIO m_hmmioIn; // MM I/O handle for the WAVE - MMCKINFO m_ckIn; // Multimedia RIFF chunk - MMCKINFO m_ckInRiff; // Use in opening a WAVE file + HMMIO m_hmmioIn; // MM I/O handle for the WAVE + MMCKINFO m_ckIn; // Multimedia RIFF chunk + MMCKINFO m_ckInRiff; // Use in opening a WAVE file public: CWaveSoundRead(); From b6017a5ef7365c86a3821199f643c49ceadec9b2 Mon Sep 17 00:00:00 2001 From: Firleju Date: Fri, 1 May 2015 19:58:51 +0200 Subject: [PATCH 2/4] First asynchrone commit (r1171) --- .gitignore | 7 + Button.cpp | 12 +- Button.h | 7 +- Dokumentacja zmiennych Python.docx | Bin 0 -> 19597 bytes DynObj.cpp | 969 +++++++++++++++++++---------- Gauge.cpp | 33 +- McZapkie/Mover.hpp | 1 + McZapkie/_Mover.hpp | 1 + McZapkie/_mover.pas | 133 ++-- Model3d.cpp | 453 ++++++++------ Train.cpp | 688 ++++++++++++-------- Train.h | 26 +- 12 files changed, 1502 insertions(+), 828 deletions(-) create mode 100644 Dokumentacja zmiennych Python.docx diff --git a/.gitignore b/.gitignore index ec4a4f77..36205d64 100644 --- a/.gitignore +++ b/.gitignore @@ -52,3 +52,10 @@ install_manifest.txt *.~h *.~bpr *.~pas +*.opensdf +*.sdf +*.sln +*.vcxproj +*.filters +format_all_files.py +~$kumentacja zmiennych Python.docx diff --git a/Button.cpp b/Button.cpp index 7b5f90c2..3f2f51b2 100644 --- a/Button.cpp +++ b/Button.cpp @@ -21,6 +21,7 @@ http://mozilla.org/MPL/2.0/. TButton::TButton() { iFeedbackBit = 0; + bData = NULL; Clear(); }; @@ -54,8 +55,8 @@ void TButton::Load(TQueryParserComp *Parser, TModel3d *pModel1, TModel3d *pModel Init(str, pModel1, false); if (pModel2) if (!pModelOn && !pModelOff) - Init(str, pModel2, - false); // może w drugim będzie (jak nie w kabinie, to w zewnętrznym) + Init(str, pModel2, false); // może w drugim będzie (jak nie w kabinie, + // to w zewnętrznym) } else { @@ -66,6 +67,8 @@ void TButton::Load(TQueryParserComp *Parser, TModel3d *pModel1, TModel3d *pModel void TButton::Update() { + if (bData != NULL) + bOn = (*bData); if (pModelOn) pModelOn->iVisible = bOn; if (pModelOff) @@ -78,3 +81,8 @@ void TButton::Update() Console::BitsClear(iFeedbackBit); } }; + +void TButton::AssignBool(bool *bValue) +{ + bData = bValue; +} diff --git a/Button.h b/Button.h index 013e0d61..a7dbffb5 100644 --- a/Button.h +++ b/Button.h @@ -14,12 +14,13 @@ http://mozilla.org/MPL/2.0/. #include "QueryParserComp.hpp" class TButton -{ // animacja dwustanowa, włącza jeden z dwóch submodeli (jednego z nich może nie być) +{ // animacja dwustanowa, włącza jeden z dwóch submodeli (jednego + // z nich może nie być) private: TSubModel *pModelOn, *pModelOff; // submodel dla stanu załączonego i wyłączonego bool bOn; + bool *bData; int iFeedbackBit; // Ra: bit informacji zwrotnej, do wyprowadzenia na pulpit - void Update(); public: TButton(); @@ -53,8 +54,10 @@ class TButton { return (pModelOn) || (pModelOff); }; + void Update(); void Init(AnsiString asName, TModel3d *pModel, bool bNewOn = false); void Load(TQueryParserComp *Parser, TModel3d *pModel1, TModel3d *pModel2 = NULL); + void AssignBool(bool *bValue); }; //--------------------------------------------------------------------------- diff --git a/Dokumentacja zmiennych Python.docx b/Dokumentacja zmiennych Python.docx new file mode 100644 index 0000000000000000000000000000000000000000..f509f279e0eaa70db075b2201b528bc38cb118b9 GIT binary patch literal 19597 zcmeFZ^OGn~lP^5BZQHhO+cwVFXKdTHjWf1woUv`|o$v158_$h>;{6A9>xYi6%8Kmn zjLiCER%Nz=G%yGX02lxS0000X0K*ssj3XcbKrtu)05SjskhZYBowKQ(v%ZSQFHD zr93M*He5~~5_Dq2F{{rOSGYl(Y3xRDv)Y&lgqU>vD5XBvqcrI@B}$OZ@{SI8Cn0v! zwQ3o8D5z^2djy#k=$gjh0~O8M4mCcix*i?PW&TOY+Wvxia?0$Ubqhilh{*WgjDl>9 z{LR+yK)%2Ia)d~CA7WZ(g=7r2FgvffHXa=ZlvNH7fSk$uCO&27r2>Z!{6K?6`Ij?& zABai?5A^k~xK1linN(z4&b^uD-v=;Q8HEX`*%RSuSR9(y@}Js2ywn(cdNkhnM?0dL zJ`?%Ah@-B#E5)uYaqa2WcF}*d?E4!SK;i!}RlInt*83ld+>a$f|Cp-2qp6J(J>5Uo z|25J7!FKsCpB|O4Aq6Z56LJl@Z8++~z5zuvzqTcj??!YE9F%?m=ms}gwBFrSNYJjZ zp?CCfJR!fF8JM}qUCIMiYpA)Dx0-1nzHRMp+ZqY3pgF3Y5nv80K3!*NXTMC(6Q7jN z6UA6ru-6zONWw>C##~pZ6Fl0j(jJE+38@?#KZ*SqRoUJ>@}Lf!kzTT{32SM7Ezmro z!KS|qr^}A@8_Mi@bs`*f6x`5$jn0V5MsnCO+KTd#2Fr$FhBQ0gs0xa0$FgAQQRG`c zGA5V?G9NO0=HA;S3s_4J-g&LSW2BZFpHPzq&ByCqIIxl4g6{{k{=1Ddc1Pku{!m(g z0RV6SAOPL$9Zl%}(@;$8ja_ViknJBx`!Ayb{K2)K+5fX!RpN})AOphib-*>kk=;T~ zdzei-I^t8sBjCL28+c|BNu$;FR({h`N}zyt zTSIemKxYIjN(9iL0IBl3v$=`miMo_mCFc`yFB7sA@C)7|%0O~pEpzK#Qn#i>*fjKp9z z=+k1in9?sLq9YIwT*F2xAXwa)UqBe=#V;mP?p`dMo;iIYzfw{NTC9Z-YQg0Ij44N$ zHI3YL67wBXn6llNV;Y-4ZtKVf*^jP$)f~xk1P+GmrG5XcDm~{YX-$9w0EkNh03iNo z$bYEPzbes%_NLti8%j5Rog0F4u7;};JF^vd-@KhhD4hf|%Brk@a??~A5okmMwLTif z6HK3;Y3i8Qr9@E`Ln1Ket#1}Kd4Y@j@1A?%qs`M5KTcvIVk-BIYJATcVGcCD!_SuY zx7jk^>=2LuHgQ4&uopJGx^-iYwm z(d{_ZrzQIw?36}a>jZ`!!5a&K0g6&Io>Z(bj?wU_93&%@x(~1Yx^cU15#u`XUX~4G z!cPS#nF5HMobw^dq4wv+Eir$}@KbD6jk@PaPDq49Wu|gBo`&y5_fUh*jIEB81S$|f zUFY7^_I~+!`6bh%eW46}zRDm(^S@Yx%dWn{h~kK%R$+fLUi;BCa9VY5blmwN{b5n4 z8FjyO!wkRL-Mo*Ap_^?=PtkfL&PoU0ZeAM=GW7OOips+^V$Y++3J)CaPo^9MImydN zW&>95=>7SxZSQ422NcK6-cF!CmhaC-?9ZkOWx%DZLKvjl*m|cyYl6a zVQ?n;Ax)3Tn)y${)xjJH+aeD<3U4hXH4bY7g#R6k+@Yaak;})XSFe06K|G{_%$?H&bMg4;sU zXCH5OKlmDU5uz^Qk3i{rM*^)^8;6}_gqJf{ODf;+yn zcc_nvGnum8yCyDWGC4N;M-Z96o}@X>1G6^|IsWNc)x4RPfd?OhNNfP1V&?qT55del z(KaZwAO1Krv<6`^A|sf>VCY4m1RxL|eeVljjNC_hxR`jL+eE{BOre~sH(=lZAcAs& z8ExPpu$1%W%I+OkE|7z zK7Ma{v1F;8rN+2ER&WvDg6QER>JcDGDa5EL~h{pkt9I`_ZOlAaV1!x#phQRlnFrNnU z>KNGb>sFoJKk$SENf-(^pyRrmct~W}9ibKj3u<+J1sq!oKMF*-?7Lk$2#;XzD2JTR zfZ+x*_~8moxvgnmB+0<4?|WW67*y@r&_LPHkHLR;FZU2*W0eY}o6Wbf4x2-v1aN^` zXS74x7a}y&&6nFEEhgyoYtg_wBY1LDUQZF|<#M(+!U6ijaI?L*?IiOzy`-sXfekNnH;~-Zn3r&(o2QF@|E3dloxb+nRye0VqRlt-`#q%S^EN^#5nn*b*VC8& zOHcGGw1-z7>v8ceP;v_(w2dPE7JQ3(%cHw5fzh9%tCUna z(+s&9WE}vKP!*+**wL08w$0%{hjJ6y{sSziNuT)(q9=%(+%knVkf=hmay^vn>2*5y zdYaD{()-xL!|qO`^G_V2HU$P(&H3Y-9xbNw3c-ojjF0()iAPR!w2zEIF^QG0nbk?> zJP|V&n@#sGIf;*Wbs|z?iZ_{j&T0}mm)xC?#n_qghB>Zw7O>DhszhP(nIa`*gOUbe z$Q+>Sy_P&E(Ht?@()Oq0wQndrPSJC!t9A%6NvIBeUxaqOk@Hqeh{An+{n}V; z=pq^|@i-#=s3M(qauWNgYKFD4)bu4h*p-mL0>NSZagrQBtk%rlYgJ6x;%GB4TP+$R zX+S#K8Ydd(88+{z1s+w&EVX-w^Z=IcWS?SvymP!6(v@=e53kPY3SVBZXXDt`>Yff> zz1+4?-Yp+oU-IN5$SOXFbaJtXVUO4mA8X3LD*QQ5s)bj zVx91hydB?E3yvKZCEe@=LFN`7nO9GEU7E%%fv>$Qn?1cEliWQEcxRh%?&q#!i=1wM z;f{chy|ev5Vq?O=WNZ|s7mO=t^t*k)o_J^YaS=4z-*F3*G-^U*0Ec0*Ru?n#vce49 z&-kF}ak!;<{s>hLzH~9KD1BjegXiO;+0aJnGc!SQ4SeA>@B;}(A!OQFWGchv9XF?S zhb+#gn+OpB;(;pkw;hOZP`KHe5W74 zcpnr5;|0zD*L}%IX+g`sg|;VuyR+qxz!ih49w1%6uwS1)Z)LKdGn?B74X*b^fwNex z9WIb=^v4Tt65MG$kq2&-m)JV^6QLtw?WXV!{pIU;+66bCt+;Urqg}3Ok zCcWxq+AFn;B7U(G(F_COVX_}HwLm`zF)3G~Voec35otlqM;O$@iv|MM2Bw_Xn+S4) zzMp?#9B@K}G2xYJak57U1)M@ALWe>7N90c{AYmh#h(bM8?3{qQ= z6~Spx-&j%hJ?(Z5ibV?Vj;H9;M%g;*=V2U&27qlL77UOewK8kTS`=8n8Gr396mPk?=Qkw7KJf)skF z6;`9X4D1JjL=rHHw15#C2dw#5a5oNAf=Zwg!*ZKM8ZK8mp`GTcjsT7J9cRG!-9o~A ze3UUR))>TvwehUh9RADmX?4Bh(d2r0#;eu-dh?Bvu{7_UCxXXkWn$*4^X;t!bJS($ zKGf~^`=JvvLWRBA$h|)P*X_f`C-`=cyXW&z>@y7aGA7m;H<)199~a1Ltqm5CQWc#@ zwS7YFwHW_cAfFM>0|yks@*#pA>JOl|d6f91?EqX`ov1BTFxXKL9`-+a3~kqq;Sewx z^e={hZIYCh%4Sjhpykq$4+cmcW`{Nf`z?s;jHg$5WdaUvNW#ZcNF6)wBO{>9tq>6) zcfW#yNqY*7qhPmmp#y|;*nvY8<;45j(KKvPFoc;PLV|-bY`O4*dM6eSm~V8$rjAf6 zWy8nLVLO#YghUC97=HUn5=I@*isa3bIQsPqHS3A=vtzF1GKrIyOn@?68VXg{L~^oU z{+aC6kA8rL@XU#Sl4XL8lpqVJmpl>`DUbP^w;vPRzZ!H29$#zBzh^9=Xkx2q7+^nd z6g+Ca11K6g??c)P+77!3z~z=t7%J$j;zkD8bR0D6R?U6w`*`}r{tP?Dwvy`G_I~yy zdpbKU=CFVEUww^9VED!`P-GZ{dB2J7MVM9`kveKhsgp?zm7p$3 zw&pV0Ok7I#BuPuHDNdqKi90b&Uls>Xzj4U9kqKT*Y^HaZQ}r6t^Y5S-8eel~zotM^ zDWWa|Nt4T#3$bRnDlQ7UH5$iVWengBofwZW_Zzk`L>kD=^F_DGwpD?@@>H_PzcbiL z5-<~270QKSwptLE)}@NSTA~0NA`W)uAh?A}rM2VZrSTTPB*}pqyRWabgqaLCATW|T zg=9AU2B^bXdhGzNXH2S0iKGa1d?kxh5?w@$@JX|lDh|&a$2FnUtBKUhb6Bi$h6;LrL1I5UEr<=rA*jCsBcwJS3B=SlL@ED?4-!1-%uv0U4YBQ z_CZ=|6SpVgO8j!|JD2qH&%gPt`f0A=ll>4Ul9D6^G=sk3Z(a}3UICnd(YX?Yt$$Xa z(1b%(_gA5doBBy6qd=fBdqj05q5m{UH&{*Azj0Kp#)e1&1>;rQRmM%X?LoRQ#2q}* z|4`VjY&LLi$G1T@8)ls`o+S8p&bh!^pFnF061WEcO405Q-S9DS|%YbMszP`iwN zdfkoG#%6-CfN1u!to$Hv$6PMwK<51G}) zo183D&0nzulFjmgEpGwqa$-t+Id~+L#4{%w)`=k4@MFoN6Hm3~6i`5 z2Q{-aq+>VO5W3M%d>Op2hP{;?_dyCI$Y|MY6-raLOtkf&=b)2Zv!`mWM-%pJxUfNZ z(=*Wdr(r^KJYL_FRq62VW>ICkH0RMx{*0dcI8mH+Ox<0>f01d?wewZNYpyN6n!TpE zO{~=Z{yIJM*gW)sH`)Y}S=?-2qq!FDx_T<@9BBwW3jQVI(LhU;^eKNCQ zgx+xTk{qv&&@v;dOgnwf2JiKYVlXT2(8{29c*T#}8A@(u`^>m)=A}Oe zv@%;hCyK7NS**IC*OF^oU2G#5cJ#Hp=IE0T9$6rz2D~h%G;Rie2A^#Oo1Z;7?92Gu z#2n!#{N_%e;jQ|@Ln9WUmgL!M8RM^793j?5$Z^EQF>?;7G{{@_Ws-WhZE-7F-gbGQ z6~R0l>hfMh4m+j5Gxtm52#2ybmHgGRSt7MEIT@9J^TCWk%8En;``P>1Am+ex4N8zR zMJpF81$+hZ=s`uV45es8Z)0m$YZrN38c{tkb44iiEH?;7ztWq%5(q8Y6NMkVr|#UZYYP?{AYGRqDLh+)mxc=&QFBIe z3RXMiXt9(fDa|cpNRb)!gh|i?^2n2g(ji1?Q7Lw_g2>#9+UI_lHo=3f?R>7 zsEV70D;uQ3kIKZ86JzqKyD zg<&uvdZH5v=9Z_#??e=EVu|Wdp$MWtR?co<4AC@O;E6EGvv$i@bPD<)XiD97;A&dJ zVg-*f)6Q*RD37B=(3~vVH&x4s7^kjhOu_nRSC$ zv;U{mLIzeDtw&Q#u)k2#6shGGVoALl#kXi{#&_(bYvKUhGwjv9Q z>UJC)$9T>&4(kdN3)EdA=aoE3>(Gb=s(cADr%;VSboK>+d}v#_Qj|z>k#N|MiGy>h^n_u7vRmO!${l z4Dl~5?xqM2A(}7!HEAsEz{BR)GGg@Ws^MWst}-iL=Y{Km&b!%Q+KPI4nMN!02%B5G zlh*vpisg=*Ih4oA?ZesUV|}NV=Z)SmV*jjr$osd&L+*-V$RiD*-03KTic(Y@AiqEa0tP36Qo36_h`Ilc2 zE+DkhPKLmT&_ zGi0^}ynZN+cc=Ho)#{)zI-WOd=Y)6*z8u*6f)N5nDgi5P4GZ7GOEQ^RM%(;>Orm;5 zhNV?rp9BFsgZK-Ca-;|6Y^TLr>FHkq5mBcNUcUBbo|6l zAU}JnDE}2hxtSU%{|gvIP4`(1Fu)AodKq3LIO}IWGDt}%Q54e8J_729Tf)?vkl1cL zJ+RuOZhE5RzT95J>s#9LDY7uZ-Za?e3qtXTw!{AN;OD*0SG;F=O@;)25epu8X*!iw zzws1nd@Gk#mEguSV4TQy!a|eLYt4#3V{0U_e@x2U_lN=9=I|yVaq4LCaS5nw)yk8e zg!0w$5TT|~MuRKU5}toMC&h;xULRdEir{xQ;)FsMbuhmEYL0dLw*lijC6;g@CIG<2 zCIGLD z&Y=-UEGDQdKAEnlT{7ET8eb4!9CSVH01yBG?Zirqy0(%lXNM60?qywn?Cjv&%=o^# zV8V8TTB4ENp8k3$?b;;>`!qotel8u*x1-<2fd|*T8e*oG+S_q{K`S(oR_Qj*=x{x2E3d_HwlT6iv<6n4h9oy7B0Y?w-(F1e% za_ww&dtrkmq7UtB^k^FoscMx?++vgD(k>3iH^J<@WGeWi?P9?D0;pw|{)pU}))w~= z`(3g^`9Ai0S3gxU%RF$3oBn>_22BsAqzz`D>>Xz& zRyUiBVh+p)4I|bL$WD9yPSEns71b?z-vwD{$O2(EhR(;~f(sUzWg34Locs;#&Yo-? z41Y+YrhtimC*~i8?(^Ginn{dH-zFzQp1Wz{^CV$e%Jb(2-BXM9(fLzQJz>9 z4VC^+V**UlzksUCd}q5N2d;E+T&{s0eATrSo}?k{<)(RVDdSA-WY&3OUoLKV`fCR6 zu`;x}d%%iQW~@1^UOT}Ger_QCxyePF*(R05Blln!4b;D9N=UC}v{IxG8JT6Y{G`BS zmU!$Fh`}mH*cNV7yfSc9$bX3RDCyIU3jjw?!nfyGtIp|xy@vp=VqrJf2&Yf47cJo>h}+-Soa*^p-kJd)2CPA*n(Wf0DeuImtw|n5g+IPP(oGMqJQNQ< zvGjMMziNuPb&CZGjK5?zibr(}3YvTtmo;L*<>0lCC)`YstL?C$$YK8L$lHy+`FfbuABLx-gx(Ha>azLYGOKIxJ6;cpmRzNC8UTq zoX%$-4Qcj1${IG84ZBtdq1bkO(BQsZo$-vN!zd}^Xg3D5rDi(tHzaRpNst5x6K({5 zREjK4Z!Ik|xhHC#qn_$MX?lJ}zH;|HWf=cr8VrowEENx@DD%aVwjyHeFsxKv*d}O* zy(ls|bCp%x)IgMF|JPD(OlZSng?H3M$7-|amU92tz}6;ZY7Q`NvY@8>bpI$qI~=E1sie zo!B%4w<&hx8~@41NO_AJqf!9|ZbT`$_1xc;kyzD(JL`v$F1!kbJvy-E_{I=Ha1J%4 zeW~%-4y^-%oBzhd<^Pun+u@}%jiv`T?r1X}6V-K~=V5fKv+~xJSbX@A z5lZIWR-Z<2g%d~0KaXyT#4I1**o{&-y!6Zy^60>jP~M^gtN(vr!dOh-7l=AA27iZ!W<%y=^% z(O5xTf~E9P&>p(iZEBT}{9Kpj)au@`%aT4Ggs_nED&uc5iM zLoY6JYszH{cx7eHDb&|s-mybv_W|8BvsY9#-Cf!yKB&kIi)8hR#kOoX`vFpwOCLD4 zK>D%yfh24i;|1+s0_A$q#S12}N?lm;_4$uhof>eXVWQTvz@6|(Tf5s5Jy;RYSYFSW z28{C(G~<~!k0p30rk^raRU}{l=5>rAGNxOO*?eGYTp^zHU?mKCH!U;HRlb8;0c=pK zciL%X>*-wGJXrd83nQ4y=z?``FtvWyLcbB%OdqC}rN^_~yFOF|j3+rE)GZs~PfuqD z)+06ESopH5oRqZO9%=V#NAOLEiHH1evL3VOJ5}c1Gm7vv42k>xl&O)>nk%SCkTVVK zmK;A6qYG*wcutm3^%b@e^#Rwq1oo~%0hWY#2KBZfgG|H0!^QG9g$Q6k@-cPk1VU*- z;@}wiL{sDkZI3pW%=QspY7GE7!<|A?d4kls0FMtsp_sXQf{Yg-E3_=4GAUp@S^LeS z0IzC)W1M6TysN=6GcOW{KIdi(z%=nXV0fM94*X>aDsvQKLD?*N=^Zy#`(92P2~G{U z1_Ns}xrWF3r2(Q@hs=r<^Rw1Lm{6M6)${>W&VzIFnYw)ZY5-z9pY$-PDZFAecy?8w z2qi)o>Gh-#TFX_K7FEb;^1$MwoZ8u%boceWMxcheK>*dM?ZX7ph$5g%%=Z4Z8oTyD zA|F)Q2p4mlj~X)R`3N>Ja11X@=22r1w#g5VG42WTch4M5%CjY?bLXIvutn$!Hc5O2 zKS>5o*FS-~C#T3FWEY9&!UQq zy2cx8PJr@bA328xOngKUI&AJ^tria#VSOf$;%!V?5`aryjRAS0`oM;1oojty6>AfN zqCEh4?9Rl}mv0D}qRvYhT)^nn^kn7?f^+nYMPgT>7V0e*G!`){+<=IWwzL%hc$#k@ zYXvv?$Z=?@In20BU)T^mWcUE2%_1NX|G4-} zdZFQ78E3z{5R9GbWq)2+ea|!iJi7_HBTNPT-tCS~L#|XfuwvRM~f<8Jziw#*{VoURPQh(k)9q`)fzyQoEbjx~> z)rexdyh7icgFcR_!&V4RvKv7TrTAKdtmB(ToHRVzbwVLao_^n)X+ti^d1ZzeT*I%e~-f(&BVoeYu$&kHOw|2297!w$)YXLIJetNMjxi2x&p4& zm$8N?_bwW%$v+6)fSlmqaF2wus ztkh;@Weo&R8y@0Au6tZkxkaG&`lp9ecg8sOOxPPO&}Pp~QZh}NIIa-Zc0~z`Hc&!U zxBHQ-+i^v;!`Gxz^evef2J0S75g%d(fr%1eoyzGCXr zzmAfu1lxDj9ts^G`$k{MU}FV7pH(uE3-8`5J5#XANJR_ zsyt)0@M{yQoeGVu=*6xVayz2}QBZV2T|ss{YLO(4RQBt>$79`ubnd_}=;RT{C?{#p zl}I-WUvBvLf$qp_j)a}E>(K&USXF1Le>+9NbRitM+tc!^PUCz|bsj7tl+E{h3I-Dp zX00wfec^RfB|Zejq~43uHDD|x>J-B=d^qsNhtLF<{?257$RBO815K7JzoH=6T_sLP zwFpcF1q}0x5XoHJo4v{+MVaI>H=RKge$mnl*jY>^Y+Xf{F_j#5RP0 zHbu(>&Of)%_cYLULA5&OV*YeOn*i0SoF%it3TXi!7(=>fj1A_2OXZ7esb*?5Pvv zGOhz67MqITOFG_l2&Aw*t5p+a0jpIKV>RMmINP611a<7gjevF7NnT)m!UfXDGa%xyIRY?_t#83=V$4vC%O zWxM$|rzeYWBC(%wjj9(fk+xX5kPUa7OHL>-<+Gg|5~&~HeKZhBC1*3j5^M}G5ll}C z>m<(oz_!HmUrR@w8W3vK_hnHRdq@u&ofInC7E@to#njT9>a#tmyj)$EjPp_@Ay=me z?zL)`e{;Z&g@d?H2q@s)+gX)Ox~<%Q6crFk~N>5DDL1MsaO? z*)jS(+OQm^R}bd3x2tJ@E$nSE^*)Mgr>91|6p+{OG4C&oqRhc2&~a=TA$?Grz+z)I zh2jdr@jMR9)KsqFyg8kFg&;BeJQwZBYp`I&DSwv#r&G=PZVxTG#FbN z(V?#%hjydbZ9a8E?4$GuKAC%z2IG}c*=Q8le3`(JDc}n}UNDC;ZE8vjV0O47Zdr~J z-iFlz9Dek~l0+p<=@>p`Jz<4mzu)V^m7~RL%MOMon~Rtb)V5PWinf%L;s6}gmh|X|={A{*Vy|{R4^!-)^dA=)K zB?=yymRo!yo&Y=gNHA175C5X*)@WazGaN_Ohy}y5QbjC_2$WyzGH|7WUJO+ODSuHl z-8(8eB*s%nwm%U41}OiL4y)5#d0dsT0@C<+}VgUWpZyl`Kz?o&tE`IvF(hx zu7Qssq44w}n{*|}TSjbe8M00RANgBg(q<^+%WV#2q>2K!M^li{3+pBS_nURj%MI(D z=judFN;~yM_5Fb~Kq!WQ8Rk=Apl<{0n`pCI;9tobvc;&(el!&;Z|M-MtamWxa{a+Y z1#NzdWQ9!Bq~t_l6w>>oMY|*`)e)q+^gN16W>`~m3m(hHmF@69*=rT}ky5MU6><7& zRE;j*Y5AX=ZEdXc6}iDbqXE3NHpy$AA~Q>DrBY9o5!}+}{zs6=Ek-a{i{1+Z)2(bC z#mWX+ufF|2Y%62SRjb52LQxclca(HY=CQB4x&6;H_a&S-^jxVb(By&*pJ5wzJqoe?nz2S;WA7_vZciF?KV9 zw-*4yyhobwy&b-}9j8D6+aCzM#kVdFR=O&}dS=zSL1o4YU$#wK<<*Q!mW z9_R+kn=)*sAq20ET-wL4Qj*&rBdbfaAxSg#s-_Iki%ubr3WOtWs!u;ixMS6}+64GE z)fQwRUhRN*r>n^-h&JHXQ~g@Ion{{xbRnb`aiu{!GBEv-Kc=MJS6i??bVwB{yL|zU zs|r!$ukx3=KT;CAi1CbeJ|Uq?L@W;=Jfbau5zid%3;6w$R+UqPEv4n_Y7acwwvI=l zd8A&3A?g~vu(3@PA~vJq3vmP+8Qc9ATG88KiS%@>_%PRIbPTNh||+IM{`|x)BOTx)1n7zc~rU!rM^d7 z{fF&Pljya@)Q6~A$(7wWe6ECsp>x?~IcqL*P@b(M3_OezjHe~Hg>J^@rDD?KGzO}% zG_UH^I(&f@YY;rH6Y`Ro$_Jr3Ue3l*NTDa@C9x`ZVpM!R^$^dHKu9d|;N4e=^Ylt9 z4KYNkseW*^db{!F5|_4hs^r`l;s}6>oF(^wI14p9VW?@2x|~VTm2VMAkMXQ%_4qEK zdgCR5D=_w~caFXH#@6M973ZljCq#j|K>iIZ#y2STsfl&G`95PF5Bs<6%4E4d8$2_8 zXe(RSOX#81m8s$KcjZKI_ag~=X0Y{(03ZicoIO4^+*_A~w+-gUL3Px1ZF{eypZMvE zn*o@+`%EUebZlE=vV$s~5XIGSHRu~O;BhZ%g@(r2B*g}(Be)F#1A#L;*mxKUm+Rre zvJ+i`K&~Gp9Z+R!-~2=-=lPna)hC|-WrSQg9ldlk`>2q%XMA>~?S|>Ov)7?6AuSnI z(jn-zzb95VtVwDb(j2HPHNcc82o^0>52E=vVzAto!dZVjB!3^tg*}!F*^cSRMRq zI7vyAL-6;9Q?(hiT+z)l%dfe`YCJgORascR6f~D;b6NcFch}fJrofp$;|IQD`WdQ| z7QuU65^CkGklj}2ACVwHtgAwsSrrk%TBm51i9>|T0$15~eC(v7{GG7g)F25KQRJtM z%h%ucGv7q!zHtLjUIekLs2!%~4}7p)Wv50BZEF<}Lj?)u8up1L zC3WQtVmFNBqr{60p1|+u2NYCM?@goMd7G-Q-c=RTdTfopoSc75K&vt!m7j)B;H`b4 zKB-5fst1-!hwqs(raDUbS@eEHHBczKnav%7f+DqX9(v>PD0O;L#~$btU(`Mr=`0HRyu%c!(*e8x;mpw&l&97WNVI31z^8>U_aaI^av*;yTAI_- zCZEWfCujL5UAS-l6yXZ|rTO=^!_d1FA5z@03*b3mi02&F!75?{{oJ=w<5neTkO|3y zzeb<0DgQ^$&tc8KNdR296!NqDIk+1AskB1;sUrEw`d4tY|K&t)Z0~6Le@Y_%w{+x3 zbWsV4(gO@A!P}tU!ed^UX2!x&8~)?o4g?&E-q2&Z=qp8};pgr8_8Ha91H3O7SAX=U zIVIaUMwwOv*$R{}i4>!N6sq=wP%%BV=?Az`Fr-mSO^XSHX)&5c?d_G+$gAdW3M#Rh zPz`{@mB*BpuDrO(N6?;1CEYlRc=fP1#z3(`UI61bAp|LXeqNkjeb392OJ z`+T-P6hnFd0HpsqZ?toT(* zt_2qBBzj@ALR+NlW9d#PA9_N{KNDr+oPRp*d9!>`u)@c?b?!6VHxR@zHyko{0Hy^B zocBj8>$NzXS^e55(bmQUF8cG*T4PmRwaKsWE^xp;R=pCc_JiCxWCcB^z$Z}S$u_vz z33Lk<6*z@_X7)((&&3a!7I}k?_4zs>c{(Y#y`)mP006Z+0nHuNEmPX`o*b}qmb$yN z>BX=zk&3^thF$IIFiuNsiQfD1WXm1fV41#ow{~})7>9?lruM0BSMX0X1V&!|(nJLs zh1lwAO`QK377xJ1z1a=Cg7`Lb*r643!scXGZyA^d$d5A#=GyZ_0H3Hssc8}PW9CEh zoyH5iEA6Bc{23!3<}yG>QP&E@~1Ipp^o!UOE4Mte_EsQN7uEie>0HDk?bvH3JCDj7V>bYX1Qd zQ#b5Jr;(O}<7&FmN4^@D(`=>as$i!$B~Vgg$<@dRLOe(?g=^s#Y#3SrE2$5CHi}`^ zN8KRnouz=SRz)sReh8u{UpbW)orZs;#vE(kY_I=)X3IW;W!9?SD}Q2r%}qZNvxIrlC>MVK)gQW$Wkpcn$MaiWP!Jnv))NxQXlI+0 zG0M7iCX>j;kK_5MxO!v)nx6;L1AWxkSF0S$!HyHSh^S4*fp!G61s};dvUlF{i z@@v8l@q`4l#0F;WLh$75K`5Gmmnf45dG^EvJk9fe?MCzdvt-rq1qc~c)nChf%0_Oa z+HT8%uHJ5X{xNS|x*_uhGMAG%jM{#1&?E=V*?e8HWPS0PpXv0%RU483NG^YW#+dQY zRT)pKBSiKF@A3HM4N5mXp3|wMsjEn*pZv1-JPb1vEn18MgQe3v+BoP-F_Gdu!@6iL zOSxv|k00)|5ZyuMwJU*PAwz}N2XA~rki@FctuDex8uS+ux+ordI{`nh1R2cL?w}M~ z@Fd=kq!?x#mR6r9S{EL|f^#rinCB8$j>u3-Mk&`78pPqvYhZc9ND71(xtp&^qam`l zhrU_eE~5POg`q^1-YYLyN}W}-u#MXWs9|KxE6bFFGB8hzA=>PQIA5$g>@4n>)l(E@7y(tI|=qy;dUEy_uW z^2pK}#Yy;t!r;@Q<@=59#m{EQ7jeVIbu!f&fFoaMPUJtCbY&Fr&S$&SQk_=oZ;oyr<2Sl(-l4r&5HX#iPnC6Vezt5OQ}BHf3X z*+pCo)x@@n)G_MZdXuX52uf0+a>QD)Sq_q~{n_gyu16V7x;s!K9#(*0rGfTydV3D9 zG)~n=a|1FBH*#}Y6$nJO=R$hsT#NKNi5UT z`0_!QWl2uC6!|#%R%|fAYg4f@ai7$$}-+^X$ zZ@fR~_jOR=y26<^3)yBRZ%=O_AV=b@VFVFTk>#Vz07!P43btf+8XUR;v3W`w+5P~H zs>W!QK2{hMmmzLG&XJq`mvv1kFFYPtiZ&|Av@@iN2D!`Xo>>O9f3D`ggjV~E0- zUWuB@j``M*=8I7{s-jY3kxw!)8-wZW`u4Rs=Gv~-z=ZgaYF5GAR9@kTHA1${AUG9I zl^*0}T?|^iQ`;TBT^q?ZCWow3RTbcls_80(dRzTen%||Wh6PO@nis8@J+BAwFw}Z83%+pKRiTsjWuo{zO zU&dBtg{`Oec9Q|6cd=gPy5IgpT6-sp-BX;gVA|)6KVZKjW}CtxoQko3;LRt_C&a`O zIBJoVK$g&3^kF?O5`#}vC(FRd9%C)^!GYlKkfFEA$NcoZNXVqzd?cey2B)4n3;`j7 zgDOo7TR^xNVR^dp0W*@ZU9Sodx$oPzM}0B^we^sI(Zqq@^9iJP0z}UDp@ZI3qXHlL z*!$dqiv)?s4bBjkIGDzNMi1#z&amZg8iAxnY44bFsRZFKKCdtyF41$`u7qDAV}qR2 zy9sHEfCMLaNXyh+=33V<#E3QFzmYgD32&_&KXAk4U8dDpG6b8Ic21U+J6b#d#~2+* zNkDN71%zxD4&9l4D+yinLj(Kh3zGP9{q7YD!Q-FqQ+%6{39tow{agQfe}rRz z+<~)$@x&$`d&FZVcl{G7{dXTV1d;~%_=mFjQ;Co8uQ8P2uV4QgLj9~9|EFas_x&se zFkSGg{21NrQVmtsz+yvjMkj{az=O6k88YPkCX#V!d20^eE#FwU>@^LSEV+32mS?B& z0h!0kXkJlc?yVH$g$|l|3*BsXjTHD5^62WO@e+TuG_QXt;xQz%-(6yBh~hIO^r`%U zPDMLRp_mMo@QkdMB9`NxX5njz;E2NB%^bGqeDqu?AZEmkr3d9hZpS*0WMH9rkGbdl zv|m_1m(%yGg7XKJE~|r8LmaQo#^J8uZ6*Liqmmz2D-q@VWAr=BpqMS~07L|SXKaLP z4Bi-lH{eiBv^X3$sqvIFj3y+OP@@pFzV$A0ZjO9g!NJ!#|KtliJ{5qwQLHO61TH~- zRQSaP2igO?0Gx)VLRQ7_y}&NapgMVoR9~NMoDAevsu#Dyu8G=IgZ{#@TU?e8ZR}%b zS8if2Q))H6h2ohC>o9EUeEe-E%vJ)$)Fp4THkW{74Ou*G<#2V93;s_^pNFCN6A_04 zT`iLd<0iYe>Ragg|2NNd-&QQVKI`Pk2L;FEW2f)qJth0&1LMZS_b)rI_>;TcP+x7{ zP`IW zIX>>m|N5*;9##0ar>oQhlRqSLFf!=^SHfaHcL|mlU^JFfm;$^}4M05&2Br~2uLfF) zbT$mSM${uRkTsrXgDzdgabO0zN$4jeAk32D#ByE&x_0z!mI&=4!1ETs$1R|5x>wwWUqYg76v;udX zS~4(T3_77}M;`@17_ikEYB$Q50J?tkh6+M|kTX<2O0xxBKWYh&(9OUQ>4xNdXn7yt W%?eCj3=BL#$OufKWx!)K7#IL!WX~l4 literal 0 HcmV?d00001 diff --git a/DynObj.cpp b/DynObj.cpp index 32f55c71..14ff1ab4 100644 --- a/DynObj.cpp +++ b/DynObj.cpp @@ -53,7 +53,8 @@ void TAnimPant::AKP_4E() vPos = vector3(0, 0, 0); // przypisanie domyśnych współczynników do pantografów fLenL1 = 1.22; // 1.176289 w modelach fLenU1 = 1.755; // 1.724482197 w modelach - fHoriz = 0.535; // 0.54555075 przesunięcie ślizgu w długości pojazdu względem osi obrotu dolnego + fHoriz = 0.535; // 0.54555075 przesunięcie ślizgu w długości pojazdu względem + // osi obrotu dolnego // ramienia fHeight = 0.07; // wysokość ślizgu ponad oś obrotu fWidth = 0.635; // połowa szerokości ślizgu, 0.635 dla AKP-1 i AKP-4E @@ -76,11 +77,14 @@ void TAnimPant::AKP_4E() }; //--------------------------------------------------------------------------- int TAnim::TypeSet(int i, int fl) -{ // ustawienie typu animacji i zależnej od niego ilości animowanych submodeli +{ // ustawienie typu animacji i zależnej od + // niego ilości animowanych submodeli fMaxDist = -1.0; // normalnie nie pokazywać switch (i) - { // maska 0x000F: ile używa wskaźników na submodele (0 gdy jeden, wtedy bez tablicy) - // maska 0x00F0: 0-osie,1-drzwi,2-obracane,3-zderzaki,4-wózki,5-pantografy,6-tłoki + { // maska 0x000F: ile używa wskaźników na submodele (0 gdy jeden, + // wtedy bez tablicy) + // maska 0x00F0: + // 0-osie,1-drzwi,2-obracane,3-zderzaki,4-wózki,5-pantografy,6-tłoki // maska 0xFF00: ile używa liczb float dla współczynników i stanu case 0: iFlags = 0x000; @@ -173,7 +177,8 @@ TDynamicObject *__fastcall TDynamicObject::FirstFind(int &coupler_nr) //--------------------------------------------------------------------------- float TDynamicObject::GetEPP() -{ // szukanie skrajnego połączonego pojazdu w pociagu +{ // szukanie skrajnego połączonego pojazdu w + // pociagu // od strony sprzegu (coupler_nr) obiektu (start) TDynamicObject *temp = this; int coupler_nr = 0; @@ -272,14 +277,16 @@ TDynamicObject* TDynamicObject::GetFirstCabDynamic(int cpl_type) return NULL; if (coupler_nr==0) {//jeżeli szukamy od sprzęgu 0 - if (temp->PrevConnectedNo==0) //jeśli pojazd od strony sprzęgu 0 jest odwrócony + if (temp->PrevConnectedNo==0) //jeśli pojazd od strony sprzęgu 0 jest +odwrócony coupler_nr=1-coupler_nr; //to zmieniamy kierunek sprzęgu if (temp->PrevConnected) temp=temp->PrevConnected; //ten jest od strony 0 } else { - if (temp->NextConnectedNo==1) //jeśli pojazd od strony sprzęgu 1 jest odwrócony + if (temp->NextConnectedNo==1) //jeśli pojazd od strony sprzęgu 1 jest +odwrócony coupler_nr=1-coupler_nr; //to zmieniamy kierunek sprzęgu if (temp->NextConnected) temp=temp->NextConnected; //ten pojazd jest od strony 1 @@ -416,7 +423,8 @@ void TDynamicObject::UpdateDoorTranslate(TAnim *pAnim) void TDynamicObject::UpdateDoorRotate(TAnim *pAnim) { // animacja drzwi - obrót if (pAnim->smAnimated) - { // if (MoverParameters->DoorOpenMethod==2) //obrotowe albo dwójłomne (trzeba kombinowac + { // if (MoverParameters->DoorOpenMethod==2) //obrotowe + // albo dwójłomne (trzeba kombinowac // submodelami i ShiftL=90,R=180) if (pAnim->iNumber & 1) pAnim->smAnimated->SetRotate(float3(1, 0, 0), dDoorMoveR); @@ -428,7 +436,8 @@ void TDynamicObject::UpdateDoorRotate(TAnim *pAnim) void TDynamicObject::UpdateDoorFold(TAnim *pAnim) { // animacja drzwi - obrót if (pAnim->smAnimated) - { // if (MoverParameters->DoorOpenMethod==2) //obrotowe albo dwójłomne (trzeba kombinowac + { // if (MoverParameters->DoorOpenMethod==2) //obrotowe + // albo dwójłomne (trzeba kombinowac // submodelami i ShiftL=90,R=180) if (pAnim->iNumber & 1) { @@ -489,15 +498,19 @@ void TDynamicObject::UpdateLeverInt(TAnim *pAnim) pAnim->smAnimated->SetRotate(float3(1, 0, 0), pAnim->fSpeed * *pAnim->iIntBase); }; void TDynamicObject::UpdateLeverEnum(TAnim *pAnim) -{ // ustawienie kąta na wartość wskazaną przez int z tablicy fParam +{ // ustawienie kąta na + // wartość wskazaną przez + // int z tablicy fParam // pAnim->fParam[0]; - dodać lepkość pAnim->smAnimated->SetRotate(float3(1, 0, 0), pAnim->fParam[*pAnim->iIntBase]); }; // ABu 29.01.05 przeklejone z render i renderalpha: ********************* void __inline TDynamicObject::ABuLittleUpdate(double ObjSqrDist) -{ // ABu290105: pozbierane i uporzadkowane powtarzajace sie rzeczy z Render i RenderAlpha - // dodatkowy warunek, if (ObjSqrDist<...) zeby niepotrzebnie nie zmianiec w obiektach, +{ // ABu290105: pozbierane i uporzadkowane powtarzajace + // sie rzeczy z Render i RenderAlpha + // dodatkowy warunek, if (ObjSqrDist<...) zeby niepotrzebnie nie zmianiec w + // obiektach, // ktorych i tak nie widac // NBMX wrzesien, MC listopad: zuniwersalnione btnOn = false; // czy przywrócić stan domyślny po renderowaniu @@ -530,7 +543,8 @@ void __inline TDynamicObject::ABuLittleUpdate(double ObjSqrDist) // ABu011104: liczenie obrotow wozkow ABuBogies(); // Mczapkie-100402: rysowanie lub nie - sprzegow - // ABu-240105: Dodatkowy warunek: if (...).Render, zeby rysowal tylko jeden + // ABu-240105: Dodatkowy warunek: if (...).Render, zeby rysowal tylko + // jeden // z polaczonych sprzegow if ((TestFlag(MoverParameters->Couplers[0].CouplingFlag, ctrain_coupler)) && (MoverParameters->Couplers[0].Render)) @@ -547,7 +561,8 @@ void __inline TDynamicObject::ABuLittleUpdate(double ObjSqrDist) } // else btCoupler2.TurnOff(); //******************************************************************************** - // przewody powietrzne j.w., ABu: decyzja czy rysowac tylko na podstawie 'render' - juz + // przewody powietrzne j.w., ABu: decyzja czy rysowac tylko na podstawie + // 'render' - juz // nie // przewody powietrzne, yB: decyzja na podstawie polaczen w t3d if (Global::bnewAirCouplers) @@ -661,7 +676,8 @@ void __inline TDynamicObject::ABuLittleUpdate(double ObjSqrDist) //*********************************************************************************/ else // po staremu ABu'oewmu { - // przewody powietrzne j.w., ABu: decyzja czy rysowac tylko na podstawie 'render' + // przewody powietrzne j.w., ABu: decyzja czy rysowac tylko na podstawie + // 'render' if (TestFlag(MoverParameters->Couplers[0].CouplingFlag, ctrain_pneumatic)) { if (MoverParameters->Couplers[0].Render) @@ -690,7 +706,8 @@ void __inline TDynamicObject::ABuLittleUpdate(double ObjSqrDist) // btCPneumatic2r.TurnOff(); //} - // przewody powietrzne j.w., ABu: decyzja czy rysowac tylko na podstawie 'render' + // przewody powietrzne j.w., ABu: decyzja czy rysowac tylko na podstawie + // 'render' // //yB - zasilajace if (TestFlag(MoverParameters->Couplers[0].CouplingFlag, ctrain_scndpneumatic)) { @@ -720,7 +737,8 @@ void __inline TDynamicObject::ABuLittleUpdate(double ObjSqrDist) // btPneumatic2r.TurnOff(); //} } - //*************************************************************/// koniec wezykow + //*************************************************************/// koniec + // wezykow // uginanie zderzakow for (int i = 0; i < 2; i++) { @@ -840,9 +858,9 @@ void __inline TDynamicObject::ABuLittleUpdate(double ObjSqrDist) else { // jak jest tylko jeden, to do drugiej kabiny go obracamy smMechanik0->iVisible = (MoverParameters->ActiveCab != 0); - smMechanik0->SetRotate(float3(0, 0, 1), MoverParameters->ActiveCab >= 0 ? - 0 : - 180); // obrót względem osi Z + smMechanik0->SetRotate( + float3(0, 0, 1), + MoverParameters->ActiveCab >= 0 ? 0 : 180); // obrót względem osi Z } if (smMechanik1) // mechanik od strony sprzęgu 1 smMechanik1->iVisible = MoverParameters->ActiveCab < 0; @@ -852,7 +870,8 @@ void __inline TDynamicObject::ABuLittleUpdate(double ObjSqrDist) // if (ObjSqrDist<80000) ABuModelRoll(); //przechyłki od 400m } if (MoverParameters->Battery) - { // sygnały czoła pociagu //Ra: wyświetlamy bez ograniczeń odległości, by były widoczne z + { // sygnały czoła pociagu //Ra: wyświetlamy bez + // ograniczeń odległości, by były widoczne z // daleka if (TestFlag(iLights[0], 1)) { @@ -895,14 +914,16 @@ void __inline TDynamicObject::ABuLittleUpdate(double ObjSqrDist) // ABu 29.01.05 koniec przeklejenia ************************************* double ABuAcos(const vector3 &calc_temp) -{ // Odpowiednik funkcji Arccos, bo cos mi tam nie dzialalo. +{ // Odpowiednik funkcji Arccos, bo cos + // mi tam nie dzialalo. return atan2(-calc_temp.x, calc_temp.z); // Ra: tak prościej } TDynamicObject *__fastcall TDynamicObject::ABuFindNearestObject(TTrack *Track, TDynamicObject *MyPointer, int &CouplNr) -{ // zwraca wskaznik do obiektu znajdujacego sie na torze (Track), którego sprzęg jest najblizszy +{ // zwraca wskaznik do obiektu znajdujacego sie na torze + // (Track), którego sprzęg jest najblizszy // kamerze // służy np. do łączenia i rozpinania sprzęgów // WE: Track - tor, na ktorym odbywa sie poszukiwanie @@ -929,7 +950,8 @@ TDynamicObject *__fastcall TDynamicObject::ABuFindNearestObject(TTrack *Track, else // jeśli (CouplNr) inne niz -2, szukamy sprzęgu { // wektor [kamera-sprzeg0], potem [kamera-sprzeg1] // Powinno byc wyliczone, ale nie zaszkodzi drugi raz: - //(bo co, jesli nie wykonuje sie obrotow wozkow?) - Ra: ale zawsze są liczone + //(bo co, jesli nie wykonuje sie obrotow wozkow?) - Ra: ale zawsze są + // liczone // współrzędne sprzęgów // Track->Dynamics[i]->modelRot.z=ABuAcos(Track->Dynamics[i]->Axle0.pPosition-Track->Dynamics[i]->Axle1.pPosition); // poz=Track->Dynamics[i]->vPosition; //pozycja środka pojazdu @@ -963,7 +985,8 @@ TDynamicObject *__fastcall TDynamicObject::ABuFindNearestObject(TTrack *Track, TDynamicObject *__fastcall TDynamicObject::ABuScanNearestObject(TTrack *Track, double ScanDir, double ScanDist, int &CouplNr) -{ // skanowanie toru w poszukiwaniu obiektu najblizszego kamerze +{ // skanowanie toru w poszukiwaniu obiektu najblizszego + // kamerze // double MyScanDir=ScanDir; //Moja orientacja na torze. //Ra: nie używane if (ABuGetDirection() < 0) ScanDir = -ScanDir; @@ -1018,18 +1041,21 @@ TDynamicObject *__fastcall TDynamicObject::ABuScanNearestObject(TTrack *Track, d // ABu 01.11.04 poczatek wyliczania przechylow pudla ********************** void TDynamicObject::ABuModelRoll() -{ // ustawienie przechyłki pojazdu i jego zawartości +{ // ustawienie przechyłki pojazdu i jego + // zawartości // Ra: przechyłkę załatwiamy na etapie przesuwania modelu } // ABu 06.05.04 poczatek wyliczania obrotow wozkow ********************** void TDynamicObject::ABuBogies() -{ // Obracanie wozkow na zakretach. Na razie uwzględnia tylko zakręty, +{ // Obracanie wozkow na zakretach. Na razie + // uwzględnia tylko zakręty, // bez zadnych gorek i innych przeszkod. if ((smBogie[0] != NULL) && (smBogie[1] != NULL)) { - // modelRot.z=ABuAcos(Axle0.pPosition-Axle1.pPosition); //kąt obrotu pojazdu [rad] + // modelRot.z=ABuAcos(Axle0.pPosition-Axle1.pPosition); //kąt obrotu pojazdu + // [rad] // bogieRot[0].z=ABuAcos(Axle0.pPosition-Axle3.pPosition); bogieRot[0].z = Axle0.vAngles.z; bogieRot[0] = RadToDeg(modelRot - bogieRot[0]); // mnożenie wektora przez stałą @@ -1044,7 +1070,8 @@ void TDynamicObject::ABuBogies() // ABu 16.03.03 sledzenie toru przed obiektem: ************************** void TDynamicObject::ABuCheckMyTrack() -{ // Funkcja przypisujaca obiekt prawidlowej tablicy Dynamics, +{ // Funkcja przypisujaca obiekt + // prawidlowej tablicy Dynamics, // bo gdzies jest jakis blad i wszystkie obiekty z danego // pociagu na poczatku stawiane sa na jednym torze i wpisywane // do jednej tablicy. Wykonuje sie tylko raz - po to 'ABuChecked' @@ -1067,8 +1094,10 @@ TDynamicObject *__fastcall TDynamicObject::ABuFindObject(TTrack *Track, int Scan // WE: Track - tor, na ktorym odbywa sie poszukiwanie, // MyPointer - wskaznik do obiektu szukajacego. //Ra: zamieniłem na "this" - // ScanDir - kierunek szukania na torze (+1:w stronę Point2, -1:w stronę Point1) - // MyScanDir - kierunek szukania obiektu szukajacego (na jego torze); Ra: nie potrzebne + // ScanDir - kierunek szukania na torze (+1:w stronę Point2, -1:w stronę + // Point1) + // MyScanDir - kierunek szukania obiektu szukajacego (na jego torze); Ra: + // nie potrzebne // MyCouplFound - nr sprzegu obiektu szukajacego; Ra: nie potrzebne // WY: wskaznik do znalezionego obiektu. @@ -1077,8 +1106,8 @@ TDynamicObject *__fastcall TDynamicObject::ABuFindObject(TTrack *Track, int Scan { // sens szukania na tym torze jest tylko, gdy są na nim pojazdy double ObjTranslation; // pozycja najblizszego obiektu na torze double MyTranslation; // pozycja szukającego na torze - double MinDist = - Track->Length(); // najmniejsza znaleziona odleglość (zaczynamy od długości toru) + double MinDist = Track->Length(); // najmniejsza znaleziona odleglość + // (zaczynamy od długości toru) double TestDist; // robocza odległość od kolejnych pojazdów na danym odcinku int iMinDist = -1; // indeks wykrytego obiektu // if (Track->iNumDynamics>1) @@ -1099,12 +1128,14 @@ TDynamicObject *__fastcall TDynamicObject::ABuFindObject(TTrack *Track, int Scan TestDist = (Track->Dynamics[i]->RaTranslationGet()) - MyTranslation; // odległogłość tamtego od szukającego if ((TestDist > 0) && (TestDist <= MinDist)) - { // gdy jest po właściwej stronie i bliżej niż jakiś wcześniejszy + { // gdy jest po właściwej stronie i bliżej + // niż jakiś wcześniejszy CouplFound = (Track->Dynamics[i]->RaDirectionGet() > 0) ? 1 : 0; // to, bo (ScanDir>=0) if (Track->iCategoryFlag & 254) // trajektoria innego typu niż tor kolejowy - { // dla torów nie ma sensu tego sprawdzać, rzadko co jedzie po jednej + { // dla torów nie ma sensu tego sprawdzać, rzadko co jedzie po + // jednej // szynie i się mija // Ra: mijanie samochodów wcale nie jest proste // Przesuniecie wzgledne pojazdow. Wyznaczane, zeby sprawdzic, @@ -1112,18 +1143,21 @@ TDynamicObject *__fastcall TDynamicObject::ABuFindObject(TTrack *Track, int Scan // w/m siebie tak, ze nie zachodza na siebie i wtedy sie mijaja). double RelOffsetH; // wzajemna odległość poprzeczna if (CouplFound) // my na tym torze byśmy byli w kierunku Point2 - // dla CouplFound=1 są zwroty zgodne - istotna różnica przesunięć + // dla CouplFound=1 są zwroty zgodne - istotna różnica + // przesunięć RelOffsetH = (MoverParameters->OffsetTrackH - Track->Dynamics[i]->MoverParameters->OffsetTrackH); else - // dla CouplFound=0 są zwroty przeciwne - przesunięcia sumują się + // dla CouplFound=0 są zwroty przeciwne - przesunięcia sumują + // się RelOffsetH = (MoverParameters->OffsetTrackH + Track->Dynamics[i]->MoverParameters->OffsetTrackH); if (RelOffsetH < 0) RelOffsetH = -RelOffsetH; if (RelOffsetH + RelOffsetH > MoverParameters->Dim.W + Track->Dynamics[i]->MoverParameters->Dim.W) - continue; // odległość większa od połowy sumy szerokości - kolizji + continue; // odległość większa od połowy sumy szerokości - + // kolizji // nie będzie // jeśli zahaczenie jest niewielkie, a jest miejsce na poboczu, to // zjechać na pobocze @@ -1140,17 +1174,17 @@ TDynamicObject *__fastcall TDynamicObject::ABuFindObject(TTrack *Track, int Scan { if (Track->Dynamics[i] != this) { - TestDist = - MyTranslation - - (Track->Dynamics[i] - ->RaTranslationGet()); //???-przesunięcie wózka względem Point1 toru + TestDist = MyTranslation - + (Track->Dynamics[i]->RaTranslationGet()); //???-przesunięcie wózka + // względem Point1 toru if ((TestDist > 0) && (TestDist < MinDist)) { CouplFound = (Track->Dynamics[i]->RaDirectionGet() > 0) ? 0 : 1; // odwrotnie, bo (ScanDir<0) if (Track->iCategoryFlag & 254) // trajektoria innego typu niż tor kolejowy - { // dla torów nie ma sensu tego sprawdzać, rzadko co jedzie po jednej + { // dla torów nie ma sensu tego sprawdzać, rzadko co jedzie po + // jednej // szynie i się mija // Ra: mijanie samochodów wcale nie jest proste // Przesunięcie względne pojazdów. Wyznaczane, żeby sprawdzić, @@ -1158,18 +1192,21 @@ TDynamicObject *__fastcall TDynamicObject::ABuFindObject(TTrack *Track, int Scan // w/m siebie tak, że nie zachodzą na siebie i wtedy sie mijają). double RelOffsetH; // wzajemna odległość poprzeczna if (CouplFound) // my na tym torze byśmy byli w kierunku Point1 - // dla CouplFound=1 są zwroty zgodne - istotna różnica przesunięć + // dla CouplFound=1 są zwroty zgodne - istotna różnica + // przesunięć RelOffsetH = (MoverParameters->OffsetTrackH - Track->Dynamics[i]->MoverParameters->OffsetTrackH); else - // dla CouplFound=0 są zwroty przeciwne - przesunięcia sumują się + // dla CouplFound=0 są zwroty przeciwne - przesunięcia sumują + // się RelOffsetH = (MoverParameters->OffsetTrackH + Track->Dynamics[i]->MoverParameters->OffsetTrackH); if (RelOffsetH < 0) RelOffsetH = -RelOffsetH; if (RelOffsetH + RelOffsetH > MoverParameters->Dim.W + Track->Dynamics[i]->MoverParameters->Dim.W) - continue; // odległość większa od połowy sumy szerokości - kolizji + continue; // odległość większa od połowy sumy szerokości - + // kolizji // nie będzie } iMinDist = i; // potencjalna kolizja @@ -1178,16 +1215,20 @@ TDynamicObject *__fastcall TDynamicObject::ABuFindObject(TTrack *Track, int Scan } } } - dist += MinDist; // doliczenie odległości przeszkody albo długości odcinka do przeskanowanej + dist += MinDist; // doliczenie odległości przeszkody albo długości odcinka + // do przeskanowanej // odległości return (iMinDist >= 0) ? Track->Dynamics[iMinDist] : NULL; } - dist += Track->Length(); // doliczenie długości odcinka do przeskanowanej odległości + dist += Track->Length(); // doliczenie długości odcinka do przeskanowanej + // odległości return NULL; // nie ma pojazdów na torze, to jest NULL } int TDynamicObject::DettachStatus(int dir) -{ // sprawdzenie odległości sprzęgów rzeczywistych od strony (dir): 0=przód,1=tył +{ // sprawdzenie odległości sprzęgów + // rzeczywistych od strony (dir): + // 0=przód,1=tył // Ra: dziwne, że ta funkcja nie jest używana if (!MoverParameters->Couplers[dir].CouplingFlag) return 0; // jeśli nic nie podłączone, to jest OK @@ -1195,10 +1236,12 @@ int TDynamicObject::DettachStatus(int dir) } int TDynamicObject::Dettach(int dir) -{ // rozłączenie sprzęgów rzeczywistych od strony (dir): 0=przód,1=tył +{ // rozłączenie sprzęgów rzeczywistych od + // strony (dir): 0=przód,1=tył // zwraca maskę bitową aktualnych sprzegów (0 jeśli rozłączony) if (ctOwner) - { // jeśli pojazd ma przypisany obiekt nadzorujący skład, to póki są wskaźniki + { // jeśli pojazd ma przypisany obiekt nadzorujący skład, to póki + // są wskaźniki TDynamicObject *d = this; while (d) { @@ -1219,7 +1262,8 @@ int TDynamicObject::Dettach(int dir) } void TDynamicObject::CouplersDettach(double MinDist, int MyScanDir) -{ // funkcja rozłączajaca podłączone sprzęgi, jeśli odległość przekracza (MinDist) +{ // funkcja rozłączajaca podłączone sprzęgi, + // jeśli odległość przekracza (MinDist) // MinDist - dystans minimalny, dla ktorego mozna rozłączać if (MyScanDir > 0) { @@ -1230,7 +1274,8 @@ void TDynamicObject::CouplersDettach(double MinDist, int MyScanDir) { if ((PrevConnectedNo ? PrevConnected->NextConnected : PrevConnected->PrevConnected) == this) - { // Ra: nie rozłączamy znalezionego, jeżeli nie do nas podłączony (może jechać w + { // Ra: nie rozłączamy znalezionego, jeżeli nie do nas + // podłączony (może jechać w // innym kierunku) PrevConnected->MoverParameters->Couplers[PrevConnectedNo].Connected = NULL; if (PrevConnectedNo == 0) @@ -1260,7 +1305,8 @@ void TDynamicObject::CouplersDettach(double MinDist, int MyScanDir) { if ((NextConnectedNo ? NextConnected->NextConnected : NextConnected->PrevConnected) == this) - { // Ra: nie rozłączamy znalezionego, jeżeli nie do nas podłączony (może jechać w + { // Ra: nie rozłączamy znalezionego, jeżeli nie do nas + // podłączony (może jechać w // innym kierunku) NextConnected->MoverParameters->Couplers[NextConnectedNo].Connected = NULL; if (NextConnectedNo == 0) @@ -1284,23 +1330,25 @@ void TDynamicObject::CouplersDettach(double MinDist, int MyScanDir) void TDynamicObject::ABuScanObjects(int ScanDir, double ScanDist) { // skanowanie toru w poszukiwaniu kolidujących pojazdów - // ScanDir - określa kierunek poszukiwania zależnie od zwrotu prędkości pojazdu + // ScanDir - określa kierunek poszukiwania zależnie od zwrotu prędkości + // pojazdu // ScanDir=1 - od strony Coupler0, ScanDir=-1 - od strony Coupler1 - int MyScanDir = - ScanDir; // zapamiętanie kierunku poszukiwań na torze początkowym, względem sprzęgów + int MyScanDir = ScanDir; // zapamiętanie kierunku poszukiwań na torze + // początkowym, względem sprzęgów TTrackFollower *FirstAxle = (MyScanDir > 0 ? &Axle0 : &Axle1); // można by to trzymać w trainset - TTrack *Track = - FirstAxle->GetTrack(); // tor na którym "stoi" skrajny wózek (może być inny niż tor pojazdu) + TTrack *Track = FirstAxle->GetTrack(); // tor na którym "stoi" skrajny wózek + // (może być inny niż tor pojazdu) if (FirstAxle->GetDirection() < 0) // czy oś jest ustawiona w stronę Point1? - ScanDir = -ScanDir; // jeśli tak, to kierunek szukania będzie przeciwny (teraz względem + ScanDir = -ScanDir; // jeśli tak, to kierunek szukania będzie przeciwny + // (teraz względem // toru) Byte MyCouplFound; // numer sprzęgu do podłączenia w obiekcie szukajacym MyCouplFound = (MyScanDir < 0) ? 1 : 0; Byte CouplFound; // numer sprzęgu w znalezionym obiekcie (znaleziony wypełni) TDynamicObject *FoundedObj; // znaleziony obiekt double ActDist = 0; // przeskanowana odleglość; odległość do zawalidrogi - FoundedObj = - ABuFindObject(Track, ScanDir, CouplFound, ActDist); // zaczynamy szukać na tym samym torze + FoundedObj = ABuFindObject(Track, ScanDir, CouplFound, + ActDist); // zaczynamy szukać na tym samym torze /* if (FoundedObj) //jak coś znajdzie, to śledzimy @@ -1358,7 +1406,8 @@ void TDynamicObject::ABuScanObjects(int ScanDir, double ScanDist) } if (Track) { // jesli jest kolejny odcinek toru - // CurrDist=Track->Length(); //doliczenie tego toru do przejrzanego dystandu + // CurrDist=Track->Length(); //doliczenie tego toru do przejrzanego + // dystandu FoundedObj = ABuFindObject(Track, ScanDir, CouplFound, ActDist); // przejrzenie pojazdów tego toru if (FoundedObj) @@ -1380,10 +1429,12 @@ void TDynamicObject::ABuScanObjects(int ScanDir, double ScanDist) CouplersDettach(1.0, MyScanDir); // odłączamy, jeśli dalej niż metr // i łączenie sprzęgiem wirtualnym if (FoundedObj) - { // siebie można bezpiecznie podłączyć jednostronnie do znalezionego + { // siebie można bezpiecznie podłączyć jednostronnie do + // znalezionego MoverParameters->Attach(MyCouplFound, CouplFound, FoundedObj->MoverParameters, ctrain_virtual); - // MoverParameters->Couplers[MyCouplFound].Render=false; //wirtualnego nie renderujemy + // MoverParameters->Couplers[MyCouplFound].Render=false; //wirtualnego nie + // renderujemy if (MyCouplFound == 0) { PrevConnected = FoundedObj; // pojazd od strony sprzęgu 0 @@ -1395,7 +1446,8 @@ void TDynamicObject::ABuScanObjects(int ScanDir, double ScanDist) NextConnectedNo = CouplFound; } if (FoundedObj->MoverParameters->Couplers[CouplFound].CouplingFlag == ctrain_virtual) - { // Ra: wpinamy się wirtualnym tylko jeśli znaleziony ma wirtualny sprzęg + { // Ra: wpinamy się wirtualnym tylko jeśli znaleziony + // ma wirtualny sprzęg FoundedObj->MoverParameters->Attach(CouplFound, MyCouplFound, this->MoverParameters, ctrain_virtual); if (CouplFound == 0) // jeśli widoczny sprzęg 0 znalezionego @@ -1423,7 +1475,8 @@ void TDynamicObject::ABuScanObjects(int ScanDir, double ScanDist) FoundedObj->NextConnectedNo = MyCouplFound; } } - // Ra: jeśli dwa samochody się mijają na odcinku przed zawrotką, to odległość między nimi + // Ra: jeśli dwa samochody się mijają na odcinku przed zawrotką, to + // odległość między nimi // nie może być liczona w linii prostej! fTrackBlock = MoverParameters->Couplers[MyCouplFound] .CoupleDist; // odległość do najbliższego pojazdu w linii prostej @@ -1431,7 +1484,8 @@ void TDynamicObject::ABuScanObjects(int ScanDir, double ScanDist) if (ActDist > MoverParameters->Dim.L + FoundedObj->MoverParameters->Dim .L) // przeskanowana odległość większa od długości pojazdów - // else if (ActDistiLights; // wskaźnik na stan własnych świateł (zmienimy dla rozrządczych EZT) + iLights = MoverParameters->iLights; // wskaźnik na stan własnych świateł + // (zmienimy dla rozrządczych EZT) // McZapkie: TypeName musi byc nazwą CHK/MMD pojazdu if (!MoverParameters->LoadChkFile(asBaseDir)) { // jak wczytanie CHK się nie uda, to błąd @@ -1635,19 +1699,21 @@ double TDynamicObject::Init( } bool driveractive = (fVel != 0.0); // jeśli prędkość niezerowa, to aktywujemy ruch if (!MoverParameters->CheckLocomotiveParameters( - driveractive, (fVel > 0 ? 1 : -1) * Cab * - (iDirection ? 1 : -1))) // jak jedzie lub obsadzony to gotowy do drogi + driveractive, + (fVel > 0 ? 1 : -1) * Cab * + (iDirection ? 1 : -1))) // jak jedzie lub obsadzony to gotowy do drogi { Error("Parameters mismatch: dynamic object " + asName + " from\n" + BaseDir + "\\" + Type_Name); return 0.0; // zerowa długość to brak pojazdu } MoverParameters->BrakeLevelSet( - MoverParameters - ->BrakeCtrlPos); // poprawienie hamulca po ewentualnym przestawieniu przez Pascal + MoverParameters->BrakeCtrlPos); // poprawienie hamulca po ewentualnym + // przestawieniu przez Pascal // dodatkowe parametry yB - MoreParams += "."; // wykonuje o jedną iterację za mało, więc trzeba mu dodać kropkę na koniec + MoreParams += "."; // wykonuje o jedną iterację za mało, więc trzeba mu dodać + // kropkę na koniec int kropka = MoreParams.Pos("."); // znajdź kropke AnsiString ActPar; // na parametry while (kropka > 0) // jesli sa kropki jeszcze @@ -1698,7 +1764,8 @@ double TDynamicObject::Init( } if (ActPar.Pos("Q") > 0) // oprozniony { - // MoverParameters->Hamulec->ForceEmptiness(); //TODO: sprawdzic, dlaczego + // MoverParameters->Hamulec->ForceEmptiness(); //TODO: sprawdzic, + // dlaczego // pojawia sie blad przy uzyciu tej linijki w lokomotywie MoverParameters->BrakeReleaser(1); // odluznij automatycznie MoverParameters->Pipe->CreatePress(0.0); @@ -1785,17 +1852,20 @@ double TDynamicObject::Init( if (Track->fTrackWidth < 3.5) // jeśli droga wąska MoverParameters->OffsetTrackH = 0.0; // to stawiamy na środku, niezależnie od stanu // ruchu - else if (driveractive) // od 3.5m do 8.0m jedzie po środku pasa, dla szerszych w odległości + else if (driveractive) // od 3.5m do 8.0m jedzie po środku pasa, dla + // szerszych w odległości // 1.5m MoverParameters->OffsetTrackH = Track->fTrackWidth <= 8.0 ? -Track->fTrackWidth * 0.25 : -1.5; - else // jak stoi, to kołem na poboczu i pobieramy szerokość razem z poboczem, ale nie z + else // jak stoi, to kołem na poboczu i pobieramy szerokość razem z + // poboczem, ale nie z // chodnikiem MoverParameters->OffsetTrackH = -0.5 * (Track->WidthTotal() - MoverParameters->Dim.W) + 0.05; iHornWarning = 0; // nie będzie trąbienia po podaniu zezwolenia na jazdę if (fDist < 0.0) //-0.5*MoverParameters->Dim.L) //jeśli jest przesunięcie do tyłu - if (!Track->CurrentPrev()) // a nie ma tam odcinka i trzeba by coś wygenerować + if (!Track->CurrentPrev()) // a nie ma tam odcinka i trzeba by coś + // wygenerować fDist = -fDist; // to traktujemy, jakby przesunięcie było w drugą stronę } // w wagonie tez niech jedzie @@ -1811,10 +1881,12 @@ double TDynamicObject::Init( else // w przeciwnym razie trzeba włączyć pokazywanie kabiny bDisplayCab = true; } - // McZapkie-151102: rozkład jazdy czytany z pliku *.txt z katalogu w którym jest sceneria + // McZapkie-151102: rozkład jazdy czytany z pliku *.txt z katalogu w którym + // jest sceneria if (DriverType.Pos("1") || DriverType.Pos("2")) { // McZapkie-110303: mechanik i rozklad tylko gdy jest obsada - // MoverParameters->ActiveCab=MoverParameters->CabNo; //ustalenie aktywnej kabiny + // MoverParameters->ActiveCab=MoverParameters->CabNo; //ustalenie aktywnej + // kabiny // (rozrząd) Mechanik = new TController(Controller, this, Aggressive); if (TrainName.IsEmpty()) // jeśli nie w składzie @@ -1829,7 +1901,8 @@ double TDynamicObject::Init( } else if (DriverType == "p") { // obserwator w charakterze pasażera - // Ra: to jest niebezpieczne, bo w razie co będzie pomagał hamulcem bezpieczeństwa + // Ra: to jest niebezpieczne, bo w razie co będzie pomagał hamulcem + // bezpieczeństwa Mechanik = new TController(Controller, this, Easyman, false); } } @@ -1909,19 +1982,22 @@ double TDynamicObject::Init( if (fAxleDist > MoverParameters->Dim.L - 0.2) // nie mogą być za daleko fAxleDist = MoverParameters->Dim.L - 0.2; // bo będzie "walenie w mur" double fAxleDistHalf = fAxleDist * 0.5; - // WriteLog("Dynamic "+Type_Name+" of length "+MoverParameters->Dim.L+" at "+AnsiString(fDist)); + // WriteLog("Dynamic "+Type_Name+" of length "+MoverParameters->Dim.L+" at + // "+AnsiString(fDist)); // if (Cab) //jeśli ma obsadę - zgodność wstecz, jeśli tor startowy ma Event0 // if (Track->Event0) //jeśli tor ma Event0 - // if (fDist>=0.0) //jeśli jeśli w starych sceneriach początek składu byłby wysunięty na ten + // if (fDist>=0.0) //jeśli jeśli w starych sceneriach początek składu byłby + // wysunięty na ten // tor // if (fDist<=0.5*MoverParameters->Dim.L+0.2) //ale nie jest wysunięty // fDist+=0.5*MoverParameters->Dim.L+0.2; //wysunąć go na ten tor // przesuwanie pojazdu tak, aby jego początek był we wskazanym miejcu - fDist -= 0.5 * - MoverParameters->Dim - .L; // dodajemy pół długości pojazdu, bo ustawiamy jego środek (zliczanie na minus) + fDist -= 0.5 * MoverParameters->Dim.L; // dodajemy pół długości pojazdu, bo + // ustawiamy jego środek (zliczanie na + // minus) switch (iNumAxles) - { // Ra: pojazdy wstawiane są na tor początkowy, a potem przesuwane + { // Ra: pojazdy wstawiane są na tor początkowy, a potem + // przesuwane case 2: // ustawianie osi na torze Axle0.Init(Track, this, iDirection ? 1 : -1); Axle0.Move((iDirection ? fDist : -fDist) + fAxleDistHalf, false); @@ -1946,9 +2022,11 @@ double TDynamicObject::Init( // Axle3.Move((iDirection?fDist:-fDist)+(fAxleDistHalf-MoverParameters->ADist*0.5),false); break; } - Move(0.0001); // potrzebne do wyliczenia aktualnej pozycji; nie może być zero, bo nie przeliczy + Move(0.0001); // potrzebne do wyliczenia aktualnej pozycji; nie może być zero, + // bo nie przeliczy // pozycji - // teraz jeszcze trzeba przypisać pojazdy do nowego toru, bo przesuwanie początkowe osi nie + // teraz jeszcze trzeba przypisać pojazdy do nowego toru, bo przesuwanie + // początkowe osi nie // zrobiło tego ABuCheckMyTrack(); // zmiana toru na ten, co oś Axle0 (oś z przodu) TLocation loc; // Ra: ustawienie pozycji do obliczania sprzęgów @@ -1992,16 +2070,21 @@ void TDynamicObject::FastMove(double fDistance) } void TDynamicObject::Move(double fDistance) -{ // przesuwanie pojazdu po trajektorii polega na przesuwaniu poszczególnych osi - // Ra: wartość prędkości 2km/h ma ograniczyć aktywację eventów w przypadku drgań +{ // przesuwanie pojazdu po + // trajektorii polega na + // przesuwaniu poszczególnych osi + // Ra: wartość prędkości 2km/h ma ograniczyć aktywację eventów w przypadku + // drgań if (Axle0.GetTrack() == Axle1.GetTrack()) // przed przesunięciem - { // powiązanie pojazdu z osią można zmienić tylko wtedy, gdy skrajne osie są na tym samym torze + { // powiązanie pojazdu z osią można zmienić tylko wtedy, gdy skrajne osie są + // na tym samym torze if (MoverParameters->Vel > 2) //|[km/h]| nie ma sensu zmiana osi, jesli pojazd drga na postoju iAxleFirst = (MoverParameters->V >= 0.0) ? 1 : 0; //[m/s] ?1:0 - aktywna druga oś w kierunku jazdy - // aktualnie eventy aktywuje druga oś, żeby AI nie wyłączało sobie semafora za szybko + // aktualnie eventy aktywuje druga oś, żeby AI nie wyłączało sobie semafora + // za szybko } if (fDistance > 0.0) { // gdy ruch w stronę sprzęgu 0, doliczyć korektę do osi 1 @@ -2022,20 +2105,23 @@ void TDynamicObject::Move(double fDistance) { // liczenie pozycji pojazdu tutaj, bo jest używane w wielu miejscach vPosition = 0.5 * (Axle1.pPosition + Axle0.pPosition); //środek między skrajnymi osiami vFront = Axle0.pPosition - Axle1.pPosition; // wektor pomiędzy skrajnymi osiami - // Ra 2F1J: to nie jest stabilne (powoduje rzucanie taborem) i wymaga dopracowania + // Ra 2F1J: to nie jest stabilne (powoduje rzucanie taborem) i wymaga + // dopracowania fAdjustment = vFront.Length() - fAxleDist; // na łuku będzie ujemny - // if (fabs(fAdjustment)>0.02) //jeśli jest zbyt dużo, to rozłożyć na kilka przeliczeń + // if (fabs(fAdjustment)>0.02) //jeśli jest zbyt dużo, to rozłożyć na kilka + // przeliczeń // (wygasza drgania?) - //{//parę centymetrów trzeba by już skorygować; te błędy mogą się też generować na ostrych + //{//parę centymetrów trzeba by już skorygować; te błędy mogą się też + // generować na ostrych //łukach // fAdjustment*=0.5; //w jednym kroku korygowany jest ułamek błędu //} // else // fAdjustment=0.0; vFront = Normalize(vFront); // kierunek ustawienia pojazdu (wektor jednostkowy) - vLeft = Normalize(CrossProduct( - vWorldUp, - vFront)); // wektor poziomy w lewo, normalizacja potrzebna z powodu pochylenia (vFront) + vLeft = Normalize(CrossProduct(vWorldUp, vFront)); // wektor poziomy w lewo, + // normalizacja potrzebna z powodu + // pochylenia (vFront) vUp = CrossProduct(vFront, vLeft); // wektor w górę, będzie jednostkowy modelRot.z = atan2(-vFront.x, vFront.z); // kąt obrotu pojazdu [rad]; z ABuBogies() double a = ((Axle1.GetRoll() + Axle0.GetRoll())); // suma przechyłek @@ -2051,11 +2137,12 @@ void TDynamicObject::Move(double fDistance) vLeft = Normalize(CrossProduct(vUp, vFront)); // wektor w lewo // vUp=CrossProduct(vFront,vLeft); //wektor w górę } - mMatrix.Identity(); // to też można by od razu policzyć, ale potrzebne jest do wyświetlania + mMatrix.Identity(); // to też można by od razu policzyć, ale potrzebne jest + // do wyświetlania mMatrix.BasisChange(vLeft, vUp, vFront); // przesuwanie jest jednak rzadziej niż // renderowanie - mMatrix = - Inverse(mMatrix); // wyliczenie macierzy dla pojazdu (potrzebna tylko do wyświetlania?) + mMatrix = Inverse(mMatrix); // wyliczenie macierzy dla pojazdu (potrzebna + // tylko do wyświetlania?) // if (MoverParameters->CategoryFlag&2) { // przesunięcia są używane po wyrzuceniu pociągu z toru vPosition.x += MoverParameters->OffsetTrackH * vLeft.x; // dodanie przesunięcia w bok @@ -2083,7 +2170,8 @@ void TDynamicObject::Move(double fDistance) // e_bridge... fShade = 0.0; // standardowe oświetlenie else - { // jeżeli te tory mają niestandardowy stopień zacienienia (e_canyon, e_tunnel) + { // jeżeli te tory mają niestandardowy stopień zacienienia + // (e_canyon, e_tunnel) if (t0->eEnvironment == t1->eEnvironment) { switch (t0->eEnvironment) @@ -2103,7 +2191,8 @@ void TDynamicObject::Move(double fDistance) d = t0->fTrackLength - d; // od drugiej strony liczona długość d /= fAxleDist; // rozsataw osi procentowe znajdowanie się na torze switch (t0->eEnvironment) - { // typ zmiany oświetlenia - zakładam, że drugi tor ma e_flat + { // typ zmiany oświetlenia - zakładam, że + // drugi tor ma e_flat case e_canyon: fShade = (d * 0.65) + (1.0 - d); break; // zacienienie w kanionie @@ -2112,7 +2201,8 @@ void TDynamicObject::Move(double fDistance) break; // zacienienie w tunelu } switch (t1->eEnvironment) - { // typ zmiany oświetlenia - zakładam, że pierwszy tor ma e_flat + { // typ zmiany oświetlenia - zakładam, że + // pierwszy tor ma e_flat case e_canyon: fShade = d + (1.0 - d) * 0.65; break; // zacienienie w kanionie @@ -2127,15 +2217,19 @@ void TDynamicObject::Move(double fDistance) }; void TDynamicObject::AttachPrev(TDynamicObject *Object, int iType) -{ // Ra: doczepia Object na końcu składu (nazwa funkcji może być myląca) +{ // Ra: doczepia Object na końcu + // składu (nazwa funkcji może być + // myląca) // Ra: używane tylko przy wczytywaniu scenerii /* - //Ra: po wstawieniu pojazdu do scenerii nie miał on ustawionej pozycji, teraz już ma + //Ra: po wstawieniu pojazdu do scenerii nie miał on ustawionej pozycji, teraz + już ma TLocation loc; loc.X=-vPosition.x; loc.Y=vPosition.z; loc.Z=vPosition.y; - MoverParameters->Loc=loc; //Ra: do obliczania sprzęgów, na starcie nie są przesunięte + MoverParameters->Loc=loc; //Ra: do obliczania sprzęgów, na starcie nie są + przesunięte loc.X=-Object->vPosition.x; loc.Y=Object->vPosition.z; loc.Z=Object->vPosition.y; @@ -2168,8 +2262,9 @@ void TDynamicObject::AttachPrev(TDynamicObject *Object, int iType) Object->NextConnected = this; // on ma nas z tyłu Object->NextConnectedNo = iDirection; } - if (MoverParameters->TrainType & - dt_EZT) // w przypadku łączenia członów, światła w rozrządczym zależą od stanu w silnikowym + if (MoverParameters->TrainType & dt_EZT) // w przypadku łączenia członów, + // światła w rozrządczym zależą od + // stanu w silnikowym if (MoverParameters->Couplers[iDirection].AllowedFlag & ctrain_depot) // gdy sprzęgi łączone warsztatowo (powiedzmy) if ((MoverParameters->Power < 1.0) && @@ -2210,7 +2305,8 @@ void TDynamicObject::LoadUpdate() mdLoad = TModelsManager::GetModel(asLoadName.c_str()); // nowy ładunek Global::asCurrentTexturePath = AnsiString(szTexturePath); // z powrotem defaultowa sciezka do tekstur - // Ra: w MMD można by zapisać położenie modelu ładunku (np. węgiel) w zależności od + // Ra: w MMD można by zapisać położenie modelu ładunku (np. węgiel) w + // zależności od // załadowania } else if (MoverParameters->Load == 0) @@ -2326,9 +2422,11 @@ bool TDynamicObject::Update(double dt, double dt1) return false; // a normalnie powinny mieć bEnabled==false // Ra: przeniosłem - no już lepiej tu, niż w wyświetlaniu! - // if ((MoverParameters->ConverterFlag==false) && (MoverParameters->TrainType!=dt_ET22)) + // if ((MoverParameters->ConverterFlag==false) && + // (MoverParameters->TrainType!=dt_ET22)) // Ra: to nie może tu być, bo wyłącza sprężarkę w rozrządczym EZT! - // if ((MoverParameters->ConverterFlag==false)&&(MoverParameters->CompressorPower!=0)) + // if + // ((MoverParameters->ConverterFlag==false)&&(MoverParameters->CompressorPower!=0)) // MoverParameters->CompressorFlag=false; // if (MoverParameters->CompressorPower==2) // MoverParameters->CompressorAllow=MoverParameters->ConverterFlag; @@ -2338,12 +2436,16 @@ bool TDynamicObject::Update(double dt, double dt1) (MoverParameters->Power > 1.0)) // aby rozrządczy nie opuszczał silnikowemu if ((MechInside) || (MoverParameters->TrainType == dt_EZT)) { - // if ((!MoverParameters->PantCompFlag)&&(MoverParameters->CompressedVolume>=2.8)) + // if + // ((!MoverParameters->PantCompFlag)&&(MoverParameters->CompressedVolume>=2.8)) // MoverParameters->PantVolume=MoverParameters->CompressedVolume; if (MoverParameters->PantPress < (MoverParameters->TrainType == dt_EZT ? 2.4 : 3.5)) - { // 3.5 wg http://www.transportszynowy.pl/eu06-07pneumat.php - //"Wyłączniki ciśnieniowe odbieraków prądu wyłączają sterowanie wyłącznika szybkiego - // oraz uniemożliwiają podniesienie odbieraków prądu, gdy w instalacji rozrządu + { // 3.5 wg + // http://www.transportszynowy.pl/eu06-07pneumat.php + //"Wyłączniki ciśnieniowe odbieraków prądu wyłączają sterowanie + // wyłącznika szybkiego + // oraz uniemożliwiają podniesienie odbieraków prądu, gdy w instalacji + // rozrządu // ciśnienie spadnie poniżej wartości 3,5 bara." // Ra 2013-12: Niebugocław mówi, że w EZT podnoszą się przy 2.5 // if (!MoverParameters->PantCompFlag) @@ -2369,24 +2471,29 @@ bool TDynamicObject::Update(double dt, double dt1) // TTrackShape ts; // ts.R=MyTrack->fRadius; // if (ABuGetDirection()<0) ts.R=-ts.R; - // ts.R=MyTrack->fRadius; //ujemne promienie są już zamienione przy wczytywaniu + // ts.R=MyTrack->fRadius; //ujemne promienie są już zamienione przy + // wczytywaniu if (Axle0.vAngles.z != Axle1.vAngles.z) - { // wyliczenie promienia z obrotów osi - modyfikację zgłosił youBy + { // wyliczenie promienia z obrotów + // osi - modyfikację zgłosił youBy ts.R = Axle0.vAngles.z - Axle1.vAngles.z; // różnica może dawać stałą ±M_2PI if (ts.R > M_PI) ts.R -= M_2PI else if (ts.R < -M_PI) ts.R += M_2PI; // normalizacja // ts.R=fabs(0.5*MoverParameters->BDist/sin(ts.R*0.5)); ts.R = -0.5 * MoverParameters->BDist / sin(ts.R * 0.5); if ((ts.R > 15000.0) || (ts.R < -15000.0)) - ts.R = 0.0; // szkoda czasu na zbyt duże promienie, 4km to promień nie wymagający + ts.R = 0.0; // szkoda czasu na zbyt duże promienie, 4km to promień nie + // wymagający // przechyłki } else ts.R = 0.0; // ts.R=ComputeRadius(Axle1.pPosition,Axle2.pPosition,Axle3.pPosition,Axle0.pPosition); - // Ra: składową pochylenia wzdłużnego mamy policzoną w jednostkowym wektorze vFront + // Ra: składową pochylenia wzdłużnego mamy policzoną w jednostkowym wektorze + // vFront ts.Len = 1.0; // Max0R(MoverParameters->BDist,MoverParameters->ADist); - ts.dHtrack = -vFront.y; // Axle1.pPosition.y-Axle0.pPosition.y; //wektor między skrajnymi osiami + ts.dHtrack = -vFront.y; // Axle1.pPosition.y-Axle0.pPosition.y; //wektor + // między skrajnymi osiami // (!!!odwrotny) ts.dHrail = (Axle1.GetRoll() + Axle0.GetRoll()) * 0.5; //średnia przechyłka pudła // TTrackParam tp; @@ -2406,7 +2513,8 @@ bool TDynamicObject::Update(double dt, double dt1) MoverParameters->InsideConsist = false; } // napiecie sieci trakcyjnej - // Ra 15-01: przeliczenie poboru prądu powinno być robione wcześniej, żeby na tym etapie były + // Ra 15-01: przeliczenie poboru prądu powinno być robione wcześniej, żeby na + // tym etapie były // znane napięcia // TTractionParam tmpTraction; // tmpTraction.TractionVoltage=0; @@ -2419,8 +2527,9 @@ bool TDynamicObject::Update(double dt, double dt1) { v = MoverParameters->PantFrontVolt; if (v == 0.0) - if (MoverParameters->TrainType & - (dt_EZT | dt_ET40 | dt_ET41 | dt_ET42)) // dwuczłony mogą mieć sprzęg WN + if ((MoverParameters->TrainType & (dt_EZT | dt_ET40 | dt_ET41 | dt_ET42)) && + MoverParameters->EngineType != + ElectricInductionMotor) // dwuczłony mogą mieć sprzęg WN v = MoverParameters->GetTrainsetVoltage(); // ostatnia szansa } if (v != 0.0) @@ -2439,20 +2548,24 @@ bool TDynamicObject::Update(double dt, double dt1) {//wspomagacz usuwania problemów z siecią if (!Global::iPause) {//Ra: tymczasowa teleportacja do miejsca, gdzie brakuje prądu - Global::SetCameraPosition(vPosition+vector3(0,0,5)); //nowa pozycja dla + Global::SetCameraPosition(vPosition+vector3(0,0,5)); //nowa + pozycja dla generowania obiektów Global::pCamera->Init(vPosition+vector3(0,0,5),Global::pFreeCameraInitAngle[0]); //przestawienie } - Global:l::pGround->Silence(Global::pCamera->Pos); //wyciszenie wszystkiego + Global:l::pGround->Silence(Global::pCamera->Pos); //wyciszenie + wszystkiego z poprzedniej pozycji - Globa:iPause|=1; //tymczasowe zapauzowanie, gdy problem z siecią + Globa:iPause|=1; //tymczasowe zapauzowanie, gdy problem z + siecią } */ NoVoltTime = NoVoltTime + dt; if (NoVoltTime > 0.2) // jeśli brak zasilania dłużej niż 0.2 sekundy (25km/h pod // izolatorem daje 0.15s) - { // Ra 2F1H: prowizorka, trzeba przechować napięcie, żeby nie wywalało WS pod + { // Ra 2F1H: prowizorka, trzeba przechować napięcie, żeby nie wywalało + // WS pod // izolatorem if (MoverParameters->Vel > 0.5) // jeśli jedzie if (MoverParameters->PantFrontUp || @@ -2480,14 +2593,16 @@ bool TDynamicObject::Update(double dt, double dt1) // "+FloatToStrF(vPosition.z,ffFixed,7,2)+", time // "+FloatToStrF(NoVoltTime,ffFixed,7,2)); } - // Ra 2F1H: nie było sensu wpisywać tu zera po upływie czasu, bo zmienna była + // Ra 2F1H: nie było sensu wpisywać tu zera po upływie czasu, bo + // zmienna była // tymczasowa, a napięcie zerowane od razu tmpTraction.TractionVoltage = 0; // Ra 2013-12: po co tak? // pControlled->MainSwitch(false); //może tak? } } } - // else //Ra: nie no, trzeba podnieść pantografy, jak nie będzie drutu, to będą miały prąd + // else //Ra: nie no, trzeba podnieść pantografy, jak nie będzie drutu, to + // będą miały prąd // po osiągnięciu 1.4m // tmpTraction.TractionVoltage=0.95*MoverParameters->EnginePowerSource.MaxVoltage; } @@ -2498,16 +2613,29 @@ bool TDynamicObject::Update(double dt, double dt1) tmpTraction.TractionResistivity = 0.3; // McZapkie: predkosc w torze przekazac do TrackParam - // McZapkie: Vel ma wymiar [km/h] (absolutny), V ma wymiar [m/s], taka przyjalem notacje + // McZapkie: Vel ma wymiar [km/h] (absolutny), V ma wymiar [m/s], taka + // przyjalem notacje tp.Velmax = MyTrack->VelocityGet(); if (Mechanik) { // Ra 2F3F: do Driver.cpp to przenieść? MoverParameters->EqvtPipePress = GetEPP(); // srednie cisnienie w PG if ((Mechanik->Primary()) && - (MoverParameters->EngineType == - ElectricInductionMotor)) // jesli glowny i z asynchronami, to niech steruje + (MoverParameters->EngineType == ElectricInductionMotor)) // jesli glowny i z + // asynchronami, to + // niech steruje { // hamulcem lacznie dla calego pociagu/ezt + float FED = 0; + float np = 0; + float masa = 0; + float FrED = 0; + float masamax = 0; + float FmaxPN = 0; + float FmaxED = 0; + float Fzad = 0; + float FzadED = 0; + float FzadPN = 0; + float amax = 0; // 1. ustal wymagana sile hamowania calego pociagu // - opoznienie moze byc ustalane na podstawie charakterystyki // - opoznienie moze byc ustalane na podstawie mas i cisnien granicznych @@ -2515,9 +2643,39 @@ bool TDynamicObject::Update(double dt, double dt1) // 2. ustal mozliwa do realizacji sile hamowania ED // - w szczegolnosci powinien brac pod uwage rozne sily hamowania - float FED = 0; - // for(TDynamicObject *p=GetFirstDynamic(4);p;p->NextC(4)) - // FED+=p->MoverParameters->eimv[eimv_Fmax]; + for (TDynamicObject *p = GetFirstDynamic(MoverParameters->ActiveCab < 0 ? 1 : 0); p; + p = p->NextC(4)) + { + np++; + masamax += p->MoverParameters->MBPM + + (p->MoverParameters->MBPM > 1 ? 0 : p->MoverParameters->Mass) + + p->MoverParameters->Mred; + float Nmax = ((p->MoverParameters->P2FTrans * p->MoverParameters->MaxBrakePress[0] - + p->MoverParameters->BrakeCylSpring) * + p->MoverParameters->BrakeCylMult[0] - + p->MoverParameters->BrakeSlckAdj) * + p->MoverParameters->BrakeCylNo * p->MoverParameters->BrakeRigEff; + FmaxPN += Nmax * + p->MoverParameters->Hamulec->GetFC( + Nmax / (p->MoverParameters->NAxles * p->MoverParameters->NBpA), + p->MoverParameters->Vmax) * + 1000; // sila hamowania pn + FmaxED += ((p->MoverParameters->Mains) && (p->MoverParameters->eimc[eimc_p_Fh] * + p->MoverParameters->NPoweredAxles > + 0) ? + p->MoverParameters->eimc[eimc_p_Fh] * 1000 : + 0); // chwilowy max ED -> do rozdzialu sil + FED -= Min0R(p->MoverParameters->eimv[eimv_Fmax], 0) * + 1000; // chwilowy max ED -> do rozdzialu sil + FrED -= Min0R(p->MoverParameters->eimv[eimv_Fr], 0) * + 1000; // chwilowo realizowane ED -> do pneumatyki + masa += p->MoverParameters->TotalMass; + } + amax = FmaxPN / masamax; + Fzad = amax * MoverParameters->LocalBrakeRatio() * masa; + FzadED = Min0R(Fzad, FmaxED); + FzadPN = Fzad - FrED; + np = 0; // 3. ustaw pojazdom sile hamowania ED // - proporcjonalnie do mozliwosci @@ -2526,8 +2684,31 @@ bool TDynamicObject::Update(double dt, double dt1) // 5. w razie potrzeby wlacz hamulec utrzymujacy // - gdy zahamowany ma ponizej 2 km/h // 6. ustaw pojazdom sile hamowania ep - // - proporcjonalnie do masy, do liczby osi, rowne cisnienia - jak bedzie, tak bedzie + // - proporcjonalnie do masy, do liczby osi, rowne cisnienia - jak + // bedzie, tak bedzie // dobrze + float Fpoj = 0; + for (TDynamicObject *p = GetFirstDynamic(MoverParameters->ActiveCab < 0 ? 1 : 0); p; + p = p->NextC(4)) + { + np++; + float Nmax = ((p->MoverParameters->P2FTrans * p->MoverParameters->MaxBrakePress[0] - + p->MoverParameters->BrakeCylSpring) * + p->MoverParameters->BrakeCylMult[0] - + p->MoverParameters->BrakeSlckAdj) * + p->MoverParameters->BrakeCylNo * p->MoverParameters->BrakeRigEff; + float FmaxPoj = Nmax * + p->MoverParameters->Hamulec->GetFC( + Nmax / (p->MoverParameters->NAxles * p->MoverParameters->NBpA), + p->MoverParameters->Vel) * + 1000; // sila hamowania pn + // Fpoj=(FED>0?-FzadED*p->MoverParameters->eimv[eimv_Fmax]*1000/FED:0); + // p->MoverParameters->AnPos=(p->MoverParameters->eimc[eimc_p_Fh]>1?0.001f*Fpoj/(p->MoverParameters->eimc[eimc_p_Fh]):0); + p->MoverParameters->AnPos = (FmaxED > 0 ? FzadED / FmaxED : 0); + Fpoj = FzadPN * Min0R(p->MoverParameters->TotalMass / masa, 1); + p->MoverParameters->LocalBrakePosA = + (p->MoverParameters->SlippingWheels ? 0 : Min0R(Max0R(Fpoj / FmaxPoj, 0), 1)); + } } // yB: cos (AI) tu jest nie kompatybilne z czyms (hamulce) @@ -2546,14 +2727,16 @@ bool TDynamicObject::Update(double dt, double dt1) if ((!MoverParameters->Battery) && (Controller == Humandriver) && (MoverParameters->EngineType != DieselEngine) && (MoverParameters->EngineType != WheelsDriven)) - { // jeśli bateria wyłączona, a nie diesel ani drezyna reczna + { // jeśli bateria wyłączona, a nie diesel ani drezyna + // reczna if (MoverParameters->MainSwitch(false)) // wyłączyć zasilanie MoverParameters->EventFlag = true; } if (MoverParameters->TrainType == dt_ET42) { // powinny być wszystkie dwuczłony oraz EZT /* - //Ra: to jest bez sensu, bo wyłącza WS przy przechodzeniu przez "wewnętrzne" kabiny (z + //Ra: to jest bez sensu, bo wyłącza WS przy przechodzeniu przez + "wewnętrzne" kabiny (z powodu ActiveCab) //trzeba to zrobić inaczej, np. dla członu A sprawdzać, czy jest B //albo sprawdzać w momencie załączania WS i zmiany w sprzęgach @@ -2608,7 +2791,8 @@ bool TDynamicObject::Update(double dt, double dt1) else if (MyTrack->eEnvironment == e_bridge) { vol *= 1.2; - // freq=0.99; //MC: stukot w zaleznosci od tego gdzie + // freq=0.99; //MC: stukot w zaleznosci od + // tego gdzie // jest tor } if (MyTrack->fSoundDistance != dRailLength) @@ -2682,13 +2866,15 @@ bool TDynamicObject::Update(double dt, double dt1) // fragment z EXE Kursa /* if (MoverParameters->TrainType==dt_ET42) { - if ((MoverParameters->DynamicBrakeType=dbrake_switch) && ((MoverParameters->BrakePress > + if ((MoverParameters->DynamicBrakeType=dbrake_switch) && + ((MoverParameters->BrakePress > 0.2) || ( MoverParameters->PipePress < 0.36 ))) { MoverParameters->StLinFlag=true; } else - if ((MoverParameters->DynamicBrakeType=dbrake_switch) && (MoverParameters->BrakePress < + if ((MoverParameters->DynamicBrakeType=dbrake_switch) && + (MoverParameters->BrakePress < 0.1)) { MoverParameters->StLinFlag=false; @@ -2696,7 +2882,8 @@ bool TDynamicObject::Update(double dt, double dt1) } } */ if ((MoverParameters->TrainType == dt_ET40) || (MoverParameters->TrainType == dt_EP05)) - { // dla ET40 i EU05 automatyczne cofanie nastawnika - i tak nie będzie to działać dobrze... + { // dla ET40 i EU05 automatyczne cofanie nastawnika - i tak + // nie będzie to działać dobrze... /* if ((MoverParameters->MainCtrlPos>MoverParameters->MainCtrlActualPos)&&(abs(MoverParameters->Im)>MoverParameters->IminHi)) { @@ -2728,23 +2915,25 @@ bool TDynamicObject::Update(double dt, double dt1) if (dWheelAngle[2] > 360.0) dWheelAngle[2] -= 360.0; } - if (pants) // pantograf może być w wagonie kuchennym albo pojeździe rewizyjnym (np. SR61) + if (pants) // pantograf może być w wagonie kuchennym albo pojeździe rewizyjnym + // (np. SR61) { // przeliczanie kątów dla pantografów double k; // tymczasowy kąt double PantDiff; TAnimPant *p; // wskaźnik do obiektu danych pantografu - double fCurrent = - (MoverParameters->DynamicBrakeFlag && MoverParameters->ResistorsFlag ? - 0 : - fabs(MoverParameters->Itot)) + - MoverParameters - ->TotalCurrent; // prąd pobierany przez pojazd - bez sensu z tym (TotalCurrent) - // fCurrent+=fabs(MoverParameters->Voltage)*1e-6; //prąd płynący przez woltomierz, + double fCurrent = (MoverParameters->DynamicBrakeFlag && MoverParameters->ResistorsFlag ? + 0 : + fabs(MoverParameters->Itot)) + + MoverParameters->TotalCurrent; // prąd pobierany przez pojazd - bez + // sensu z tym (TotalCurrent) + // TotalCurrent to bedzie prad nietrakcyjny (niezwiazany z napedem) + // fCurrent+=fabs(MoverParameters->Voltage)*1e-6; //prąd płynący przez + // woltomierz, // rozładowuje kondensator orgromowy 4µF double fPantCurrent = fCurrent; // normalnie cały prąd przez jeden pantograf if (pants) - if (iAnimType[ANIM_PANTS] > - 1) // a jeśli są dwa pantografy //Ra 1014-11: proteza, trzeba zrobić sensowniej + if (iAnimType[ANIM_PANTS] > 1) // a jeśli są dwa pantografy //Ra 1014-11: + // proteza, trzeba zrobić sensowniej if (pants[0].fParamPants->hvPowerWire && pants[1].fParamPants->hvPowerWire) // i oba podłączone do drutów fPantCurrent = fCurrent * 0.5; // to dzielimy prąd równo na oba (trochę bez @@ -2783,7 +2972,8 @@ bool TDynamicObject::Update(double dt, double dt1) if ((MoverParameters->PantFrontVolt == 0.0) && (MoverParameters->PantRearVolt == 0.0)) sPantUp.Play(vol, 0, MechInside, vPosition); - if (p->hvPowerWire) // TODO: wyliczyć trzeba prąd przypadający na pantograf i + if (p->hvPowerWire) // TODO: wyliczyć trzeba prąd przypadający na + // pantograf i // wstawić do GetVoltage() { MoverParameters->PantFrontVolt = @@ -2807,7 +2997,8 @@ bool TDynamicObject::Update(double dt, double dt1) if ((MoverParameters->PantRearVolt == 0.0) && (MoverParameters->PantFrontVolt == 0.0)) sPantUp.Play(vol, 0, MechInside, vPosition); - if (p->hvPowerWire) // TODO: wyliczyć trzeba prąd przypadający na pantograf i + if (p->hvPowerWire) // TODO: wyliczyć trzeba prąd przypadający na + // pantograf i // wstawić do GetVoltage() { MoverParameters->PantRearVolt = @@ -2822,9 +3013,11 @@ bool TDynamicObject::Update(double dt, double dt1) break; } // pozostałe na razie nie obsługiwane if (MoverParameters->PantPress > - (MoverParameters->TrainType == dt_EZT ? - 2.5 : - 3.3)) // Ra 2013-12: Niebugocław mówi, że w EZT podnoszą się przy 2.5 + (MoverParameters->TrainType == dt_EZT ? 2.5 : 3.3)) // Ra 2013-12: + // Niebugocław + // mówi, że w EZT + // podnoszą się + // przy 2.5 pantspeedfactor = 0.015 * (MoverParameters->PantPress) * dt1; // z EXE Kursa //Ra: wysokość zależy od ciśnienia !!! else @@ -2836,21 +3029,26 @@ bool TDynamicObject::Update(double dt, double dt1) MoverParameters->PantFrontUp) // jeśli ma być podniesiony { if (PantDiff > 0.001) // jeśli nie dolega do drutu - { // jeśli poprzednia wysokość jest mniejsza niż pożądana, zwiększyć kąt dolnego + { // jeśli poprzednia wysokość jest mniejsza niż pożądana, zwiększyć kąt + // dolnego // ramienia zgodnie z ciśnieniem if (pantspeedfactor > 0.55 * PantDiff) // 0.55 to około pochodna kąta po wysokości k += 0.55 * PantDiff; // ograniczenie "skoku" w danej klatce else k += pantspeedfactor; // dolne ramię - // jeśli przekroczono kąt graniczny, zablokować pantograf (wymaga interwencji + // jeśli przekroczono kąt graniczny, zablokować pantograf (wymaga + // interwencji // pociągu sieciowego) } else if (PantDiff < -0.001) - { // drut się obniżył albo pantograf podniesiony za wysoko + { // drut się obniżył albo pantograf + // podniesiony za wysoko // jeśli wysokość jest zbyt duża, wyznaczyć zmniejszenie kąta - // jeśli zmniejszenie kąta jest zbyt duże, przejść do trybu łamania pantografu - // if (PantFrontDiff<-0.05) //skok w dół o 5cm daje złąmanie pantografu + // jeśli zmniejszenie kąta jest zbyt duże, przejść do trybu łamania + // pantografu + // if (PantFrontDiff<-0.05) //skok w dół o 5cm daje złąmanie + // pantografu k += 0.4 * PantDiff; // mniej niż pochodna kąta po wysokości } // jeśli wysokość jest dobra, nic więcej nie liczyć } @@ -2888,7 +3086,8 @@ bool TDynamicObject::Update(double dt, double dt1) MoverParameters->PantRearSP = true; } if (MoverParameters->EnginePowerSource.SourceType == CurrentCollector) - { // Winger 240404 - wylaczanie sprezarki i przetwornicy przy braku napiecia + { // Winger 240404 - wylaczanie sprezarki i + // przetwornicy przy braku napiecia if (tmpTraction.TractionVoltage == 0) { // to coś wyłączało dźwięk silnika w ST43! MoverParameters->ConverterFlag = false; @@ -2901,7 +3100,8 @@ bool TDynamicObject::Update(double dt, double dt1) if (MoverParameters->EnginePowerSource.PowerType == SteamPower) // if (smPatykird1[0]) { // Ra: animacja rozrządu parowozu, na razie nieoptymalizowane - /* //Ra: tymczasowo wyłączone ze względu na porządkowanie animacji pantografów + /* //Ra: tymczasowo wyłączone ze względu na porządkowanie animacji + pantografów double fi,dx,c2,ka,kc; double sin_fi,cos_fi; double L1=1.6688888888888889; @@ -2913,10 +3113,12 @@ bool TDynamicObject::Update(double dt, double dt1) //ruch tłoków oraz korbowodów for (int i=0;i<=1;++i) {//obie strony w ten sam sposób - fi=DegToRad(dWheelAngle[1]+(i?pant2x:pant1x)); //kąt obrotu koła dla tłoka 1 + fi=DegToRad(dWheelAngle[1]+(i?pant2x:pant1x)); //kąt obrotu koła dla + tłoka 1 sin_fi=sin(fi); cos_fi=cos(fi); - dx=panty*cos_fi+sqrt(panth*panth-panty*panty*sin_fi*sin_fi)-panth; //nieoptymalne + dx=panty*cos_fi+sqrt(panth*panth-panty*panty*sin_fi*sin_fi)-panth; + //nieoptymalne if (smPatykird1[i]) //na razie zabezpieczenie smPatykird1[i]->SetTranslate(float3(dx,0,0)); ka=-asin(panty/panth)*sin_fi; @@ -2924,7 +3126,8 @@ bool TDynamicObject::Update(double dt, double dt1) smPatykirg1[i]->SetRotateXYZ(vector3(RadToDeg(ka),0,0)); //smPatykirg1[0]->SetRotate(float3(0,1,0),RadToDeg(fi)); //obracamy //ruch drążka mimośrodkowego oraz jarzma - //korzystałem z pliku PDF "mm.pdf" (opis czworoboku korbowo-wahaczowego): + //korzystałem z pliku PDF "mm.pdf" (opis czworoboku + korbowo-wahaczowego): //"MECHANIKA MASZYN. Szkic wykładu i laboratorium komputerowego." //Prof. dr hab. inż. Jerzy Zajączkowski, 2007, Politechnika Łódzka //L1 - wysokość (w pionie) osi jarzma ponad osią koła @@ -2938,11 +3141,14 @@ bool TDynamicObject::Update(double dt, double dt1) //G1=(Lr*Lr+L1*L1+L2*L2+Kc*Lc-L*L-2.0*Lc*L2*cos(fi)+2.0*Lc*L1*sin(fi))/(Lr*Lr); //G2=2.0*(L2-Lc*cos(fi))/Lr; //G3=2.0*(L1-Lc*sin(fi))/Lr; - fi=DegToRad(dWheelAngle[1]+(i?pant2x:pant1x)-96.77416667); //kąt obrotu koła dla + fi=DegToRad(dWheelAngle[1]+(i?pant2x:pant1x)-96.77416667); //kąt + obrotu koła dla tłoka 1 - //1) dla dWheelAngle[1]=0° korba jest w dół, a mimośród w stronę jarzma, czyli + //1) dla dWheelAngle[1]=0° korba jest w dół, a mimośród w stronę + jarzma, czyli fi=-7° - //2) dla dWheelAngle[1]=90° korba jest do tyłu, a mimośród w dół, czyli fi=83° + //2) dla dWheelAngle[1]=90° korba jest do tyłu, a mimośród w dół, + czyli fi=83° sin_fi=sin(fi); cos_fi=cos(fi); G1=(1.0+L1*L1+L2*L2+Lc*Lc-L*L-2.0*Lc*L2*cos_fi+2.0*Lc*L1*sin_fi); @@ -2951,17 +3157,23 @@ bool TDynamicObject::Update(double dt, double dt1) G2_2=G2*G2; G3=2.0*(L1-Lc*sin_fi); G3_2=G3*G3; - sin_ksi=(G1*G2-G3*_fm_sqrt(G2_2+G3_2-G1_2))/(G2_2+G3_2); //x1 (minus delta) + sin_ksi=(G1*G2-G3*_fm_sqrt(G2_2+G3_2-G1_2))/(G2_2+G3_2); //x1 (minus + delta) ksi=asin(sin_ksi); //kąt jarzma if (smPatykirg2[i]) - smPatykirg2[i]->SetRotateXYZ(vector3(RadToDeg(ksi),0,0)); //obrócenie jarzma + smPatykirg2[i]->SetRotateXYZ(vector3(RadToDeg(ksi),0,0)); //obrócenie + jarzma //1) ksi=-23°, gam= //2) ksi=10°, gam= - //gam=acos((L2-sin_ksi-Lc*cos_fi)/L); //kąt od poziomu, liczony względem poziomu - //gam=asin((L1-cos_ksi-Lc*sin_fi)/L); //kąt od poziomu, liczony względem pionu - gam=atan2((L1-cos(ksi)+Lc*sin_fi),(L2-sin_ksi+Lc*cos_fi)); //kąt od poziomu + //gam=acos((L2-sin_ksi-Lc*cos_fi)/L); //kąt od poziomu, liczony + względem poziomu + //gam=asin((L1-cos_ksi-Lc*sin_fi)/L); //kąt od poziomu, liczony + względem pionu + gam=atan2((L1-cos(ksi)+Lc*sin_fi),(L2-sin_ksi+Lc*cos_fi)); //kąt od + poziomu if (smPatykird2[i]) //na razie zabezpieczenie - smPatykird2[i]->SetRotateXYZ(vector3(RadToDeg(-gam-ksi),0,0)); //obrócenie drążka + smPatykird2[i]->SetRotateXYZ(vector3(RadToDeg(-gam-ksi),0,0)); + //obrócenie drążka mimośrodowego } */ @@ -2986,13 +3198,17 @@ bool TDynamicObject::Update(double dt, double dt1) } // ABu-160303 sledzenie toru przed obiektem: ******************************* - // Z obserwacji: v>0 -> Coupler 0; v<0 ->coupler1 (Ra: prędkość jest związana z pojazdem) - // Rozroznienie jest tutaj, zeby niepotrzebnie nie skakac do funkcji. Nie jest uzaleznione + // Z obserwacji: v>0 -> Coupler 0; v<0 ->coupler1 (Ra: prędkość jest związana + // z pojazdem) + // Rozroznienie jest tutaj, zeby niepotrzebnie nie skakac do funkcji. Nie jest + // uzaleznione // od obecnosci AI, zeby uwzglednic np. jadace bez lokomotywy wagony. - // Ra: można by przenieść na poziom obiektu reprezentującego skład, aby nie sprawdzać środkowych + // Ra: można by przenieść na poziom obiektu reprezentującego skład, aby nie + // sprawdzać środkowych if (CouplCounter > 25) // licznik, aby nie robić za każdym razem { // poszukiwanie czegoś do zderzenia się - fTrackBlock = 10000.0; // na razie nie ma przeszkód (na wypadek nie uruchomienia skanowania) + fTrackBlock = 10000.0; // na razie nie ma przeszkód (na wypadek nie + // uruchomienia skanowania) // jeśli nie ma zwrotnicy po drodze, to tylko przeliczyć odległość? if (MoverParameters->V > 0.03) //[m/s] jeśli jedzie do przodu (w kierunku Coupler 0) { @@ -3016,7 +3232,8 @@ bool TDynamicObject::Update(double dt, double dt1) ++CouplCounter; // jazda sprzyja poszukiwaniu połączenia else { - CouplCounter = 25; // a bezruch nie, ale trzeba zaktualizować odległość, bo zawalidroga może + CouplCounter = 25; // a bezruch nie, ale trzeba zaktualizować odległość, bo + // zawalidroga może // sobie pojechać } if (MoverParameters->DerailReason > 0) @@ -3089,7 +3306,8 @@ bool TDynamicObject::FastUpdate(double dt) //}; void TDynamicObject::TurnOff() -{ // wyłączenie rysowania submodeli zmiennych dla egemplarza pojazdu +{ // wyłączenie rysowania submodeli zmiennych dla + // egemplarza pojazdu btnOn = false; btCoupler1.TurnOff(); btCoupler2.TurnOff(); @@ -3134,7 +3352,8 @@ void TDynamicObject::Render() if (ObjSqrDist < 500) // jak jest blisko - do 70m modelrotate = 0.01; // mały kąt, żeby nie znikało else - { // Global::pCameraRotation to kąt bewzględny w świecie (zero - na północ) + { // Global::pCameraRotation to kąt bewzględny w świecie (zero - na + // północ) tempangle = (vPosition - Global::pCameraPosition); // wektor od kamery modelrotate = ABuAcos(tempangle); // określenie kąta // if (modelrotate>M_PI) modelrotate-=(2*M_PI); @@ -3164,7 +3383,8 @@ void TDynamicObject::Render() // ActualTrack= GetTrack(); //McZapkie-240702 #if RENDER_CONE - { // Ra: testowe renderowanie pozycji wózków w postaci ostrosłupów, wymaga GLUT32.DLL + { // Ra: testowe renderowanie pozycji wózków w postaci ostrosłupów, wymaga + // GLUT32.DLL double dir = RadToDeg(atan2(vLeft.z, vLeft.x)); Axle0.Render(0); Axle1.Render(1); // bogieRot[0] @@ -3178,11 +3398,13 @@ void TDynamicObject::Render() if (this == Global::pUserDynamic) { // specjalne ustawienie, aby nie trzęsło if (Global::bSmudge) - { // jak jest widoczna smuga, to pojazd renderować po wyrenderowaniu smugi + { // jak jest widoczna smuga, to pojazd renderować po + // wyrenderowaniu smugi glPopMatrix(); // a to trzeba zebrać przed wyjściem return; } - // if (Global::pWorld->) //tu trzeba by ustawić animacje na modelu zewnętrznym + // if (Global::pWorld->) //tu trzeba by ustawić animacje na modelu + // zewnętrznym glLoadIdentity(); // zacząć od macierzy jedynkowej Global::pCamera->SetCabMatrix(vPosition); // specjalne ustawienie kamery } @@ -3234,7 +3456,8 @@ void TDynamicObject::Render() // Ra: dlaczego jest zablokowana w przezroczystych? if (mdKabina) // jeśli ma model kabiny if ((mdKabina != mdModel) && bDisplayCab && FreeFlyModeFlag) - { // rendering kabiny gdy jest oddzielnym modelem i ma byc wyswietlana + { // rendering kabiny gdy jest oddzielnym modelem i + // ma byc wyswietlana // ABu: tylko w trybie FreeFly, zwykly tryb w world.cpp // Ra: świetła są ustawione dla zewnętrza danego pojazdu // oswietlenie kabiny @@ -3293,7 +3516,9 @@ void TDynamicObject::Render() }; void TDynamicObject::RenderSounds() -{ // przeliczanie dźwięków, bo będzie słychać bez wyświetlania sektora z pojazdem +{ // przeliczanie dźwięków, bo będzie + // słychać bez wyświetlania sektora z + // pojazdem // McZapkie-010302: ulepszony dzwiek silnika double freq; double vol = 0; @@ -3304,10 +3529,11 @@ void TDynamicObject::RenderSounds() if (MoverParameters->Power > 0) { - if ((rsSilnik.AM != 0) && - ((MoverParameters->Mains) || - (MoverParameters->EngineType == - DieselEngine))) // McZapkie-280503: zeby dla dumb dzialal silnik na jalowych obrotach + if ((rsSilnik.AM != 0) && ((MoverParameters->Mains) || (MoverParameters->EngineType == + DieselEngine))) // McZapkie-280503: + // zeby dla dumb + // dzialal silnik na + // jalowych obrotach { if ((fabs(MoverParameters->enrot) > 0.01) || (MoverParameters->EngineType == Dumb)) //&& (MoverParameters->EnginePower>0.1)) @@ -3369,7 +3595,8 @@ void TDynamicObject::RenderSounds() } if ((MoverParameters->DynamicBrakeFlag) && (MoverParameters->EnginePower > 0.1) && (MoverParameters->EngineType == - ElectricSeriesMotor)) // Szociu - 29012012 - jeżeli uruchomiony jest hamulec + ElectricSeriesMotor)) // Szociu - 29012012 - jeżeli uruchomiony + // jest hamulec // elektrodynamiczny, odtwarzany jest dźwięk silnika vol += 0.8; @@ -3449,7 +3676,8 @@ void TDynamicObject::RenderSounds() else rscurve.Stop(); - // McZapkie-280302 - pisk mocno zacisnietych hamulcow - trzeba jeszcze zabezpieczyc przed + // McZapkie-280302 - pisk mocno zacisnietych hamulcow - trzeba jeszcze + // zabezpieczyc przed // brakiem deklaracji w mmedia.dta if (rsPisk.AM != 0) { @@ -3463,9 +3691,12 @@ void TDynamicObject::RenderSounds() rsPisk.Stop(); } - // if ((MoverParameters->ConverterFlag==false) && (MoverParameters->TrainType!=dt_ET22)) - // if ((MoverParameters->ConverterFlag==false)&&(MoverParameters->CompressorPower!=0)) - // MoverParameters->CompressorFlag=false; //Ra: wywalić to stąd, tu tylko dla wyświetlanych! + // if ((MoverParameters->ConverterFlag==false) && + // (MoverParameters->TrainType!=dt_ET22)) + // if + // ((MoverParameters->ConverterFlag==false)&&(MoverParameters->CompressorPower!=0)) + // MoverParameters->CompressorFlag=false; //Ra: wywalić to stąd, tu tylko dla + // wyświetlanych! // Ra: no to już wiemy, dlaczego pociągi jeżdżą lepiej, gdy się na nie patrzy! // if (MoverParameters->CompressorPower==2) // MoverParameters->CompressorAllow=MoverParameters->ConverterFlag; @@ -3487,8 +3718,8 @@ void TDynamicObject::RenderSounds() // youBy - przenioslem, bo diesel tez moze miec turbo if ((MoverParameters->MainCtrlPos) >= - (MoverParameters - ->TurboTest)) // hunter-250312: dlaczego zakomentowane? Ra: bo nie działało dobrze + (MoverParameters->TurboTest)) // hunter-250312: dlaczego zakomentowane? + // Ra: bo nie działało dobrze { // udawanie turbo: (6.66*(eng_vol-0.85)) if (eng_turbo > 6.66 * (enginevolume - 0.8) + 0.2 * dt) @@ -3736,7 +3967,7 @@ void TDynamicObject::RenderAlpha() mdKabina->RenderAlpha(ObjSqrDist,0); //smierdzi - // mdModel->RenderAlpha(SquareMagnitude(Global::pCameraPosition-pos),0); + // mdModel->RenderAlpha(SquareMagnitude(Global::pCameraPosition-pos),0); glLightfv(GL_LIGHT0,GL_AMBIENT,Global::ambientDayLight); glLightfv(GL_LIGHT0,GL_DIFFUSE,Global::diffuseDayLight); @@ -3809,7 +4040,9 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, asModel = asModel.SubString(1, asModel.Length() - 1); } if ((i = asModel.Pos(",")) > 0) - { // Ra 2015-01: może szukać przecinka w nazwie modelu, a po przecinku była by liczba + { // Ra 2015-01: może szukać przecinka w + // nazwie modelu, a po przecinku była by + // liczba // tekstur? if (i < asModel.Length()) iMultiTex = asModel[i + 1] - '0'; @@ -3818,8 +4051,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, else if (iMultiTex > 1) iMultiTex = 1; // na razie ustawiamy na 1 } - asModel = BaseDir + - asModel; // McZapkie 2002-07-20: dynamics maja swoje modele w dynamics/basedir + asModel = BaseDir + asModel; // McZapkie 2002-07-20: dynamics maja swoje + // modele w dynamics/basedir Global::asCurrentTexturePath = BaseDir; // biezaca sciezka do tekstur to dynamic/... mdModel = TModelsManager::GetModel(asModel.c_str(), true); if (ReplacableSkin != AnsiString("none")) @@ -3924,19 +4157,23 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, iAlpha = 0x31310031; // tekstura -1 z kanałem alfa - nie renderować w cyklu // nieprzezroczystych else - iAlpha = 0x30300030; // wszystkie tekstury nieprzezroczyste - nie renderować w + iAlpha = 0x30300030; // wszystkie tekstury nieprzezroczyste - nie + // renderować w // cyklu przezroczystych if (ReplacableSkinID[2]) if (TTexturesManager::GetAlpha(ReplacableSkinID[2])) - iAlpha |= 0x02020002; // tekstura -2 z kanałem alfa - nie renderować w cyklu + iAlpha |= 0x02020002; // tekstura -2 z kanałem alfa - nie renderować + // w cyklu // nieprzezroczystych if (ReplacableSkinID[3]) if (TTexturesManager::GetAlpha(ReplacableSkinID[3])) - iAlpha |= 0x04040004; // tekstura -3 z kanałem alfa - nie renderować w cyklu + iAlpha |= 0x04040004; // tekstura -3 z kanałem alfa - nie renderować + // w cyklu // nieprzezroczystych if (ReplacableSkinID[4]) if (TTexturesManager::GetAlpha(ReplacableSkinID[4])) - iAlpha |= 0x08080008; // tekstura -4 z kanałem alfa - nie renderować w cyklu + iAlpha |= 0x08080008; // tekstura -4 z kanałem alfa - nie renderować + // w cyklu // nieprzezroczystych } // Winger 040304 - ladowanie przedsionkow dla EZT @@ -3950,7 +4187,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, // if (MoverParameters->LoadAccepted!=AnsiString("")); // && // MoverParameters->LoadType!=AnsiString("passengers")) if (MoverParameters->EnginePowerSource.SourceType == CurrentCollector) - { // wartość niby "pantstate" - nazwa dla formalności, ważna jest ilość + { // wartość niby "pantstate" - nazwa dla + // formalności, ważna jest ilość if (MoverParameters->Load == 1) MoverParameters->PantFront(true); else if (MoverParameters->Load == 2) @@ -3987,10 +4225,14 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, { str = Parser->GetNextSymbol().LowerCase(); if (str == AnsiString("animations:")) - { // Ra: ustawienie ilości poszczególnych animacji - musi być jako pierwsze, inaczej + { // Ra: ustawienie ilości + // poszczególnych animacji - + // musi być jako pierwsze, + // inaczej // ilości będą domyślne if (!pAnimations) - { // jeśli nie ma jeszcze tabeli animacji, można odczytać nowe ilości + { // jeśli nie ma jeszcze tabeli animacji, można + // odczytać nowe ilości int co = 0, ile; iAnimations = 0; do @@ -3999,7 +4241,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, // animacji // if (co==ANIM_PANTS) // if (!Global::bLoadTraction) - // if (!DebugModeFlag) //w debugmode pantografy mają "niby działać" + // if (!DebugModeFlag) //w debugmode pantografy mają "niby + // działać" // ile=0; //wyłączenie animacji pantografów if (co < ANIM_TYPES) if (ile >= 0) @@ -4016,7 +4259,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, // WriteLog("Total animations: "+AnsiString(iAnimations)); } if (!pAnimations) - { // Ra: tworzenie tabeli animacji, jeśli jeszcze nie było + { // Ra: tworzenie tabeli animacji, jeśli jeszcze nie + // było if (!iAnimations) // jeśli nie podano jawnie, ile ma być animacji iAnimations = 28; // tyle było kiedyś w każdym pojeździe (2 wiązary wypadły) /* //pojazd może mieć pantograf do innych celów niż napęd @@ -4038,8 +4282,9 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, pants = pAnimations + k; // zapamiętanie na potrzeby wyszukania submodeli pAnimations[k].iShift = sm; // przesunięcie do przydzielenia wskaźnika - sm += pAnimations[k++].TypeSet( - j); // ustawienie typu animacji i zliczanie tablicowanych submodeli + sm += pAnimations[k++].TypeSet(j); // ustawienie typu animacji i + // zliczanie tablicowanych + // submodeli } if (sm) // o ile są bardziej złożone animacje { @@ -4053,13 +4298,13 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, if (str == AnsiString("lowpolyinterior:")) // ABu: wnetrze lowpoly { asModel = Parser->GetNextSymbol().LowerCase(); - asModel = - BaseDir + - asModel; // McZapkie-200702 - dynamics maja swoje modele w dynamic/basedir + asModel = BaseDir + asModel; // McZapkie-200702 - dynamics maja swoje + // modele w dynamic/basedir Global::asCurrentTexturePath = BaseDir; // biezaca sciezka do tekstur to dynamic/... mdLowPolyInt = TModelsManager::GetModel(asModel.c_str(), true); - // Global::asCurrentTexturePath=AnsiString(szTexturePath); //kiedyś uproszczone + // Global::asCurrentTexturePath=AnsiString(szTexturePath); //kiedyś + // uproszczone // wnętrze mieszało tekstury nieba } if (str == AnsiString("brakemode:")) @@ -4093,8 +4338,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, MoverParameters->WheelDiameter; // nie kręcić w większej odległości pAnimations[i].fMaxDist *= pAnimations[i].fMaxDist * - MoverParameters - ->WheelDiameter; // 50m do kwadratu, a średnica do trzeciej + MoverParameters->WheelDiameter; // 50m do kwadratu, a średnica + // do trzeciej pAnimations[i].fMaxDist *= Global::fDistanceFactor; // współczynnik // przeliczeniowy // jakości ekranu @@ -4111,22 +4356,27 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, m = 0; // numer osi; kolejny znak; ile osi danego typu; która średnica if ((MoverParameters->WheelDiameterL != MoverParameters->WheelDiameter) || (MoverParameters->WheelDiameterT != MoverParameters->WheelDiameter)) - { // obsługa różnych średnic, o ile występują + { // obsługa różnych średnic, o + // ile występują while ((i < iAnimType[ANIM_WHEELS]) && (j <= MoverParameters->AxleArangement.Length())) - { // wersja ze wskaźnikami jest bardziej elastyczna na nietypowe układy + { // wersja ze wskaźnikami jest + // bardziej elastyczna na nietypowe + // układy if ((k >= 'A') && (k <= 'J')) // 10 chyba maksimum? { pAnimations[i++].dWheelAngle = dWheelAngle + 1; // obrót osi napędzających - --k; // następna będzie albo taka sama, albo bierzemy kolejny znak + --k; // następna będzie albo taka sama, albo bierzemy kolejny + // znak m = 2; // następujące toczne będą miały inną średnicę } else if ((k >= '1') && (k <= '9')) { pAnimations[i++].dWheelAngle = dWheelAngle + m; // obrót osi // tocznych - --k; // następna będzie albo taka sama, albo bierzemy kolejny znak + --k; // następna będzie albo taka sama, albo bierzemy kolejny + // znak } else k = MoverParameters->AxleArangement[j++]; // pobranie kolejnego @@ -4145,7 +4395,9 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, // } // } else if (str == AnsiString("animpantprefix:")) - { // Ra: pantografy po nowemu mają literki i numerki + { // Ra: pantografy po + // nowemu mają literki + // i numerki } // Pantografy - Winger 160204 if (str == AnsiString("animpantrd1prefix:")) @@ -4155,7 +4407,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, TSubModel *sm; if (pants) for (int i = 0; i < iAnimType[ANIM_PANTS]; i++) - { // Winger 160204: wyszukiwanie max 2 patykow o nazwie str* + { // Winger 160204: wyszukiwanie max 2 patykow o nazwie + // str* asAnimName = str + AnsiString(i + 1); sm = mdModel->GetFromName(asAnimName.c_str()); pants[i].smElement[0] = sm; // jak NULL, to nie będzie animowany @@ -4163,9 +4416,11 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, { // w EP09 wywalało się tu z powodu NULL sm->WillBeAnimated(); sm->ParentMatrix(&m); // pobranie macierzy transformacji - // m(3)[1]=m[3][1]+0.054; //w górę o wysokość ślizgu (na razie tak) + // m(3)[1]=m[3][1]+0.054; //w górę o wysokość ślizgu (na razie + // tak) if ((mdModel->Flags() & 0x8000) == 0) // jeśli wczytano z T3D - m.InitialRotate(); // może być potrzebny dodatkowy obrót, jeśli + m.InitialRotate(); // może być potrzebny dodatkowy obrót, + // jeśli // wczytano z T3D, tzn. przed wykonaniem // Init() pants[i].fParamPants->vPos.z = @@ -4173,7 +4428,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, pants[i].fParamPants->vPos.y = m[3][1]; // przesunięcie w górę odczytane z modelu if ((sm = pants[i].smElement[0]->ChildGet()) != NULL) - { // jeśli ma potomny, można policzyć długość (odległość potomnego + { // jeśli ma potomny, można policzyć długość + // (odległość potomnego // od osi obrotu) m = float4x4(*sm->GetMatrix()); // wystarczyłby wskaźnik, nie // trzeba kopiować @@ -4195,7 +4451,9 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, pants[i].fParamPants->fAngleL0; // początkowy kąt dolnego // ramienia if ((sm = sm->ChildGet()) != NULL) - { // jeśli dalej jest ślizg, można policzyć długość górnego + { // jeśli dalej jest + // ślizg, można policzyć + // długość górnego // ramienia m = float4x4(*sm->GetMatrix()); // wystarczyłby wskaźnik, // nie trzeba kopiować @@ -4276,7 +4534,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, TSubModel *sm; if (pants) for (int i = 0; i < iAnimType[ANIM_PANTS]; i++) - { // Winger 160204: wyszukiwanie max 2 patykow o nazwie str* + { // Winger 160204: wyszukiwanie max 2 patykow o nazwie + // str* asAnimName = str + AnsiString(i + 1); sm = mdModel->GetFromName(asAnimName.c_str()); pants[i].smElement[1] = sm; // jak NULL, to nie będzie animowany @@ -4284,7 +4543,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, { // w EP09 wywalało się tu z powodu NULL sm->WillBeAnimated(); if (pants[i].fParamPants->vPos.y == 0.0) - { // jeśli pierwsze ramię nie ustawiło tej wartości, próbować drugim + { // jeśli pierwsze ramię nie ustawiło tej wartości, + // próbować drugim //!!!! docelowo zrobić niezależną animację ramion z każdej // strony m = float4x4( @@ -4313,7 +4573,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, str = Parser->GetNextSymbol(); if (pants) for (int i = 0; i < iAnimType[ANIM_PANTS]; i++) - { // Winger 160204: wyszukiwanie max 2 patykow o nazwie str* + { // Winger 160204: wyszukiwanie max 2 patykow o nazwie + // str* asAnimName = str + AnsiString(i + 1); pants[i].smElement[2] = mdModel->GetFromName(asAnimName.c_str()); pants[i].smElement[2]->WillBeAnimated(); @@ -4324,7 +4585,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, str = Parser->GetNextSymbol(); if (pants) for (int i = 0; i < iAnimType[ANIM_PANTS]; i++) - { // Winger 160204: wyszukiwanie max 2 patykow o nazwie str* + { // Winger 160204: wyszukiwanie max 2 patykow o nazwie + // str* asAnimName = str + AnsiString(i + 1); pants[i].smElement[3] = mdModel->GetFromName(asAnimName.c_str()); pants[i].smElement[3]->WillBeAnimated(); @@ -4335,7 +4597,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, str = Parser->GetNextSymbol(); if (pants) for (int i = 0; i < iAnimType[ANIM_PANTS]; i++) - { // Winger 160204: wyszukiwanie max 2 patykow o nazwie str* + { // Winger 160204: wyszukiwanie max 2 patykow o nazwie + // str* asAnimName = str + AnsiString(i + 1); pants[i].smElement[4] = mdModel->GetFromName(asAnimName.c_str()); pants[i].smElement[4]->WillBeAnimated(); @@ -4345,7 +4608,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, } } else if (str == AnsiString("pantfactors:")) - { // Winger 010304: parametry pantografow + { // Winger 010304: + // parametry pantografow double pant1x = Parser->GetNextSymbol().ToDouble(); double pant2x = Parser->GetNextSymbol().ToDouble(); double pant1h = Parser->GetNextSymbol().ToDouble(); // wysokość pierwszego @@ -4361,7 +4625,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, } if (pants) for (int i = 0; i < iAnimType[ANIM_PANTS]; ++i) - { // przepisanie współczynników do pantografów (na razie nie będzie lepiej) + { // przepisanie współczynników do pantografów (na razie + // nie będzie lepiej) pants[i].fParamPants->fAngleL = pants[i].fParamPants->fAngleL0; // początkowy kąt dolnego ramienia pants[i].fParamPants->fAngleU = @@ -4370,9 +4635,12 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, // //wysokość początkowa // pants[i].fParamPants->PantWys=1.176289*sin(pants[i].fParamPants->fAngleL)+1.724482197*sin(pants[i].fParamPants->fAngleU); // //wysokość początkowa - if (pants[i].fParamPants->fHeight == - 0.0) // gdy jest nieprawdopodobna wartość (np. nie znaleziony ślizg) - { // gdy pomiary modelu nie udały się, odczyt podanych parametrów z MMD + if (pants[i].fParamPants->fHeight == 0.0) // gdy jest + // nieprawdopodobna + // wartość (np. nie + // znaleziony ślizg) + { // gdy pomiary modelu nie udały się, odczyt podanych parametrów + // z MMD pants[i].fParamPants->vPos.x = (i & 1) ? pant2x : pant1x; pants[i].fParamPants->fHeight = (i & 1) ? pant2h : @@ -4394,7 +4662,10 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, } } else if (str == AnsiString("animpistonprefix:")) - { // prefiks tłoczysk - na razie używamy modeli pantografów + { // prefiks tłoczysk + // - na razie + // używamy modeli + // pantografów str = Parser->GetNextSymbol(); for (int i = 1; i <= 2; i++) { @@ -4404,7 +4675,9 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, } } else if (str == AnsiString("animconrodprefix:")) - { // prefiks korbowodów - na razie używamy modeli pantografów + { // prefiks korbowodów - na + // razie używamy modeli + // pantografów str = Parser->GetNextSymbol(); for (int i = 1; i <= 2; i++) { @@ -4414,20 +4687,30 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, } } else if (str == AnsiString("pistonfactors:")) - { // Ra: parametry silnika parowego (tłoka) - /* //Ra: tymczasowo wyłączone ze względu na porządkowanie animacji pantografów - pant1x=Parser->GetNextSymbol().ToDouble(); //kąt przesunięcia dla + { // Ra: parametry + // silnika parowego + // (tłoka) + /* //Ra: tymczasowo wyłączone ze względu na porządkowanie animacji + pantografów + pant1x=Parser->GetNextSymbol().ToDouble(); //kąt przesunięcia + dla pierwszego tłoka - pant2x=Parser->GetNextSymbol().ToDouble(); //kąt przesunięcia dla + pant2x=Parser->GetNextSymbol().ToDouble(); //kąt przesunięcia + dla drugiego tłoka panty=Parser->GetNextSymbol().ToDouble(); //długość korby (r) - panth=Parser->GetNextSymbol().ToDouble(); //długoś korbowodu (k) + panth=Parser->GetNextSymbol().ToDouble(); //długoś korbowodu + (k) */ MoverParameters->EnginePowerSource.PowerType = SteamPower; // Ra: po chamsku, ale z CHK nie działa } else if (str == AnsiString("animreturnprefix:")) - { // prefiks drążka mimośrodowego - na razie używamy modeli pantografów + { // prefiks drążka + // mimośrodowego - + // na razie używamy + // modeli + // pantografów str = Parser->GetNextSymbol(); for (int i = 1; i <= 2; i++) { @@ -4451,7 +4734,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, str = Parser->GetNextSymbol(); asAnimName = ""; for (int i = 1; i <= 4; i++) - { // McZapkie-050402: wyszukiwanie max 4 wahaczy o nazwie str* + { // McZapkie-050402: wyszukiwanie max 4 + // wahaczy o nazwie str* asAnimName = str + AnsiString(i); smWahacze[i - 1] = mdModel->GetFromName(asAnimName.c_str()); smWahacze[i - 1]->WillBeAnimated(); @@ -4465,7 +4749,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, str = Parser->GetNextSymbol(); smMechanik0 = mdModel->GetFromName(str.c_str()); if (!smMechanik0) - { // jak nie ma bez numerka, to może jest z numerkiem? + { // jak nie ma bez numerka, to może jest z + // numerkiem? smMechanik0 = mdModel->GetFromName(AnsiString(str + "1").c_str()); smMechanik1 = mdModel->GetFromName(AnsiString(str + "2").c_str()); } @@ -4491,7 +4776,9 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, // optymalizacji // transformu switch (MoverParameters->DoorOpenMethod) - { // od razu zapinamy potrzebny typ animacji + { // od razu zapinamy + // potrzebny typ + // animacji case 1: pAnimations[i + j].yUpdate = UpdateDoorTranslate; break; @@ -4508,7 +4795,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, pAnimations[i + j].fSpeed = random(150); // oryginalny koncept z DoorSpeedFactor pAnimations[i + j].fSpeed = (pAnimations[i + j].fSpeed + 100) / 100; - // Ra: te współczynniki są bez sensu, bo modyfikują wektor przesunięcia + // Ra: te współczynniki są bez sensu, bo modyfikują wektor + // przesunięcia } } } @@ -4535,8 +4823,9 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, str = Parser->GetNextSymbol(); } else if ((str == AnsiString("engine:")) && - (MoverParameters->Power > - 0)) // plik z dzwiekiem silnika, mnozniki i ofsety amp. i czest. + (MoverParameters->Power > 0)) // plik z dzwiekiem silnika, + // mnozniki i ofsety amp. i + // czest. { str = Parser->GetNextSymbol(); rsSilnik.Init(str.c_str(), Parser->GetNextSymbol().ToDouble(), GetPosition().x, @@ -4560,7 +4849,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, else if (((str == AnsiString("ventilator:")) && ((MoverParameters->EngineType == ElectricSeriesMotor) || (MoverParameters->EngineType == - ElectricInductionMotor)))) // plik z dzwiekiem wentylatora, mnozniki i + ElectricInductionMotor)))) // plik z dzwiekiem + // wentylatora, mnozniki i // ofsety amp. i czest. { str = Parser->GetNextSymbol(); @@ -4576,7 +4866,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, } else if ((str == AnsiString("transmission:")) && (MoverParameters->EngineType == - ElectricSeriesMotor)) // plik z dzwiekiem, mnozniki i ofsety amp. i czest. + ElectricSeriesMotor)) // plik z dzwiekiem, mnozniki i ofsety + // amp. i czest. { str = Parser->GetNextSymbol(); rsPrzekladnia.Init(str.c_str(), Parser->GetNextSymbol().ToDouble(), @@ -4586,9 +4877,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, rsPrzekladnia.FM = 0.005; rsPrzekladnia.FA = 1.0; } - else if (str == - AnsiString( - "brake:")) // plik z piskiem hamulca, mnozniki i ofsety amplitudy. + else if (str == AnsiString("brake:")) // plik z piskiem hamulca, + // mnozniki i ofsety amplitudy. { str = Parser->GetNextSymbol(); rsPisk.Init(str.c_str(), Parser->GetNextSymbol().ToDouble(), GetPosition().x, @@ -4598,9 +4888,9 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, rsPisk.FM = 1.0; rsPisk.FA = 0.0; } - else if (str == - AnsiString( - "brakeacc:")) // plik z przyspieszaczem (upust po zlapaniu hamowania) + else if (str == AnsiString("brakeacc:")) // plik z przyspieszaczem + // (upust po zlapaniu + // hamowania) { str = Parser->GetNextSymbol(); // sBrakeAcc.Init(str.c_str(),Parser->GetNextSymbol().ToDouble(),GetPosition().x,GetPosition().y,GetPosition().z,true); @@ -4611,9 +4901,9 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, // sBrakeAcc.FM=1.0; // sBrakeAcc.FA=0.0; } - else if (str == - AnsiString( - "unbrake:")) // plik z piskiem hamulca, mnozniki i ofsety amplitudy. + else if (str == AnsiString("unbrake:")) // plik z piskiem hamulca, + // mnozniki i ofsety + // amplitudy. { str = Parser->GetNextSymbol(); rsUnbrake.Init(str.c_str(), Parser->GetNextSymbol().ToDouble(), GetPosition().x, @@ -4694,7 +4984,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, } else if (str == AnsiString("converter:")) // pliki z przetwornica { - // if (MoverParameters->EngineType==DieselElectric) //będzie modulowany? + // if (MoverParameters->EngineType==DieselElectric) //będzie + // modulowany? sConverter.Load(Parser, GetPosition()); } else if (str == AnsiString("turbo:")) // pliki z turbogeneratorem @@ -4756,7 +5047,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, // ABu 050205 - tego wczesniej nie bylo i uciekala pamiec: delete Parser; if (mdModel) - mdModel->Init(); // obrócenie modelu oraz optymalizacja, również zapisanie binarnego + mdModel->Init(); // obrócenie modelu oraz optymalizacja, również zapisanie + // binarnego if (mdLoad) mdLoad->Init(); if (mdPrzedsionek) @@ -4778,15 +5070,19 @@ void TDynamicObject::RadioStop() }; void TDynamicObject::RaLightsSet(int head, int rear) -{ // zapalenie świateł z przodu i z tyłu, zależne od kierunku pojazdu +{ // zapalenie świateł z przodu i z + // tyłu, zależne od kierunku + // pojazdu if (!MoverParameters) return; // może tego nie być na początku if (rear == 2 + 32 + 64) - { // jeśli koniec pociągu, to trzeba ustalić, czy jest tam czynna lokomotywa + { // jeśli koniec pociągu, to trzeba ustalić, czy + // jest tam czynna lokomotywa // EN57 może nie mieć końcówek od środka członu if (MoverParameters->Power > 1.0) // jeśli ma moc napędową if (!MoverParameters->ActiveDir) // jeśli nie ma ustawionego kierunku - { // jeśli ma zarówno światła jak i końcówki, ustalić, czy jest w stanie aktywnym + { // jeśli ma zarówno światła jak i końcówki, ustalić, czy jest w stanie + // aktywnym // np. lokomotywa na zimno będzie mieć końcówki a nie światła rear = 64; // tablice blaszane // trzeba to uzależnić od "załączenia baterii" w pojeździe @@ -4819,7 +5115,8 @@ int TDynamicObject::DirectionSet(int d) iDirection = d > 0 ? 1 : 0; // d:1=zgodny,-1=przeciwny; iDirection:1=zgodny,0=przeciwny; CouplCounter = 20; //żeby normalnie skanować kolizje, to musi ruszyć z miejsca if (MyTrack) - { // podczas wczytywania wstawiane jest AI, ale może jeszcze nie być toru + { // podczas wczytywania wstawiane jest AI, ale może jeszcze nie + // być toru // AI ustawi kierunek ponownie po uruchomieniu silnika if (iDirection) // jeśli w kierunku Coupler 0 { @@ -4836,7 +5133,8 @@ int TDynamicObject::DirectionSet(int d) }; TDynamicObject *__fastcall TDynamicObject::PrevAny() -{ // wskaźnik na poprzedni, nawet wirtualny +{ // wskaźnik na poprzedni, + // nawet wirtualny return iDirection ? PrevConnected : NextConnected; }; TDynamicObject *__fastcall TDynamicObject::Prev() @@ -4858,7 +5156,9 @@ TDynamicObject *__fastcall TDynamicObject::NextC(int C) return NULL; // gdy sprzęg inny, to jakby nic nie było }; double TDynamicObject::NextDistance(double d) -{ // ustalenie odległości do następnego pojazdu, potrzebne do wstecznego skanowania +{ // ustalenie odległości do + // następnego pojazdu, potrzebne + // do wstecznego skanowania if (!MoverParameters->Couplers[iDirection].Connected) return d; // jeśli nic nie ma, zwrócenie domyślnej wartości if ((d <= 0.0) || (MoverParameters->Couplers[iDirection].CoupleDist < d)) @@ -4868,7 +5168,8 @@ double TDynamicObject::NextDistance(double d) }; TDynamicObject *__fastcall TDynamicObject::Neightbour(int &dir) -{ // ustalenie następnego (1) albo poprzedniego (0) w składzie bez względu na prawidłowość +{ // ustalenie następnego (1) albo poprzedniego (0) w składzie bez + // względu na prawidłowość // iDirection int d = dir; // zapamiętanie kierunku dir = 1 - (dir ? NextConnectedNo : PrevConnectedNo); // nowa wartość @@ -4886,7 +5187,8 @@ void TDynamicObject::CoupleDist() else { // na drodze trzeba uwzględnić wektory ruchu double d0 = MoverParameters->Couplers[0].CoupleDist; - // double d1=MoverParameters->Couplers[1].CoupleDist; //sprzęg z tyłu samochodu można olać, + // double d1=MoverParameters->Couplers[1].CoupleDist; //sprzęg z tyłu + // samochodu można olać, // dopóki nie jeździ na wstecznym vector3 p1, p2; double d, w; // dopuszczalny dystans w poprzek @@ -4894,10 +5196,12 @@ void TDynamicObject::CoupleDist() if (MoverParameters->Couplers[0].Connected) // jeśli cokolwiek podłączone if (MoverParameters->Couplers[0].CouplingFlag == 0) // jeśli wirtualny if (MoverParameters->Couplers[0].CoupleDist < 300.0) // i mniej niż 300m - { // przez MoverParameters->Couplers[0].Connected nie da się dostać do DynObj, stąd + { // przez MoverParameters->Couplers[0].Connected nie da się dostać do + // DynObj, stąd // prowizorka // WriteLog("Collision of - // "+AnsiString(MoverParameters->Couplers[0].CoupleDist)+"m detected by + // "+AnsiString(MoverParameters->Couplers[0].CoupleDist)+"m detected + // by // "+asName+":0."); w = 0.5 * (MoverParameters->Couplers[0].Connected->Dim.W + MoverParameters->Dim.W); // minimalna odległość minięcia @@ -4918,7 +5222,8 @@ void TDynamicObject::CoupleDist() if (MoverParameters->Couplers[1].CoupleDist < 300.0) // i mniej niż 300m { // WriteLog("Collision of - // "+AnsiString(MoverParameters->Couplers[1].CoupleDist)+"m detected by + // "+AnsiString(MoverParameters->Couplers[1].CoupleDist)+"m detected + // by // "+asName+":1."); w = 0.5 * (MoverParameters->Couplers[1].Connected->Dim.W + MoverParameters->Dim.W); // minimalna odległość minięcia @@ -4938,29 +5243,41 @@ void TDynamicObject::CoupleDist() }; TDynamicObject *__fastcall TDynamicObject::ControlledFind() -{ // taka proteza: chcę podłączyć kabinę EN57 bezpośrednio z silnikowym, aby nie robić tego przez +{ // taka proteza: + // chcę podłączyć + // kabinę EN57 + // bezpośrednio z + // silnikowym, aby + // nie robić tego + // przez // ukrotnienie // drugi silnikowy i tak musi być ukrotniony, podobnie jak kolejna jednostka - // lepiej by było przesyłać komendy sterowania, co jednak wymaga przebudowy transmisji komend + // lepiej by było przesyłać komendy sterowania, co jednak wymaga przebudowy + // transmisji komend // (LD) - // problem się robi ze światłami, które będą zapalane w silnikowym, ale muszą świecić się w + // problem się robi ze światłami, które będą zapalane w silnikowym, ale muszą + // świecić się w + // rozrządczych + // dla EZT światłą czołowe będą "zapalane w silnikowym", ale widziane z // rozrządczych - // dla EZT światłą czołowe będą "zapalane w silnikowym", ale widziane z rozrządczych // również wczytywanie MMD powinno dotyczyć aktualnego członu // problematyczna może być kwestia wybranej kabiny (w silnikowym...) - // jeśli silnikowy będzie zapięty odwrotnie (tzn. -1), to i tak powinno jeździć dobrze + // jeśli silnikowy będzie zapięty odwrotnie (tzn. -1), to i tak powinno + // jeździć dobrze // również hamowanie wykonuje się zaworem w członie, a nie w silnikowym... TDynamicObject *d = this; // zaczynamy od aktualnego if (d->MoverParameters->TrainType & dt_EZT) // na razie dotyczy to EZT if (d->NextConnected ? d->MoverParameters->Couplers[1].AllowedFlag & ctrain_depot : false) - { // gdy jest człon od sprzęgu 1, a sprzęg łączony warsztatowo (powiedzmy) + { // gdy jest człon od sprzęgu 1, a sprzęg łączony + // warsztatowo (powiedzmy) if ((d->MoverParameters->Power < 1.0) && (d->NextConnected->MoverParameters->Power > 1.0)) // my nie mamy mocy, ale ten drugi ma d = d->NextConnected; // będziemy sterować tym z mocą } else if (d->PrevConnected ? d->MoverParameters->Couplers[0].AllowedFlag & ctrain_depot : false) - { // gdy jest człon od sprzęgu 0, a sprzęg łączony warsztatowo (powiedzmy) + { // gdy jest człon od sprzęgu 0, a sprzęg łączony + // warsztatowo (powiedzmy) if ((d->MoverParameters->Power < 1.0) && (d->PrevConnected->MoverParameters->Power > 1.0)) // my nie mamy mocy, ale ten drugi ma d = d->PrevConnected; // będziemy sterować tym z mocą @@ -4973,9 +5290,10 @@ void TDynamicObject::ParamSet(int what, int into) { // ustawienie lokalnego parametru (what) na stan (into) switch (what & 0xFF00) { - case 0x0100: // to np. są drzwi, bity 0..7 określają numer 1..254 albo maskę dla 8 różnych - if (what & - 1) // na razie mamy lewe oraz prawe, czyli używamy maskę 1=lewe, 2=prawe, 3=wszystkie + case 0x0100: // to np. są drzwi, bity 0..7 określają numer 1..254 albo maskę + // dla 8 różnych + if (what & 1) // na razie mamy lewe oraz prawe, czyli używamy maskę 1=lewe, + // 2=prawe, 3=wszystkie if (MoverParameters->DoorLeftOpened) { // są otwarte if (!into) // jeśli zamykanie @@ -5010,7 +5328,9 @@ void TDynamicObject::ParamSet(int what, int into) }; int TDynamicObject::RouteWish(TTrack *tr) -{ // zapytanie do AI, po którym segmencie (-6..6) jechać na skrzyżowaniu (tr) +{ // zapytanie do AI, po którym + // segmencie (-6..6) jechać na + // skrzyżowaniu (tr) return Mechanik ? Mechanik->CrossRoute(tr) : 0; // wg AI albo prosto }; @@ -5035,10 +5355,14 @@ AnsiString TDynamicObject::TextureTest(AnsiString &name) }; void TDynamicObject::DestinationSet(AnsiString to) -{ // ustawienie stacji docelowej oraz wymiennej tekstury 4, jeśli istnieje plik +{ // ustawienie stacji + // docelowej oraz wymiennej + // tekstury 4, jeśli + // istnieje plik // w zasadzie, to każdy wagon mógłby mieć inną stację docelową // zwłaszcza w towarowych, pod kątem zautomatyzowania maewrów albo pracy górki - // ale to jeszcze potrwa, zanim będzie możliwe, na razie można wpisać stację z rozkładu + // ale to jeszcze potrwa, zanim będzie możliwe, na razie można wpisać stację z + // rozkładu if (abs(iMultiTex) >= 4) return; // jak są 4 tekstury wymienne, to nie zmieniać rozkładem asDestination = to; @@ -5060,11 +5384,14 @@ void TDynamicObject::DestinationSet(AnsiString to) NULL, NULL, x.c_str(), 9); // rozmywania 0,1,4,5 nie nadają się else ReplacableSkinID[4] = 0; // 0 to brak? -1 odpada, bo inaczej się będzie mapować - // Ra 2015-01: żeby zalogować błąd, trzeba by mieć pewność, że model używa tekstury nr 4 + // Ra 2015-01: żeby zalogować błąd, trzeba by mieć pewność, że model używa + // tekstury nr 4 }; void TDynamicObject::OverheadTrack(float o) -{ // ewentualne wymuszanie jazdy bezprądowej z powodu informacji w torze +{ // ewentualne wymuszanie jazdy + // bezprądowej z powodu informacji + // w torze if (ctOwner) // jeśli ma obiekt nadzorujący { // trzeba zaktualizować mapę flag bitowych jazdy bezprądowej if (o < 0.0) diff --git a/Gauge.cpp b/Gauge.cpp index 1772754f..9c65a502 100644 --- a/Gauge.cpp +++ b/Gauge.cpp @@ -50,7 +50,8 @@ void TGauge::Init(TSubModel *NewSubModel, TGaugeType eNewType, double fNewScale, double fNewFriction, double fNewValue) { // ustawienie parametrów animacji submodelu if (NewSubModel) - { // warunek na wszelki wypadek, gdyby się submodel nie podłączył + { // warunek na wszelki wypadek, gdyby się submodel nie + // podłączył fFriction = fNewFriction; fValue = fNewValue; fOffset = fNewOffset; @@ -61,11 +62,12 @@ void TGauge::Init(TSubModel *NewSubModel, TGaugeType eNewType, double fNewScale, { TSubModel *sm = SubModel->ChildGet(); do - { // pętla po submodelach potomnych i obracanie ich o kąt zależy od cyfry w (fValue) + { // pętla po submodelach potomnych i obracanie ich o kąt zależy od + // cyfry w (fValue) if (sm->pName) { // musi mieć niepustą nazwę - if ((*sm->pName) >= '0') - if ((*sm->pName) <= '9') + if (sm->pName[0] >= '0') + if (sm->pName[0] <= '9') sm->WillBeAnimated(); // wyłączenie optymalizacji } sm = sm->NextGet(); @@ -137,14 +139,16 @@ void TGauge::PutValue(double fNewDesired) void TGauge::Update() { float dt = Timer::GetDeltaTime(); - if ((fFriction > 0) && - (dt < - 0.5 * fFriction)) // McZapkie-281102: zabezpieczenie przed oscylacjami dla dlugich czasow + if ((fFriction > 0) && (dt < 0.5 * fFriction)) // McZapkie-281102: + // zabezpieczenie przed + // oscylacjami dla dlugich + // czasow fValue += dt * (fDesiredValue - fValue) / fFriction; else fValue = fDesiredValue; if (SubModel) - { // warunek na wszelki wypadek, gdyby się submodel nie podłączył + { // warunek na wszelki wypadek, gdyby się submodel nie + // podłączył TSubModel *sm; switch (eType) { @@ -167,16 +171,17 @@ void TGauge::Update() break; case gt_Digital: // Ra 2014-07: licznik cyfrowy sm = SubModel->ChildGet(); - AnsiString n = FormatFloat("0000000000", floor(fValue)); // na razie tak trochę bez - // sensu + AnsiString n = + FormatFloat("0000000000", floor(fValue)); // na razie tak trochę bez sensu do - { // pętla po submodelach potomnych i obracanie ich o kąt zależy od cyfry w (fValue) + { // pętla po submodelach potomnych i obracanie ich o kąt zależy od + // cyfry w (fValue) if (sm->pName) { // musi mieć niepustą nazwę - if ((*sm->pName) >= '0') - if ((*sm->pName) <= '9') + if (sm->pName[0] >= '0') + if (sm->pName[0] <= '9') sm->SetRotate(float3(0, 1, 0), - -36.0 * (n['0' + 10 - (*sm->pName)] - '0')); + -36.0 * (n['0' + 10 - sm->pName[0]] - '0')); } sm = sm->NextGet(); } while (sm); diff --git a/McZapkie/Mover.hpp b/McZapkie/Mover.hpp index 009f5b8f..8dd3a9cd 100644 --- a/McZapkie/Mover.hpp +++ b/McZapkie/Mover.hpp @@ -867,6 +867,7 @@ static const Shortint eimv_Uzsmax = 0x10; static const Shortint eimv_Pmax = 0x11; static const Shortint eimv_Fzad = 0x12; static const Shortint eimv_Imax = 0x13; +static const Shortint eimv_Fful = 0x14; extern PACKAGE double __fastcall Distance(const TLocation &Loc1, const TLocation &Loc2, const TDimension &Dim1, const TDimension &Dim2); diff --git a/McZapkie/_Mover.hpp b/McZapkie/_Mover.hpp index 81065a91..f5d8031b 100644 --- a/McZapkie/_Mover.hpp +++ b/McZapkie/_Mover.hpp @@ -865,6 +865,7 @@ static const Shortint eimv_Uzsmax = 0x10; static const Shortint eimv_Pmax = 0x11; static const Shortint eimv_Fzad = 0x12; static const Shortint eimv_Imax = 0x13; +static const Shortint eimv_Fful = 0x14; extern PACKAGE double __fastcall Distance(const TLocation &Loc1, const TLocation &Loc2, const TDimension &Dim1, const TDimension &Dim2); diff --git a/McZapkie/_mover.pas b/McZapkie/_mover.pas index c35523fe..9dc52768 100644 --- a/McZapkie/_mover.pas +++ b/McZapkie/_mover.pas @@ -1,13 +1,5 @@ unit _mover; {fizyka ruchu dla symulatora lokomotywy} -(* -This Source Code Form is subject to the -terms of the Mozilla Public License, v. -2.0. If a copy of the MPL was not -distributed with this file, You can -obtain one at -http://mozilla.org/MPL/2.0/. -*) (* MaSzyna EU07 locomotive simulator Copyright (C) 2001-2004 Maciej Czapkiewicz and others @@ -212,6 +204,7 @@ CONST eimv_Pmax=17; eimv_Fzad=18; eimv_Imax=19; + eimv_Fful=20; TYPE @@ -2425,10 +2418,13 @@ begin dpMainValve:=0; -if (BrakeCtrlPosNo>1) and (ActiveCab<>0)then +if (BrakeCtrlPosNo>1) {and(ActiveCab<>0)}then with BrakePressureTable[BrakeCtrlPos] do begin - dpLocalValve:=LocHandle.GetPF(LocalBrakePos/LocalBrakePosNo, Hamulec.GetBCP, ScndPipePress, dt, 0); + if(EngineType<>ElectricInductionMotor)then + dpLocalValve:=LocHandle.GetPF(Max0R(LocalBrakePos/LocalBrakePosNo,LocalBrakePosA), Hamulec.GetBCP, ScndPipePress, dt, 0) + else + dpLocalValve:=LocHandle.GetPF(LocalBrakePosA, Hamulec.GetBCP, ScndPipePress, dt, 0); if(BrakeHandle=FV4a)and((PipePress<2.75)and((Hamulec.GetStatus and b_rls)=0))and(BrakeSubsystem=ss_LSt)and(TrainType<>dt_EZT)then temp:=PipePress+0.00001 else @@ -2483,11 +2479,12 @@ end; if(DynamicBrakeFlag)and(EngineType=ElectricInductionMotor)then begin - if(Vel>10)then LocBrakePress:=0 else - if(Vel>5)then LocBrakePress:=(10-Vel)/5*LocBrakePress - end; - - (Hamulec as TLSt).SetLBP(LocBrakePress); + (Hamulec as TLSt).SetLBP(LocBrakePress); +// if(Vel>10)then LocBrakePress:=0 else +// if(Vel>5)then LocBrakePress:=(10-Vel)/5*LocBrakePress + end + else + (Hamulec as TLSt).SetLBP(LocBrakePress); end; CV1_L_TR: begin @@ -4095,10 +4092,11 @@ begin Mm:=Mm*RList[MainCtrlActualPos].Bn/(RList[MainCtrlActualPos].Bn+1); //zrobione w momencie, żeby nie dawac elektryki w przeliczaniu sił if (Abs(Im)>Imax) then - Vhyp:=Vhyp+dt*(Abs(Im)/Imax-0.9)*10 //zwieksz czas oddzialywania na PN + Vhyp:=Vhyp+dt//*(Abs(Im)/Imax-0.9)*10 //zwieksz czas oddzialywania na PN else Vhyp:=0; if (Vhyp>CtrlDelay/2) then //jesli czas oddzialywania przekroczony +// dec(MainCtrlActualPos); FuseOff; {wywalanie bezpiecznika z powodu przetezenia silnikow} if (Mains) then //nie wchodzić w funkcję bez potrzeby if (Abs(Voltage)EnginePowerSource.CollectorParameters.MaxV) then @@ -4292,31 +4290,39 @@ begin end; ElectricInductionMotor: begin - if (Voltage>1800) and (MainS) then + if (Mains) then //nie wchodzić w funkcję bez potrzeby + if (Abs(Voltage)EnginePowerSource.CollectorParameters.MaxV) then + MainSwitch(false); +// tmpV:=V/(Pi*WheelDiameter)*Transmision.Ratio;//*DirAbsolute*eimc[eimc_s_p]; - do przemyslenia dzialanie pp + if (MainS) then begin - if ((Hamulec as TLSt).GetEDBCP<0.25)and(LocHandle.GetCP<0.25) then + if ((Hamulec as TLSt).GetEDBCP<0.25) and (LocHandle.GetCP<0.25) and (AnPos<0.01) then DynamicBrakeFlag:=false - else if ((BrakePress>0.25) and ((Hamulec as TLSt).GetEDBCP>0.25)) or (LocHandle.GetCP>0.25) then + else if (((BrakePress>0.25) and ((Hamulec as TLSt).GetEDBCP>0.25) or (LocHandle.GetCP>0.25))) or (AnPos>0.02) then DynamicBrakeFlag:=true; if(DynamicBrakeFlag)then begin if eimv[eimv_Fmax]*sign(V)*DirAbsolute<-1 then - PosRatio:=-sign(V)*DirAbsolute*eimv[eimv_Fr]/(eimc[eimc_p_Fh]*Max0R((Hamulec as TLSt).GetEDBCP,LocHandle.GetCP)/MaxBrakePress[0]{dizel_fill}) + PosRatio:=-sign(V)*DirAbsolute*eimv[eimv_Fr]/(eimc[eimc_p_Fh]*Max0R((Hamulec as TLSt).GetEDBCP/MaxBrakePress[0],AnPos){dizel_fill}) else PosRatio:=0; PosRatio:=round(20*Posratio)/20; if PosRatio<19.5/20 then PosRatio:=PosRatio*0.9; (Hamulec as TLSt).SetED(PosRatio); - PosRatio:=-Max0R((Hamulec as TLSt).GetEDBCP,LocHandle.GetCP)/MaxBrakePress[0]*Max0R(0,Min0R(1,(Vel-eimc[eimc_p_Vh0])/(eimc[eimc_p_Vh1]-eimc[eimc_p_Vh0]))); +// (Hamulec as TLSt).SetLBP(LocBrakePress*(1-PosRatio)); + PosRatio:=-Max0R(Min0R((Hamulec as TLSt).GetEDBCP/MaxBrakePress[0],1),AnPos)*Max0R(0,Min0R(1,(Vel-eimc[eimc_p_Vh0])/(eimc[eimc_p_Vh1]-eimc[eimc_p_Vh0]))); + eimv[eimv_Fzad]:=-Max0R(LocalBrakeRatio,(Hamulec as TLSt).GetEDBCP/MaxBrakePress[0]); tmp:=5; end else begin PosRatio:=(MainCtrlPos/MainCtrlPosNo); + eimv[eimv_Fzad]:=PosRatio; PosRatio:=1.0*(PosRatio*0+1)*PosRatio; (Hamulec as TLSt).SetED(0); +// (Hamulec as TLSt).SetLBP(LocBrakePress); if (PosRatio>dizel_fill) then tmp:=1 else tmp:=4; //szybkie malenie, powolne wzrastanie end; if SlippingWheels then begin PosRatio:=0; tmp:=10; SandDoseOn; end;//przeciwposlizg @@ -4331,19 +4337,22 @@ begin eimv[eimv_Pmax]:=eimc[eimc_p_Ph] else eimv[eimv_Pmax]:=Min0R(eimc[eimc_p_Pmax],0.001*Voltage*(eimc[eimc_p_Imax]-eimc[eimc_f_I0])*Pirazy2*eimc[eimc_s_cim]/eimc[eimc_s_p]/eimc[eimc_s_cfu]); - eimv[eimv_FMAXMAX]:=0.001*SQR(Min0R(eimv[eimv_fkr]/Max0R(abs(enrot)*eimc[eimc_s_p]+eimc[eimc_s_dfmax]*eimv[eimv_ks],eimc[eimc_s_dfmax]),1)*eimc[eimc_f_cfu]/eimc[eimc_s_cfu])*(eimc[eimc_s_dfmax]*eimc[eimc_s_dfic]*eimc[eimc_s_cim])*Transmision.Ratio*NPoweredAxles*2/WheelDiameter; if(DynamicBrakeFlag)then -// if(Vel>eimc[eimc_p_Vh0])then - eimv[eimv_Fmax]:=-sign(V)*(DirAbsolute)*Min0R(eimc[eimc_p_Ph]*3.6/Vel,-eimc[eimc_p_Fh]*dizel_fill)//*Min0R(1,(Vel-eimc[eimc_p_Vh0])/(eimc[eimc_p_Vh1]-eimc[eimc_p_Vh0])) -// else -// eimv[eimv_Fmax]:=0 + begin + eimv[eimv_Fful]:=Min0R(eimc[eimc_p_Ph]*3.6/Vel,Min0R(eimc[eimc_p_Fh],eimv[eimv_FMAXMAX])); + eimv[eimv_Fmax]:=-sign(V)*(DirAbsolute)*Min0R(eimc[eimc_p_Ph]*3.6/Vel,Min0R(-eimc[eimc_p_Fh]*dizel_fill,eimv[eimv_FMAXMAX]));//*Min0R(1,(Vel-eimc[eimc_p_Vh0])/(eimc[eimc_p_Vh1]-eimc[eimc_p_Vh0])) + end else - eimv[eimv_Fmax]:=Min0R(Min0R(3.6*eimv[eimv_Pmax]/Max0R(Vel,1),eimc[eimc_p_F0]-Vel*eimc[eimc_p_a1]),eimv[eimv_FMAXMAX])*dizel_fill; + begin + eimv[eimv_Fful]:=Min0R(Min0R(3.6*eimv[eimv_Pmax]/Max0R(Vel,1),eimc[eimc_p_F0]-Vel*eimc[eimc_p_a1]),eimv[eimv_FMAXMAX]); + eimv[eimv_Fmax]:=eimv[eimv_Fful]*dizel_fill; + end; + eimv[eimv_ks]:=eimv[eimv_Fmax]/eimv[eimv_FMAXMAX]; eimv[eimv_df]:=eimv[eimv_ks]*eimc[eimc_s_dfmax]; - eimv[eimv_fp]:=DirAbsolute*enrot*eimc[eimc_s_p]+eimv[eimv_df]; + eimv[eimv_fp]:=DirAbsolute*enrot*eimc[eimc_s_p]+eimv[eimv_df]; //do przemyslenia dzialanie pp z tmpV // eimv[eimv_U]:=Max0R(eimv[eimv_Uzsmax],Min0R(eimc[eimc_f_cfu]*eimv[eimv_fp],eimv[eimv_Uzsmax])); // eimv[eimv_pole]:=eimv[eimv_U]/(eimv[eimv_fp]*eimc[eimc_s_cfu]); if(abs(eimv[eimv_fp])<=eimv[eimv_fkr])then @@ -4365,13 +4374,13 @@ begin EnginePower:=Abs(eimv[eimv_Ic]*eimv[eimv_U]*NPoweredAxles)/1000; tmpV:=eimv[eimv_fp]; - if (abs(eimv[eimv_If])>1) or (abs(tmpV)>0.1) then + if ((abs(eimv[eimv_If])>1) or (abs(tmpV)>0.1))and(RlistSize>0) then begin - if abs(tmpV)<32 then RventRot:=1.0 else - if abs(tmpV)<39 then RventRot:=0.33*abs(tmpV)/32 else - RventRot:=0.25*abs(tmpV)/39;//} + i:=0; + while (i0 then @@ -4851,34 +4860,39 @@ function T_MoverParameters.ComputeMovement(dt:real; dt1:real; Shape:TTrackShape; var b:byte; Vprev,AccSprev:real; // Iheat:real; prad ogrzewania + hvc: real; const Vepsilon=1e-5; Aepsilon=1e-3; //ASBSpeed=0.8; begin -{ + TotalCurrent:=0; for b:=0 to 1 do //przekazywanie napiec if ((Couplers[b].CouplingFlag and ctrain_power) = ctrain_power)or(((Couplers[b].CouplingFlag and ctrain_heating) = ctrain_heating)and(Heating)) then begin - HVCouplers[1-b][1]:=Max0R(Abs(Voltage),Couplers[b].Connected.HVCouplers[Couplers[b].ConnectedNr][1]); + HVCouplers[1-b][1]:=Max0R(Abs(ElectricTraction.TractionVoltage),Couplers[b].Connected.HVCouplers[Couplers[b].ConnectedNr][1]*0.99); end else - HVCouplers[1-b][1]:=Max0R(Abs(Voltage),0); - end; + HVCouplers[1-b][1]:=Abs(ElectricTraction.TractionVoltage);//Max0R(Abs(Voltage),0); +// end; + + hvc:=HVCouplers[0][1]+HVCouplers[1][1]; + if (Abs(ElectricTraction.TractionVoltage)<1) and (hvc>1)then //bez napiecia, ale jest cos na sprzegach: + begin + for b:=0 to 1 do //przekazywanie pradow + if ((Couplers[b].CouplingFlag and ctrain_power) = ctrain_power)or(((Couplers[b].CouplingFlag and ctrain_heating) = ctrain_heating)and(Heating)) then //jesli spiety + begin + HVCouplers[b][0]:=Couplers[b].Connected.HVCouplers[1-Couplers[b].ConnectedNr][0]+Itot*HVCouplers[b][1]/hvc; //obciążenie rozkladane stosownie do napiec + end + else //pierwszy pojazd + begin + HVCouplers[b][0]:=Itot*HVCouplers[b][1]/hvc; + end; + end + else + begin + TotalCurrent:=HVCouplers[0][0]+HVCouplers[1][0]; + HVCouplers[0][0]:=0; + HVCouplers[1][0]:=0; + end; - for b:=0 to 1 do //przekazywanie pradow - if ((Couplers[b].CouplingFlag and ctrain_power) = ctrain_power)or(((Couplers[b].CouplingFlag and ctrain_heating) = ctrain_heating)and(Heating)) then //jesli spiety - begin - if (HVCouplers[b][1]) > 1 then //przewod pod napiecie - HVCouplers[b][0]:=Couplers[b].Connected.HVCouplers[1-Couplers[b].ConnectedNr][0]+Iheat//obciążenie - else - HVCouplers[b][0]:=0; - end - else //pierwszy pojazd - begin - if (HVCouplers[b][1]) > 1 then //pod napieciem - HVCouplers[b][0]:=0+Iheat//obciążenie - else - HVCouplers[b][0]:=0; - end; -} ClearPendingExceptions; if not TestFlag(DamageFlag,dtrain_out) then @@ -4888,7 +4902,7 @@ begin RunningTraction:=ElectricTraction; with ElectricTraction do if not DynamicBrakeFlag then - RunningTraction.TractionVoltage:=TractionVoltage-Abs(TractionResistivity*(Itot+HVCouplers[0][0]+HVCouplers[1][0])) + RunningTraction.TractionVoltage:=TractionVoltage{-Abs(TractionResistivity*(Itot+HVCouplers[0][0]+HVCouplers[1][0]))} else RunningTraction.TractionVoltage:=TractionVoltage-Abs(TractionResistivity*Itot*0); //zasadniczo ED oporowe nie zmienia napięcia w sieci end; @@ -7357,7 +7371,14 @@ begin SST[k].Pmax:=Min0R(SST[k].Pmax,sqr(SST[k].Umax)/47.6); end; end; + end + else if (Pos('ffList:',lines)>0) then {dla asynchronow} + begin + RListSize:=s2b(DUE(ExtractKeyWord(lines,'Size='))); + for k:=0 to RListSize do + readln(fin, DEList[k].rpm, DEList[k].genpower) end; + end; end; {koniec filtru importu parametrow} if ConversionError=0 then diff --git a/Model3d.cpp b/Model3d.cpp index 435b6fdd..90a3c309 100644 --- a/Model3d.cpp +++ b/Model3d.cpp @@ -91,7 +91,8 @@ void TSubModel::FirstInit() Child = NULL; TextureID = 0; // TexAlpha=false; - iFlags = 0x0200; // bit 9=1: submodel został utworzony a nie ustawiony na wczytany plik + iFlags = 0x0200; // bit 9=1: submodel został utworzony a nie ustawiony na + // wczytany plik // TexHash=false; // Hits=NULL; // CollisionPts=NULL; @@ -137,15 +138,17 @@ TSubModel::~TSubModel() delete[] pName; } /* - else - {//wczytano z pliku binarnego (nie jest właścicielem tablic) - } + else + {//wczytano z pliku binarnego (nie jest właścicielem tablic) + } */ - delete[] smLetter; // używany tylko roboczo dla TP_TEXT, do przyspieszenia wyświetlania + delete[] smLetter; // używany tylko roboczo dla TP_TEXT, do przyspieszenia + // wyświetlania }; void TSubModel::TextureNameSet(const char *n) -{ // ustawienie nazwy submodelu, o ile nie jest wczytany z E3D +{ // ustawienie nazwy submodelu, o + // ile nie jest wczytany z E3D if (iFlags & 0x0200) { // tylko jeżeli submodel zosta utworzony przez new delete[] pTexture; // usunięcie poprzedniej @@ -161,7 +164,8 @@ void TSubModel::TextureNameSet(const char *n) }; void TSubModel::NameSet(const char *n) -{ // ustawienie nazwy submodelu, o ile nie jest wczytany z E3D +{ // ustawienie nazwy submodelu, o ile + // nie jest wczytany z E3D if (iFlags & 0x0200) { // tylko jeżeli submodel zosta utworzony przez new delete[] pName; // usunięcie poprzedniej @@ -176,10 +180,13 @@ void TSubModel::NameSet(const char *n) } }; -// int TSubModel::SeekFaceNormal(DWORD *Masks, int f,DWORD dwMask,vector3 *pt,GLVERTEX +// int TSubModel::SeekFaceNormal(DWORD *Masks, int f,DWORD dwMask,vector3 +// *pt,GLVERTEX // *Vertices) int TSubModel::SeekFaceNormal(DWORD *Masks, int f, DWORD dwMask, float3 *pt, float8 *Vertices) -{ // szukanie punktu stycznego do (pt), zwraca numer wierzchołka, a nie trójkąta +{ // szukanie punktu stycznego + // do (pt), zwraca numer + // wierzchołka, a nie trójkąta int iNumFaces = iNumVerts / 3; // bo maska powierzchni jest jedna na trójkąt // GLVERTEX *p; //roboczy wskaźnik float8 *p; // roboczy wskaźnik @@ -269,13 +276,16 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic) parser >> token; NameSet(token.c_str()); if (dynamic) - { // dla pojazdu, blokujemy załączone submodele, które mogą być nieobsługiwane + { // dla pojazdu, blokujemy załączone submodele, które mogą być + // nieobsługiwane if (token.find("_on") + 3 == token.length()) // jeśli nazwa kończy się na "_on" iVisible = 0; // to domyślnie wyłączyć, żeby się nie nakładało z obiektem "_off" } - else // dla pozostałych modeli blokujemy zapalone światła, które mogą być nieobsługiwane + else // dla pozostałych modeli blokujemy zapalone światła, które mogą być + // nieobsługiwane if (token.find("Light_On") == 0) // jeśli nazwa zaczyna się od "Light_On" - iVisible = 0; // to domyślnie wyłączyć, żeby się nie nakładało z obiektem "Light_Off" + iVisible = 0; // to domyślnie wyłączyć, żeby się nie nakładało z obiektem + // "Light_Off" if (parser.expectToken("anim:")) // Ra: ta informacja by się przydała! { // rodzaj animacji @@ -358,7 +368,8 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic) parser.getToken(fCosHotspotAngle); // kąt liczony dla średnicy, a nie promienia fCosHotspotAngle = cos(DegToRad(0.5 * fCosHotspotAngle)); iNumVerts = 1; - iFlags |= 0x4010; // rysowane w cyklu nieprzezroczystych, macierz musi zostać bez zmiany + iFlags |= 0x4010; // rysowane w cyklu nieprzezroczystych, macierz musi + // zostać bez zmiany } else if (eType < TP_ROTATOR) { @@ -417,7 +428,8 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic) szTexturePath, Global::asCurrentTexturePath.c_str(), texture); // TexAlpha=TTexturesManager::GetAlpha(TextureID); // iFlags|=TexAlpha?0x20:0x10; //0x10-nieprzezroczysta, 0x20-przezroczysta - if (Opacity < 1.0) // przezroczystość z tekstury brana tylko dla Opacity 0! + if (Opacity < 1.0) // przezroczystość z tekstury brana tylko dla Opacity + // 0! iFlags |= TTexturesManager::GetAlpha(TextureID) ? 0x20 : 0x10; // 0x10-nieprzezroczysta, 0x20-przezroczysta @@ -449,15 +461,17 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic) if (eType < TP_ROTATOR) { // wczytywanie wierzchołków parser.ignoreToken(); - // Ra 15-01: to wczytać jako tekst - jeśli pierwszy znak zawiera "*", to dalej będzie nazwa - // wcześniejszego submodelu, z którego należy wziąć wierzchołki - // zapewni to jakąś zgodność wstecz, bo zamiast liczby będzie ciąg, którego wartość powinna - // być uznana jako zerowa + // Ra 15-01: to wczytać jako tekst - jeśli pierwszy znak zawiera "*", to + // dalej będzie nazwa wcześniejszego submodelu, z którego należy wziąć + // wierzchołki + // zapewni to jakąś zgodność wstecz, bo zamiast liczby będzie ciąg, którego + // wartość powinna być uznana jako zerowa // parser.getToken(iNumVerts); parser.getToken(token); if (token[0] == '*') - { // jeśli pierwszy znak jest gwiazdką, poszukać submodelu o nazwie bez tej gwiazdki i wziąć - // z niego wierzchołki + { // jeśli pierwszy znak jest gwiazdką, poszukać + // submodelu o nazwie bez tej gwiazdki i wziąć z + // niego wierzchołki Error("Verticles reference not yet supported!"); } else @@ -474,19 +488,23 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic) { Vertices = new float8[iNumVerts]; iNumFaces = iNumVerts / 3; - sg = new DWORD[iNumFaces]; // maski powierzchni: 0 oznacza brak użredniania wektorów - // normalnych - int *wsp = new int[iNumVerts]; // z którego wierzchołka kopiować wektor normalny + sg = new DWORD[iNumFaces]; // maski powierzchni: 0 oznacza brak + // użredniania wektorów normalnych + int *wsp = new int[iNumVerts]; // z którego wierzchołka kopiować wektor + // normalny int maska = 0; for (int i = 0; i < iNumVerts; i++) - { // Ra: z konwersją na układ scenerii - będzie wydajniejsze wyświetlanie + { // Ra: z konwersją na układ scenerii - będzie wydajniejsze + // wyświetlanie wsp[i] = -1; // wektory normalne nie są policzone dla tego wierzchołka if ((i % 3) == 0) - { // jeśli będzie maska -1, to dalej będą wierzchołki z wektorami normalnymi, - // podanymi jawnie + { // jeśli będzie maska -1, to dalej będą + // wierzchołki z wektorami normalnymi, podanymi + // jawnie parser.getToken(maska); // maska powierzchni trójkąta - sg[i / 3] = (maska == -1) ? 0 : maska; // dla maski -1 będzie 0, czyli nie - // ma wspólnych wektorów normalnych + sg[i / 3] = (maska == -1) ? 0 : maska; // dla maski -1 będzie 0, + // czyli nie ma wspólnych + // wektorów normalnych } parser.getToken(Vertices[i].Point.x); parser.getToken(Vertices[i].Point.y); @@ -512,15 +530,15 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic) WriteLog(AnsiString("Degenerated triangle ignored in: \"") + AnsiString(pName) + "\", verticle " + AnsiString(i)); } - if (i > 0) // jeśli pierwszy trójkąt będzie zdegenerowany, to zostanie - // usunięty i nie ma co sprawdzać + if (i > 0) // jeśli pierwszy trójkąt będzie zdegenerowany, to + // zostanie usunięty i nie ma co sprawdzać if (((Vertices[i].Point - Vertices[i - 1].Point).Length() > 1000.0) || ((Vertices[i - 1].Point - Vertices[i - 2].Point).Length() > 1000.0) || ((Vertices[i - 2].Point - Vertices[i].Point).Length() > 1000.0)) - { // jeżeli są dalej niż 2km od siebie //Ra 15-01: obiekt wstawiany nie - // powinien być większy niż 300m (trójkąty terenu w E3D mogą mieć - // 1.5km) + { // jeżeli są dalej niż 2km od siebie //Ra 15-01: + // obiekt wstawiany nie powinien być większy niż + // 300m (trójkąty terenu w E3D mogą mieć 1.5km) --iNumFaces; // o jeden trójkąt mniej iNumVerts -= 3; // czyli o 3 wierzchołki i -= 3; // wczytanie kolejnego w to miejsce @@ -531,8 +549,9 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic) } int i; // indeks dla trójkątów float3 *n = new float3[iNumFaces]; // tablica wektorów normalnych dla trójkątów - for (i = 0; i < iNumFaces; i++) // pętla po trójkątach - będzie szybciej, jak - // wstępnie przeliczymy normalne trójkątów + for (i = 0; i < iNumFaces; i++) // pętla po trójkątach - będzie + // szybciej, jak wstępnie przeliczymy + // normalne trójkątów n[i] = SafeNormalize( CrossProduct(Vertices[i * 3].Point - Vertices[i * 3 + 1].Point, Vertices[i * 3].Point - Vertices[i * 3 + 2].Point)); @@ -541,8 +560,8 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic) float3 norm; // roboczy wektor normalny for (v = 0; v < iNumVerts; v++) { // pętla po wierzchołkach trójkątów - if (wsp[v] >= - 0) // jeśli już był liczony wektor normalny z użyciem tego wierzchołka + if (wsp[v] >= 0) // jeśli już był liczony wektor normalny z użyciem + // tego wierzchołka Vertices[v].Normal = Vertices[wsp[v]].Normal; // to wystarczy skopiować policzony wcześniej else @@ -551,15 +570,16 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic) norm = float3(0, 0, 0); // liczenie zaczynamy od zera f = v; // zaczynamy dodawanie wektorów normalnych od własnego while (f >= 0) - { // sumowanie z wektorem normalnym sąsiada (włącznie ze sobą) + { // sumowanie z wektorem normalnym sąsiada (włącznie + // ze sobą) wsp[f] = v; // informacja, że w tym wierzchołku jest już policzony // wektor normalny norm += n[f / 3]; f = SeekFaceNormal(sg, f / 3 + 1, sg[i], &Vertices[v].Point, Vertices); // i szukanie od kolejnego trójkąta } - // Ra 15-01: należało by jeszcze uwzględnić skalowanie wprowadzane przez - // transformy, aby normalne po przeskalowaniu były jednostkowe + // Ra 15-01: należało by jeszcze uwzględnić skalowanie wprowadzane + // przez transformy, aby normalne po przeskalowaniu były jednostkowe Vertices[v].Normal = SafeNormalize(norm); // przepisanie do wierzchołka trójkąta } @@ -576,7 +596,8 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic) } // obsługa submodelu z własną listą wierzchołków } else if (eType == TP_STARS) - { // punkty świecące dookólnie - składnia jak dla smt_Mesh + { // punkty świecące dookólnie - składnia jak + // dla smt_Mesh parser.ignoreToken(); parser.getToken(iNumVerts); // Vertices=new GLVERTEX[iNumVerts]; @@ -604,7 +625,8 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic) }; int TSubModel::TriangleAdd(TModel3d *m, int tex, int tri) -{ // dodanie trójkątów do submodelu, używane przy tworzeniu E3D terenu +{ // dodanie trójkątów do submodelu, używane + // przy tworzeniu E3D terenu TSubModel *s = this; while (s ? (s->TextureID != tex) : false) { // szukanie submodelu o danej teksturze @@ -636,7 +658,8 @@ int TSubModel::TriangleAdd(TModel3d *m, int tex, int tri) }; float8 *__fastcall TSubModel::TrianglePtr(int tex, int pos, int *la, int *ld, int *ls) -{ // zwraca wskaźnik do wypełnienia tabeli wierzchołków, używane przy tworzeniu E3D terenu +{ // zwraca wskaźnik do wypełnienia tabeli wierzchołków, używane + // przy tworzeniu E3D terenu TSubModel *s = this; while (s ? s->TextureID != tex : false) { // szukanie submodelu o danej teksturze @@ -660,7 +683,8 @@ float8 *__fastcall TSubModel::TrianglePtr(int tex, int pos, int *la, int *ld, in }; void TSubModel::DisplayLists() -{ // utworznie po jednej skompilowanej liście dla każdego submodelu +{ // utworznie po jednej skompilowanej liście dla + // każdego submodelu if (Global::bUseVBO) return; // Ra: przy VBO to się nie przyda // iFlags|=0x4000; //wyłączenie przeliczania wierzchołków, bo nie są zachowane @@ -682,9 +706,9 @@ void TSubModel::DisplayLists() for (int i = 0; i < iNumVerts; i++) { /* - glNormal3dv(&Vertices[i].Normal.x); - glTexCoord2f(Vertices[i].tu,Vertices[i].tv); - glVertex3dv(&Vertices[i].Point.x); + glNormal3dv(&Vertices[i].Normal.x); + glTexCoord2f(Vertices[i].tu,Vertices[i].tv); + glVertex3dv(&Vertices[i].Point.x); */ glNormal3fv(&Vertices[i].Normal.x); glTexCoord2f(Vertices[i].tu, Vertices[i].tv); @@ -738,7 +762,8 @@ void TSubModel::DisplayLists() glMaterialfv(GL_FRONT, GL_EMISSION, emm2); glEndList(); } - // SafeDeleteArray(Vertices); //przy VBO muszą zostać do załadowania całego modelu + // SafeDeleteArray(Vertices); //przy VBO muszą zostać do załadowania całego + // modelu if (Child) Child->DisplayLists(); if (Next) @@ -762,11 +787,12 @@ void TSubModel::InitialRotate(bool doit) iFlags &= ~0x8000; // jednak jednostkowa po obróceniu } if (Child) - Child->InitialRotate( - false); // potomnych nie obracamy już, tylko ewentualnie optymalizujemy + Child->InitialRotate(false); // potomnych nie obracamy już, tylko + // ewentualnie optymalizujemy else if (Global::iConvertModels & 2) // optymalizacja jest opcjonalna if ((iFlags & 0xC000) == 0x8000) // o ile nie ma animacji - { // jak nie ma potomnych, można wymnożyć przez transform i wyjedynkować go + { // jak nie ma potomnych, można wymnożyć przez transform i wyjedynkować + // go float4x4 *mat = GetMatrix(); // transform submodelu if (Vertices) { @@ -774,8 +800,8 @@ void TSubModel::InitialRotate(bool doit) Vertices[i].Point = (*mat) * Vertices[i].Point; (*mat)(3)[0] = (*mat)(3)[1] = (*mat)(3)[2] = 0.0; // zerujemy przesunięcie przed obracaniem normalnych - if (eType != TP_STARS) // gwiazdki mają kolory zamiast normalnych, to ich wtedy - // nie ruszamy + if (eType != TP_STARS) // gwiazdki mają kolory zamiast normalnych, to + // ich wtedy nie ruszamy for (int i = 0; i < iNumVerts; ++i) Vertices[i].Normal = SafeNormalize((*mat) * Vertices[i].Normal); } @@ -785,7 +811,8 @@ void TSubModel::InitialRotate(bool doit) } else // jak jest jednostkowy i nie ma animacji if (doit) - { // jeśli jest jednostkowy transform, to przeliczamy wierzchołki, a mnożenie podajemy dalej + { // jeśli jest jednostkowy transform, to przeliczamy + // wierzchołki, a mnożenie podajemy dalej double t; if (Vertices) for (int i = 0; i < iNumVerts; ++i) @@ -809,7 +836,8 @@ void TSubModel::InitialRotate(bool doit) void TSubModel::ChildAdd(TSubModel *SubModel) { // dodanie submodelu potemnego (uzależnionego) - // Ra: zmiana kolejności, żeby kolejne móc renderować po aktualnym (było przed) + // Ra: zmiana kolejności, żeby kolejne móc renderować po aktualnym (było + // przed) if (SubModel) SubModel->NextAdd(Child); // Ra: zmiana kolejności renderowania Child = SubModel; @@ -826,7 +854,8 @@ void TSubModel::NextAdd(TSubModel *SubModel) int TSubModel::FlagsCheck() { // analiza koniecznych zmian pomiędzy submodelami // samo pomijanie glBindTexture() nie poprawi wydajności - // ale można sprawdzić, czy można w ogóle pominąć kod do tekstur (sprawdzanie replaceskin) + // ale można sprawdzić, czy można w ogóle pominąć kod do tekstur (sprawdzanie + // replaceskin) int i; if (Child) { // Child jest renderowany po danym submodelu @@ -836,7 +865,8 @@ int TSubModel::FlagsCheck() i = Child->FlagsCheck(); iFlags |= 0x00FF0000 & ((i << 16) | (i) | (i >> 8)); // potomny, rodzeństwo i dzieci if (eType == TP_TEXT) - { // wyłączenie renderowania Next dla znaków wyświetlacza tekstowego + { // wyłączenie renderowania Next dla znaków + // wyświetlacza tekstowego TSubModel *p = Child; while (p) { @@ -846,21 +876,23 @@ int TSubModel::FlagsCheck() } } if (Next) - { // Next jest renderowany po danym submodelu (kolejność odwrócona po wczytaniu T3D) + { // Next jest renderowany po danym submodelu (kolejność odwrócona + // po wczytaniu T3D) if (TextureID) // o ile dany ma teksturę if ((TextureID != Next->TextureID) || (i & 0x00800000)) // a ma inną albo dzieci zmieniają iFlags |= 0x80; // to dany submodel musi sobie ją ustawiać i = Next->FlagsCheck(); iFlags |= 0xFF000000 & ((i << 24) | (i << 8) | (i)); // następny, kolejne i ich dzieci - // tekstury nie ustawiamy tylko wtedy, gdy jest taka sama jak Next i jego dzieci nie - // zmieniają + // tekstury nie ustawiamy tylko wtedy, gdy jest taka sama jak Next i jego + // dzieci nie zmieniają } return iFlags; }; void TSubModel::SetRotate(float3 vNewRotateAxis, float fNewAngle) -{ // obrócenie submodelu wg podanej osi (np. wskazówki w kabinie) +{ // obrócenie submodelu wg podanej + // osi (np. wskazówki w kabinie) v_RotateAxis = vNewRotateAxis; f_Angle = fNewAngle; if (fNewAngle != 0.0) @@ -872,7 +904,9 @@ void TSubModel::SetRotate(float3 vNewRotateAxis, float fNewAngle) } void TSubModel::SetRotateXYZ(float3 vNewAngles) -{ // obrócenie submodelu o podane kąty wokół osi lokalnego układu +{ // obrócenie submodelu o + // podane kąty wokół osi + // lokalnego układu v_Angles = vNewAngles; b_Anim = at_RotateXYZ; b_aAnim = at_RotateXYZ; @@ -880,7 +914,9 @@ void TSubModel::SetRotateXYZ(float3 vNewAngles) } void TSubModel::SetRotateXYZ(vector3 vNewAngles) -{ // obrócenie submodelu o podane kąty wokół osi lokalnego układu +{ // obrócenie submodelu o + // podane kąty wokół osi + // lokalnego układu v_Angles.x = vNewAngles.x; v_Angles.y = vNewAngles.y; v_Angles.z = vNewAngles.z; @@ -908,7 +944,9 @@ void TSubModel::SetTranslate(vector3 vNewTransVector) } void TSubModel::SetRotateIK1(float3 vNewAngles) -{ // obrócenie submodelu o podane kąty wokół osi lokalnego układu +{ // obrócenie submodelu o + // podane kąty wokół osi + // lokalnego układu v_Angles = vNewAngles; iAnimOwner = iInstance; // zapamiętanie czyja jest animacja } @@ -1004,13 +1042,14 @@ void TSubModel::RaAnimation(TAnimType a) break; case at_Billboard: // obrót w pionie do kamery { - matrix4x4 mat; // potrzebujemy współrzędne przesunięcia środka układu współrzędnych - // submodelu + matrix4x4 mat; // potrzebujemy współrzędne przesunięcia środka układu + // współrzędnych submodelu glGetDoublev(GL_MODELVIEW_MATRIX, mat.getArray()); // pobranie aktualnej matrycy float3 gdzie = float3(mat[3][0], mat[3][1], mat[3][2]); // początek układu współrzędnych submodelu względem kamery glLoadIdentity(); // macierz jedynkowa - glTranslatef(gdzie.x, gdzie.y, gdzie.z); // początek układu zostaje bez zmian + glTranslatef(gdzie.x, gdzie.y, gdzie.z); // początek układu zostaje bez + // zmian glRotated(atan2(gdzie.x, gdzie.z) * 180.0 / M_PI, 0.0, 1.0, 0.0); // jedynie obracamy w pionie o kąt } @@ -1024,7 +1063,8 @@ void TSubModel::RaAnimation(TAnimType a) glRotated(-fmod(Global::fTimeAngleDeg, 360.0), 0.0, 1.0, 0.0); // obrót dobowy osi OX break; case at_IK11: // ostatni element animacji szkieletowej (podudzie, stopa) - glRotatef(v_Angles.z, 0.0, 1.0, 0.0); // obrót względem osi pionowej (azymut) + glRotatef(v_Angles.z, 0.0, 1.0, 0.0); // obrót względem osi pionowej + // (azymut) glRotatef(v_Angles.x, 1.0, 0.0, 0.0); // obrót względem poziomu (deklinacja) break; case at_DigiClk: // animacja zegara cyfrowego @@ -1034,9 +1074,10 @@ void TSubModel::RaAnimation(TAnimType a) { // pętla po submodelach potomnych i obracanie ich o kąt zależy od czasu if (sm->pName) { // musi mieć niepustą nazwę - if ((*sm->pName) >= '0') - if ((*sm->pName) <= '5') // zegarek ma 6 cyfr maksymalnie - sm->SetRotate(float3(0, 1, 0), -Global::fClockAngleDeg[(*sm->pName) - '0']); + if ((sm->pName[0]) >= '0') + if ((sm->pName[0]) <= '5') // zegarek ma 6 cyfr maksymalnie + sm->SetRotate(float3(0, 1, 0), + -Global::fClockAngleDeg[(sm->pName[0]) - '0']); } sm = sm->NextGet(); } while (sm); @@ -1093,8 +1134,8 @@ void TSubModel::RenderDL() if (fCosViewAngle > fCosFalloffAngle) // kąt większy niż maksymalny stożek swiatła { double Distdimm = 1.0; - if (fCosViewAngle < fCosHotspotAngle) // zmniejszona jasność między Hotspot a - // Falloff + if (fCosViewAngle < + fCosHotspotAngle) // zmniejszona jasność między Hotspot a Falloff if (fCosFalloffAngle < fCosHotspotAngle) Distdimm = 1.0 - (fCosHotspotAngle - fCosViewAngle) / @@ -1102,20 +1143,21 @@ void TSubModel::RenderDL() glColor3f(f4Diffuse[0] * Distdimm, f4Diffuse[1] * Distdimm, f4Diffuse[2] * Distdimm); /* TODO: poprawic to zeby dzialalo - if (iFarAttenDecay>0) - switch (iFarAttenDecay) - { - case 1: - Distdimm=fFarDecayRadius/(1+sqrt(fSquareDist)); //dorobic od - kata - break; - case 2: - Distdimm=fFarDecayRadius/(1+fSquareDist); //dorobic od kata - break; - } - if (Distdimm>1) - Distdimm=1; - glColor3f(Diffuse[0]*Distdimm,Diffuse[1]*Distdimm,Diffuse[2]*Distdimm); + if (iFarAttenDecay>0) + switch (iFarAttenDecay) + { + case 1: + Distdimm=fFarDecayRadius/(1+sqrt(fSquareDist)); + //dorobic od kata + break; + case 2: + Distdimm=fFarDecayRadius/(1+fSquareDist); + //dorobic od kata + break; + } + if (Distdimm>1) + Distdimm=1; + glColor3f(Diffuse[0]*Distdimm,Diffuse[1]*Distdimm,Diffuse[2]*Distdimm); */ // glPopMatrix(); // return; @@ -1124,7 +1166,8 @@ void TSubModel::RenderDL() } else if (eType == TP_STARS) { - // glDisable(GL_LIGHTING); //Tolaris-030603: bo mu punkty swiecace sie blendowaly + // glDisable(GL_LIGHTING); //Tolaris-030603: bo mu punkty swiecace sie + // blendowaly if (Global::fLuminance < fLight) { glMaterialfv(GL_FRONT, GL_EMISSION, f4Diffuse); // zeby swiecilo na kolorowo @@ -1184,12 +1227,14 @@ void TSubModel::RenderAlphaDL() } if (Child != NULL) if (eType == TP_TEXT) - { // tekst renderujemy w specjalny sposób, zamiast submodeli z łańcucha Child + { // tekst renderujemy w specjalny sposób, zamiast + // submodeli z łańcucha Child int i, j = pasText->Length(); TSubModel *p; char c; if (!smLetter) - { // jeśli nie ma tablicy, to ją stworzyć; miejsce nieodpowiednie, ale tymczasowo + { // jeśli nie ma tablicy, to ją stworzyć; miejsce + // nieodpowiednie, ale tymczasowo // może być smLetter = new TSubModel *[256]; // tablica wskaźników submodeli dla // wyświetlania tekstu @@ -1248,7 +1293,8 @@ void TSubModel::RenderVBO() else glBindTexture(GL_TEXTURE_2D, TextureID); // również 0 glColor3fv(f4Diffuse); // McZapkie-240702: zamiast ub - // glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,f4Diffuse); //to samo, co glColor + // glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,f4Diffuse); //to samo, + // co glColor if (Global::fLuminance < fLight) { glMaterialfv(GL_FRONT, GL_EMISSION, f4Diffuse); // zeby swiecilo na kolorowo @@ -1271,8 +1317,8 @@ void TSubModel::RenderVBO() if (fCosViewAngle > fCosFalloffAngle) // kąt większy niż maksymalny stożek swiatła { double Distdimm = 1.0; - if (fCosViewAngle < fCosHotspotAngle) // zmniejszona jasność między Hotspot a - // Falloff + if (fCosViewAngle < + fCosHotspotAngle) // zmniejszona jasność między Hotspot a Falloff if (fCosFalloffAngle < fCosHotspotAngle) Distdimm = 1.0 - (fCosHotspotAngle - fCosViewAngle) / @@ -1280,30 +1326,36 @@ void TSubModel::RenderVBO() /* TODO: poprawic to zeby dzialalo - 2- Inverse (Applies inverse decay. The formula is luminance=R0/R, where R0 is - the radial source of the light if no attenuation is used, or the Near End - value of the light if Attenuation is used. R is the radial distance of the - illuminated surface from R0.) + 2- Inverse (Applies inverse decay. The formula is luminance=R0/R, where + R0 is + the radial source of the light if no attenuation is + used, or the Near End + value of the light if Attenuation is used. R is the + radial distance of the + illuminated surface from R0.) - 3- Inverse Square (Applies inverse-square decay. The formula for this is (R0/R)^2. - This is actually the "real-world" decay of light, but you might find it too dim - in the world of computer graphics.) + 3- Inverse Square (Applies inverse-square decay. The formula for this is + (R0/R)^2. + This is actually the "real-world" decay of light, but + you might find it too dim + in the world of computer graphics.) .DecayRadius -- The distance over which the decay occurs. - if (iFarAttenDecay>0) - switch (iFarAttenDecay) - { - case 1: - Distdimm=fFarDecayRadius/(1+sqrt(fSquareDist)); //dorobic od - kata - break; - case 2: - Distdimm=fFarDecayRadius/(1+fSquareDist); //dorobic od kata - break; - } - if (Distdimm>1) - Distdimm=1; + if (iFarAttenDecay>0) + switch (iFarAttenDecay) + { + case 1: + Distdimm=fFarDecayRadius/(1+sqrt(fSquareDist)); + //dorobic od kata + break; + case 2: + Distdimm=fFarDecayRadius/(1+fSquareDist); + //dorobic od kata + break; + } + if (Distdimm>1) + Distdimm=1; */ glBindTexture(GL_TEXTURE_2D, 0); // nie teksturować @@ -1313,10 +1365,12 @@ void TSubModel::RenderVBO() f4Diffuse[2] * Distdimm, 0}; // glColor3f(f4Diffuse[0]*Distdimm,f4Diffuse[1]*Distdimm,f4Diffuse[2]*Distdimm); glColorMaterial(GL_FRONT, GL_EMISSION); - glDisable(GL_LIGHTING); // Tolaris-030603: bo mu punkty swiecace sie blendowaly + glDisable(GL_LIGHTING); // Tolaris-030603: bo mu punkty swiecace sie + // blendowaly glColor3fv(color); // inaczej są białe glMaterialfv(GL_FRONT, GL_EMISSION, color); - glDrawArrays(GL_POINTS, iVboPtr, iNumVerts); // narysuj wierzchołek z VBO + glDrawArrays(GL_POINTS, iVboPtr, iNumVerts); // narysuj wierzchołek z + // VBO glEnable(GL_LIGHTING); glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); // co ma ustawiać glColor glMaterialfv(GL_FRONT, GL_EMISSION, emm2); // bez tego słupy się świecą @@ -1324,16 +1378,21 @@ void TSubModel::RenderVBO() } else if (eType == TP_STARS) { - // glDisable(GL_LIGHTING); //Tolaris-030603: bo mu punkty swiecace sie blendowaly + // glDisable(GL_LIGHTING); //Tolaris-030603: bo mu punkty swiecace sie + // blendowaly if (Global::fLuminance < fLight) - { // Ra: pewnie można by to zrobić lepiej, bez powtarzania StartVBO() + { // Ra: pewnie można by to zrobić + // lepiej, bez powtarzania StartVBO() pRoot->EndVBO(); // Ra: to też nie jest zbyt ładne if (pRoot->StartColorVBO()) - { // wyświetlanie kolorowych punktów zamiast trójkątów + { // wyświetlanie kolorowych punktów zamiast + // trójkątów glBindTexture(GL_TEXTURE_2D, 0); // tekstury nie ma glColorMaterial(GL_FRONT, GL_EMISSION); - glDisable(GL_LIGHTING); // Tolaris-030603: bo mu punkty swiecace sie blendowaly - // glMaterialfv(GL_FRONT,GL_EMISSION,f4Diffuse); //zeby swiecilo na kolorowo + glDisable(GL_LIGHTING); // Tolaris-030603: bo mu punkty swiecace sie + // blendowaly + // glMaterialfv(GL_FRONT,GL_EMISSION,f4Diffuse); //zeby swiecilo na + // kolorowo glDrawArrays(GL_POINTS, iVboPtr, iNumVerts); // narysuj naraz wszystkie punkty z VBO glEnable(GL_LIGHTING); @@ -1345,9 +1404,9 @@ void TSubModel::RenderVBO() } } /*Ra: tu coś jest bez sensu... - else - { - glBindTexture(GL_TEXTURE_2D, 0); + else + { + glBindTexture(GL_TEXTURE_2D, 0); // if (eType==smt_FreeSpotLight) // { // if (iFarAttenDecay==0) @@ -1355,18 +1414,20 @@ void TSubModel::RenderVBO() // } // else //TODO: poprawic zeby dzialalo - glColor3f(f4Diffuse[0],f4Diffuse[1],f4Diffuse[2]); - glColorMaterial(GL_FRONT,GL_EMISSION); - glDisable(GL_LIGHTING); //Tolaris-030603: bo mu punkty swiecace sie blendowaly - //glBegin(GL_POINTS); - glDrawArrays(GL_POINTS,iVboPtr,iNumVerts); //narysuj wierzchołek z VBO - // glVertex3f(0,0,0); - //glEnd(); - glEnable(GL_LIGHTING); - glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE); - glMaterialfv(GL_FRONT,GL_EMISSION,emm2); - //glEndList(); - } + glColor3f(f4Diffuse[0],f4Diffuse[1],f4Diffuse[2]); + glColorMaterial(GL_FRONT,GL_EMISSION); + glDisable(GL_LIGHTING); //Tolaris-030603: bo mu punkty + swiecace sie blendowaly + //glBegin(GL_POINTS); + glDrawArrays(GL_POINTS,iVboPtr,iNumVerts); //narysuj + wierzchołek z VBO + // glVertex3f(0,0,0); + //glEnd(); + glEnable(GL_LIGHTING); + glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE); + glMaterialfv(GL_FRONT,GL_EMISSION,emm2); + //glEndList(); + } */ if (Child != NULL) if (iAlpha & iFlags & 0x001F0000) @@ -1459,7 +1520,8 @@ void TSubModel::RaArrayFill(CVertNormTex *Vert) }; void TSubModel::Info() -{ // zapisanie informacji o submodelu do obiektu pomocniczego +{ // zapisanie informacji o submodelu do obiektu + // pomocniczego TSubModelInfo *info = TSubModelInfo::pTable + TSubModelInfo::iCurrent; info->pSubModel = this; if (fMatrix && (iFlags & 0x8000)) // ma matrycę i jest ona niejednostkowa @@ -1474,7 +1536,8 @@ void TSubModel::Info() } if (info->iTexture < 0) // jeśli nie znaleziono we wcześniejszych { - info->iTexture = ++info->iTotalTextures; // przydzielenie numeru tekstury w pliku (od 1) + info->iTexture = ++info->iTotalTextures; // przydzielenie numeru tekstury + // w pliku (od 1) AnsiString t = AnsiString(pTexture); if (t.SubString(t.Length() - 3, 4) == ".tga") t.Delete(t.Length() - 3, 4); @@ -1510,7 +1573,9 @@ void TSubModel::Info() }; void TSubModel::InfoSet(TSubModelInfo *info) -{ // ustawienie danych wg obiektu pomocniczego do zapisania w pliku +{ // ustawienie danych wg obiektu + // pomocniczego do zapisania w + // pliku int ile = (char *)&uiDisplayList - (char *)&eType; // ilość bajtów pomiędzy tymi zmiennymi ZeroMemory(this, sizeof(TSubModel)); // zerowaie całości CopyMemory(this, info->pSubModel, ile); // skopiowanie pamięci 1:1 @@ -1538,14 +1603,16 @@ void TSubModel::BinInit(TSubModel *s, float4x4 *m, float8 *v, TStringPack *t, TS pName = n->String(iName); AnsiString s = AnsiString(pName); if (!s.IsEmpty()) - { // jeśli dany submodel jest zgaszonym światłem, to domyślnie go ukrywamy + { // jeśli dany submodel jest zgaszonym światłem, to + // domyślnie go ukrywamy if (s.SubString(1, 8) == "Light_On") // jeśli jest światłem numerowanym - iVisible = 0; // to domyślnie wyłączyć, żeby się nie nakładało z obiektem - // "Light_Off" + iVisible = 0; // to domyślnie wyłączyć, żeby się nie nakładało z + // obiektem "Light_Off" else if (dynamic) // inaczej wyłączało smugę w latarniach if (s.SubString(s.Length() - 2, 3) == "_on") // jeśli jest kontrolką w stanie zapalonym - iVisible = 0; // to domyślnie wyłączyć, żeby się nie nakładało z obiektem "_off" + iVisible = 0; // to domyślnie wyłączyć, żeby się nie nakładało z + // obiektem "_off" } } else @@ -1561,7 +1628,8 @@ void TSubModel::BinInit(TSubModel *s, float4x4 *m, float8 *v, TStringPack *t, TS TextureID = TTexturesManager::GetTextureID(szTexturePath, Global::asCurrentTexturePath.c_str(), t.c_str()); // TexAlpha=TTexturesManager::GetAlpha(TextureID); //zmienna robocza - // ustawienie cyklu przezroczyste/nieprzezroczyste zależnie od własności stałej tekstury + // ustawienie cyklu przezroczyste/nieprzezroczyste zależnie od własności + // stałej tekstury // iFlags=(iFlags&~0x30)|(TTexturesManager::GetAlpha(TextureID)?0x20:0x10); // //0x10-nieprzezroczysta, 0x20-przezroczysta if (Opacity < 1.0) // przezroczystość z tekstury brana tylko dla Opacity 0! @@ -1572,12 +1640,15 @@ void TSubModel::BinInit(TSubModel *s, float4x4 *m, float8 *v, TStringPack *t, TS iFlags |= 0x10; // normalnie nieprzezroczyste } b_aAnim = b_Anim; // skopiowanie animacji do drugiego cyklu - iFlags &= ~0x0200; // wczytano z pliku binarnego (nie jest właścicielem tablic) + iFlags &= ~0x0200; // wczytano z pliku binarnego (nie jest właścicielem + // tablic) Vertices = v + iVboPtr; - // if (!iNumVerts) eType=-1; //tymczasowo zmiana typu, żeby się nie renderowało na siłę + // if (!iNumVerts) eType=-1; //tymczasowo zmiana typu, żeby się nie + // renderowało na siłę }; void TSubModel::AdjustDist() -{ // aktualizacja odległości faz LoD, zależna od rozdzielczości pionowej oraz multisamplingu +{ // aktualizacja odległości faz LoD, zależna od + // rozdzielczości pionowej oraz multisamplingu if (fSquareMaxDist > 0.0) fSquareMaxDist *= Global::fDistanceFactor; if (fSquareMinDist > 0.0) @@ -1605,7 +1676,8 @@ void TSubModel::ColorsSet(int *a, int *d, int *s) }; void TSubModel::ParentMatrix(float4x4 *m) { // pobranie transformacji względem wstawienia modelu - // jeśli nie zostało wykonane Init() (tzn. zaraz po wczytaniu T3D), to dodatkowy obrót + // jeśli nie zostało wykonane Init() (tzn. zaraz po wczytaniu T3D), to + // dodatkowy obrót // obrót T3D jest wymagany np. do policzenia wysokości pantografów *m = float4x4(*fMatrix); // skopiowanie, bo będziemy mnożyć // m(3)[1]=m[3][1]+0.054; //w górę o wysokość ślizgu (na razie tak) @@ -1616,11 +1688,12 @@ void TSubModel::ParentMatrix(float4x4 *m) *m = *sm->Parent->GetMatrix() * *m; sm = sm->Parent; } - // dla ostatniego może być potrzebny dodatkowy obrót, jeśli wczytano z T3D, a nie obrócono - // jeszcze + // dla ostatniego może być potrzebny dodatkowy obrót, jeśli wczytano z T3D, a + // nie obrócono jeszcze }; float TSubModel::MaxY(const float4x4 &m) -{ // obliczenie maksymalnej wysokości, na początek ślizgu w pantografie +{ // obliczenie maksymalnej wysokości, + // na początek ślizgu w pantografie if (eType != 4) return 0; // tylko dla trójkątów liczymy if (iNumVerts < 1) @@ -1666,7 +1739,8 @@ TModel3d::~TModel3d() { // SafeDeleteArray(Materials); if (iFlags & 0x0200) - { // wczytany z pliku tekstowego, submodele sprzątają same + { // wczytany z pliku tekstowego, submodele sprzątają + // same SafeDelete(Root); // submodele się usuną rekurencyjnie } else @@ -1686,7 +1760,9 @@ TSubModel *__fastcall TModel3d::AddToNamed(const char *Name, TSubModel *SubModel }; void TModel3d::AddTo(TSubModel *tmp, TSubModel *SubModel) -{ // jedyny poprawny sposób dodawania submodeli, inaczej mogą zginąć przy zapisie E3D +{ // jedyny poprawny sposób dodawania + // submodeli, inaczej mogą zginąć + // przy zapisie E3D if (tmp) { // jeśli znaleziony, podłączamy mu jako potomny tmp->ChildAdd(SubModel); @@ -1784,13 +1860,13 @@ void TModel3d::LoadFromBinFile(char *FileName, bool dynamic) break; case 'SUB0': // submodele: 'SUB0',len,(256 bajtów na submodel) iSubModelsCount = (k - 2) / 64; - Root = (TSubModel *)(iModel + i + 2); // numery na wskaźniki przetworzymy - // później + Root = + (TSubModel *)(iModel + i + 2); // numery na wskaźniki przetworzymy później break; case 'SUB1': // submodele: 'SUB1',len,(320 bajtów na submodel) iSubModelsCount = (k - 2) / 80; - Root = (TSubModel *)(iModel + i + 2); // numery na wskaźniki przetworzymy - // później + Root = + (TSubModel *)(iModel + i + 2); // numery na wskaźniki przetworzymy później for (ch = 1; ch < iSubModelsCount; ++ch) // trzeba przesunąć bliżej, bo 256 wystarczy MoveMemory(((char *)Root) + 256 * ch, ((char *)Root) + 320 * ch, 256); @@ -1809,13 +1885,15 @@ void TModel3d::LoadFromBinFile(char *FileName, bool dynamic) break; case 'IDX4': // indeksy 4B: 'IDX4',len,(po 4 bajty na numer wierzchołka) break; - case 'TEX0': // tekstury: 'TEX0',len,(łańcuchy zakończone zerem - pliki tekstur) + case 'TEX0': // tekstury: 'TEX0',len,(łańcuchy zakończone zerem - pliki + // tekstur) Textures.Init((char *)(iModel + i)); //łącznie z nagłówkiem break; case 'TIX0': // indeks nazw tekstur Textures.InitIndex((int *)(iModel + i)); //łącznie z nagłówkiem break; - case 'NAM0': // nazwy: 'NAM0',len,(łańcuchy zakończone zerem - nazwy submodeli) + case 'NAM0': // nazwy: 'NAM0',len,(łańcuchy zakończone zerem - nazwy + // submodeli) Names.Init((char *)(iModel + i)); //łącznie z nagłówkiem break; case 'NIX0': // indeks nazw submodeli @@ -1853,25 +1931,30 @@ void TModel3d::LoadFromTextFile(char *FileName, bool dynamic) { std::string parent; // parser.getToken(parent); - parser.getTokens(1, false); // nazwa submodelu nadrzędnego bez zmieny na małe + parser.getTokens(1, false); // nazwa submodelu nadrzędnego bez zmieny na + // małe parser >> parent; if (parent == "") break; SubModel = new TSubModel(); iNumVerts += SubModel->Load(parser, this, iNumVerts, dynamic); - SubModel->Parent = AddToNamed( - parent.c_str(), SubModel); // będzie potrzebne do wyliczenia pozycji, np. pantografu + SubModel->Parent = + AddToNamed(parent.c_str(), + SubModel); // będzie potrzebne do wyliczenia pozycji, np. pantografu // iSubModelsCount++; parser.getToken(token); } - // Ra: od wersji 334 przechylany jest cały model, a nie tylko pierwszy submodel - // ale bujanie kabiny nadal używa bananów :( od 393 przywrócone, ale z dodatkowym warunkiem + // Ra: od wersji 334 przechylany jest cały model, a nie tylko pierwszy + // submodel + // ale bujanie kabiny nadal używa bananów :( od 393 przywrócone, ale z + // dodatkowym warunkiem if (Global::iConvertModels & 4) { // automatyczne banany czasem psuły przechylanie kabin... if (dynamic && Root) { if (Root->NextGet()) // jeśli ma jakiekolwiek kolejne - { // dynamic musi mieć "banana", bo tylko pierwszy obiekt jest animowany, a następne nie + { // dynamic musi mieć "banana", bo tylko pierwszy obiekt jest animowany, + // a następne nie SubModel = new TSubModel(); // utworzenie pustego SubModel->ChildAdd(Root); Root = SubModel; @@ -1883,16 +1966,19 @@ void TModel3d::LoadFromTextFile(char *FileName, bool dynamic) } void TModel3d::Init() -{ // obrócenie początkowe układu współrzędnych, dla pojazdów wykonywane po analizie animacji +{ // obrócenie początkowe układu współrzędnych, dla + // pojazdów wykonywane po analizie animacji if (iFlags & 0x8000) return; // operacje zostały już wykonane if (Root) { if (iFlags & 0x0200) // jeśli wczytano z pliku tekstowego - { // jest jakiś dziwny błąd, że obkręcany ma być tylko ostatni submodel głównego łańcucha + { // jest jakiś dziwny błąd, że obkręcany ma być tylko ostatni submodel + // głównego łańcucha // TSubModel *p=Root; // do - //{p->InitialRotate(true); //ostatniemu należy się konwersja układu współrzędnych + //{p->InitialRotate(true); //ostatniemu należy się konwersja układu + // współrzędnych // p=p->NextGet(); //} // while (p->NextGet()) @@ -1910,11 +1996,12 @@ void TModel3d::Init() { if (Global::fDistanceFactor != 1.0) // trochę zaoszczędzi czasu na modelach z wieloma submocelami - Root->AdjustDist(); // aktualizacja odległości faz LoD, zależnie od rozdzielczości - // pionowej oraz multisamplingu + Root->AdjustDist(); // aktualizacja odległości faz LoD, zależnie od + // rozdzielczości pionowej oraz multisamplingu if (Global::bUseVBO) { - if (!m_pVNT) // jeśli nie ma jeszcze tablicy (wczytano z pliku tekstowego) + if (!m_pVNT) // jeśli nie ma jeszcze tablicy (wczytano z pliku + // tekstowego) { // tworzenie tymczasowej tablicy z wierzchołkami całego modelu MakeArray(iNumVerts); // tworzenie tablic dla VBO Root->RaArrayFill(m_pVNT); // wypełnianie tablicy @@ -2027,7 +2114,8 @@ void TModel3d::BreakHierarhy() }; /* -void TModel3d::Render(vector3 pPosition,double fAngle,GLuint ReplacableSkinId,int iAlpha) +void TModel3d::Render(vector3 pPosition,double fAngle,GLuint +ReplacableSkinId,int iAlpha) { // glColor3f(1.0f,1.0f,1.0f); // glColor3f(0.0f,0.0f,0.0f); @@ -2080,7 +2168,8 @@ void TModel3d::RenderAlpha(double fSquareDistance, GLuint *ReplacableSkinId, int }; /* -void TModel3d::RaRender(vector3 pPosition,double fAngle,GLuint *ReplacableSkinId,int +void TModel3d::RaRender(vector3 pPosition,double fAngle,GLuint +*ReplacableSkinId,int iAlpha) { // glColor3f(1.0f,1.0f,1.0f); @@ -2100,7 +2189,8 @@ iAlpha) fSquareDist=SquareMagnitude(pos); */ /* - fSquareDist=SquareMagnitude(pPosition-Global::GetCameraPosition()); //zmienna globalna! + fSquareDist=SquareMagnitude(pPosition-Global::GetCameraPosition()); //zmienna +globalna! if (StartVBO()) {//odwrócenie flag, aby wyłapać nieprzezroczyste Root->ReplacableSet(ReplacableSkinId,iAlpha^0x0F0F000F); @@ -2142,14 +2232,16 @@ void TModel3d::RaRenderAlpha(double fSquareDistance, GLuint *ReplacableSkinId, i }; /* -void TModel3d::RaRenderAlpha(vector3 pPosition,double fAngle,GLuint *ReplacableSkinId,int +void TModel3d::RaRenderAlpha(vector3 pPosition,double fAngle,GLuint +*ReplacableSkinId,int iAlpha) { glPushMatrix(); glTranslatef(pPosition.x,pPosition.y,pPosition.z); if (fAngle!=0) glRotatef(fAngle,0,1,0); - fSquareDist=SquareMagnitude(pPosition-Global::GetCameraPosition()); //zmienna globalna! + fSquareDist=SquareMagnitude(pPosition-Global::GetCameraPosition()); //zmienna +globalna! if (StartVBO()) {Root->ReplacableSet(ReplacableSkinId,iAlpha); Root->RaRenderAlpha(); @@ -2244,7 +2336,8 @@ void TModel3d::RaRenderAlpha(vector3 *vPosition, vector3 *vAngle, GLuint *Replac //----------------------------------------------------------------------------- int TModel3d::TerrainCount() -{ // zliczanie kwadratów kilometrowych (główna linia po Next) do tworznia tablicy +{ // zliczanie kwadratów kilometrowych (główna + // linia po Next) do tworznia tablicy int i = 0; TSubModel *r = Root; while (r) @@ -2273,16 +2366,16 @@ void TModel3d::TerrainRenderVBO(int n) // if (vAngle->y!=0.0) glRotated(vAngle->y,0.0,1.0,0.0); // if (vAngle->x!=0.0) glRotated(vAngle->x,1.0,0.0,0.0); // if (vAngle->z!=0.0) glRotated(vAngle->z,0.0,0.0,1.0); - // TSubModel::fSquareDist=SquareMagnitude(*vPosition-Global::GetCameraPosition()); //zmienna - // globalna! + // TSubModel::fSquareDist=SquareMagnitude(*vPosition-Global::GetCameraPosition()); + // //zmienna globalna! if (StartVBO()) { // odwrócenie flag, aby wyłapać nieprzezroczyste // Root->ReplacableSet(ReplacableSkinId,iAlpha^0x0F0F000F); TSubModel *r = Root; while (r) { - if (r->iVisible == n) // tylko jeśli ma być widoczny w danej ramce (problem dla - // 0==false) + if (r->iVisible == + n) // tylko jeśli ma być widoczny w danej ramce (problem dla 0==false) r->RenderVBO(); // sub kolejne (Next) się nie wyrenderują r = r->NextGet(); } diff --git a/Train.cpp b/Train.cpp index 1b1922a9..c24aad4a 100644 --- a/Train.cpp +++ b/Train.cpp @@ -127,7 +127,7 @@ void TCab::Update() } for (i = 0; i < iButtons; ++i) { // animacje dwustanowe - // btList[i].Update(); //odczyt parametru i wybór submodelu + btList[i].Update(); // odczyt parametru i wybór submodelu } }; @@ -232,9 +232,10 @@ bool TTrain::Init(TDynamicObject *NewDynamicObject, bool e3d) // McZapkie: jazda luzem: // dsbRunningNoise=TSoundsManager::GetFromName("runningnoise.wav"); - // McZapkie? - dzwieki slyszalne tylko wewnatrz kabiny - generowane przez obiekt sterowany: + // McZapkie? - dzwieki slyszalne tylko wewnatrz kabiny - generowane przez + // obiekt sterowany: - // McZapkie-080302 sWentylatory.Init("wenton.wav","went.wav","wentoff.wav"); + // McZapkie-080302 sWentylatory.Init("wenton.wav","went.wav","wentoff.wav"); // McZapkie-010302 // sCompressor.Init("compressor-start.wav","compressor.wav","compressor-stop.wav"); @@ -303,8 +304,9 @@ void TTrain::OnKeyDown(int cKey) if (GetAsyncKeyState(VK_SHIFT) < 0) { // wciśnięty [Shift] - if (cKey == Global::Keys[k_IncMainCtrlFAST]) // McZapkie-200702: szybkie przelaczanie na - // poz. bezoporowa + if (cKey == Global::Keys[k_IncMainCtrlFAST]) // McZapkie-200702: szybkie + // przelaczanie na poz. + // bezoporowa { if (mvControlled->IncMainCtrl(2)) { @@ -394,7 +396,8 @@ void TTrain::OnKeyDown(int cKey) // if // (((mvControlled->TrainType==dt_EZT)||(mvControlled->EngineType==ElectricSeriesMotor)||(mvControlled->EngineType==DieselElectric))&&(!mvControlled->Battery)) if (!mvControlled->Battery) - { // wyłącznik jest też w SN61, ewentualnie załączać prąd na stałe z poziomu FIZ + { // wyłącznik jest też w SN61, ewentualnie + // załączać prąd na stałe z poziomu FIZ if (mvOccupied->BatterySwitch(true)) // bateria potrzebna np. do zapalenia świateł { dsbSwitch->Play(0, 0, 0); @@ -441,8 +444,9 @@ void TTrain::OnKeyDown(int cKey) else //----------- - if (cKey == - Global::Keys[k_BrakeProfile]) // McZapkie-240302-B: przelacznik opoznienia hamowania + if (cKey == Global::Keys[k_BrakeProfile]) // McZapkie-240302-B: + // przelacznik opoznienia + // hamowania { // yB://ABu: male poprawki, zeby bylo mozna ustawic dowolny wagon int CouplNr = -2; if (!FreeFlyModeFlag) @@ -492,12 +496,14 @@ void TTrain::OnKeyDown(int cKey) } else //----------- - // hunter-261211: przetwornica i sprzezarka przeniesione do TTrain::Update() - /* if (cKey==Global::Keys[k_Converter]) //NBMX 14-09-2003: przetwornica wl + // hunter-261211: przetwornica i sprzezarka przeniesione do + // TTrain::Update() + /* if (cKey==Global::Keys[k_Converter]) //NBMX 14-09-2003: + przetwornica wl { - if ((mvControlled->PantFrontVolt) || (mvControlled->PantRearVolt) || - (mvControlled->EnginePowerSource.SourceType!=CurrentCollector) || - (!Global::bLiveTraction)) + if ((mvControlled->PantFrontVolt) || (mvControlled->PantRearVolt) || + (mvControlled->EnginePowerSource.SourceType!=CurrentCollector) || + (!Global::bLiveTraction)) if (mvControlled->ConverterSwitch(true)) { dsbSwitch->SetVolume(DSBVOLUME_MAX); @@ -507,7 +513,8 @@ void TTrain::OnKeyDown(int cKey) else if (cKey==Global::Keys[k_Compressor]) //NBMX 14-09-2003: sprezarka wl { - if ((mvControlled->ConverterFlag) || (mvControlled->CompressorPower<2)) + if ((mvControlled->ConverterFlag) || + (mvControlled->CompressorPower<2)) if (mvControlled->CompressorSwitch(true)) { dsbSwitch->SetVolume(DSBVOLUME_MAX); @@ -537,14 +544,15 @@ void TTrain::OnKeyDown(int cKey) dsbSwitch->Play(0, 0, 0); } } - else if (cKey == Global::Keys[k_SmallCompressor]) // Winger 160404: mala sprezarka wl + else if (cKey == Global::Keys[k_SmallCompressor]) // Winger 160404: mala + // sprezarka wl { // Ra: dźwięk, gdy razem z [Shift] if ((mvControlled->TrainType & dt_EZT) ? mvControlled == mvOccupied : !mvOccupied->ActiveCab) // tylko w maszynowym if (Console::Pressed(VK_CONTROL)) // z [Ctrl] - mvControlled->bPantKurek3 = true; // zbiornik pantografu połączony jest ze - // zbiornikiem głównym (pompowanie nie ma - // sensu) + mvControlled->bPantKurek3 = true; // zbiornik pantografu połączony + // jest ze zbiornikiem głównym + // (pompowanie nie ma sensu) else if (!mvControlled->PantCompFlag) // jeśli wyłączona if (mvControlled->Battery) // jeszcze musi być załączona bateria if (mvControlled->PantPress < 4.8) // piszą, że to tak nie działa @@ -555,17 +563,20 @@ void TTrain::OnKeyDown(int cKey) } } else if (cKey == VkKeyScan('q')) // ze Shiftem - włączenie AI - { // McZapkie-240302 - wlaczanie automatycznego pilota (zadziala tylko w trybie debugmode) + { // McZapkie-240302 - wlaczanie automatycznego pilota (zadziala tylko w + // trybie debugmode) if (DynamicObject->Mechanik) { if (DebugModeFlag) - if (DynamicObject->Mechanik - ->AIControllFlag) //żeby nie trzeba było rozłączać dla zresetowania + if (DynamicObject->Mechanik->AIControllFlag) //żeby nie trzeba było + // rozłączać dla + // zresetowania DynamicObject->Mechanik->TakeControl(false); DynamicObject->Mechanik->TakeControl(true); } } - else if (cKey == Global::Keys[k_MaxCurrent]) // McZapkie-160502: F - wysoki rozruch + else if (cKey == Global::Keys[k_MaxCurrent]) // McZapkie-160502: F - + // wysoki rozruch { if ((mvControlled->EngineType == DieselElectric) && (mvControlled->ShuntModeAllow) && (mvControlled->MainCtrlPos == 0)) @@ -578,7 +589,8 @@ void TTrain::OnKeyDown(int cKey) dsbSwitch->Play(0, 0, 0); } /* Ra: przeniesione do Mover.cpp - if (mvControlled->TrainType!=dt_EZT) //to powinno być w fizyce, a nie w kabinie! + if (mvControlled->TrainType!=dt_EZT) //to powinno być w fizyce, a + nie w kabinie! if (mvControlled->MinCurrentSwitch(true)) { dsbSwitch->SetVolume(DSBVOLUME_MAX); @@ -586,7 +598,8 @@ void TTrain::OnKeyDown(int cKey) } */ } - else if (cKey == Global::Keys[k_CurrentAutoRelay]) // McZapkie-241002: G - wlaczanie PSR + else if (cKey == Global::Keys[k_CurrentAutoRelay]) // McZapkie-241002: G - + // wlaczanie PSR { if (mvControlled->AutoRelaySwitch(true)) { @@ -594,7 +607,8 @@ void TTrain::OnKeyDown(int cKey) dsbSwitch->Play(0, 0, 0); } } - else if (cKey == Global::Keys[k_FailedEngineCutOff]) // McZapkie-060103: E - wylaczanie + else if (cKey == Global::Keys[k_FailedEngineCutOff]) // McZapkie-060103: E + // - wylaczanie // sekcji silnikow { if (mvControlled->CutOffEngine()) @@ -636,7 +650,8 @@ void TTrain::OnKeyDown(int cKey) else //----------- // hunter-131211: dzwiek dla przelacznika universala podniesionego - // hunter-091012: ubajerowanie swiatla w kabinie (wyrzucenie przyciemnienia pod Univ4) + // hunter-091012: ubajerowanie swiatla w kabinie (wyrzucenie + // przyciemnienia pod Univ4) if (cKey == Global::Keys[k_Univ3]) { if (Console::Pressed(VK_CONTROL)) @@ -679,10 +694,12 @@ void TTrain::OnKeyDown(int cKey) else //----------- if (cKey == Global::Keys[k_PantFrontUp]) - { // Winger 160204: podn. przedn. pantografu + { // Winger 160204: podn. + // przedn. pantografu if (mvOccupied->ActiveCab == 1) //||((mvOccupied->ActiveCab<1)&&((mvControlled->TrainType&(dt_ET40|dt_ET41|dt_ET42|dt_EZT))==0))) - { // przedni gdy w kabinie 1 lub (z wyjątkiem ET40, ET41, ET42 i EZT) gdy w kabinie -1 + { // przedni gdy w kabinie 1 lub (z wyjątkiem ET40, ET41, ET42 i EZT) gdy + // w kabinie -1 mvControlled->PantFrontSP = false; if (mvControlled->PantFront(true)) if (mvControlled->PantFrontStart != 1) @@ -705,10 +722,13 @@ void TTrain::OnKeyDown(int cKey) } } else if (cKey == Global::Keys[k_PantRearUp]) - { // Winger 160204: podn. tyln. pantografu względem kierunku jazdy + { // Winger 160204: podn. + // tyln. pantografu + // względem kierunku jazdy if (mvOccupied->ActiveCab == 1) //||((mvOccupied->ActiveCab<1)&&((mvControlled->TrainType&(dt_ET40|dt_ET41|dt_ET42|dt_EZT))==0))) - { // tylny gdy w kabinie 1 lub (z wyjątkiem ET40, ET41, ET42 i EZT) gdy w kabinie -1 + { // tylny gdy w kabinie 1 lub (z wyjątkiem ET40, ET41, ET42 i EZT) gdy w + // kabinie -1 mvControlled->PantRearSP = false; if (mvControlled->PantRear(true)) if (mvControlled->PantRearStart != 1) @@ -731,18 +751,21 @@ void TTrain::OnKeyDown(int cKey) } } else if (cKey == Global::Keys[k_Active]) // yB 300407: przelacznik rozrzadu - { // Ra 2014-06: uruchomiłem to, aby aktywować czuwak w zajmowanym członie, a wyłączyć w - // innych - // Ra 2014-03: aktywacja czuwaka przepięta na ustawienie kierunku w mvOccupied + { // Ra 2014-06: uruchomiłem to, aby aktywować czuwak w zajmowanym członie, + // a wyłączyć w innych + // Ra 2014-03: aktywacja czuwaka przepięta na ustawienie kierunku w + // mvOccupied // if (mvControlled->Battery) //jeśli bateria jest już załączona - // mvOccupied->BatterySwitch(true); //to w ten oto durny sposób aktywuje się CA/SHP + // mvOccupied->BatterySwitch(true); //to w ten oto durny sposób aktywuje + // się CA/SHP // if (mvControlled->CabActivisation()) // { // dsbSwitch->SetVolume(DSBVOLUME_MAX); // dsbSwitch->Play(0,0,0); // } } - else if (cKey == Global::Keys[k_Heating]) // Winger 020304: ogrzewanie skladu - wlaczenie + else if (cKey == Global::Keys[k_Heating]) // Winger 020304: ogrzewanie + // skladu - wlaczenie { // Ra 2014-09: w trybie latania obsługa jest w World.cpp if (!FreeFlyModeFlag) { @@ -863,7 +886,8 @@ void TTrain::OnKeyDown(int cKey) } } //----------- } - else if (cKey == Global::Keys[k_UpperSign]) // ABu 060205: światło górne - włączenie + else if (cKey == Global::Keys[k_UpperSign]) // ABu 060205: światło górne - + // włączenie { if ((GetAsyncKeyState(VK_CONTROL) < 0) && (ggRearUpperLightButton.SubModel)) // hunter-230112 - z controlem zapala z tylu @@ -914,8 +938,9 @@ void TTrain::OnKeyDown(int cKey) } } } - else if (cKey == - Global::Keys[k_RightSign]) // Winger 070304: swiatla tylne (koncowki) - wlaczenie + else if (cKey == Global::Keys[k_RightSign]) // Winger 070304: swiatla + // tylne (koncowki) - + // wlaczenie { if ((GetAsyncKeyState(VK_CONTROL) < 0) && (ggRearRightLightButton.SubModel)) // hunter-230112 - z controlem zapala z tylu @@ -1039,7 +1064,8 @@ void TTrain::OnKeyDown(int cKey) ; else if (cKey == Global::Keys[k_IncScndCtrl]) // if (MoverParameters->ScndCtrlPosScndCtrlPosNo) - // if (mvControlled->EnginePowerSource.SourceType==CurrentCollector) + // if + // (mvControlled->EnginePowerSource.SourceType==CurrentCollector) if (mvControlled->ShuntMode) { mvControlled->AnPos += (GetDeltaTime() / 0.85f); @@ -1088,7 +1114,10 @@ void TTrain::OnKeyDown(int cKey) else ; else if (cKey == Global::Keys[k_IncLocalBrakeLevel]) - { // Ra 2014-09: w trybie latania obsługa jest w World.cpp + { // Ra 2014-09: w + // trybie latania + // obsługa jest w + // World.cpp if (!FreeFlyModeFlag) { if (GetAsyncKeyState(VK_CONTROL) < 0) @@ -1103,7 +1132,10 @@ void TTrain::OnKeyDown(int cKey) } } else if (cKey == Global::Keys[k_DecLocalBrakeLevel]) - { // Ra 2014-06: wersja dla swobodnego latania przeniesiona do World.cpp + { // Ra 2014-06: wersja dla + // swobodnego latania + // przeniesiona do + // World.cpp if (!FreeFlyModeFlag) { if (GetAsyncKeyState(VK_CONTROL) < 0) @@ -1111,16 +1143,17 @@ void TTrain::OnKeyDown(int cKey) mvOccupied->DecManualBrakeLevel(1); else ; - else // Ra 1014-06: AI potrafi zahamować pomocniczym mimo jego braku - odhamować - // jakoś trzeba + else // Ra 1014-06: AI potrafi zahamować pomocniczym mimo jego braku - + // odhamować jakoś trzeba if ((mvOccupied->LocalBrake != ManualBrake) || mvOccupied->LocalBrakePos) mvOccupied->DecLocalBrakeLevel(1); } } else if ((cKey == Global::Keys[k_IncBrakeLevel]) && (mvOccupied->BrakeHandle != FV4a)) // if (mvOccupied->IncBrakeLevel()) - if (mvOccupied->BrakeLevelAdd( - Global::fBrakeStep)) // nieodpowiedni warunek; true, jeśli można dalej kręcić + if (mvOccupied->BrakeLevelAdd(Global::fBrakeStep)) // nieodpowiedni + // warunek; true, jeśli + // można dalej kręcić { keybrakecount = 0; if ((isEztOer) && (mvOccupied->BrakeCtrlPos < 3)) @@ -1133,7 +1166,8 @@ void TTrain::OnKeyDown(int cKey) ; else if ((cKey == Global::Keys[k_DecBrakeLevel]) && (mvOccupied->BrakeHandle != FV4a)) { - // nową wersję dostarczył ZiomalCl ("fixed looped sound in ezt when using NUM_9 key") + // nową wersję dostarczył ZiomalCl ("fixed looped sound in ezt when using + // NUM_9 key") if ((mvOccupied->BrakeCtrlPos > -1) || (keybrakecount > 1)) { @@ -1148,12 +1182,14 @@ void TTrain::OnKeyDown(int cKey) else keybrakecount += 1; // koniec wersji dostarczonej przez ZiomalCl - /* wersja poprzednia - ten pierwszy if ze średnikiem nie działał jak warunek + /* wersja poprzednia - ten pierwszy if ze średnikiem nie działał jak + warunek if ((mvOccupied->BrakeCtrlPos>-1)|| (keybrakecount>1)) { if (mvOccupied->DecBrakeLevel()); { - if ((isEztOer) && (mvOccupied->BrakeCtrlPos<2)&&(keybrakecount<=1)) + if ((isEztOer) && + (mvOccupied->BrakeCtrlPos<2)&&(keybrakecount<=1)) { dsbPneumaticSwitch->SetVolume(-10); dsbPneumaticSwitch->Play(0,0,0); @@ -1197,11 +1233,10 @@ void TTrain::OnKeyDown(int cKey) mvOccupied->BrakeLevelSet(mvOccupied->BrakeCtrlPosNo / 2 + (mvOccupied->BrakeHandle == FV4a ? 1 : 0)); if (GetAsyncKeyState(VK_CONTROL) < 0) - mvOccupied->BrakeLevelSet(mvOccupied->Handle->GetPos(bh_NP)); // yB: czy ten stos - // funkcji nie - // powinien być jako - // oddzielna funkcja - // movera? + mvOccupied->BrakeLevelSet( + mvOccupied->Handle->GetPos(bh_NP)); // yB: czy ten stos funkcji nie + // powinien być jako oddzielna + // funkcja movera? } else if (cKey == Global::Keys[k_Brake1]) { @@ -1260,7 +1295,8 @@ void TTrain::OnKeyDown(int cKey) } else //--------------- - // hunter-221211: hamulec przeciwposlizgowy przeniesiony do TTrain::Update() + // hunter-221211: hamulec przeciwposlizgowy przeniesiony do + // TTrain::Update() if (cKey == Global::Keys[k_AntiSlipping]) { if (mvOccupied->BrakeSystem != ElectroPneumatic) @@ -1375,7 +1411,9 @@ void TTrain::OnKeyDown(int cKey) // (mvControlled->EngineType==ElectricSeriesMotor)|| // (mvControlled->EngineType==DieselElectric)) if (mvOccupied->BatterySwitch(false)) - { // ewentualnie zablokować z FIZ, np. w samochodach się nie odłącza akumulatora + { // ewentualnie zablokować z FIZ, + // np. w samochodach się nie + // odłącza akumulatora dsbSwitch->Play(0, 0, 0); // mvOccupied->SecuritySystem.Status=0; mvControlled->PantFront(false); @@ -1384,7 +1422,8 @@ void TTrain::OnKeyDown(int cKey) } //----------- - // if (cKey==Global::Keys[k_Active]) //yB 300407: przelacznik rozrzadu + // if (cKey==Global::Keys[k_Active]) //yB 300407: przelacznik + // rozrzadu // { // if (mvControlled->CabDeactivisation()) // { @@ -1394,7 +1433,9 @@ void TTrain::OnKeyDown(int cKey) // } // else if (cKey == Global::Keys[k_BrakeProfile]) - { // yB://ABu: male poprawki, zeby bylo mozna ustawic dowolny wagon + { // yB://ABu: male poprawki, zeby + // bylo mozna ustawic dowolny + // wagon int CouplNr = -2; if (!FreeFlyModeFlag) { @@ -1443,7 +1484,8 @@ void TTrain::OnKeyDown(int cKey) } else //----------- - // hunter-261211: przetwornica i sprzezarka przeniesione do TTrain::Update() + // hunter-261211: przetwornica i sprzezarka przeniesione do + // TTrain::Update() if (cKey == Global::Keys[k_Converter]) { if (ggConverterButton.GetValue() != 0) @@ -1486,14 +1528,15 @@ void TTrain::OnKeyDown(int cKey) } } } - else if (cKey == Global::Keys[k_SmallCompressor]) // Winger 160404: mala sprezarka wl + else if (cKey == Global::Keys[k_SmallCompressor]) // Winger 160404: mala + // sprezarka wl { // Ra: bez [Shift] też dać dźwięk if ((mvControlled->TrainType & dt_EZT) ? mvControlled == mvOccupied : !mvOccupied->ActiveCab) // tylko w maszynowym if (Console::Pressed(VK_CONTROL)) // z [Ctrl] - mvControlled->bPantKurek3 = false; // zbiornik pantografu połączony jest z małą - // sprężarką (pompowanie ma sens, ale potem - // trzeba przełączyć) + mvControlled->bPantKurek3 = + false; // zbiornik pantografu połączony jest z małą sprężarką + // (pompowanie ma sens, ale potem trzeba przełączyć) else if (!mvControlled->PantCompFlag) // jeśli wyłączona if (mvControlled->Battery) // jeszcze musi być załączona bateria if (mvControlled->PantPress < 4.8) // piszą, że to tak nie działa @@ -1503,7 +1546,8 @@ void TTrain::OnKeyDown(int cKey) dsbSwitch->Play(0, 0, 0); // dźwięk tylko po naciśnięciu klawisza } } - // McZapkie-240302 - wylaczanie automatycznego pilota (w trybie ~debugmode mozna tylko raz) + // McZapkie-240302 - wylaczanie automatycznego pilota (w trybie ~debugmode + // mozna tylko raz) else if (cKey == VkKeyScan('q')) // bez Shift { if (DynamicObject->Mechanik) @@ -1530,7 +1574,8 @@ void TTrain::OnKeyDown(int cKey) } */ } - else if (cKey == Global::Keys[k_CurrentAutoRelay]) // McZapkie-241002: g - wylaczanie PSR + else if (cKey == Global::Keys[k_CurrentAutoRelay]) // McZapkie-241002: g - + // wylaczanie PSR { if (mvControlled->AutoRelaySwitch(false)) { @@ -1539,7 +1584,8 @@ void TTrain::OnKeyDown(int cKey) } } else - // hunter-201211: piasecznica poprawiona oraz przeniesiona do TTrain::Update() + // hunter-201211: piasecznica poprawiona oraz przeniesiona do + // TTrain::Update() if (cKey == Global::Keys[k_Sand]) { /* @@ -1590,7 +1636,9 @@ void TTrain::OnKeyDown(int cKey) false; // wyjście z maszynowego wyłącza sprężarkę pomocniczą } else if (cKey == Global::Keys[k_Couple]) - { // ABu051104: male zmiany, zeby mozna bylo laczyc odlegle wagony + { // ABu051104: male zmiany, zeby + // mozna bylo laczyc odlegle + // wagony // da sie zoptymalizowac, ale nie ma na to czasu :( if (iCabn > 0) { @@ -1598,24 +1646,26 @@ void TTrain::OnKeyDown(int cKey) { /* if (mvControlled->Couplers[iCabn-1].CouplingFlag==0) { - if - (mvControlled->Attach(iCabn-1,mvControlled->Couplers[iCabn-1].Connected,ctrain_coupler)) +if + (mvControlled->Attach(iCabn-1,mvControlled->Couplers[iCabn-1].Connected,ctrain_coupler)) { dsbCouplerAttach->SetVolume(DSBVOLUME_MAX); dsbCouplerAttach->Play(0,0,0); - //ABu: aha, a guzik, nie dziala i nie bedzie, a przydalo by sie cos takiego: + //ABu: aha, a guzik, nie dziala i nie bedzie, a przydalo by sie + cos takiego: //DynamicObject->NextConnected=mvControlled->Couplers[iCabn-1].Connected; //DynamicObject->PrevConnected=mvControlled->Couplers[iCabn-1].Connected; } } else - if (!TestFlag(mvControlled->Couplers[iCabn-1].CouplingFlag,ctrain_pneumatic)) + if + (!TestFlag(mvControlled->Couplers[iCabn-1].CouplingFlag,ctrain_pneumatic)) { //ABu021104: zeby caly czas bylo widac sprzegi: - if - (mvControlled->Attach(iCabn-1,mvControlled->Couplers[iCabn-1].Connected,mvControlled->Couplers[iCabn-1].CouplingFlag+ctrain_pneumatic)) - //if - (mvControlled->Attach(iCabn-1,mvControlled->Couplers[iCabn-1].Connected,ctrain_pneumatic)) +if + (mvControlled->Attach(iCabn-1,mvControlled->Couplers[iCabn-1].Connected,mvControlled->Couplers[iCabn-1].CouplingFlag+ctrain_pneumatic)) +//if + (mvControlled->Attach(iCabn-1,mvControlled->Couplers[iCabn-1].Connected,ctrain_pneumatic)) { rsHiss.Play(1,DSBPLAY_LOOPING,true,DynamicObject->GetPosition()); } @@ -1742,11 +1792,13 @@ void TTrain::OnKeyDown(int cKey) } } else if (cKey == Global::Keys[k_DeCouple]) - { // ABu051104: male zmiany, zeby mozna bylo rozlaczac odlegle wagony + { // ABu051104: male zmiany, + // zeby mozna bylo rozlaczac + // odlegle wagony if (iCabn > 0) { - if (!FreeFlyModeFlag) // tryb 'kabinowy' (pozwala również rozłączyć sprzęgi - // zablokowane) + if (!FreeFlyModeFlag) // tryb 'kabinowy' (pozwala również rozłączyć + // sprzęgi zablokowane) { if (DynamicObject->DettachStatus(iCabn - 1) < 0) // jeśli jest co odczepić if (DynamicObject->Dettach(iCabn - 1)) // iCab==1:przód,iCab==2:tył @@ -1810,7 +1862,8 @@ void TTrain::OnKeyDown(int cKey) else //----------- // hunter-131211: dzwiek dla przelacznika universala - // hunter-091012: ubajerowanie swiatla w kabinie (wyrzucenie przyciemnienia pod Univ4) + // hunter-091012: ubajerowanie swiatla w kabinie (wyrzucenie + // przyciemnienia pod Univ4) if (cKey == Global::Keys[k_Univ3]) { if (Console::Pressed(VK_CONTROL)) @@ -1850,7 +1903,8 @@ void TTrain::OnKeyDown(int cKey) } } //----------- - else if (cKey == Global::Keys[k_PantFrontDown]) // Winger 160204: opuszczanie prz. patyka + else if (cKey == Global::Keys[k_PantFrontDown]) // Winger 160204: + // opuszczanie prz. patyka { if (mvOccupied->ActiveCab == 1) //||((mvOccupied->ActiveCab<1)&&(mvControlled->TrainType!=dt_ET40)&&(mvControlled->TrainType!=dt_ET41)&&(mvControlled->TrainType!=dt_ET42)&&(mvControlled->TrainType!=dt_EZT))) @@ -1875,7 +1929,8 @@ void TTrain::OnKeyDown(int cKey) } } } - else if (cKey == Global::Keys[k_PantRearDown]) // Winger 160204: opuszczanie tyl. patyka + else if (cKey == Global::Keys[k_PantRearDown]) // Winger 160204: + // opuszczanie tyl. patyka { if (mvOccupied->ActiveCab == 1) //||((mvOccupied->ActiveCab<1)&&(mvControlled->TrainType!=dt_ET40)&&(mvControlled->TrainType!=dt_ET41)&&(mvControlled->TrainType!=dt_ET42)&&(mvControlled->TrainType!=dt_EZT))) @@ -1901,7 +1956,8 @@ void TTrain::OnKeyDown(int cKey) } } } - else if (cKey == Global::Keys[k_Heating]) // Winger 020304: ogrzewanie - wylaczenie + else if (cKey == Global::Keys[k_Heating]) // Winger 020304: ogrzewanie - + // wylaczenie { // Ra 2014-09: w trybie latania obsługa jest w World.cpp if (!FreeFlyModeFlag) { @@ -1913,7 +1969,8 @@ void TTrain::OnKeyDown(int cKey) } } } - else if (cKey == Global::Keys[k_LeftSign]) // ABu 060205: lewe swiatlo - wylaczenie + else if (cKey == Global::Keys[k_LeftSign]) // ABu 060205: lewe swiatlo - + // wylaczenie { if ((GetAsyncKeyState(VK_CONTROL) < 0) && (ggRearLeftLightButton.SubModel)) // hunter-230112 - z controlem gasi z tylu @@ -2016,7 +2073,8 @@ void TTrain::OnKeyDown(int cKey) } } } - else if (cKey == Global::Keys[k_UpperSign]) // ABu 060205: światło górne - wyłączenie + else if (cKey == Global::Keys[k_UpperSign]) // ABu 060205: światło górne - + // wyłączenie { if ((GetAsyncKeyState(VK_CONTROL) < 0) && (ggRearUpperLightButton.SubModel)) // hunter-230112 - z controlem gasi z tylu @@ -2067,8 +2125,8 @@ void TTrain::OnKeyDown(int cKey) } } } - if (cKey == Global::Keys[k_RightSign]) // Winger 070304: swiatla tylne (koncowki) - - // wlaczenie + if (cKey == Global::Keys[k_RightSign]) // Winger 070304: swiatla tylne + // (koncowki) - wlaczenie { if ((GetAsyncKeyState(VK_CONTROL) < 0) && (ggRearRightLightButton.SubModel)) // hunter-230112 - z controlem gasi z tylu @@ -2171,7 +2229,8 @@ void TTrain::OnKeyDown(int cKey) } } } - else if (cKey == Global::Keys[k_StLinOff]) // Winger 110904: wylacznik st. liniowych + else if (cKey == Global::Keys[k_StLinOff]) // Winger 110904: wylacznik st. + // liniowych { if ((mvControlled->TrainType != dt_EZT) && (mvControlled->TrainType != dt_EP05) && (mvControlled->TrainType != dt_ET40)) @@ -2213,8 +2272,8 @@ void TTrain::OnKeyDown(int cKey) vMechMovement.x += fMechCroach; if (DynamicObject->Mechanik) if (!FreeFlyModeFlag) //żeby nie mieszać obserwując z zewnątrz - DynamicObject->Mechanik->RouteSwitch(1); // na skrzyżowaniu skręci w - // lewo + DynamicObject->Mechanik->RouteSwitch( + 1); // na skrzyżowaniu skręci w lewo } else if (cKey == Global::Keys[k_MechRight]) { @@ -2229,7 +2288,8 @@ void TTrain::OnKeyDown(int cKey) vMechMovement.z -= fMechCroach; // if (DynamicObject->Mechanik) // if (!FreeFlyModeFlag) //żeby nie mieszać obserwując z zewnątrz - // DynamicObject->Mechanik->RouteSwitch(0); //na skrzyżowaniu stanie i poczeka + // DynamicObject->Mechanik->RouteSwitch(0); //na skrzyżowaniu stanie + // i poczeka } else if (cKey == Global::Keys[k_MechForward]) { @@ -2309,10 +2369,13 @@ void TTrain::OnKeyUp(int cKey) }; void TTrain::UpdateMechPosition(double dt) -{ // Ra: mechanik powinien być telepany niezależnie od pozycji pojazdu +{ // Ra: mechanik powinien być + // telepany niezależnie od pozycji + // pojazdu // Ra: trzeba zrobić model bujania głową i wczepić go do pojazdu - // DynamicObject->vFront=DynamicObject->GetDirection(); //to jest już policzone + // DynamicObject->vFront=DynamicObject->GetDirection(); //to jest już + // policzone // Ra: tu by się przydało uwzględnić rozkład sił: // - na postoju horyzont prosto, kabina skosem @@ -2362,9 +2425,9 @@ void TTrain::UpdateMechPosition(double dt) } else { // hamowanie rzucania przy spadku FPS - pMechShake -= - pMechShake * - Min0R(dt, 1); // po tym chyba potrafią zostać jakieś ułamki, które powodują zjazd + pMechShake -= pMechShake * Min0R(dt, 1); // po tym chyba potrafią zostać + // jakieś ułamki, które powodują + // zjazd pMechOffset += vMechMovement * dt; vMechVelocity.y = 0.5 * vMechVelocity.y; pNewMechPosition = pMechOffset + vector3(pMechShake.x, 5 * pMechShake.y, pMechShake.z); @@ -2422,15 +2485,17 @@ bool TTrain::Update() DWORD stat; double dt = Timer::GetDeltaTime(); if (DynamicObject->mdKabina) - { // Ra: TODO: odczyty klawiatury/pulpitu nie powinny być uzależnione od istnienia modelu kabiny + { // Ra: TODO: odczyty klawiatury/pulpitu nie + // powinny być uzależnione od istnienia modelu + // kabiny tor = DynamicObject->GetTrack(); // McZapkie-180203 // McZapkie: predkosc wyswietlana na tachometrze brana jest z obrotow kol float maxtacho = 3; fTachoVelocity = Min0R(fabs(11.31 * mvControlled->WheelDiameter * mvControlled->nrot), mvControlled->Vmax * 1.05); { // skacze osobna zmienna - float ff = floor( - GlobalTime->mr); // skacze co sekunde - pol sekundy pomiar, pol sekundy ustawienie + float ff = floor(GlobalTime->mr); // skacze co sekunde - pol sekundy + // pomiar, pol sekundy ustawienie if (ff != fTachoTimer) // jesli w tej sekundzie nie zmienial { if (fTachoVelocity > 1) // jedzie @@ -2446,8 +2511,8 @@ bool TTrain::Update() fTachoCount += dt * 3; // szybciej zacznij stukac } else if (fTachoCount > 0) - fTachoCount -= - dt * 0.66; // schodz powoli - niektore haslery to ze 4 sekundy potrafia stukac + fTachoCount -= dt * 0.66; // schodz powoli - niektore haslery to ze 4 + // sekundy potrafia stukac /* Ra: to by trzeba było przemyśleć, zmienione na szybko problemy robi //McZapkie: predkosc wyswietlana na tachometrze brana jest z obrotow kol @@ -2465,18 +2530,22 @@ bool TTrain::Update() if (mvControlled->TrainType==dt_EZT) //dla EZT wskazówka porusza się niestabilnie if (fTachoVelocity>7.0) - {fTachoVelocity=floor(0.5+fTachoVelocity+random(5)-random(5)); - //*floor(0.2*fTachoVelocity); + {fTachoVelocity=floor(0.5+fTachoVelocity+random(5)-random(5)); + //*floor(0.2*fTachoVelocity); if (fTachoVelocity<0.0) fTachoVelocity=0.0; } iSekunda=floor(GlobalTime->mr); } */ - // Ra 2014-09: napięcia i prądy muszą być ustalone najpierw, bo wysyłane są ewentualnie na + // Ra 2014-09: napięcia i prądy muszą być ustalone najpierw, bo wysyłane są + // ewentualnie na // PoKeys - if (mvControlled->EngineType != DieselElectric) // Ra 2014-09: czy taki rozdział ma sens? - fHVoltage = mvControlled->RunningTraction - .TractionVoltage; // Winger czy to nie jest zle? *mvControlled->Mains); + if ((mvControlled->EngineType != DieselElectric) || + (mvControlled->EngineType != + ElectricInductionMotor)) // Ra 2014-09: czy taki rozdział ma sens? + fHVoltage = + mvControlled->RunningTraction.TractionVoltage; // Winger czy to nie jest zle? + // *mvControlled->Mains); else fHVoltage = mvControlled->Voltage; if (ShowNextCurrent) @@ -2489,8 +2558,8 @@ bool TTrain::Update() fHCurrent[3] = mvSecond->ShowCurrent(3) * 1.05; } else - fHCurrent[0] = fHCurrent[1] = fHCurrent[2] = fHCurrent[3] = 0.0; // gdy nie ma - // człona + fHCurrent[0] = fHCurrent[1] = fHCurrent[2] = fHCurrent[3] = + 0.0; // gdy nie ma człona } else { // normalne pokazywanie @@ -2499,27 +2568,97 @@ bool TTrain::Update() fHCurrent[2] = mvControlled->ShowCurrent(2); fHCurrent[3] = mvControlled->ShowCurrent(3); } + + TDynamicObject *p = DynamicObject->GetFirstDynamic(mvOccupied->ActiveCab < 0 ? 1 : 0); + int in = 0; + fEIMParams[0][6] = 0; + for (int i = 0; i < 20; i++) + { + if (p) + { + fPress[i][0] = p->MoverParameters->BrakePress; + fPress[i][1] = p->MoverParameters->PipePress; + fPress[i][2] = p->MoverParameters->ScndPipePress; + bDoors[i] = (p->dDoorMoveL > 0.001) || (p->dDoorMoveR > 0.001); + if ((in < 8) && (p->MoverParameters->eimc[eimc_p_Pmax] > 1)) + { + fEIMParams[1 + in][0] = p->MoverParameters->eimv[eimv_Fr]; + fEIMParams[1 + in][1] = Max0R(fEIMParams[1 + in][0], 0); + fEIMParams[1 + in][2] = -Min0R(fEIMParams[1 + in][0], 0); + fEIMParams[1 + in][3] = p->MoverParameters->eimv[eimv_Fr] / + Max0R(p->MoverParameters->eimv[eimv_Fful], 1); + fEIMParams[1 + in][4] = Max0R(fEIMParams[1 + in][3], 0); + fEIMParams[1 + in][5] = -Min0R(fEIMParams[1 + in][3], 0); + fEIMParams[1 + in][6] = p->MoverParameters->eimv[eimv_If]; + fEIMParams[1 + in][7] = p->MoverParameters->eimv[eimv_U]; + fEIMParams[1 + in][8] = p->MoverParameters->eimv[eimv_Ipoj]; + fEIMParams[1 + in][9] = p->MoverParameters->Voltage; + fEIMParams[0][6] += fEIMParams[1 + in][8]; + in++; + } + p = p->NextC(4); + } + else + { + fPress[i][0] = 0; + fPress[i][1] = 0; + fPress[i][2] = 0; + bDoors[i] = false; + } + } + + if (mvControlled == mvOccupied) + fEIMParams[0][3] = mvControlled->eimv[eimv_Fzad]; // procent zadany + else + fEIMParams[0][3] = + mvControlled->eimv[eimv_Fzad] - mvOccupied->LocalBrakeRatio(); // procent zadany + fEIMParams[0][4] = Max0R(fEIMParams[0][3], 0); + fEIMParams[0][5] = -Min0R(fEIMParams[0][3], 0); + fEIMParams[0][1] = fEIMParams[0][4] * mvControlled->eimv[eimv_Fful]; + fEIMParams[0][2] = fEIMParams[0][5] * mvControlled->eimv[eimv_Fful]; + fEIMParams[0][0] = fEIMParams[0][1] - fEIMParams[0][2]; + fEIMParams[0][7] = 0; + fEIMParams[0][8] = 0; + fEIMParams[0][9] = 0; + + for (int i = in; i < 8; i++) + { + fEIMParams[1 + i][0] = 0; + fEIMParams[1 + i][1] = 0; + fEIMParams[1 + i][2] = 0; + fEIMParams[1 + i][3] = 0; + fEIMParams[1 + i][4] = 0; + fEIMParams[1 + i][5] = 0; + fEIMParams[1 + i][6] = 0; + fEIMParams[1 + i][7] = 0; + fEIMParams[1 + i][8] = 0; + fEIMParams[1 + i][9] = 0; + } + if (Global::iFeedbackMode == 4) { // wykonywać tylko gdy wyprowadzone na pulpit Console::ValueSet(0, mvOccupied->Compressor); // Ra: sterowanie miernikiem: zbiornik główny - Console::ValueSet(1, mvOccupied->PipePress); // Ra: sterowanie miernikiem: przewód - // główny + Console::ValueSet(1, + mvOccupied->PipePress); // Ra: sterowanie miernikiem: przewód główny Console::ValueSet( 2, mvOccupied->BrakePress); // Ra: sterowanie miernikiem: cylinder hamulcowy Console::ValueSet(3, fHVoltage); // woltomierz wysokiego napięcia Console::ValueSet(4, fHCurrent[2]); // Ra: sterowanie miernikiem: drugi amperomierz Console::ValueSet( - 5, fHCurrent[(mvControlled->TrainType & dt_EZT) ? 0 : 1]); // pierwszy amperomierz; - // dla EZT prąd całkowity - Console::ValueSet(6, fTachoVelocity); ////Ra: prędkość na pin 43 - wyjście analogowe (to - /// nie jest PWM); skakanie zapewnia mechanika + 5, + fHCurrent[(mvControlled->TrainType & dt_EZT) ? 0 : 1]); // pierwszy amperomierz; dla + // EZT prąd całkowity + Console::ValueSet(6, fTachoVelocity); ////Ra: prędkość na pin 43 - wyjście + /// analogowe (to nie jest PWM); + /// skakanie zapewnia mechanika /// napędu } - // hunter-080812: wyrzucanie szybkiego na elektrykach gdy nie ma napiecia przy dowolnym - // ustawieniu kierunkowego - // Ra: to już jest w T_MoverParameters::TractionForce(), ale zależy od kierunku + // hunter-080812: wyrzucanie szybkiego na elektrykach gdy nie ma napiecia + // przy dowolnym ustawieniu kierunkowego + // Ra: to już jest w T_MoverParameters::TractionForce(), ale zależy od + // kierunku if (mvControlled->EngineType == ElectricSeriesMotor) if (fabs(mvControlled->RunningTraction.TractionVoltage) < 0.5 * @@ -2548,8 +2687,8 @@ bool TTrain::Update() ((mvControlled->EngineType == ElectricSeriesMotor) || (mvControlled->TrainType == dt_EZT)) && (DynamicObject->Controller == Humandriver)) // hunter-110212: poprawka dla EZT - { // hunter-091012: poprawka (zmiana warunku z CompressorPower /rozne od 0/ na /rowne - // 1/) + { // hunter-091012: poprawka (zmiana warunku z CompressorPower /rozne od + // 0/ na /rowne 1/) if (fConverterTimer < fConverterPrzekaznik) { mvControlled->ConvOvldFlag = true; @@ -2822,10 +2961,13 @@ bool TTrain::Update() // McZapkie! - to wazne - SoundFlag wystawiane jest przez moje moduly // gdy zachodza pewne wydarzenia komentowane dzwiekiem. // Mysle ze wystarczy sprawdzac a potem zerowac SoundFlag tutaj - // a nie w DynObject - gdyby cos poszlo zle to po co szarpac dzwiekiem co 10ms. + // a nie w DynObject - gdyby cos poszlo zle to po co szarpac dzwiekiem co + // 10ms. - if (TestFlag(mvOccupied->SoundFlag, - sound_relay)) // przekaznik - gdy bezpiecznik, automatyczny rozruch itp + if (TestFlag(mvOccupied->SoundFlag, sound_relay)) // przekaznik - gdy + // bezpiecznik, + // automatyczny rozruch + // itp { if (mvOccupied->EventFlag || TestFlag(mvOccupied->SoundFlag, sound_loud)) { @@ -2889,7 +3031,8 @@ bool TTrain::Update() mvOccupied->SoundFlag = 0; /* - for (int b=0; b<2; b++) //MC: aby zerowac stukanie przekaznikow w czlonie silnikowym + for (int b=0; b<2; b++) //MC: aby zerowac stukanie przekaznikow w + czlonie silnikowym if (TestFlag(mvControlled->Couplers[b].CouplingFlag,ctrain_controll)) if (mvControlled->Couplers[b].Connected.Power>0.01) mvControlled->Couplers[b]->Connected->SoundFlag=0; @@ -2939,16 +3082,18 @@ bool TTrain::Update() //fHaslerTimer+=dt; //if (fHaslerTimer>fHaslerTime) {//Ra: ryzykowne jest to, gdyż może się nie uaktualniać prędkość - //Ra: prędkość się powinna zaokrąglać tam gdzie się liczy fTachoVelocity + //Ra: prędkość się powinna zaokrąglać tam gdzie się liczy + fTachoVelocity if (ggVelocity.SubModel) - {//ZiomalCl: wskazanie Haslera w kabinie A ze zwloka czasowa oraz odpowiednia - tolerancja - //Nalezy sie zastanowic na przyszlosc nad rozroznieniem predkosciomierzy (dokladnosc - wskazan, zwloka czasowa wskazania, inne funkcje) - //ZiomalCl: W ezt typu stare EN57 wskazania haslera sa mniej dokladne (linka) + {//ZiomalCl: wskazanie Haslera w kabinie A ze zwloka czasowa oraz odpowiednia + tolerancja + //Nalezy sie zastanowic na przyszlosc nad rozroznieniem predkosciomierzy + (dokladnosc wskazan, zwloka czasowa wskazania, inne funkcje) + //ZiomalCl: W ezt typu stare EN57 wskazania haslera sa mniej dokladne + (linka) //ggVelocity.UpdateValue(fTachoVelocity>2?fTachoVelocity+0.5-random(mvControlled->TrainType==dt_EZT?5:2)/2:0); - ggVelocity.UpdateValue(Min0R(fTachoVelocity,mvControlled->Vmax*1.05)); //ograniczenie - maksymalnego wskazania na analogowym + ggVelocity.UpdateValue(Min0R(fTachoVelocity,mvControlled->Vmax*1.05)); + //ograniczenie maksymalnego wskazania na analogowym ggVelocity.Update(); } if (ggVelocityDgt.SubModel) @@ -2957,10 +3102,10 @@ bool TTrain::Update() ggVelocityDgt.Update(); } if (ggVelocity_B.SubModel) - {//ZiomalCl: wskazanie Haslera w kabinie B ze zwloka czasowa oraz odpowiednia - tolerancja - //Nalezy sie zastanowic na przyszlosc nad rozroznieniem predkosciomierzy (dokladnosc - wskazan, zwloka czasowa wskazania, inne funkcje) + {//ZiomalCl: wskazanie Haslera w kabinie B ze zwloka czasowa oraz odpowiednia + tolerancja + //Nalezy sie zastanowic na przyszlosc nad rozroznieniem predkosciomierzy + (dokladnosc wskazan, zwloka czasowa wskazania, inne funkcje) //Velocity_B.UpdateValue(fTachoVelocity>2?fTachoVelocity+0.5-random(mvControlled->TrainType==dt_EZT?5:2)/2:0); ggVelocity_B.UpdateValue(fTachoVelocity); ggVelocity_B.Update(); @@ -3087,11 +3232,12 @@ bool TTrain::Update() } if (mvControlled->SlippingWheels) - { // Ra 2014-12: lokomotywy 181/182 dostają SlippingWheels po zahamowaniu powyżej 2.85 bara - // i buczały + { // Ra 2014-12: lokomotywy 181/182 + // dostają SlippingWheels po zahamowaniu + // powyżej 2.85 bara i buczały double veldiff = (DynamicObject->GetVelocity() - fTachoVelocity) / mvControlled->Vmax; - if (veldiff < - -0.01) // 1% Vmax rezerwy, żeby 181/182 nie buczały po zahamowaniu, ale to proteza + if (veldiff < -0.01) // 1% Vmax rezerwy, żeby 181/182 nie buczały po + // zahamowaniu, ale to proteza { if (fabs(mvControlled->Im) > 10.0) btLampkaPoslizg.TurnOn(); @@ -3132,8 +3278,8 @@ bool TTrain::Update() (mvControlled->MainCtrlActualPos == 0)); // do EU04 if ((mvControlled->Itot != 0) || (mvOccupied->BrakePress > 2) || (mvOccupied->PipePress < 3.6)) - btLampkaStyczn.TurnOff(); // Ra: czy to jest udawanie działania styczników - // liniowych? + btLampkaStyczn.TurnOff(); // Ra: czy to jest udawanie działania + // styczników liniowych? else if (mvOccupied->BrakePress < 1) btLampkaStyczn.TurnOn(); // mozna prowadzic rozruch if (((TestFlag(mvControlled->Couplers[1].CouplingFlag, ctrain_controll)) && @@ -3144,18 +3290,19 @@ bool TTrain::Update() else btLampkaUkrotnienie.TurnOff(); - // if ((TestFlag(mvControlled->BrakeStatus,+b_Rused+b_Ractive)))//Lampka + // if + // ((TestFlag(mvControlled->BrakeStatus,+b_Rused+b_Ractive)))//Lampka // drugiego stopnia hamowania btLampkaHamPosp.Turn((TestFlag(mvOccupied->BrakeStatus, 1))); // lampka drugiego stopnia - // hamowania //TODO: - // youBy wyciągnąć flagę - // wysokiego stopnia + // hamowania //TODO: youBy + // wyciągnąć flagę wysokiego + // stopnia // hunter-111211: wylacznik cisnieniowy - Ra: tutaj? w kabinie? //yBARC - // omujborzegrzesiuzniszczylesmicalydzien // if (mvControlled->TrainType!=dt_EZT) - // if (((mvOccupied->BrakePress > 2) || ( mvOccupied->PipePress < 3.6 )) && ( - // mvControlled->MainCtrlPos != 0 )) + // if (((mvOccupied->BrakePress > 2) || ( mvOccupied->PipePress < + // 3.6 )) && ( mvControlled->MainCtrlPos != 0 )) // mvControlled->StLinFlag=true; //------- @@ -3179,8 +3326,8 @@ bool TTrain::Update() btLampkaSprezarka.Turn(mvControlled->CompressorFlag); // mutopsitka dziala // boczniki unsigned char scp; // Ra: dopisałem "unsigned" - // Ra: w SU45 boczniki wchodzą na MainCtrlPos, a nie na MainCtrlActualPos - pokićkał - // ktoś? + // Ra: w SU45 boczniki wchodzą na MainCtrlPos, a nie na MainCtrlActualPos + // - pokićkał ktoś? scp = mvControlled->RList[mvControlled->MainCtrlPos].ScndAct; scp = (scp == 255 ? 0 : scp); // Ra: whatta hella is this? if ((mvControlled->ScndCtrlPos > 0) || (mvControlled->ScndInMain) && (scp > 0)) @@ -3201,10 +3348,12 @@ bool TTrain::Update() { //sprezarka w drugim wozie bool comptemp=false; if (DynamicObject->NextConnected) - if (TestFlag(mvControlled->Couplers[1].CouplingFlag,ctrain_controll)) + if + (TestFlag(mvControlled->Couplers[1].CouplingFlag,ctrain_controll)) comptemp=DynamicObject->NextConnected->MoverParameters->CompressorFlag; if ((DynamicObject->PrevConnected) && (!comptemp)) - if (TestFlag(mvControlled->Couplers[0].CouplingFlag,ctrain_controll)) + if + (TestFlag(mvControlled->Couplers[0].CouplingFlag,ctrain_controll)) comptemp=DynamicObject->PrevConnected->MoverParameters->CompressorFlag; btLampkaSprezarkaB.Turn(comptemp); */ @@ -3244,8 +3393,8 @@ bool TTrain::Update() false); { // yB - wskazniki drugiego czlonu - TDynamicObject * - tmp; //=mvControlled->mvSecond; //Ra 2014-07: trzeba to jeszcze wyjąć z kabiny... + TDynamicObject *tmp; //=mvControlled->mvSecond; //Ra 2014-07: trzeba to + // jeszcze wyjąć z kabiny... // Ra 2014-07: no nie ma potrzeby szukać tego w każdej klatce tmp = NULL; if ((TestFlag(mvControlled->Couplers[1].CouplingFlag, ctrain_controll)) && @@ -3271,15 +3420,15 @@ bool TTrain::Update() btLampkaStycznB.TurnOn(); // mozna prowadzic rozruch //----------------- - // //hunter-271211: brak jazdy w drugim czlonie, gdy w pierwszym tez nie - // ma (i odwrotnie) - Ra: tutaj? w kabinie? + // //hunter-271211: brak jazdy w drugim czlonie, gdy w + // pierwszym tez nie ma (i odwrotnie) - Ra: tutaj? w kabinie? // if (tmp->MoverParameters->TrainType!=dt_EZT) // if (((tmp->MoverParameters->BrakePress > 2) || ( // tmp->MoverParameters->PipePress < 3.6 )) && ( // tmp->MoverParameters->MainCtrlPos != 0 )) // { - // tmp->MoverParameters->MainCtrlActualPos=0; //inaczej StLinFlag nie - // zmienia sie na false w drugim pojezdzie + // tmp->MoverParameters->MainCtrlActualPos=0; //inaczej + // StLinFlag nie zmienia sie na false w drugim pojezdzie // //tmp->MoverParameters->StLinFlag=true; // mvControlled->StLinFlag=true; // } @@ -3288,8 +3437,8 @@ bool TTrain::Update() // //tmp->MoverParameters->StLinFlag=true; //----------------- - // hunter-271211: sygnalizacja poslizgu w pierwszym pojezdzie, gdy wystapi w - // drugim + // hunter-271211: sygnalizacja poslizgu w pierwszym pojezdzie, gdy + // wystapi w drugim btLampkaPoslizg.Turn(tmp->MoverParameters->SlippingWheels); //----------------- @@ -3392,7 +3541,8 @@ bool TTrain::Update() ggMainCtrlAct.Update(); } if (ggScndCtrl.SubModel) - { // Ra: od byte odejmowane boolean i konwertowane potem na double? + { // Ra: od byte odejmowane boolean i konwertowane + // potem na double? ggScndCtrl.UpdateValue( double(mvControlled->ScndCtrlPos - ((mvControlled->TrainType == dt_ET42) && mvControlled->DynamicBrakeFlag))); @@ -3723,8 +3873,8 @@ bool TTrain::Update() } // Winger 020304 - ogrzewanie //---------- - // hunter-080812: poprawka na ogrzewanie w elektrykach - usuniete uzaleznienie od - // przetwornicy + // hunter-080812: poprawka na ogrzewanie w elektrykach - usuniete + // uzaleznienie od przetwornicy if (ggTrainHeatingButton.SubModel) { if (mvControlled->Heating) @@ -3848,7 +3998,8 @@ bool TTrain::Update() } //---------------- - // hunter-141211: wyl. szybki zalaczony i wylaczony przeniesiony z OnKeyPress() + // hunter-141211: wyl. szybki zalaczony i wylaczony przeniesiony z + // OnKeyPress() if (Console::Pressed(VK_SHIFT) && Console::Pressed(Global::Keys[k_Main])) { fMainRelayTimer += dt; @@ -3858,10 +4009,10 @@ bool TTrain::Update() if (fMainRelayTimer > mvControlled->InitialCtrlDelay) // wlaczanie WSa z opoznieniem if (mvControlled->MainSwitch(true)) { - // if (mvControlled->MainCtrlPos!=0) //zabezpieczenie, by po wrzuceniu - // pozycji przed wlaczonym - // mvControlled->StLinFlag=true; //WSem nie wrzucilo na ta pozycje po - // jego zalaczeniu //yBARC - co to tutaj robi?! + // if (mvControlled->MainCtrlPos!=0) //zabezpieczenie, by po + // wrzuceniu pozycji przed wlaczonym + // mvControlled->StLinFlag=true; //WSem nie wrzucilo na ta + // pozycje po jego zalaczeniu //yBARC - co to tutaj robi?! if (mvControlled->EngineType == DieselEngine) dsbDieselIgnition->Play(0, 0, 0); } @@ -3871,8 +4022,9 @@ bool TTrain::Update() if (ggConverterButton.GetValue() != 0) // po puszczeniu przycisku od WSa odpalanie potwora mvControlled->ConverterSwitch(true); - // hunter-091012: przeniesione z mover.pas, zeby dzwiek sie nie zapetlal, drugi warunek - // zeby nie odtwarzalo w nieskonczonosc i przeniesienie zerowania timera + // hunter-091012: przeniesione z mover.pas, zeby dzwiek sie nie zapetlal, + // drugi warunek zeby nie odtwarzalo w nieskonczonosc i przeniesienie + // zerowania timera if ((mvControlled->Mains != true) && (fMainRelayTimer > 0)) { dsbRelay->Play(0, 0, 0); @@ -3896,7 +4048,8 @@ bool TTrain::Update() ggMainOnButton.PutValue(1); if (mvControlled->MainSwitch(true)) { - if (mvControlled->MainCtrlPos!=0) //hunter-131211: takie zabezpieczenie + if (mvControlled->MainCtrlPos!=0) //hunter-131211: takie + zabezpieczenie mvControlled->StLinFlag=true; if (mvControlled->EngineType==DieselEngine) @@ -3921,7 +4074,8 @@ bool TTrain::Update() // hunter-131211: czuwak przeniesiony z OnKeyPress // hunter-091012: zrobiony test czuwaka if (Console::Pressed(Global::Keys[k_Czuwak])) - { // czuwak testuje kierunek, ale podobno w EZT nie, więc może być w rozrządczym + { // czuwak testuje kierunek, ale podobno w + // EZT nie, więc może być w rozrządczym fCzuwakTestTimer += dt; ggSecurityResetButton.PutValue(1); if (CAflag == false) @@ -4089,10 +4243,12 @@ bool TTrain::Update() if (!FreeFlyModeFlag) { - if (Console::Pressed(Global::Keys[k_Releaser])) // yB: odluzniacz caly czas trzymany, - // warunki powinny byc takie same, jak - // przy naciskaniu. Wlasciwie stamtad - // mozna wyrzucic sprawdzanie + if (Console::Pressed(Global::Keys[k_Releaser])) // yB: odluzniacz caly + // czas trzymany, warunki + // powinny byc takie same, + // jak przy naciskaniu. + // Wlasciwie stamtad mozna + // wyrzucic sprawdzanie // nacisniecia. { if ((mvControlled->EngineType == ElectricSeriesMotor) || @@ -4154,9 +4310,9 @@ bool TTrain::Update() { if (ggUniversal3Button.SubModel) { - ggUniversal3Button.PutValue(1); // hunter-131211: z UpdateValue na PutValue - // - by zachowywal sie jak pozostale - // przelaczniki + ggUniversal3Button.PutValue(1); // hunter-131211: z UpdateValue na + // PutValue - by zachowywal sie jak + // pozostale przelaczniki if (btLampkaUniversal3.Active()) LampkaUniversal3_st = true; } @@ -4177,9 +4333,9 @@ bool TTrain::Update() { if (ggUniversal3Button.SubModel) { - ggUniversal3Button.PutValue(0); // hunter-131211: z UpdateValue na PutValue - // - by zachowywal sie jak pozostale - // przelaczniki + ggUniversal3Button.PutValue(0); // hunter-131211: z UpdateValue na + // PutValue - by zachowywal sie jak + // pozostale przelaczniki if (btLampkaUniversal3.Active()) LampkaUniversal3_st = false; } @@ -4187,8 +4343,8 @@ bool TTrain::Update() } } - // hunter-091012: to w ogole jest bez sensu i tak namodzone ze nie wiadomo o co chodzi - - // zakomentowalem i zrobilem po swojemu + // hunter-091012: to w ogole jest bez sensu i tak namodzone ze nie wiadomo o + // co chodzi - zakomentowalem i zrobilem po swojemu /* if ( Console::Pressed(Global::Keys[k_Univ3]) ) { @@ -4212,15 +4368,15 @@ bool TTrain::Update() {//bez [Ctrl] przełączamy cośtem if (Console::Pressed(VK_SHIFT)) { - ggUniversal3Button.PutValue(1); //hunter-131211: z UpdateValue na PutValue - by - zachowywal sie jak pozostale przelaczniki + ggUniversal3Button.PutValue(1); //hunter-131211: z UpdateValue na + PutValue - by zachowywal sie jak pozostale przelaczniki if (btLampkaUniversal3.Active()) LampkaUniversal3_st=true; } else { - ggUniversal3Button.PutValue(0); //hunter-131211: z UpdateValue na PutValue - by - zachowywal sie jak pozostale przelaczniki + ggUniversal3Button.PutValue(0); //hunter-131211: z UpdateValue na + PutValue - by zachowywal sie jak pozostale przelaczniki if (btLampkaUniversal3.Active()) LampkaUniversal3_st=false; } @@ -4264,7 +4420,8 @@ bool TTrain::Update() } */ - // hunter-091012: przepisanie univ4 i zrobione z uwzglednieniem przelacznika swiatla + // hunter-091012: przepisanie univ4 i zrobione z uwzglednieniem przelacznika + // swiatla if (Console::Pressed(Global::Keys[k_Univ4])) { if (Console::Pressed(VK_SHIFT)) @@ -4290,9 +4447,9 @@ bool TTrain::Update() bCabLightDim = false; if (ggCabLightDimButton.SubModel) { - ggCabLightDimButton.PutValue(0); // hunter-131211: z UpdateValue na PutValue - // - by zachowywal sie jak pozostale - // przelaczniki + ggCabLightDimButton.PutValue(0); // hunter-131211: z UpdateValue na + // PutValue - by zachowywal sie jak + // pozostale przelaczniki } } else @@ -4321,7 +4478,8 @@ bool TTrain::Update() } // Ra: przeklejka z SPKS - płynne poruszanie hamulcem - // if ((mvOccupied->BrakeHandle==FV4a)&&(Console::Pressed(Global::Keys[k_IncBrakeLevel]))) + // if + // ((mvOccupied->BrakeHandle==FV4a)&&(Console::Pressed(Global::Keys[k_IncBrakeLevel]))) if ((Console::Pressed(Global::Keys[k_IncBrakeLevel]))) { if (Console::Pressed(VK_CONTROL)) @@ -4335,7 +4493,8 @@ bool TTrain::Update() // mvOccupied->BrakeCtrlPos= floor(mvOccupied->BrakeCtrlPosR+0.499); } } - // if ((mvOccupied->BrakeHandle==FV4a)&&(Console::Pressed(Global::Keys[k_DecBrakeLevel]))) + // if + // ((mvOccupied->BrakeHandle==FV4a)&&(Console::Pressed(Global::Keys[k_DecBrakeLevel]))) if ((Console::Pressed(Global::Keys[k_DecBrakeLevel]))) { if (Console::Pressed(VK_CONTROL)) @@ -4364,7 +4523,8 @@ bool TTrain::Update() { // mvOccupied->BrakeCtrlPosR+=(mvOccupied->BrakeCtrlPosR>mvOccupied->BrakeCtrlPosNo?0:dt*2); mvOccupied->BrakeLevelAdd(dt * 2); - // mvOccupied->BrakeCtrlPos= floor(mvOccupied->BrakeCtrlPosR+0.499); + // mvOccupied->BrakeCtrlPos= + // floor(mvOccupied->BrakeCtrlPosR+0.499); } } @@ -4379,7 +4539,8 @@ bool TTrain::Update() else { // mvOccupied->BrakeCtrlPosR-=(mvOccupied->BrakeCtrlPosR<-1?0:dt*2); - // mvOccupied->BrakeCtrlPos= floor(mvOccupied->BrakeCtrlPosR+0.499); + // mvOccupied->BrakeCtrlPos= + // floor(mvOccupied->BrakeCtrlPosR+0.499); mvOccupied->BrakeLevelAdd(-dt * 2); } } @@ -4515,7 +4676,8 @@ bool TTrain::Update() ggPantFrontButtonOff.PutValue(0); } - /* if ((mvControlled->Mains) && (mvControlled->EngineType==ElectricSeriesMotor)) + /* if ((mvControlled->Mains) && + (mvControlled->EngineType==ElectricSeriesMotor)) { //tu dac w przyszlosci zaleznosc od wlaczenia przetwornicy if (mvControlled->ConverterFlag) //NBMX -obsluga przetwornicy @@ -4652,8 +4814,10 @@ bool TTrain::CabChange(int iDirection) ->CabActivisation(); // załączenie rozrządu (wirtualne kabiny) return true; // udało się zmienić kabinę } - DynamicObject->MoverParameters->CabActivisation(); // aktywizacja poprzedniej, bo jeszcze - // nie wiadomo, czy jakiś pojazd jest + DynamicObject->MoverParameters->CabActivisation(); // aktywizacja + // poprzedniej, bo + // jeszcze nie wiadomo, + // czy jakiś pojazd jest } return false; // ewentualna zmiana pojazdu } @@ -4739,7 +4903,8 @@ bool TTrain::LoadMMediaFile(AnsiString asFileName) } else //--------------- - // hunter-111211: wydzielenie wejscia na bezoporowa i na drugi uklad do pliku + // hunter-111211: wydzielenie wejscia na bezoporowa i na drugi uklad + // do pliku if (str == AnsiString("wejscie_na_bezoporow:")) { str = Parser->GetNextSymbol().LowerCase(); @@ -4922,14 +5087,16 @@ bool TTrain::LoadMMediaFile(AnsiString asFileName) } else return false; // nie znalazl sekcji internal - delete Parser; // Ra: jak się coś newuje, to trzeba zdeletować, inaczej syf się robi + delete Parser; // Ra: jak się coś newuje, to trzeba zdeletować, inaczej syf + // się robi if (!InitializeCab(mvOccupied->ActiveCab, asFileName)) // zle zainicjowana kabina return false; else { if (DynamicObject->Controller == Humandriver) - DynamicObject->bDisplayCab = true; // McZapkie-030303: mozliwosc wyswietlania kabiny, w - // przyszlosci dac opcje w mmd + DynamicObject->bDisplayCab = true; // McZapkie-030303: mozliwosc + // wyswietlania kabiny, w przyszlosci + // dac opcje w mmd return true; } } @@ -4957,6 +5124,7 @@ bool TTrain::InitializeCab(int NewCabNo, AnsiString asFileName) str = ""; int cabindex = 0; TGauge *gg; // roboczy wsaźnik na obiekt animujący gałkę + TButton *bt; // roboczy wsaźnik na obiekt animujący lampkę DynamicObject->mdKabina = NULL; // likwidacja wskaźnika na dotychczasową kabinę switch (NewCabNo) { // ustalenie numeru kabiny do wczytania @@ -4984,8 +5152,8 @@ bool TTrain::InitializeCab(int NewCabNo, AnsiString asFileName) { Cabine[cabindex].Load(Parser); str = Parser->GetNextSymbol().LowerCase(); - if (AnsiCompareStr(AnsiString("driver") + cabindex + AnsiString("pos:"), str) == - 0) // pozycja poczatkowa maszynisty + if (AnsiCompareStr(AnsiString("driver") + cabindex + AnsiString("pos:"), + str) == 0) // pozycja poczatkowa maszynisty { pMechOffset.x = Parser->GetNextSymbol().ToDouble(); pMechOffset.y = Parser->GetNextSymbol().ToDouble(); @@ -4996,8 +5164,8 @@ bool TTrain::InitializeCab(int NewCabNo, AnsiString asFileName) } // ABu: pozycja siedzaca mechanika str = Parser->GetNextSymbol().LowerCase(); - if (AnsiCompareStr(AnsiString("driver") + cabindex + AnsiString("sitpos:"), str) == - 0) // ABu 180404 pozycja siedzaca maszynisty + if (AnsiCompareStr(AnsiString("driver") + cabindex + AnsiString("sitpos:"), + str) == 0) // ABu 180404 pozycja siedzaca maszynisty { pMechSittingPosition.x = Parser->GetNextSymbol().ToDouble(); pMechSittingPosition.y = Parser->GetNextSymbol().ToDouble(); @@ -5013,12 +5181,12 @@ bool TTrain::InitializeCab(int NewCabNo, AnsiString asFileName) else parse = true; // inicjacja kabiny - // Ra 2014-08: zmieniamy zasady - zamiast przypisywać submodel do istniejących obiektów - // animujących - // będziemy teraz uaktywniać obiekty animujące z tablicy i podawać im submodel oraz - // wskaźnik na parametr - if (AnsiCompareStr(AnsiString("cab") + cabindex + AnsiString("model:"), str) == - 0) // model kabiny + // Ra 2014-08: zmieniamy zasady - zamiast przypisywać submodel do + // istniejących obiektów animujących + // będziemy teraz uaktywniać obiekty animujące z tablicy i podawać im + // submodel oraz wskaźnik na parametr + if (AnsiCompareStr(AnsiString("cab") + cabindex + AnsiString("model:"), + str) == 0) // model kabiny { str = Parser->GetNextSymbol().LowerCase(); if (str != AnsiString("none")) @@ -5033,15 +5201,15 @@ bool TTrain::InitializeCab(int NewCabNo, AnsiString asFileName) // if (DynamicObject->mdKabina!=k) if (k) DynamicObject->mdKabina = k; // nowa kabina - //(mdKabina) może zostać to samo po przejściu do innego członu bez zmiany - // kabiny, przy powrocie musi być wiązanie ponowne + //(mdKabina) może zostać to samo po przejściu do innego członu bez + // zmiany kabiny, przy powrocie musi być wiązanie ponowne // else // break; //wyjście z pętli, bo model zostaje bez zmian } else if (cabindex == 1) // model tylko, gdy nie ma kabiny 1 DynamicObject->mdKabina = - DynamicObject - ->mdModel; // McZapkie-170103: szukaj elementy kabiny w glownym modelu + DynamicObject->mdModel; // McZapkie-170103: szukaj elementy kabiny + // w glownym modelu ActiveUniversal4 = false; ggMainCtrl.Clear(); ggMainCtrlAct.Clear(); @@ -5199,12 +5367,11 @@ bool TTrain::InitializeCab(int NewCabNo, AnsiString asFileName) else if (str == AnsiString("maxcurrent_sw:")) // przelacznik rozruchu ggMaxCurrentCtrl.Load(Parser, DynamicObject->mdKabina); // SEKCJA przyciskow sprezynujacych - else if (str == - AnsiString( - "main_off_bt:")) // przycisk wylaczajacy (w EU07 wyl szybki czerwony) + else if (str == AnsiString("main_off_bt:")) // przycisk wylaczajacy (w + // EU07 wyl szybki czerwony) ggMainOffButton.Load(Parser, DynamicObject->mdKabina); - else if (str == - AnsiString("main_on_bt:")) // przycisk wlaczajacy (w EU07 wyl szybki zielony) + else if (str == AnsiString("main_on_bt:")) // przycisk wlaczajacy (w EU07 + // wyl szybki zielony) ggMainOnButton.Load(Parser, DynamicObject->mdKabina); else if (str == AnsiString("security_reset_bt:")) // przycisk zbijajacy SHP/czuwak ggSecurityResetButton.Load(Parser, DynamicObject->mdKabina); @@ -5218,8 +5385,10 @@ bool TTrain::InitializeCab(int NewCabNo, AnsiString asFileName) ggHornButton.Load(Parser, DynamicObject->mdKabina); else if (str == AnsiString("fuse_bt:")) // bezp. nadmiarowy ggFuseButton.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("converterfuse_bt:")) // hunter-261211: odblokowanie - // przekaznika nadm. przetw. i ogrz. + else if (str == AnsiString("converterfuse_bt:")) // hunter-261211: + // odblokowanie + // przekaznika nadm. + // przetw. i ogrz. ggConverterFuseButton.Load(Parser, DynamicObject->mdKabina); else if (str == AnsiString("stlinoff_bt:")) // st. liniowe ggStLinOffButton.Load(Parser, DynamicObject->mdKabina); @@ -5295,13 +5464,17 @@ bool TTrain::InitializeCab(int NewCabNo, AnsiString asFileName) ggUniversal4Button.Load(Parser, DynamicObject->mdKabina, DynamicObject->mdModel); // SEKCJA WSKAZNIKOW else if ((str == AnsiString("tachometer:")) || (str == AnsiString("tachometerb:"))) - { // predkosciomierz wskazówkowy z szarpaniem + { // predkosciomierz + // wskazówkowy z + // szarpaniem gg = Cabine[cabindex].Gauge(-1); // pierwsza wolna gałka gg->Load(Parser, DynamicObject->mdKabina); gg->AssignFloat(&fTachoVelocityJump); } else if (str == AnsiString("tachometern:")) - { // predkosciomierz wskazówkowy bez szarpania + { // predkosciomierz + // wskazówkowy bez + // szarpania gg = Cabine[cabindex].Gauge(-1); // pierwsza wolna gałka gg->Load(Parser, DynamicObject->mdKabina); gg->AssignFloat(&fTachoVelocity); @@ -5336,8 +5509,19 @@ bool TTrain::InitializeCab(int NewCabNo, AnsiString asFileName) gg->Load(Parser, DynamicObject->mdKabina); gg->AssignFloat(fHCurrent); } + else if (str == AnsiString("eimscreen:")) + { // amperomierz calkowitego pradu + int i = Parser->GetNextSymbol().ToInt(); + int j = Parser->GetNextSymbol().ToInt(); + gg = Cabine[cabindex].Gauge(-1); // pierwsza wolna gałka + gg->Load(Parser, DynamicObject->mdKabina); + gg->AssignFloat(&fEIMParams[i][j]); + } else if ((str == AnsiString("brakepress:")) || (str == AnsiString("brakepressb:"))) - { // manometr cylindrow hamulcowych //Ra 2014-08: przeniesione do TCab + { // manometr cylindrow + // hamulcowych //Ra + // 2014-08: przeniesione + // do TCab gg = Cabine[cabindex].Gauge(-1); // pierwsza wolna gałka gg->Load(Parser, DynamicObject->mdKabina, NULL, 0.1); gg->AssignDouble(&mvOccupied->BrakePress); @@ -5348,9 +5532,9 @@ bool TTrain::InitializeCab(int NewCabNo, AnsiString asFileName) gg->Load(Parser, DynamicObject->mdKabina, NULL, 0.1); gg->AssignDouble(&mvOccupied->PipePress); } - else if (str == - AnsiString( - "limpipepress:")) // manometr zbiornika sterujacego zaworu maszynisty + else if (str == AnsiString("limpipepress:")) // manometr zbiornika + // sterujacego zaworu + // maszynisty ggZbS.Load(Parser, DynamicObject->mdKabina, NULL, 0.1); else if (str == AnsiString("cntrlpress:")) { // manometr zbiornika kontrolnego/rorządu @@ -5359,7 +5543,9 @@ bool TTrain::InitializeCab(int NewCabNo, AnsiString asFileName) gg->AssignDouble(&mvControlled->PantPress); } else if ((str == AnsiString("compressor:")) || (str == AnsiString("compressorb:"))) - { // manometr sprezarki/zbiornika glownego + { // manometr + // sprezarki/zbiornika + // glownego gg = Cabine[cabindex].Gauge(-1); // pierwsza wolna gałka gg->Load(Parser, DynamicObject->mdKabina, NULL, 0.1); gg->AssignDouble(&mvOccupied->Compressor); @@ -5421,8 +5607,8 @@ bool TTrain::InitializeCab(int NewCabNo, AnsiString asFileName) gg->Load(Parser, DynamicObject->mdKabina); gg->AssignDouble(&mvControlled->dizel_engage); } // ggEngageRatio.Load(Parser,DynamicObject->mdKabina); - else if (str == AnsiString("maingearstatus:")) // np. ciśnienie sterownika skrzyni - // biegów + else if (str == AnsiString("maingearstatus:")) // np. ciśnienie sterownika + // skrzyni biegów ggMainGearStatus.Load(Parser, DynamicObject->mdKabina); else if (str == AnsiString("ignitionkey:")) // ggIgnitionKey.Load(Parser, DynamicObject->mdKabina); @@ -5544,6 +5730,13 @@ bool TTrain::InitializeCab(int NewCabNo, AnsiString asFileName) btLampkaBackward.Load(Parser, DynamicObject->mdKabina); else if (str == AnsiString("i-cablight:")) // hunter-171012 btCabLight.Load(Parser, DynamicObject->mdKabina); + else if (str == AnsiString("i-doors:")) + { + int i = Parser->GetNextSymbol().ToInt() - 1; + bt = Cabine[cabindex].Button(-1); // pierwsza wolna lampka + bt->Load(Parser, DynamicObject->mdKabina); + bt->AssignBool(bDoors + i); + } else if (str == AnsiString("pyscreen:")) pyScreens.init(Parser, DynamicObject->mdKabina, DynamicObject->GetName(), NewCabNo); // btLampkaUnknown.Init("unknown",mdKabina,false); @@ -5559,15 +5752,16 @@ bool TTrain::InitializeCab(int NewCabNo, AnsiString asFileName) pyScreens.start(); if (DynamicObject->mdKabina) { - DynamicObject->mdKabina - ->Init(); // obrócenie modelu oraz optymalizacja, również zapisanie binarnego + DynamicObject->mdKabina->Init(); // obrócenie modelu oraz optymalizacja, + // również zapisanie binarnego return true; } return AnsiCompareStr(str, AnsiString("none")); } void TTrain::MechStop() -{ // likwidacja ruchu kamery w kabinie (po powrocie przez [F4]) +{ // likwidacja ruchu kamery w kabinie (po powrocie + // przez [F4]) pMechPosition = vector3(0, 0, 0); pMechShake = vector3(0, 0, 0); vMechMovement = vector3(0, 0, 0); @@ -5591,15 +5785,19 @@ vector3 TTrain::MirrorPosition(bool lewe) }; void TTrain::DynamicSet(TDynamicObject *d) -{ // taka proteza: chcę podłączyć kabinę EN57 bezpośrednio z silnikowym, aby nie robić tego przez - // ukrotnienie +{ // taka proteza: chcę podłączyć + // kabinę EN57 bezpośrednio z + // silnikowym, aby nie robić tego + // przez ukrotnienie // drugi silnikowy i tak musi być ukrotniony, podobnie jak kolejna jednostka - // problem się robi ze światłami, które będą zapalane w silnikowym, ale muszą świecić się w + // problem się robi ze światłami, które będą zapalane w silnikowym, ale muszą + // świecić się w rozrządczych + // dla EZT światła czołowe będą "zapalane w silnikowym", ale widziane z // rozrządczych - // dla EZT światła czołowe będą "zapalane w silnikowym", ale widziane z rozrządczych // również wczytywanie MMD powinno dotyczyć aktualnego członu // problematyczna może być kwestia wybranej kabiny (w silnikowym...) - // jeśli silnikowy będzie zapięty odwrotnie (tzn. -1), to i tak powinno jeździć dobrze + // jeśli silnikowy będzie zapięty odwrotnie (tzn. -1), to i tak powinno + // jeździć dobrze // również hamowanie wykonuje się zaworem w członie, a nie w silnikowym... DynamicObject = d; // jedyne miejsce zmiany mvOccupied = mvControlled = d ? DynamicObject->MoverParameters : NULL; // albo silnikowy w EZT @@ -5608,7 +5806,8 @@ void TTrain::DynamicSet(TDynamicObject *d) if (mvControlled->TrainType & dt_EZT) // na razie dotyczy to EZT if (DynamicObject->NextConnected ? mvControlled->Couplers[1].AllowedFlag & ctrain_depot : false) - { // gdy jest człon od sprzęgu 1, a sprzęg łączony warsztatowo (powiedzmy) + { // gdy jest człon od sprzęgu 1, a sprzęg łączony + // warsztatowo (powiedzmy) if ((mvControlled->Power < 1.0) && (mvControlled->Couplers[1].Connected->Power > 1.0)) // my nie mamy mocy, ale ten drugi ma mvControlled = @@ -5617,7 +5816,8 @@ void TTrain::DynamicSet(TDynamicObject *d) else if (DynamicObject->PrevConnected ? mvControlled->Couplers[0].AllowedFlag & ctrain_depot : false) - { // gdy jest człon od sprzęgu 0, a sprzęg łączony warsztatowo (powiedzmy) + { // gdy jest człon od sprzęgu 0, a sprzęg łączony + // warsztatowo (powiedzmy) if ((mvControlled->Power < 1.0) && (mvControlled->Couplers[0].Connected->Power > 1.0)) // my nie mamy mocy, ale ten drugi ma mvControlled = @@ -5628,7 +5828,8 @@ void TTrain::DynamicSet(TDynamicObject *d) if (mvOccupied->Couplers[1].Connected ? mvOccupied->Couplers[1].AllowedFlag & ctrain_controll : false) - { // gdy jest człon od sprzęgu 1, a sprzęg łączony warsztatowo (powiedzmy) + { // gdy jest człon od sprzęgu 1, a sprzęg łączony + // warsztatowo (powiedzmy) if (mvOccupied->Couplers[1].Connected->Power > 1.0) // ten drugi ma moc mvSecond = (TMoverParameters *)mvOccupied->Couplers[1].Connected; // wskaźnik na drugiego @@ -5636,7 +5837,8 @@ void TTrain::DynamicSet(TDynamicObject *d) else if (mvOccupied->Couplers[0].Connected ? mvOccupied->Couplers[0].AllowedFlag & ctrain_controll : false) - { // gdy jest człon od sprzęgu 0, a sprzęg łączony warsztatowo (powiedzmy) + { // gdy jest człon od sprzęgu 0, a sprzęg łączony + // warsztatowo (powiedzmy) if (mvOccupied->Couplers[0].Connected->Power > 1.0) // ale ten drugi ma moc mvSecond = (TMoverParameters *)mvOccupied->Couplers[0].Connected; // wskaźnik na drugiego diff --git a/Train.h b/Train.h index 97c7b532..090e71ed 100644 --- a/Train.h +++ b/Train.h @@ -152,8 +152,8 @@ class TTrain TGauge ggReleaserButton; TGauge ggAntiSlipButton; TGauge ggFuseButton; - TGauge ggConverterFuseButton; // hunter-261211: przycisk odblokowania nadmiarowego przetwornic i - // ogrzewania + TGauge ggConverterFuseButton; // hunter-261211: przycisk odblokowania + // nadmiarowego przetwornic i ogrzewania TGauge ggStLinOffButton; TGauge ggRadioButton; TGauge ggUpperLightButton; @@ -185,7 +185,8 @@ class TTrain TGauge ggUniversal4Button; TGauge ggCabLightButton; // hunter-091012: przelacznik oswietlania kabiny - TGauge ggCabLightDimButton; // hunter-091012: przelacznik przyciemnienia oswietlenia kabiny + TGauge ggCabLightDimButton; // hunter-091012: przelacznik przyciemnienia + // oswietlenia kabiny // NBMX wrzesien 2003 - obsluga drzwi TGauge ggDoorLeftButton; @@ -233,7 +234,8 @@ class TTrain TButton btLampkaOpory; TButton btLampkaWysRozr; TButton btLampkaUniversal3; - int LampkaUniversal3_typ; // ABu 030405 - swiecenie uzaleznione od: 0-nic, 1-obw.gl, 2-przetw. + int LampkaUniversal3_typ; // ABu 030405 - swiecenie uzaleznione od: 0-nic, + // 1-obw.gl, 2-przetw. bool LampkaUniversal3_st; TButton btLampkaWentZaluzje; // ET22 TButton btLampkaOgrzewanieSkladu; @@ -334,7 +336,8 @@ class TTrain // TFadeSound sConverter; //przetwornica // TFadeSound sSmallCompressor; //przetwornica - int iCabLightFlag; // McZapkie:120503: oswietlenie kabiny (0: wyl, 1: przyciemnione, 2: pelne) + int iCabLightFlag; // McZapkie:120503: oswietlenie kabiny (0: wyl, 1: + // przyciemnione, 2: pelne) bool bCabLight; // hunter-091012: czy swiatlo jest zapalone? bool bCabLightDim; // hunter-091012: czy przyciemnienie kabiny jest zapalone? @@ -372,17 +375,20 @@ class TTrain float fTachoVelocityJump; // ze skakaniem float fTachoTimer; float fTachoCount; - float fHVoltage; // napięcie dla dynamicznych gałek - float fHCurrent[4]; // prądy: suma i amperomierze 1,2,3 - float fEngine[4]; // obroty te?trzeba pobra? + float fHVoltage; // napi?cie dla dynamicznych ga?ek + float fHCurrent[4]; // pr?dy: suma i amperomierze 1,2,3 + float fEngine[4]; // obroty te? trzeba pobra? + float fPress[20][3]; // cisnienia dla wszystkich czlonow + bool bDoors[20]; // drzwi dla wszystkich czlonow // McZapkie: do syczenia float fPPress, fNPress; float fSPPress, fSNPress; - int iSekunda; // Ra: sekunda aktualizacji prędkości - int iRadioChannel; // numer aktualnego kanału radiowego + int iSekunda; // Ra: sekunda aktualizacji pr?dko?ci + int iRadioChannel; // numer aktualnego kana?u radiowego TPythonScreens pyScreens; public: + float fEIMParams[9][10]; // parametry dla silnikow asynchronicznych int RadioChannel() { return iRadioChannel; From 98ca26d0bb7aed72450f9c784405d521d1acc93a Mon Sep 17 00:00:00 2001 From: Firleju Date: Wed, 6 May 2015 21:23:25 +0200 Subject: [PATCH 3/4] Added python vars for display more vehicles in train. Added missing python libs. --- Dokumentacja zmiennych Python.docx | Bin 19597 -> 19876 bytes PyInt.h | 1 + Train.cpp | 13 +++++++++++++ Train.h | 1 + 4 files changed, 15 insertions(+) diff --git a/Dokumentacja zmiennych Python.docx b/Dokumentacja zmiennych Python.docx index f509f279e0eaa70db075b2201b528bc38cb118b9..f421014b541c0ad11f6369681f4c428a33d56795 100644 GIT binary patch delta 5084 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 delta 4784 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 diff --git a/PyInt.h b/PyInt.h index 4228e049..12e6755b 100644 --- a/PyInt.h +++ b/PyInt.h @@ -11,6 +11,7 @@ #define PyGetFloat(param) PyFloat_FromDouble(param >= 0 ? param : -param) #define PyGetInt(param) PyInt_FromLong(param) +#define PyGetFloatS(param) PyFloat_FromDouble(param) #define PyGetBool(param) param ? Py_True : Py_False struct ltstr diff --git a/Train.cpp b/Train.cpp index c24aad4a..48973198 100644 --- a/Train.cpp +++ b/Train.cpp @@ -290,6 +290,15 @@ PyObject *TTrain::GetTrainState() PyDict_SetItemString(dict, "minutes", PyGetInt(GlobalTime->mm)); PyDict_SetItemString(dict, "seconds", PyGetInt(GlobalTime->mr)); PyDict_SetItemString(dict, "velocity_desired", PyGetFloat(DynamicObject->Mechanik->VelDesired)); + Char* TXTT[10] = { "fd", "fdt", "fdb", "pd", "pdt", "pdb", "itothv", "1", "2", "3" }; + Char* TXTC[10] = { "fr", "frt", "frb", "pr", "prt", "prb", "im", "vm", "ihv", "uhv" }; + for (int j = 0; j<10; j++) + PyDict_SetItemString(dict, (AnsiString("eimp_t_") + AnsiString(TXTT[j])).c_str(), PyGetFloatS(fEIMParams[0][j])); + for (int i = 0; i<8; i++) + for (int j = 0; j<10; j++) + PyDict_SetItemString(dict, (AnsiString("eimp_c") + IntToStr(i + 1) + AnsiString("_") + AnsiString(TXTC[j])).c_str(), PyGetFloatS(fEIMParams[i + 1][j])); + PyDict_SetItemString(dict, "car_no", PyGetInt(iCarNo)); + PyDict_SetItemString(dict, "power_no", PyGetInt(iPowerNo)); return dict; } @@ -2572,6 +2581,8 @@ bool TTrain::Update() TDynamicObject *p = DynamicObject->GetFirstDynamic(mvOccupied->ActiveCab < 0 ? 1 : 0); int in = 0; fEIMParams[0][6] = 0; + iCarNo = 0; + iPowerNo = 0; for (int i = 0; i < 20; i++) { if (p) @@ -2595,8 +2606,10 @@ bool TTrain::Update() fEIMParams[1 + in][9] = p->MoverParameters->Voltage; fEIMParams[0][6] += fEIMParams[1 + in][8]; in++; + iPowerNo = in; } p = p->NextC(4); + iCarNo = i; } else { diff --git a/Train.h b/Train.h index 090e71ed..5ccb3ac3 100644 --- a/Train.h +++ b/Train.h @@ -379,6 +379,7 @@ class TTrain float fHCurrent[4]; // pr?dy: suma i amperomierze 1,2,3 float fEngine[4]; // obroty te? trzeba pobra? float fPress[20][3]; // cisnienia dla wszystkich czlonow + int iCarNo, iPowerNo; //liczba pojazdow i czlonow napednych bool bDoors[20]; // drzwi dla wszystkich czlonow // McZapkie: do syczenia float fPPress, fNPress; From d71ada46d148bf615e598248fac6f98c6d9e8007 Mon Sep 17 00:00:00 2001 From: Firleju Date: Wed, 6 May 2015 21:26:08 +0200 Subject: [PATCH 4/4] Add missing python libs needed for compiling --- python/libs/_bsddb.lib | Bin 0 -> 1888 bytes python/libs/_ctypes.lib | Bin 0 -> 1714 bytes python/libs/_ctypes_test.lib | Bin 0 -> 21680 bytes python/libs/_elementtree.lib | Bin 0 -> 1878 bytes python/libs/_hashlib.lib | Bin 0 -> 1732 bytes python/libs/_msi.lib | Bin 0 -> 1664 bytes python/libs/_multiprocessing.lib | Bin 0 -> 1950 bytes python/libs/_socket.lib | Bin 0 -> 1920 bytes python/libs/_sqlite3.lib | Bin 0 -> 1732 bytes python/libs/_ssl.lib | Bin 0 -> 1664 bytes python/libs/_testcapi.lib | Bin 0 -> 1748 bytes python/libs/_tkinter.lib | Bin 0 -> 1732 bytes python/libs/bz2.lib | Bin 0 -> 1646 bytes python/libs/omf_python27.lib | Bin 0 -> 103936 bytes python/libs/pyexpat.lib | Bin 0 -> 1714 bytes python/libs/python27.lib | Bin 0 -> 231346 bytes python/libs/select.lib | Bin 0 -> 1698 bytes python/libs/unicodedata.lib | Bin 0 -> 1782 bytes python/libs/winsound.lib | Bin 0 -> 1732 bytes 19 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 python/libs/_bsddb.lib create mode 100644 python/libs/_ctypes.lib create mode 100644 python/libs/_ctypes_test.lib create mode 100644 python/libs/_elementtree.lib create mode 100644 python/libs/_hashlib.lib create mode 100644 python/libs/_msi.lib create mode 100644 python/libs/_multiprocessing.lib create mode 100644 python/libs/_socket.lib create mode 100644 python/libs/_sqlite3.lib create mode 100644 python/libs/_ssl.lib create mode 100644 python/libs/_testcapi.lib create mode 100644 python/libs/_tkinter.lib create mode 100644 python/libs/bz2.lib create mode 100644 python/libs/omf_python27.lib create mode 100644 python/libs/pyexpat.lib create mode 100644 python/libs/python27.lib create mode 100644 python/libs/select.lib create mode 100644 python/libs/unicodedata.lib create mode 100644 python/libs/winsound.lib diff --git a/python/libs/_bsddb.lib b/python/libs/_bsddb.lib new file mode 100644 index 0000000000000000000000000000000000000000..9f840ed9bdf28d0ae3c4e273067c601ab82d5dee GIT binary patch literal 1888 zcmcIlPj3=I6#p%MTG)8NKS^VvaZQ@27X)@`OJc}YYa;0u2&LyOu+?&CAuT5D$%{wB z#jjxe3?6$n9z6H~ntq5Lt?$jwz)(TK;3P9|-kZ1c-tYaHefX?#)Y>naPp#3BwQVO; zu=81GRGyJ+b~Pt=yC#4|z_7+gZ4p}mcw?>@1Dv_MmbGGKM(ga<6Il!j1$lc z14zVxA~BZ>K%XXohk*#rr zBZ{w|-&agVO(+>?I@oKzeY3nBvVcpQ4~mi0Me2FF9W;84<(xXYLz{0j&!r$r)J5h@ z>a9pIZqVi@&2uFn>cTpU5WR_{keXq2FsMhko#F)Wbv#%hd2(y3-8$+VcV73b$F(Px zS1NCc(`yUc;t%-(s$Q{6(aM=##Lx(N(CQp?$<^e^M_gSgbNmGl_ALU1*ad{Q`${6P zv7M-rIIKeg40Q5C3CkbwA_w0NtVxbZ1XWu9rOM`2B{`=s=zq_Mh${IaJY)aHS4kj_ zhKp7uwvuv{d{T_0TqXY_`_ts~KKU^5kQ?ed!teUM&f1355R%`C1O%LCl;t TCqLfKU9w})%Xsa7q*?j}^C)V` literal 0 HcmV?d00001 diff --git a/python/libs/_ctypes.lib b/python/libs/_ctypes.lib new file mode 100644 index 0000000000000000000000000000000000000000..7cc4d0fa78d967534be6584b96c85221e6433e39 GIT binary patch literal 1714 zcmcIlzfaph6#i_7A2AFOurMIG5)yO?3ATYq2suEdM3@AbFq<@?B?BaaAi>1K$X1E} zp!^SPSvz#-&_95Gf)(Dg@37O7k|27K@9ur~?(Ti>zPo%_t)A2l*YpLWyJSt%%H&Kt zYj)!qVP;KB^!9ZCLx6GvXdNK&01OxS^ZnxXPT8yYo1bAJebG8Nh3}X4 zT=#DWTndkHyi(XJZTXw|N}gskj#^Y5H`>pO#EpR&SP_E+QMgfnjs`rCQ5X&=L4k?{ z{WRMB4P0Iexi{A^OX=1{J)rg4X;?XVO#8a4X!vn^RURWgqr{7flCB?oKKnYm8=63# zI@i(=t%KBhx>2vTtFw!8Xo@;N>AM#Ir3Vf&9pSemV2o4ekv{3ixC5i3Qagbpn-~+P z#-!#jnHnLC*WU2(;owwA$_|}ABZm?R$ngwKA{P4)5c${;Qsny;FR}Y&Nu2$DNkg>nn%#ag+Ea*w fX4JCf{|f(q@a1$Bezm5Fol5Uk_d6dwhtQt@uX{o3 literal 0 HcmV?d00001 diff --git a/python/libs/_ctypes_test.lib b/python/libs/_ctypes_test.lib new file mode 100644 index 0000000000000000000000000000000000000000..2307e980d1be892a660617779938b074e7e74925 GIT binary patch literal 21680 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 literal 0 HcmV?d00001 diff --git a/python/libs/_elementtree.lib b/python/libs/_elementtree.lib new file mode 100644 index 0000000000000000000000000000000000000000..4217b7eadfd1ebfb294017fd92508a246bbd708d GIT binary patch literal 1878 zcmcIlPfrs;6#wnE0^M+Ekl=}AQH*-&zwII>h7?6(VQEPzHvF4duwul`n=NTs>BK9` zPFgqR3CSkyw4_P~fCqp+4TRT;JO?JOxVvt4b1Ppcx@+&Y-xji4#eBhay+g0=9r=FC z^WeI<9mna{!f8;gtyKK5liP6DR*S2&tyXW+a8&bydgzyo?bTA(t1!7Wtpn>soRfc7 z6T(es&=ICDM0VWOztKIoJreOA2Zv_urOIZ>2!<}!{9J_*SIJd59)bZo*^QQ?h4AC+ zS$<9frYLgMv{=>K{j|Th-DZLJL|iCF&KX4C#A?;DUtUb9rCB0=QvV|bA(}HtTuQwq zDaH&DVY*N0u{;Cwl9Gl;h%k$2uba>CFgi&Kd?+_oi=51C)+(*WabwRnpBG-3PByn8 zR(l45xY)=C(B0H05v7sfK~(QmWKE?}Z<5)OlP|cwR+sWVZfvIx<$VSamLDjI@RQ99 zDM^}jNPv!x-IcKXDG##o>A;HQc+&Ba#=E0-2o}dgPs+ACFNmY*0zKb_m2B%^^i;)C zcL<=zQc_0GH^s=A(ewXMF-n%_$&!CQcVkyxYI!*jyLRRMrW@Kh9~`?|D$iEoVq|jV x1zVu<(n`*HzZ4_q`;YM`aeYj;-!CpZur&G4##QTR{IWd}eohVe%kPaw@A#w2$P z>NzGd4@t=fGOPsgmm6z1&wPB28-pB_~&J>rSk&;Kcq#KH& z-r8+bxaouMxV#jHyoZV7Ga;ypfQq;&8ikKNS)%dSh7`E6@p~H9Px7FNPY2#=i6;{w zjrXgk;Z;k)&tLU$V3?{}eyHd;#+$39p_Y0>qFP+ha}yn cqW4CZqQn0u+@XQNuh$cWZ}i$bpUfES-<}&png9R* literal 0 HcmV?d00001 diff --git a/python/libs/_msi.lib b/python/libs/_msi.lib new file mode 100644 index 0000000000000000000000000000000000000000..ca2b30f6ffc4c8907352a646711e10e62c5f63bf GIT binary patch literal 1664 zcmb_dPfHt75dZCN8k42apq`3_6a?E#n(S`0f=IL$8e9{J@w~>wKYNG?8bL35@#w8r zPagaTo;{WxiueKiBn6#$d6UFSXaaf5&U^El**AaQ%-fF(mBZ@(qWvZLa%5cBOV7L6 zjPnvtYc}JEV9N&Z1~AS5>k5e61JNmdgCM`QUM!V^mG2whO8ND2u@nULqYyz**!2C^ zQk=86EiC`oEUX4AOXVd}59>`L2VtxId1p1W*KXJA2)TV`09O`pPs~(Qg#iO5BJ@~f zcUb@Xd)g;53OCg}tw|jJ%ewcq>%VVU_;qtpj8Y6SiiL)es_kqa?@e#CSzwVCm%`{d zhs1I!tW{c-X-7npwD?W$qXsA?$RT~F^=35;KI*^piXP)RB=1a`-yzN{Vths%)C?vP zV+8PKJXjn*8D9&lhmE7gZY%kz^f~G03#&@{4|z*Gf5;n9O{rCaC>0uEVuGw!8}%l+ z89(`nrzbJS`aIY#6B2C>P@e7!qT*sJmLMMM5P*(Owu>F(UJeZy4MajU!{(x*CVO4KDi)!_=t)p0G1p1C?kf9ivrCZ9mx3&fVn7__6D zxz`=_Ko;6(J9I~7B~4s`+)=%wr=vW!T$vAM&IBY PYC^>oL(dJauL#)B%X210 literal 0 HcmV?d00001 diff --git a/python/libs/_multiprocessing.lib b/python/libs/_multiprocessing.lib new file mode 100644 index 0000000000000000000000000000000000000000..4fc7827582c28c715998cf0be7b89ae1d7201a24 GIT binary patch literal 1950 zcmcIl&2HL25dLha0#*;GjdF=nxlz9Qyz{^w0h375G5HXQ_y>fW&IjZPxqsg^Zkj*z_~nEdGbF@lKk3Kz0`yBNBxVt371Lo*U*c(kDokbd8@t9&pKQ8~ZoAjs@9VEB zi@IGbZHW1S;W25vkUv1D!jlrz6K%*AwjD*)Xtz2Pe*E+cZf@kpyp|ist3qa>0C)%v zrNzU`J4U1>%RXelA0O-1!uCb(MB}dmt3u;JMU(pbF?tMsN^*?Jri_&rp3ElIW7Cxv zEyoqGqd8NgSm!?@pJZF%Tko}pH+ILL JDfCXzegjG~g_-~W literal 0 HcmV?d00001 diff --git a/python/libs/_socket.lib b/python/libs/_socket.lib new file mode 100644 index 0000000000000000000000000000000000000000..f795f14707c53759adc9f6d4f16892fe395c96eb GIT binary patch literal 1920 zcmcIl&2G~`5dQ2WO_Oqn3>OYaMydo{LK53hO9(koB%-=W<)*#5sgu%xila72<-~;} zH=Y61SK!to7Y-bF0A8ZkGGp&1&L2%GSb2YDc6N8Z*>A^ppR|sH!>9R&`e-Q|hFP)= zt6Uk?mxNeelM{P+09in}0Ma^;*#(x);+oZHO7s2N=2pXN`s**YpL?~fX2bLSlQ4MG z>BINyJFYuvfDghVo^QU~sc-n})n=7ebdP$}yzTY}n~Vr!^WpyMPCy3@Y=mNA#P$$z zh9F-kfSv|+NjO^qG>QRzP@p1>OjJ|k?KQAZgLoAxj^#MS*)fcxU+leaM`5_?woTg* z_r8~Rl@z{z{n%I`{L6%wAs5@7{dcccw__2g(%_R6MDL*Rtk`Y0`mNQ9oVrDWA5?z} zMT&X{rE_8TNT_jx2A5Q&9qS$F=PLCYax7v+uz^9{!_5NU1@Fg&Epn&YW;ZwvPr`$~ ze&2hbyS4g8G&|PtVZ4wxAWBE00=0bUStL$@6NE=S@-=t*8JFZ=d>pUf!p^CXkR2d$ z_fTpgaJ(WVH747T0s|XssA0X%jVQc3U<-*m6&|(MBHT=(K{h053vj);stN1RUgyb-OdOvpe(c%&aG0R}X62Z|s*&H)UPd%gnj? zY_40M(PGw})!e2H;0a)y0M!syzX(3pkEzxe1hP|jIHt3fA8HLwDL1E*>0M0ESL3lO>6f77p zk)WSN{vU(q;i&IHtZysb{9I>j4`s!h>)`PX3qMc4mPZKF5Md)S()FzmN1vwF+9I$> z%r_DATtI3u9o4I?>Qqja#)$bv-=$X26`_F4nYMeS)fi!h{D~cl1vqCW&7(-Nh+)Yc zgL;n9)F3JOKqfXx9zR`)Y6p$O#>bZPqB8CH#nQ4`y)g`v%p3Ut%9-L)G*a?N7k5KZ z)Ec`@3O9ND9amT4koPcgd?o~S0ZvNPnKvrwjl+sZSoxr>nC~8#HR!ETH?t> zK;z@;sejdy%V)29*f&g7Ek9Ir9OK>9QddizAyzG}Xt`QWMbI->%m1l@UNSpDQT+A6 zvE!A}OPA$l@E8(X-ue5%k>O`|agUpONSO d)uK0}OVQ!~6Yfyo;MZ$h;TyW~&c`zb`w#4;LaqP+ literal 0 HcmV?d00001 diff --git a/python/libs/_ssl.lib b/python/libs/_ssl.lib new file mode 100644 index 0000000000000000000000000000000000000000..176c166fd4cd3b507dc1159348034a8a3da0a438 GIT binary patch literal 1664 zcmb_dOG^S#6#iz$OeILNRTLNm)y8yY>;Vz>f}}~qY(1Iw5Go}NYEzq*?b^0#(NAdI zx*(z-&@Tzey?m;kAd{zSMv_19&55*ek+-1|1%H46@s)|E)c3 z5gCOWDPI&+9RFqAo^AN=Xa-&$uG3zM!AG&s&?1Gs-Lr$Str`m~(Beiha!w$)6e$*R z)!dk=M1!<=ruRbvloBKmeUf_95(XdjC%sCK@dUz8I?es?GYcP|5eGGnP_UN(-i!x} z{pSN4#r$chQrfSECo+>^Cz)Co(qE*Hc>a(#pqdh^AW4z!SI50#?J=AOHXW literal 0 HcmV?d00001 diff --git a/python/libs/_testcapi.lib b/python/libs/_testcapi.lib new file mode 100644 index 0000000000000000000000000000000000000000..ae59b09416ba16e0c8dc257ad0b92b93e6dc5f9b GIT binary patch literal 1748 zcmcIlOHbQC5dLgaN-Q2x;aU+85^xE5*a!qdrhwE4lb{f|nlz8%10(_?!HG+c-1raa zkLZPCZyY#~J3l0yadwk9(2$^ZEbs2jj(6vq`F1_Co~Z0Jjopv03&Bet3} zCe*kgCysRh9{{BWXmuKff#EX0j+5Hk&t!AX_RhgpHnpG2WF5yVU3i6j)rI4v4{iIU z3vOCIO^@8y!}PARy_wsjZ`{)=HD|8Zazd9nFcPzkWQd^D6ripFVZu}%_Mt(6iXnP5 zir`(C`U$)jZke@c^}0v^->Qxoi;FrP>$aldckM@Jf^dxxJ`yEbEPcEDK6lVmfh`)` zN=5V*!e63pG4JK)5^`#a1`qT;3j?JI7Gn3pZ&{czP6LJZlYVTs5V=>WpF)ULjI}Dr zpyn|d{zz6{k%fIiSD*IW!g=MQQuZPX*~N&RO7Hr!UCk)z{2?y@Die>0h0IDC1@?he zsGL?Q-q6(@8V$K2f5XB7s*tcPzz_LET6}=KlO`<&`;Y-GAG2*?`z$v?cy(Y+Xxynd zqV}Dn>OmMi0J;yxBsxxkt*Aa@e)$1%n6ERY=ufqq4#p&Dxzn`{3j;#Q{B%L z#$PX=f%CS~zCGkgd!h}RrG7ncJx-b_Q^kbjlh!F6C(V#{_Is3y=>Ktk`^o7vZQX;8 egJ#uOm46-nyYMl!6~4o`bbO0-UHO6Kq5lDp)K3-w literal 0 HcmV?d00001 diff --git a/python/libs/_tkinter.lib b/python/libs/_tkinter.lib new file mode 100644 index 0000000000000000000000000000000000000000..6d8865d5c3c442c37db57cd1ee1a23a5f0980190 GIT binary patch literal 1732 zcmcIlPfrt35dZCNMYl?a7ghJ{x``*mFd2it>K z%DV6WZGkUh(lrR)uUD4CrG;RDwnY1F8V;gZY|t;=8HLwFL1E*_08T9+MR+zw6f77p zk)oeP{_lh5_NZ?_tZysZ{@i42w`Ikf@8R(c3qOy)R>uj`C}ATqvd!(SPrK7=T@hF$ z=9>t5E+Mm+jhgkiK3$NdNn(D{_ggFIicmuCMBB}3HO84Ce`3dC3C@X0^90f?VoY+! zpq^nO^N^H$AQPLU4>H-4mLDoQj`8|xX{x2(kf;_{v|KI6BIuc`<^NQ{AentaQT+44 zv6GcDNS77nK#0nNH`T=|i3%GYO;dz{nW)ASkb_R%`WO;r-gXT6wiztp&}mHiDqC z?)(2c@r}F#Uwv`CvK%bT*XJp^v(+Q9-RX;u)g&=udx$tikoPp;zyOX&85rnKV#2;30n~<7TB<>~kK8W4j0IP^a-BGOQvklbXSJ zHcdLO#f`n0{l_bv)=u|x_ha9BR(o#w<;t?~{v(Jt;zM45s6;)DEJ@-Q&EyX7THUQ4 zVa)9R#Knc$ilezPC><(Q4-hanl|>}Q;0$GPIfe`fV~Rry+n=zIjaLVXQsY6#63N7b zi6w@alo_@=8)1ennDIw|VrcQqXbaa+M3~_yD>LJlQsl_Yxc3vk%UM1p0M|Ymi7Qr8 zZ`g*Z?$Te{U~sVU6}#asg-l@j@m-3x$X#-ko#RfGBFB5H>|LrkNt?!!FKHzm^(a~V WAHWyU*Z5_6B(fSs_-3nnYhD8Cg&CRv literal 0 HcmV?d00001 diff --git a/python/libs/omf_python27.lib b/python/libs/omf_python27.lib new file mode 100644 index 0000000000000000000000000000000000000000..a239e707b981d84b19020d7722542ba0076efbbb GIT binary patch literal 103936 zcmd_TdzhtFbthZ|6E9dIA|fC+xyc|RAOVLkq^YiMEA)-7YFb2c=JYvlR~`G*ImNkj zS9yue7-FeI7~?p`5JU19$1%qE8OQi}8$%rQ^NM_i7{e&yjTkj(lsLxQthLwLd#~T# z`#sh9d-{2(D)w)^YpuQZ+H0?UdH4I>=_&i~=)+H(dO~B@+NSx1#!P>CrPHnc&H6=C zQ-63=TKxExwb4?)cgf|?YInQS@WhW_{R>l5BVl{^xT#~6-9AHJ(>9ps$R3PsombSwsYT$s@CYk>sLCaMG!b2UwHZ)&wlFgu~XB5 z|CT{jjn*%8jIk6rKHhU=`r895X8>P+r|{L zVN=H!ukUoaZ$Jj}P6c@>$2+WivDY=tVI>{4v9PvMHH^Iy2;`8x61XzF z*@?A1m}-7B==2sH|Em-J1}gD4aEt`fMGik{>WO5(Yx@0egM-nwesA%-^-G<_G5~lV zn>_W1(_H(TvJE3Nmv3(k)(H<}cs`{zCA9 z$p7@IQ_)_#t7d!epfjqZBKNFscSf5`1rnbIHA?u+2GOp=9Ilrys(x<+`Gp$S$QR02 zCGsUd&=%NQjdt}ry-_t7<@Svr)Hb$XB#49h;ipbLCE9mx7`^e<^{bs>YhaLZLa?ai z@Gh*1*i-Tmtq%?1H<)}RmI8OmMH}uHG{wMwI@E-puw%;M6Q@q#_FWrQn+AjC z+8p_g8&V#%ewAz9G78+ETzdYUqI}A~vB`z$-r}(({sFD!A1Llt{wGWwZ}q1vzSnAw zzOnvXr+o$4D&z5jUo(2é-z2Ai$gb2hh{=20eVz)QO-!54zIRuU+5d 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�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 a`mgZ+gDGjrg~IpaAqz>q1L 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 Z^(Wy!2G^yd@q6`I_|}8q+a9Q9^EdzPI3)l8 literal 0 HcmV?d00001 diff --git a/python/libs/unicodedata.lib b/python/libs/unicodedata.lib new file mode 100644 index 0000000000000000000000000000000000000000..d6e6f64a751d5974bbf5e930207755acbdb28528 GIT binary patch literal 1782 zcmcIl%}(1u5dLiQ(^yE23gTADNRencgd~n5kN}xKi3pRR5H7u#H0H+#NCZKmr(Sa8 z)_17H3vff?*lQ0QcmVFa0n9kN#5go0h_2<`nQzCQ`DSMAiMh&g^#%8fpc2`!nmP`4~aiUGPbisFsjdJVs84no9}^&j5!Yt^z+v!ZT0x}#|L^SfCbC4L`>Ck-X(?S4Pq zPi(bRV3mY(sfg7^d@1R3;Sw3SHAcc;y6*%)>4J^awXn+x7;zFb@+a*Ww_#kXw2mXj zDn3R?O=2`YOgO)j2V2F?K5h8bOvy<~NQ ioOf-?elu&CBC!Vld-%XQ3V+eq5r5MsPB?q6I0 literal 0 HcmV?d00001 diff --git a/python/libs/winsound.lib b/python/libs/winsound.lib new file mode 100644 index 0000000000000000000000000000000000000000..efa8af838b879719d4d92fc30c50367828852c4f GIT binary patch literal 1732 zcmcIlPfrt35dZCNLAoKN5pPDbBqYkEw%x6QF{J!4v0-URSrTqb?W*j7wt*7y#KogG z?;QCMp17J24j%jfei58`eM7hWt)xz~^WMyx_hx=?W?rY>)OQ=(^Y#m;pYpEj<>uUC z-tE`tw3v5i^=!)qFaj7yfOSgK6fnBUUl^8G*Q&K3TzjUI-RwOT5!2){Hx1gMR6sQFuKR6gG|w;M4+AglBV9!GZx3 zDf(ID|2}x`j{0WA0yEqG5;3;Bvf|D4@c4#>pT}RT6NG7uun`&A=)?Q{Pt)sN5m=H zUp)=4S_;MdMGyOisjB6NijHHvzFH!+)MJTiaYf73ax8)#xmx~D6%3NuCltkv500Iz zltH?zFe|U%mMvZOn>=*$eEq%M(q%=tDy~NEvLq$C%o9D^{SrZs!@b`@?(`{n9$qba buXHIo{C~n7>KpueJy!U}F1_=~jKTg38>dN! literal 0 HcmV?d00001