Взаимодействие с пользователем из руководителя PostScript - PullRequest
2 голосов
/ 06 сентября 2011

Я создаю приложение на PostScript, которое должно принимать ввод от пользователя по запросу (я буду использовать GhostScript Executive, и файл не будет отправлен на принтер).В справочном руководстве по языку PostScript я не вижу ничего, что бы указывало на то, что это возможно, и я не хочу возвращаться к руководителю, поэтому возможно ли это?

Ответы [ 2 ]

3 голосов
/ 08 сентября 2011

Это не так безнадежно!Но это не совсем легко.Есть еще два специальных файла, кроме% stdin, из которых вы можете читать.(%lineedit)(r)file dup bytesavailable string readstring pop будет читать строку из stdin в строку.Существует также файл (%statementedit), который будет считываться до тех пор, пока не будет напечатан синтаксически правильный фрагмент постскрипта (плюс перевод строки).Это будет соответствовать круглым скобкам и фигурным скобкам, но не квадратным скобкам.Перед прочтением вам следует ввести приглашение типа (> )print flush.

Еще одна вещь, которую вы можете поймать ^ D, обернув все это в stopped контекст.

{ %stopped
    (> )print flush
    (%lineedit)(r)file
    dup bytesavailable string readstring pop
} stopped not {
    (successfully read: )print
    print
}{
    (received EOF indication)print
}ifelse

Вместо того, чтобы выдавать этот bool после readstring, вы можете использовать его для дешевого обнаруженияпустая строка ввода.Также обратите внимание, что остановка, которая срабатывает на EOF, происходит из-за ошибки в file (ghostscript называет это /invalidfilename), но хотя file определен как оператор, и операторы должны перенести свои аргументы обратно в стексообщая об ошибке, я заметил, что ghostscript не обязательно делает это (я забыл, что он оставляет, но это не две строки, как вы ожидаете), поэтому вы можете поместить mark впереди и cleartomark popпосле всего этого блока.

Специальные файлы (%lineedit) и (%statementedit), если они доступны, будут успешно обрабатывать возвраты, control-U и, возможно, другие элементы управления.Я полагаю, что настоящие принтеры Adobe ответят на ^ T неким сообщением о состоянии.Но я никогда этого не видел.

PS.:!

У меня есть более обширный пример интерактивного postscript в моем postscript отладчике .Вот лучшая версия отладчика , но, вероятно, она менее полезна в качестве примера.

2 голосов
/ 06 сентября 2011

PostScript не предназначен для использования в качестве интерактивного языка, поэтому для ввода данных не предусмотрено никаких специальных возможностей.

Вы можете читать ввод из stdin, и вы можете записывать в stdout или stderr, поэтому, если они подключены к консоли, вы можете теоретически запросить ввод данных, записав в stdout, и прочитать ввод обратно из stdin.

Обратите внимание, что чтение из stdin не позволит пользователю выполнять такие действия, как возврат по ошибкам. По крайней мере, визуально данные будут отправлены в вашу программу PostScript, которая может обрабатывать символы возврата на одну позицию.

Это единственный способ добиться этого, о котором я могу подумать.

...