2017-03-18 20 views
0

要测试的PostScript文件的完整性,我想通过以下方式运行的Ghostscript:Ghostscript的为PS完整性测试:在EOF结束,返回错误,除非栈为空

  • 返回1(或其他上在EOF错误
  • 返回0(成功)错误代码)如果栈是空的
  • 返回1(或其它错误码)否则

我可以在后台运行gs,并使用一个超时对于ce终止,如果gs挂在堆栈上的项目。有更简单的解决方案吗?

+0

我知道留在堆栈上的项目通常不会被认为是错误,并且不会为PostScript解释器造成任何问题。但是,在我的PostScript编程实践中,它们确实表明了一个错误。因此测试一个空的堆栈是非常有用的。 –

回答

1

如果您发送文件作为输入(除非您编写进入无限循环或以其他方式未能达到暂停状态的程序),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 
+0

您能否详细说明如何在停止的环境下执行测试程序?谢谢你的帮助。 –

0

下,基于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)将受到欢迎。

相关问题