Seite 1 von 1

EOF an STDIN eines CLI-Tools manuell senden

Verfasst: 21.10.2018 01:45
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()

Re: EOF an STDIN eines CLI-Tools manuell senden

Verfasst: 21.10.2018 06:15
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.

Re: EOF an STDIN eines CLI-Tools manuell senden

Verfasst: 21.10.2018 09:45
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: