EOF an STDIN eines CLI-Tools manuell senden

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
TroaX
Beiträge: 661
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Pop_OS! | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Pop_OS!
Wohnort: NRW
Kontaktdaten:

EOF an STDIN eines CLI-Tools manuell senden

Beitrag von TroaX »

Irgendwie stehe ich gerade auf'm Schlauch :freak:

Ich habe folgendes Problem. Ich versuche gerade, mit Hilfe von Pandoc aus PureBasic heraus verschiedene Markup-Formate untereinander zu konvertieren. Dazu kann Pandoc von STDIN lesen und über STDOUT antworten. Das kommt mir gelegen, damit ich nicht für jeden Vorgang Dateien schreiben muss. Nun habe ich aber das Problem, das Pandoc die Eingaben, die ich per WriteProgramString sende, unendlich lang entgegennimmt (Mit einer Forever-Schleife getestet - RAM-Auslastung nahm stetig zu - Bei einmaliger Eingabe war sie konstant). Dadurch sendet Pandoc mir das HTML, das es aus Markdown erzeugen soll, nicht zurück. Mache ich es direkt über die Komandozeile und beende den Strom mit STRG+Z und danach Enter, bekomme ich die Ausgabe. Auch das einlesen über STDIN über Konsole und Dateieingabe klappt.

Meine Vermutung daher ist, das es am fehlendem EOF liegt. Nun habe ich schon mit Chr(4) versucht, EOT zu senden. Das klappt aber nicht. Auch SUB (26) zeigt keine Wirkung genauso wie 0. Wenn ich statt der Konvertierung nur die Liste der Formate abfrage, bekomme ich per STDOUT eine Liste. Auch das scheint zu klappen. Nur wenn ich über mein Programm den String ans STDIN sende, bekomme ich es nicht hin. Wie sende ich also EOF an STDIN? Kann mir da wer helfen?

Einmal der Code:

Code: Alles auswählen

EnableExplicit

OpenConsole()

Define.l PanDoc
Define.s MarkdownString

MarkdownString = "# Das ist eine Ueberschrift #" + Chr(13)
MarkdownString + "Das ist eine Zeile mit *hervorgehobenen* Wort!" + Chr(13)
MarkdownString + "So geht es!"

PanDoc = RunProgram("C:\Program Files (x86)\Pandoc\pandoc", "-f markdown -t html", "", #PB_Program_Open | #PB_Program_Read | #PB_Program_Write)

If PanDoc
	Delay(500)
	WriteProgramString(PanDoc, MarkdownString, #PB_UTF8)
	WriteProgramString(PanDoc, Chr(4), #PB_UTF8)
	While ProgramRunning(PanDoc)
		If AvailableProgramOutput(PanDoc)
			Print(ReadProgramString(PanDoc, #PB_UTF8))
		EndIf
	Wend
EndIf

Input()
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Pop_OS!
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Pop_OS!
NAS: Fritz.Box :lol:
Coding: Purebasic 6.04 | PHP | HTML | CSS | Javascript
DarkDragon
Beiträge: 6267
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: EOF an STDIN eines CLI-Tools manuell senden

Beitrag von DarkDragon »

Ich vermute CloseProgram bewirkt was du willst. Oder WriteProgramData(Program, #PB_Program_Eof, 0).

Du kannst sonst kein EOF senden, weil es sonst nicht möglich wäre das EOF als Daten zu übertragen. Im Prinzip ist EOF gar nicht als Zeichen zu sehen.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
TroaX
Beiträge: 661
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Pop_OS! | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Pop_OS!
Wohnort: NRW
Kontaktdaten:

Re: EOF an STDIN eines CLI-Tools manuell senden

Beitrag von TroaX »

OMG Hätte ich mehr auf die Autovervollständigung geachtet, hätte mir #PB_Program_EoF auffallen müssen. Damit klappt es. Vielen Dank!

Ich sag ja. Stand aufm Schlauch :lol:
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Pop_OS!
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Pop_OS!
NAS: Fritz.Box :lol:
Coding: Purebasic 6.04 | PHP | HTML | CSS | Javascript
Antworten