Write / WriteLn - 80-Zeichen-Begrenzung bei Ausgabe umgehen?

Rund um die LCL und andere Komponenten
Antworten
Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Write / WriteLn - 80-Zeichen-Begrenzung bei Ausgabe umgehen?

Beitrag von Timm Thaler »

Ein Programm sendet per Write / WriteLn Text an die Standardausgabe. Funktioniert soweit. Dieses Programm wird jetzt als cgi-bin aufgerufen und sendet den Text an den aufrufenden Webserver, der das an einen Browser weiterreicht. Dabei wird der Text immer nach 80 Zeichen umgebrochen.

Das ist insofern ärgerlich, weil dann am Browser mitten in den Befehlen Umbrüche auftauchen, die den Inhalt kaputtmachen. Beispiel eines SVG:

Code: Alles auswählen

WriteLn('  <g id="' + stitle + '" font-family="' + sfont + '" font-size="' + IntToStr(ssize) + '" fill="#' + IntToHex(scol, 6) + '">');
txt := '    <circle cx="' + IntToStr(xpos) + '" cy="' + IntToStr(ypos) + '" r="' + IntToStr(rad) + '" stroke="#' + IntToHex(scol, 6) + '" stroke-width="' + IntToStr(sline) + '" fill="#' + IntToHex(sfill, 6) + '" />';
WriteLn(txt);


Code: Alles auswählen

<g id="legend" font-family="Roboto, Tahoma, Verdana, sans-serif" font-size="120" fill="#D0D0D0">
    <circle cx="6772" cy="80" r="30" stroke="#FF00FF" stroke-width="0" fill="#FF00FF" />


wird zu

Code: Alles auswählen

<g id="legend" font-family="Roboto, Tahoma, Verdana, sans-serif" font-size="12
0" fill="#D0D0D0">
    <circle cx="6772" cy="80" r="30" stroke="#FF00FF" stroke-width="0" fill="#FF
00FF" />


Hier wird aus der font-size 120 eine 12 und das fill bei circle wird ignoriert. Bei Linienpfaden mit richtig vielen Punkten wird die Linie komplett unbrauchbar.

Schreibe ich die Ausgabe dagegen in eine normale Textdatei, wird die komplette Zeile ohne Umbruch ausgegeben und das SVG ist lesbar.

Wie kann ich den Umbruch nach 80 Zeichen beim Schreiben in die Standardausgabe unterdrücken oder auf einige tausend Zeichen hinausschieben?

Es macht auch keinen Unterschied, ob ich die Ausgabe mit WriteLn('content-type:text/html);WriteLn; starte oder mit WriteLn('content-type:image/svg+xml);WriteLn;, wie es für SVG richtig wäre. Auch ist das SVG bis auf die unerwünschten Umbrüche in sich konsistent, hat das richtige Encoding, das funktioniert alles.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2639
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Write / WriteLn - 80-Zeichen-Begrenzung bei Ausgabe umge

Beitrag von m.fuchs »

Hm, ich würde das alles gar nicht händisch machen sondern die mitgelieferten Packages für CGI-Programme verwenden.

http://wiki.freepascal.org/fcl-web#Crea ... pplication
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: Write / WriteLn - 80-Zeichen-Begrenzung bei Ausgabe umge

Beitrag von Timm Thaler »

m.fuchs hat geschrieben:Hm, ich würde das alles gar nicht händisch machen sondern die mitgelieferten Packages für CGI-Programme verwenden.


Ich will nicht die komplette Webseite mit CGI ausgeben, sondern die Webseite ist statisch und über ein JS werden nur Werte bzw. Diagramme (als SVG-Images) regelmäßig nachgeladen. Das hat auch den Grund, dass auf der Webseite Daten aus verschiedenen Quellen angezeigt werden, für die jeweils eigene CGIs zuständig sind.

Das CGI soll also nur die SVGs erzeugen. Dabei unterstützt mich aber die fcl-web eher nicht. Und die Ausgabe ist simpel und orientiert sich an http://wiki.lazarus.freepascal.org/CGI_Web_Programming. Bis auf die unerwünschten Zeilenumbrüche.

