kann man einen alten Quellcode mit einem neuen compiler neu kompilieren ?
-
Hallo zusammen,
ich hoffe hier Hilfe zu finden
und zwar versuche ich seit Ewigkeiten (ohne Kenntnisse im coding) einen älteren code neu zu kompillieren, denn ich will in diesem einige Wörter aus dem Parser ins englische übersetzen.http://moras.svn.sourceforge.net/viewvc/moras/moras/branches/1.73/
nach 'zig mal Borland und sogar mein Betriebssystem neu installieren haben
mein Freund Google und ich es nun endlich geschafft alle damals (2006) benutzen Komponenten zu finden und richtig zu installieren.Borland C++ Builder 6.0 incl Update #4 Moras Components included in source zip or cvs tree SoftGems Windows XP Theme Manager http://www.delphi-gems.com/ThemeManager.php SoftGems VirtualTreeView http://www.delphi-gems.com/VirtualTreeview/ Indy Internet Components http://www.indyproject.org/ Toolbar2000 http://www.jrsoftware.org/tb2k.php Toolbar2000 mod TBX http://www.g32.org/tbx/index.html Inno-Setup http://www.jrsoftware.org/isinfo.php
ich klicke auf compile und es kompilliert und kompilliiert und kompiliiiert ...endlich ohne Fehler
und dann DAS:[Linker Error] Fatal: Access violation. Link terminated.
Das Programm wurde damals mit Borland 6 C++ builder (update 4) gebaut
und laut Google kommt dieser Fehler fast ausschliesslich bei Borland C++ 6 vor.
meine Frage nun: ist es möglich, einen so alten code mit einem neuen builder zu kompillieren
in dem Fall würde ich mir den neuen von Embarcadero als trial runterladen.
bzw. kommen die neuen mit den Komponenten klar die dort verwendet wurden ?
oder liegt es vielleicht an meinem Betriebssystem Win 8 ?
den Besitzer von allem Ordnern (auch den System Ordnern System32 und SysWOW64) habe ich auf Administrator geändert und Vollzugriff angehakt,das und führe Borland auch mit diesem Konto aus.
ich hoffe, das mir hier jemand helfen kann und nicht nur Kommentare kommen, von wegen lerne coden usw. es geht mir nur um dieses eine Programm, danach werde ich alles von meinem PC verbannen was mit coden zu tun hatlG Moni
-
2006 ist ja nun nicht so lange her, der letzte Sprachstandard war damals von 1998 und somit schon lange etabliert. Das heißt natürlich nicht, dass dieser zwangsläufig benutzt wurde, denn der Borland-Compiler ist bekannt dafür, auch richtigen Schludercode zu übersetzen, bei dem strengere Compiler sehr viel anmeckern würden. Das heißt aber nicht automatisch, dass schluderig programmiert wurde.
Da das Unmengen an Code sind, kann man dies wohl nur durch Ausprobieren endgültig klären. Beim Diagonallesen einiger zufällig gewählter Dateien ist mir zumindest nichts zu schlimmes aufgefallen. Es wäre auch eher ungewöhnlich, wenn ein Open-Source Projekt vollkommen unportabel oder gar compilerabhängig programmiert würde.
-
wenn ich nun einen neuen compiler runterlade, kann ich den dann neben dem BCB6 installieren oder muss ich den zuerst löschen ?
und was ist mit den Koponenten wie Virtual Treeview und Thememanager die damals benutzt wurden, funktionieren die noch mit einem neuen compiler?
wenn ich neuere releases davon runterlade und installiere, kann ich dann noch das builder package aus dem originalen code benutzen ?
-
Diese Fragen kann dir vermutlich nur jmd. beantworten der sich wirklich gut mit den verschiedenen Borland-Versionen auskennt.
Hat auf jeden Fall mit Standard-C++ nix zu tun. Wäre also vielleicht gut diesen Thread nach "VCL (C++ Builder)" zu verschieben - da tummeln sich wohl eher die Borland-Spezialisten.
-
hustbaer schrieb:
Wäre also vielleicht gut diesen Thread nach "VCL (C++ Builder)" zu verschieben - da tummeln sich wohl eher die Borland-Spezialisten.
Ja, vorher schon mal ein paar Hinweise:
Diese Linker Fehler waren früher wirklich eine Plage. Auch nach dem BCB 6 Update 4 gab es noch ein Linker Update für diese Version. Manche Bugs im Linker wurden erst mit der Version 2007 behoben, kann aber auch sein, dass noch welche übrig sind.
Die Version 2007 ist auch die letzte, wo die VCL noch Ansi basiert ist. Alle neueren C++ Builder arbeiten mit einer Unicode VCL, da müssen Programm und Komponenten sicher etwas angepasst werden.
Komponenten müssen in der Regel für jede IDE Version neu separat installiert werden.
Projekte von einer vorherigen Version in eine neuere zu laden ist auch so eine Sache. Ich habe da keine guten Erfahrungen mit. Ein neues Projekt anlegen und alles Stück für Stück hereinholen, klappt bei mit besser.
Was die ISO C++ Unterstützung angeht, hat sich beim 32 Bit Compiler seit damals nicht so viel geändert, nur der neue 64 Bit Compiler basiert auf CLang 3.1.
Man kann verschiedene C++ Builder auf dem gleichen Rechner installieren, aber nur in dem man in aufsteigender Reihenfolge installiert, nie einen älteren über einen neuen installieren.
-
Der Linker ist noch genauso schrottig wie damals.
Bei größeren Projekten hilft nur aufteilen in BPLs. Das ist aber nicht ganz trivial.
Im allgemeinen C++ Forum ist der Beitrag falsch.
-
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum VCL (C++ Builder) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
nn schrieb:
Ja, vorher schon mal ein paar Hinweise:
Diese Linker Fehler waren früher wirklich eine Plage. Auch nach dem BCB 6 Update 4 gab es noch ein Linker Update für diese Version. Manche Bugs im Linker wurden erst mit der Version 2007 behoben, kann aber auch sein, dass noch welche übrig sind.
dieses linker update "ilink" oder so habe ich auch runtergeladen und in den bin Ordner von Cbuilder kopiert, aber es bringt leider keine Änderung.
nn schrieb:
Die Version 2007 ist auch die letzte, wo die VCL noch Ansi basiert ist. Alle neueren C++ Builder arbeiten mit einer Unicode VCL, da müssen Programm und Komponenten sicher etwas angepasst werden.
Das kann ich vergessen, denn ich wüsste nicht einmal wo und was ich da anpassen müsste.
hmm... naja vielen Dank schonmal für euere Antworten ich werde einfach mal weiter versuchen, vielleicht habe ich ja Glück und ich mache aus Versehen irgendwo ein Häkchen, das mein Problem behebt
-
DAOC, man war das nen tolles Spiel.... Albion FOREVER!!!!!
-
Um direkt auf das Topic zu antworten: ja!
Ein C++ Builder 6 Projekt ist durchaus mit einer neueren RAD-Studio Version compilierbar. Das hat nichts mit dem Jahr 2006 zu tun. Es gilt nur die AnsiString vs. UnicodeString Inkompatibilitäten zu beseitigen.
Du hast jedoch keine aktuell benutzte Compiler- / Studioversion angegeben. Das wird also nicht ganz klar.ThemeMgr brauchst du unter neueren Rad-Studios nicht. Denn da wird alles von Haus aus in dem benutzten Windows-Theme dargestellt, auch TGroupBox
Was du mit VirtualTreeView machst, wird nicht klar.
Indy ist in neuer Version kompatibel zu deiner verwendeten RAD-Studio Version verfügbar.
Inno-Setup ist standalone nutzbar. Das hat mit deiner Entwicklerversion nichts zu tun.
Toolbar2000 klingt erstmal alt, ka was du damit machst.
Falls du konkrete Compilermeldungen posten könntest, wäre das sicher hilfreich
Viele Grüße
int02h
-
MORAS hat auch noch eigene Komponenten, die mit beiliegen Ordner components) diese müssen als erstes compiliert und installiert werden.
-
DAOC schrieb:
DAOC, man war das nen tolles Spiel.... Albion FOREVER!!!!!
in der Classic Version ist es das immer noch
also was die einzelnen Komponenten wie VirtualTreeView und Toolbar ect. machen weiss ich leider selber nicht.
im Moment bin ich mal wieder mein Betriebssystem am neu aufsetzen denn ich habe da wohl einige System Bibliotheken verschoben oder k.A.
aber vielleicht klappt es ja wenn alles nochmal sauber installiert ist.
wenn nicht, werde ich gerne die Compilermeldungen posten.
allerdings kamen beim Kompillieren keine Fehlermeldungen, erst als es anfing zu linken, kam sofort dieser blöde Fehler.einige Features brauche ich gar nicht, z.B. muss ich damit nicht ins Internet, weil ich keine online updates brauche und ich brauche auch dieses Gnugettext nicht denn das Programm darf ruhig ausschliesslich in englischer Sprache laufen.
damit würde das Programm ja sicher etwas kleiner werden.
nur dazu muss man ja auch den Quellcode ändern oder ?Und was heisst das : AnsiString vs. UnicodeString Inkompatibilitäten beseitigen ?
müssten da einzelne Befehle nur ersetzt werden ?
-
DAOC MORAS schrieb:
MORAS hat auch noch eigene Komponenten, die mit beiliegen Ordner components) diese müssen als erstes compiliert und installiert werden.
ich weiss nicht mehr wie, aber ich hatte es geschafft diese zu kompillieren und zu installieren
die wurden auch unter "Packages" angezeigt.
Ich habe auch alles genau in die Pfade installiert, die in der Projektdatei des Entwicklers stehen.
-
eifelhexe schrieb:
Und was heisst das : AnsiString vs. UnicodeString Inkompatibilitäten beseitigen ?
müssten da einzelne Befehle nur ersetzt werden ?Er meint im Prinzip das gleiche, was ich geschrieben habe. Man muss halt an Program und Komponenten Anpassungen vornehmen, weil der Text standardmäßig jetzt nicht mehr als ein Byte pro Zeichen sondern als UTF-16 (zwei oder vier Byte pro Zeichen) dargestellt wird. Es gibt dann halt zwei Arten von Fehlern, welche wo der Compiler meckert und welche die zwar übersetzt werden, aber nicht mehr das richtige tun.
Auch habe ich ja nicht geschrieben, dass man ein altes Projekt nicht mit einer neunen Version kompilieren kann, sondern dass das nicht immer problemlos ist. Wir hatten erst letzte Woche hier eine Frage dazu:
http://www.c-plusplus.net/forum/313090Was diese Linker Fehler angeht, es gab da welche die auftauchten, wenn ein Projekt eine gewisse Größe erreichte. Je nach Projektart und Einrichtung der IDE (Anzahl Fremdkomponenen im Projekt oder der IDE) waren manche Leute viel und andere weniger von diesen Problemen betroffen.
-
lol ich glaube es selber noch nicht, aber ich habe es geschafft mit BCB6 !!!
zum Schluss ist der Startbildschirm des Programmes aufgegangen und ich habe keine Ahnung was ich nun tun muss.
Auf jeden Fall mach ich jetzt gar nix bis einer von euch mir sagt was...
-
hm... ich habe gerade die exe gefunden
also muss ich wohl nichts mehr machen.
nun kann ich meine Übersetzungen in dem Parser vornehmen, kann sein das ich mich wieder melde
und vielen Dank an alle
-
so da bin ich schon wieder
und hoffe das ich mit meiner Angelegenheit immer noch im richtigen Forum bin.wie schon geschrieben, konnte ich den code endlich kompillieren
und ich konnte auch die zu übersetzenden Teile übersetzen und es funktioniert immer noch.nun habe ich allerdings immer noch ein hoffentlich kleines Problem :
der Parser liest den Chatlog aus und fügt die Werte in ein .xml Dokument ein.
Das tut er auch so wie er sollte,allerdings bei einem Wert will er nicht:Das hier z.B. soll er lesen:
[11:20:27] <Begin Info: Obedience> [11:20:27] [11:20:27] usable by: [11:20:27] - Spiritmaster [11:20:27] - Runemaster [11:20:27] - Bonedancer [11:20:27] [11:20:27] Magical Bonuses: [11:20:27] - Summoning: 4 pts [11:20:27] - Constitution: 18 pts [11:20:27] - Matter: 10% [11:20:27] - Power: 8 pts [11:20:27] [11:20:27] Focus Bonuses: [11:20:27] - ALL spell lines: 50 lvls [11:20:27] [11:20:27] [11:20:27] Level Requirement: [11:20:27] - 50 Level [11:20:27] [11:20:27] Damage Modifiers: [11:20:27] - 16,5 Base DPS [11:20:27] - 4,5 Weapon Speed [11:20:27] - 100% Quality / 100% Condition [11:20:27] - Damage Type: Crush [11:20:27] [11:20:27] Effective Damage: [11:20:27] - 16,5 DPS [11:20:27] <End Info>
das liest er alles korrekt bis auf das:
[11:20:27] Focus Bonuses:
[11:20:27] - ALL spell lines: 50 lvlsich habe herausgefunden, das,wenn dieser Wert unter "10" liegt, es korrekt ausgelesen wird sobald er aber auf 10 oder höher geht findet er ihn gar nicht mehr, hat vielleicht jemand eine Ahnung ?
#include <assert.h> #include <StrUtils.hpp> #pragma hdrstop #include "ChatLog.h" #include "Utils.h" #include "MainFrame.h" // Brauch die xml_config Struktur // Mit diesem String beginnt der Info-Bereich const char strInfoStart[] = "<Begin Info:"; // Mit diesem String endet der Info-Bereich const char strInfoStop[] = "<End Info>"; // Mit diesem String beginnt der Info-Bereich const char strMagBoniStart[] = "Bonuses:"; // Ein paar Strings zur identifikation bestimmter Werte const char strAF[] = "Armor"; const char strAbsorb[] = "Absorption"; // Daraus läßt sich Rüstungsklasse gewinnen const char strQuality[] = "Quality"; const char strSpeed[] = "Weapon"; const char strUnique[] = "Einzigartiger Gegenstand"; const char strCrafted[] = "Hergestellt von:"; const char strBonus[] = "Bonus auf"; const char strBonus2[] = "Bonus zum"; const char strRestriction[] = "usable by:"; const char strArtifact[] = "Artefakt:"; const char strActivLevel[] = " (Benötigte Objektstufe:"; //--------------------------------------------------------------------------- CChatLog::CChatLog() { fChatLog = NULL; arItemNames = new TStringList; }; CChatLog::~CChatLog() { CloseChatLog(); delete arItemNames; }; // Öffnet die ChatLog-Datei für Lesezugriff int CChatLog::OpenChatLog(const char* Filename) { if (fChatLog != NULL) delete fChatLog; // Seek funktioniert nur richtig im binary-mode. Nur ist jetzt immer /r hinter einem String fChatLog = new fstream(Filename, ios_base::in | ios_base::binary); iLineNo = 0; if (fChatLog->is_open()) return true; else return false; }; void CChatLog::CloseChatLog() { if (fChatLog != NULL) { fChatLog->close(); delete fChatLog; } fChatLog = NULL; }; // enumwerte des Parsers in Init enum ParserStateInit { STATE_START, // Scanne nach Start einer Info-Section STATE_ITEM, // Suche danach in der Sektion, das es ein Gegenstand ist }; // Diese Funktion scannt erstmal das gesamte Log nach Gegenständen und merkt // sich deren Position. In einem zweiten durchlauf wird versucht, die Herkunft // der Gegenstände herauszubekommen. Doppelte Items werden herausgefiltert void CChatLog::Init(void) { int posStart; // Startposition des aktuellen Info-Bereichs AnsiString strName; // Name des aktuellen Info-Bereichs char Line[1024]; // Hier eine maximale Länge eines Textes heruasfinden bool bIsItem; nItems = 0; iLineNo = 0; arItemNames->Clear(); arOffsets.Length = 0; ParserStateInit State = STATE_START; fChatLog->seekg(0, ios::beg); // Lesezeiger auf Dateianfang fChatLog->getline(Line, 1024); while(!fChatLog->eof()) { assert(StrLen(Line) < 1024); iLineNo++; switch (State) { case STATE_START: { // Suche nach dem Start eines Info-Bereichs char *pStart = AnsiStrPos(Line, (char*)strInfoStart); if (pStart != NULL) { posStart = fChatLog->tellg() - fChatLog->gcount(); AnsiString sTemp = pStart; strName = sTemp.SubString(sizeof(strInfoStart) + 1, StrLen(pStart) - sizeof(strInfoStart)- 2); // Jetzt mal schauen, ob es einen Doppelpunkt gibt. int p = strName.AnsiPos(':'); if (p > 0) { // Wenn ja, dann den String bis dorthin abschneiden strName = strName.SubString(p + 2, strName.Length() - p - 1); } bIsItem = false; State = STATE_ITEM; } } break; case STATE_ITEM: { // Suche nach Magieboni oder Info-Sektion Ende char *pStart = AnsiStrPos(Line, (char*)strMagBoniStart); if (pStart != NULL) bIsItem = true; // Ist Info-Sektion zu Ende? pStart = AnsiStrPos(Line, (char*)strInfoStop); if (pStart != NULL) { State = STATE_START; // Nach der nächsten Info-Sektion suchen if (bIsItem) { // Ende Info-Sektion und es ist ein Gegenstand // Also in die Liste der zu untersuchenden Gegenstände aufnehmen int index; if ((index = arItemNames->IndexOf(strName)) == -1) { // Item mit diesem Namen gibts noch nicht (im Logfile) arItemNames->Add(strName); arOffsets.Length = nItems + 1; arOffsets[nItems] = posStart; nItems++; } else { // Name gibts schon. Offset aber auf diesen setzen, // da immer das letzte das aktuellste sein sollte arOffsets[index] = posStart; } } } } break; } fChatLog->getline(Line, 1024); } } // Diese Funktion macht die eigentliche Lesearbeit // Input ist dabei der Index des zu beschaffenden Items und einen Zeiger // auf eine CItem-Klasse, welche ausgefüllt werden soll // Rückgabe ist true für keinen Fehler int CChatLog::GetItem(int index, CItem* Item) { unsigned int i; char Line[1024]; // Hier eine maximale Länge eines Textes heruasfinden char sArg[64]; // Längere Bonusbezeichnungen gibts glaub nicht int NextBonus = 0; // Welche Position soll der nächste Bonus eingetragen werden int NextRestriction = 0; // Nächster Index einer Klassenbeschränkung bool bRestriction = false; if ((index < 0) && (index >= nItems)) return false; // Itemindex nicht im gültigen Bereich Item->Init(); Item->Name = arItemNames->Strings[index]; Item->Realm = player->Realm; // Immer Realm des Spielers annehmen Item->Quality = 0; // Versuche Aufgrund des Namen auf den Itemslot zu schliessen AnsiString strTemp = Item->Name.LowerCase(); for (i = 0; i < 18; i++) { for (int j = 0; j < xml_config.arItemSlots[i].arIds.Length; j++) { if (strTemp.AnsiPos(xml_config.arItemSlots[i].arIds[j]) > 0) Item->Position = i; } } // Lesezeiger auf Beginn der entsprechenden Info-Sektion stellen fChatLog->clear(); // Ist nötig, da wir eventuell noch im eof-state sind fChatLog->seekg(arOffsets[index], ios::beg); fChatLog->getline(Line, 1024); // Erste Zeile Lesen (kann ignoriert werden) fChatLog->getline(Line, 1024); // Erste Zeile mit Infos while(!fChatLog->eof()) { assert(StrLen(Line) < 1024); int Value = 0; // Ist Info-Sektion zu Ende? char *pStart = AnsiStrPos(Line, (char*)strInfoStop); if (pStart!= NULL) break; if (Line[11] == '-') { // Alles danach ist ein Wert, der mich interessiert // Suche erstmal nach einem Zahlenwert. Sollte immer nur einer sein // Bonus-Argument ist immer der String vor einem Doppelpunkt, // oder der String hinter einer Zahl bool bValue = false; // Gibts eine Zahl? bool bDoppel = false; // gibt es einen Doppelpunkt im String bool bPercent = false; // Es ist ein Prozent-Wert int pArg = 0; // Aktuelle Position im Argument-String for (i = 13; i < StrLen(Line); i++) { if ((Line[i] >= '0') && (Line[i] <= '9')) { bValue = true; Value = Value * 10 + Line[i] - '0'; } else if (Line[i] == ':') bDoppel = true; else if (Line[i] == ' ') { if (bValue && (bDoppel || (pArg > 0))) break; pArg = 0; } else if (Line[i] == '%') bPercent = true; else if ((Line[i] == '\r') || (Line[i] == ',')) {} // Diese Zeichen ignorieren else { sArg[pArg++] = Line[i]; sArg[pArg] = 0; } } if (bValue) { // In xml_config nach einem entsprechendem Boni suchen int bid = xml_config.GetBonusId(sArg, bPercent); if (bid < 0) { // testen, ob der gesamte Text nicht vielleicht doch ein Bonus ist bid = xml_config.GetBonusId(MidStr(AnsiString(Line), 14, i - 16), bPercent); } if (bid >= 0) { // Es ist ein regulärer Bonus Item->Effect[NextBonus] = bid; Item->EffectValue[NextBonus] = Value; NextBonus++; } else { // Hier ein paar zusätzliche Werte nehmen, die keine Boni sind if (strcmp(sArg, strAF) == 0) Item->AF = Value; if (strcmp(sArg, strQuality) == 0) Item->Quality = Value; if (strcmp(sArg, strSpeed) == 0) Item->Speed = Value; if (strcmp(sArg, strAbsorb) == 0) { // Value in Rüstungsklasse umwandeln switch (Value) { case 0: Item->Class = 0; Item->Level = Item->AF;break; case 10: Item->Class = 1; Item->Level = Item->AF / 2; break; case 19: Item->Class = 2; Item->Level = Item->AF / 2; break; case 27: Item->Class = 3; Item->Level = Item->AF / 2; break; case 34: Item->Class = 4; Item->Level = Item->AF / 2; break; } //if (Item->Position < 0) // Item->Position = 0; // Alle Rüstungen als Handschuhe annehmen // Es gibt leider keine Info darüber im Log // Wenn wir die Position auf -1 lassen, dann kommt automatisch eine Auswahlbox } if (strcmp(sArg, "DPS") == 0) { // Nur ersten DPS-Wert speichern if (Item->DPS == 0) { Item->DPS = Value; // Berechne den Itemlevel int level = (Value - 11) / 3; if (level > 51) level = 51; Item->Level = level; } } } } } // else { // noch ein paar besondere Strings auswerten if (strncmp(&Line[11], strUnique, sizeof(strUnique) - 1) == 0) { // Unique Gegenstände nicht importieren return false; } if (strncmp(&Line[11], strCrafted, sizeof(strCrafted) - 1) == 0) { // Craftet Gegenstände nicht importieren return false; } if (strncmp(&Line[11], strArtifact, sizeof(strArtifact) - 1) == 0) { Item->MaxLevel = 10; Item->Realm = 7; } if ((strncmp(&Line[11], strBonus, sizeof(strBonus) - 1) == 0) \ || (strncmp(&Line[11], strBonus2, sizeof(strBonus2) - 1) == 0)) { // Spezielle Werte (meist Bonuserhöhungen) // Bonus auf BONUS: VALUE unsigned int i; for (i = 21; i < StrLen(Line); i++) { // Alles bis zum Doppelpunkt in sArg kopieren if (Line[i] == ':') break; sArg[i - 21] = Line[i]; } sArg[i - 21] = 0; for (; i < StrLen(Line); i++) { if ((Line[i] >= '0') && (Line[i] <= '9')) { Value = Value * 10 + Line[i] - '0'; } } // In xml_config nach einem entsprechendem Boni suchen int bid = xml_config.GetBonusId(sArg); if (bid >= 0) { // Es ist ein regulärer Bonus Item->Effect[NextBonus] = bid; Item->EffectValue[NextBonus] = Value; NextBonus++; } else { // Fehlermeldung Application->MessageBoxA(AnsiString("Ein Bonus '" + AnsiString(sArg) + "' ist unbekannt!\nDie Datei 'config.xml' bzw. die entsprechende Sprachdatei anpassen!").c_str(), "Fehler"); } } if (strncmp(&Line[11], strActivLevel, sizeof(strActivLevel) - 1) == 0) { // Danach kommt ne Zahl, welche den Level angibt int level = Str2Int(&Line[11 + sizeof(strActivLevel)]); Item->EffectLevel[NextBonus - 1] = level; } unsigned int cp = 12; if ((strncmp(&Line[11], strRestriction, sizeof(strRestriction) - 1) == 0) \ || (strncmp(&Line[12], strRestriction, sizeof(strRestriction) - 1) == 0)) { // Solange nachfolgende Strings eine Klasse darstellen, solange // diese bei den Beschränkungen eintragen bRestriction = true; cp = 12 + sizeof(strRestriction); } while (bRestriction && (cp < StrLen(Line))) { int pArg = 0; for (; cp < StrLen(Line); cp++) { if ((Line[cp] == ' ') || (Line[cp] == ',') || (Line[cp] == '-') || (Line[cp] == '\r')) { sArg[pArg] = 0; if (pArg > 0) { // Es gibt einen String. Schauen obs ne Klasse ist int cid = xml_config.GetClassId(sArg); if (cid >= 0) { Item->ClassRestriction[NextRestriction++] = cid; } else { // Keine Klasse mehr, Modus aufheben bRestriction = false; } } pArg = 0; } else { sArg[pArg++] = Line[cp]; } } } } fChatLog->getline(Line, 1024); } return true; } #pragma package(smart_init)