Uh, da haste aber reingehauen...
Dann wollen wir mal:
> da ich ja den Pfad zu PB mit einem Doppelpunkt angeben muss
Ahh, beim 3. Mal überlegen, weiß ich endlich, was du meinst. Ja das ist korrekt. Der komplette Pfad inklusive Dateiname wird ja als Dateiname genommen und enthält unter Windows daher auch einen Doppelpunkt. Gut mitgedacht! Normalerweise denke ich an sowas aber bei diesem Projekt muss ich mich voll und ganz auf Linux konzentrieren, weil Lunix/Unix eben Neuland für mich ist.
Gut, ändere das einfach, eine Änderung wird ja sowieso nötig, weil du ja den Frontslash / durch einen Backslash \ ersetzen musst.
Danke für den Hinweis!
> Zudem wäre es besser die Ausgabe des Programms mit folgendem Code zu formatieren
Du meinst, die Ausgabe des Interpreters, falls ein Fehler auftritt?
Das brauchst du nicht. Ändere in der Prozedur
error() den Content-Type von "text/html" nach "text/plain". Das veranlasst den Browser den Text so wie er ist auszugeben, ohne Formatierung. Auch HTML-Tags werden dann ignoriert. Das funzt in meinem IE8 aber nicht immer, deswegen habe ich text/html dringelassen. Wenn's geht, würde ich sofort auf text/plain umsteigen, in jedem Fall.
> Trotz der anpassungen bekomme ich folgenden Fehler
Hier stößt du auf einen Bug in PureBasic, der noch nicht behoben wurde. Unter Linux funktioniert
ProgramRunning() nicht richtig, unter Linux sieht es so aus, als würde das Program ewig weiterlaufen. Daher habe ich es auskommentiert.
Siehe ungefähr zeile 140. Unter Windows müsste der Befehl funktionieren, habs mal getestet gehabt. Der Vorgang soll in Zeile 140 dann abgebrochen werden, wenn eine der folgenden Bedingungen wahr ist:
- Es liegt Kompileroutput vor.
Beachte den Parameter --quiet auf Linux bzw. /quiet auf Windows. Er sorgt dafür, dass der Kompiler kein Output ausgibt, es sei denn es gibt einen Fehler (Syntaxfehler, Include nicht gefunden, etc.). Mit anderen Worten: Ist der Output gleich null, dann lief alles glatt. Da deine Fehlermeldung aber aussagt, der Vorgang sei erfolgreich abgelaufen, scheint mir das ein Hinweis darauf, dass du den Parameter /quiet vergessen hast. Dein Testprogramm ist nämlich einwandfrei.
- FileSize(exe$) = -1
Wenn die Exe-Datei nicht erstellt bzw. gefunden wurde
- Wenn ein Timeout-Wert von 5 Sekunden erreicht wurde (ein Vorschlag von mir, finde deinen eigenen optimalen Wert!)
Eine Internetseite, durch PureBasic generiert, die länger als 5 Sekunden braucht, ist vermutlich ein Fehlschlag. Also lieber vorsichtshalber abbrechen. Ist aber eine Idee von mir, kann jeder so handhaben, wie er es möchte.
- Wenn der Kompiler immer noch läuft
Sollte der Kompiler immer noch laufen, obwohl im Extremfall 5 Sekunden gewartet wurde, dann ist das Timeout erreicht.
> das immer einen config.xml oder config.ini gesucht wird
Das war das erste Problem, mit dem ich mit auseinandersetzen musste. Nehme ich eine config-XML? nein, dachte ich, zu viel Overhead. Eine INI-Datei? Nicht schlecht.
Aber der einzige Grund, warum ich mich letzendlich gegen eine Config-INI entschieden habe, war die Performance. Überleg mal, wenn 10 Leute deine Seite gleichzeitig aufrufen, bedeutet das, dass 10 Interpreter-Prozesse laufen, die alle auf 1 Datei zugreifen wollen. elbst, wenn alle nur lesen kann ich mir nur vorstellen, dass die Performance darunter leidet.
Ich war sehr froh, als ich es geschafft habe, alle Einstellungen schon im Sourcecode verankern zu können.
Ich rate dir, wenn du deinen eigenen temporären Pfad nehmen möchtest, zu folgenden 2 Möglichkeiten, die ich in Betracht ziehe:
- Wahl des Temp-Verzeichnisses als Parameter
Beispiel:Code: Alles auswählen
#!C:/xampp/purebasic/interpreter.exe -w -t "C:/Windows/Temp/"
Es könnte zum Beispiel einen Parameter -t geben (t = temporär). Nach -t muss dann das temporäre Verzeichnis folgen (ggf. muss man den Pfad in Anführungszeichen setzen!).
- Anpassen des Temp-Pfades im Sourcecode
Ändere den Temp-Pfad im Sourcecode und kompiliere den Interpreter erneut. Speichere ihn z. B. unter "interpreter2.exe". Das nimmste dann auch mit in dein PB-Verzeichnis rein. So hast du interpreter.exe und interpreter2.exe, jedes mit anderem temp-Verzeichnis.
Ein Hinweis zu den Parametern: In Version 1.1 auf Linux wird der jeweils letzte Parameter nicht erkannt. Lauten die Parameter also "-w -f", wird -f nicht erkannt, weil ein #CRLF$ dranklebt (das #CRLF$ ist ein unvorhergesehenes Produkt, verursacht, weil Apache das Skript aufruft, als würde es den Interpreter per Eingabeaufforderung bedienen; bestätigt man dort einen Befehl mit RETURN, landet dieses RETURN (zumindest unter Linux) mit in der Parameter-Zeile). Ich habe bereits eine Version 1.2 des Interpreters, die das behebt. Hast du unter Windows die gleichen Erfahrungen gemacht?
Darüber hinaus, werden die Parameter hinter der Shebang-Zeile alle als ein Parameter an den PB Interpreter übergeben, das ist béi mir unter Linux so. "-f -c -w" kriege ich also als einen Parameter mit
ProgramParameter(0) rein, deswegen muss ich die am Anfang manuell mit
StringField() aufteilen. Ist das unter Windows auch so?
> Habs gemerkt... /quiet statt --quiet
Alles klar. Trotzdem lösche ich meinen müsahm getippten Absatz oben nicht :-P
> Hab den Fehler gefunden... Es ist der Fix, für Linux
Richtig. Den Fix hab ich mir ausgedacht, hab ich ja oben auch schon geschrieben, warum.
> Wenn die RegEx Funktionen stören, wegen der Lizenz, könnte ich diese durch gleiche, aber dafür langsamere PB-Native Stringoperationen austauschen
Du brauchst die Lizenz nicht einzubinden. Das musst du nur, wenn du deine Software öffentlich zugänglich gemacht wird. Da dein Parser aber (vermutlich) für immer und ewig nur auf deinem Webspace schlummert und dort seine Arbeit verrichtet, wird den wohl nie jemand runterladen. Ergo: Keine Lizenz erforderlich.