Workaround wäre, dass ich die Zeilen prinziell so aufbaue, dass sie nicht länger als 80 Zeichen werden, bevor ein definierter Umbruch kommt. Das wäre aber häßlich.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2639
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Write / WriteLn - 80-Zeichen-Begrenzung bei Ausgabe umge

Beitrag von m.fuchs »

Timm Thaler hat geschrieben:
m.fuchs hat geschrieben:Hm, ich würde das alles gar nicht händisch machen sondern die mitgelieferten Packages für CGI-Programme verwenden.

Ich will nicht die komplette Webseite mit CGI ausgeben, sondern die Webseite ist statisch und über ein JS werden nur Werte bzw. Diagramme (als SVG-Images) regelmäßig nachgeladen.

Musst du ja auch nicht. Du definierst nur ein paar Actions für deine Diagramme und das wars. Von wo du diese Actions aufrufst ist ja egal.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: Write / WriteLn - 80-Zeichen-Begrenzung bei Ausgabe umge

Beitrag von Timm Thaler »

Was ist dann der Vorteil gegenüber der Konsolen-Abfrage, abgesehen vom Zeilenumbruch in der Konsole? Bessere GET und POST Möglichkeiten?

Ich versuche die CGI-Programme mit so wenig Overhead wie möglich zu schreiben.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2639
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Write / WriteLn - 80-Zeichen-Begrenzung bei Ausgabe umge

Beitrag von m.fuchs »

Ein weiterer Vorteil ist zum Beispiel dass du mit dem Austauschen einer Unit aus deiner CGI-Anwendung eine FCGI-Anwendung machst. Damit ist nochmal einiges an Performanceverbesserung möglich.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: Write / WriteLn - 80-Zeichen-Begrenzung bei Ausgabe umge

Beitrag von Timm Thaler »

Ich bin gerade am Recherchieren, ob mit FCGI hier Vorteile bringen würde und wie ich mein Programm dahingehend änderen müsste. Aktuell läuft das so ab:

1. Programm starten
2. Konfig (Pfade, Einstellungen) aus einem XML holen.
3. Query-String holen und auswerten.
4. Angefragte Daten aus Tabellen holen.
5. SVG entsprechend Anfrage aus Daten erzeugen. SVG ausgeben.
6. Programm schließen.

Das passiert innerhalb von Millisekunden.

Seinen Vorteil spielt FCGI ja vor allem bei Skriptsprachen aus, weil dann nicht der Interpreter ständig neu gestartet und initalisiert werden muss. Den Vorteil eines immer wieder beendeten CGI-Programms sehe ich darin, dass es sich nicht festfahren kann oder irgendwann mit veralteten Werten arbeitet - siehe den Now()-Bug in den DateTimeUtils zur Sommerzeitumstellung.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2639
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Write / WriteLn - 80-Zeichen-Begrenzung bei Ausgabe umge

Beitrag von m.fuchs »

Timm Thaler hat geschrieben:Ich versuche die CGI-Programme mit so wenig Overhead wie möglich zu schreiben.


Timm Thaler hat geschrieben:Ich bin gerade am Recherchieren, ob mit FCGI hier Vorteile bringen würde
[...]
Das passiert innerhalb von Millisekunden.

Schwierig, schwierig. Einerseits willst du wenig Overhead haben, andererseits sagst du dass das Programm sowieso schnell genug ist.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: Write / WriteLn - 80-Zeichen-Begrenzung bei Ausgabe umge

Beitrag von Timm Thaler »

Das ist bei mir genetisch bedingt. Ich hab mit Programmieren auf dem Amiga500 angefangen, da bekam man noch mehrere Programme auf eine Diskette. 8)

Ich hab jetzt noch fpCGI und cgiapp ausgegraben, das scheint für meine Anwendungen ausreichend zu sein. Und ich kann meine WriteLn-Befehle anscheinend so lassen, und lange Strings werden nicht umgebrochen. Könnte nur sein, dass die Units inzwischen veraltet sind, zumindest das Beispiel testcgi.pp läuft nicht ohne Anpassung. Foreneinträge dazu sind auch 10 Jahre alt. :roll:

Antworten