2017-03-18 17 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)將受到歡迎。

相關問題