要测试的PostScript文件的完整性,我想通过以下方式运行的Ghostscript:Ghostscript的为PS完整性测试:在EOF结束,返回错误,除非栈为空
- 返回1(或其他上在EOF错误
- 返回0(成功)错误代码)如果栈是空的
- 返回1(或其它错误码)否则
我可以在后台运行gs
,并使用一个超时对于ce终止,如果gs
挂在堆栈上的项目。有更简单的解决方案吗?
要测试的PostScript文件的完整性,我想通过以下方式运行的Ghostscript:Ghostscript的为PS完整性测试:在EOF结束,返回错误,除非栈为空
我可以在后台运行gs
,并使用一个超时对于ce终止,如果gs
挂在堆栈上的项目。有更简单的解决方案吗?
如果您发送文件作为输入(除非您编写进入无限循环或以其他方式未能达到暂停状态的程序),Ghostscript将不会挂起。在任何堆栈上都有物品不会导致它挂起。
另一方面,如果PostScript程序在操作数堆栈上留下操作数(或字典堆栈上的字典,剪辑堆栈上的剪辑或图形状态堆栈上的状态),则不会出现错误。这是因为这不是一个错误,并且由于PostScript解释器通常在作业服务器循环中运行,所以它也不是问题。终止作业会将控制返回到作业服务器循环,该作业服务器循环将执行保存并在整个作业中进行恢复,从而清除所有遗留的内容。
我建议如果你真的想这样做,你需要采用相同的方法,你需要编写一个PostScript程序来执行你想要测试的PostScript程序,然后检查操作数堆栈(和其他堆栈如果需要)查看是否有任何遗漏。请注意,您将希望在停止的上下文中执行测试程序,因为程序过程中的错误显然可能会导致潜在的问题。
如果我没有记错的话,Ghostscript在干净的出口上返回0,并且错误值小于0。如果项目留在程序末尾,您将需要在测试框架中使用signalerror,以引发错误。
[编辑]
任何供给的Ghostscript在命令行上通过任一-s或-d在systemdict定义的,所以,如果我们做-sInputFileName=/test.pdf
那么我们将在systemdict找到的关键/InputFileName
,其值是一个字符串内容为(/test.pdf)
。我们可以使用它将文件名传递给我们的程序。
stopped
运算符将可执行数组作为参数,并根据执行数组时是否发生错误返回true或false(3rd Edition PLRM,p。697)。
所以我们需要运行包含在我们已经给出的文件名中的程序,并在'停止'的上下文中执行它。事情是这样的:
{InputFileName run} stopped
{
(Error occurred\n) print flush
%% Potentially check $error for more information.
}{
(program terminated normally\n) print flush
%% Here you could check the various stacks
} ifelse
您能否详细说明如何在停止的环境下执行测试程序?谢谢你的帮助。 –
下,基于90%的KENS的答案,就是99%满意:
计划checkIntegrity.ps
:
{Script run} stopped
{
(\n===> Integrity test failed:) print Script print (has error\n\n) print
handleerror
(ignore this error which only serves to force a return value of 1) /syntaxerror signalerror
}{
% script passed, now check the stack
count dup 0 eq {
pop (\n===> Integrity test passed:) print Script print (terminated normally\n\n) print
} {
(\n===> Integrity test failed:) print Script print (left) print
3 string cvs print (item(s) on stack\n\n) print
Script /syntaxerror signalerror
} ifelse
} ifelse
quit
与
gs -q -sScript=CodeToBeChecked.ps checkIntegrity.ps ; echo $?
对于执行最后1%的满意度我需要替换
(blabla) /syntaxerror signalerror
它强制退出并返回代码1,但非常慷慨,并分散了由handleerror
报告的已检查脚本中的实际错误。因此,一个更清洁的方式exit(1)
将受到欢迎。
我知道留在堆栈上的项目通常不会被认为是错误,并且不会为PostScript解释器造成任何问题。但是,在我的PostScript编程实践中,它们确实表明了一个错误。因此测试一个空的堆栈是非常有用的。 –