我正在玩过滤器和文件对象,并且对PostScript大师有两个问题:
我想使用一个生成大量字符串作为过滤器数据源的过程。但是,我只能获取堆栈中的最后一个字符串,以便过滤器接受/处理:
GS>/source {(str1) (str2)} def
GS>/fileobj {source /ReusableStreamDecode filter} def
GS>fileobj dup bytesavailable string readstring {==} if
(str2)
由于65k限制,字符串连接不是一个选项。相反,我想要一个包含该过程中所有字符串的文件对象。这可能吗?
PLRM说:“数据源或目标可以是一个过程。当读取或写入过滤器文件时,它调用过程来获取要解码的输入数据或处理已经输出的数据这使得数据可以由任意程序提供或使用。“
任何有助于实现这一目标的帮助。
是否可以将文件对象从数据目标更改为数据源?可以将字符串写入文件系统上的(w) file
,然后从(r) file
读取它们。但是,有一种方法可以不依赖于PostScript解释器访问文件系统的能力?所以,我会对文件对象的“性别转换器”感兴趣,它接受要写入的字符串以及后来要读取的字符串(同时保留文件对象,而不是字符串数组等)。这可能吗?没有在PLRM中找到任何信息。任何帮助表示赞赏。
答案 0 :(得分:0)
确定,对程序数据源的工作方式有误解。它没有返回多个字符串,每次调用它都会返回一个字符串。如果字符串是按程序生成的,那么每次都是一个不同的字符串。在您的情况下,它始终是您发现的最后一个字符串,因为您的过程不会更改字符串。翻译中没有任何魔力,它不知道你已经退回了' n' n'字符串,它只期望一个。
示例:
/Index 0 def
/StringArray [(string1) (string2)] def
/ProcSource {
StringArray Index get
Index 1 add
dup 1 gt {
pop /index 0 def
} {
/Index exch def
}ifelse
} bind def
注意:我还没有真正尝试过该代码,但希望你能明白我的意思。
其他一些观察结果:
64Kb限制不是语言限制,它是Adobe解释器的实现限制。许多口译员(包括Ghostscript)都没有这个限制。因此,如果您只使用Ghostscript,那么您不必担心它。
如果要在读取和写入之间进行更改,可以随时关闭文件并重新打开。
与大多数3级PostScript解释器一样,Ghostscript有一个RAM文件系统(%ram%IIRC),如果你不想使用主机操作系统文件系统,你可以在那里放置文件(受可用内存限制)
我真的不明白你要解决的问题,也许如果你能解释一下,我可能会提出一些建议。
顺便说一句,Ghostscript ReusableStreamDecode过滤器的工作原理是从底层源读取所有数据并将其存储在一个字符串中(它可能会在某个时刻切换到文件,我不记得细节)< / p>