kincaid@cg-atla.UUCP (Tom Kincaid ) (08/30/89)
If I have a postscript variable V1 that can have a value 1 2 3 or 4 and I want to execute /proc1 if V1 = 1 /proc2 if V1 = 2 /proc3 if V1 = 3 /proc4 if V1 = 4 What is the best way to write the code ? Is there a case statement of some sort ?
montnaro@sprite.crd.ge.com (Skip Montanaro) (08/30/89)
Tom Kincaid asked about a case statement for PostScript. Sun wrote just such a beast for NeWS. Perhaps somebody at Sun can make the decision to post it (it is copyrighted). For anybody who might want to go out and write a case function in PostScript, here's a syntax description of Sun's: % A case/switch statement. Takes a key for the case and an array. % Generally the array is executable to avoid evaluating the array % each time case is called: % obj { % key1 {proc1} % key2 key3 {proc2} % key4 {proc3} % /Default {proc4} % } case If somebody at Sun is listening, I think it would be a nice idea to post a number of common functions defined in basics.ps, such as the rectangle and list utilities, /case, /sprintf, and /append. I think this would help reduce incompatible implementations of the same stuff in the future. -- Skip Montanaro (montanaro@sprite.crd.ge.com)
bkc@image.soe.clarkson.edu (Brad Clements) (08/30/89)
From article <7573@cg-atla.UUCP>, by kincaid@cg-atla.UUCP (Tom Kincaid ): > If I have a postscript variable V1 that can have a value > 1 2 3 or 4 and I want to execute > > /proc1 if V1 = 1 > /proc2 if V1 = 2 > /proc3 if V1 = 3 > /proc4 if V1 = 4 > > What is the best way to write the code ? Is there a case > statement of some sort ? This is cheap. Not in processing time though... % define proc1 through proc4 /case_array [ /proc1 load /proc2 load /proc3 load /proc4 load ] def .... % suppose V1 now has a value between 1 and 4 case_array v1 1 sub get exec % presto, all done. Better off letting V1 have values 0 through 3 | Brad Clements bkc@omnigate.clarkson.edu bkc@clutx.bitnet | Network Engineer Clarkson University (315)268-2292 -- | Brad Clements bkc@omnigate.clarkson.edu bkc@clutx.bitnet | Network Engineer Clarkson University (315)268-2292
rainero@prism.wbst128.xerox.com (Emil Rainero) (09/01/89)
Try this /case { % (in case) == /printnextproc 0 def /proc exch def /obj exch def { /proc load dup length 0 eq {pop exit} if dup 0 get dup type /arraytype eq printnextproc 1 eq and {dup exec /printnextproc 2 def} if dup /Default eq printnextproc 0 eq and {/printnextproc 1 def} if /obj load eq {/printnextproc 1 def} if dup length 1 sub 1 exch getinterval /proc exch def } loop } bind def % EXAMPLE 1 0 1 20 { dup ( ) cvs print ( ) print { 1 {(is 1) =} 2 {(is 2) =} 3 4 {(is 3,4) =} 5 7 {(is 5,7) =} 8 {(is 8) =} /Default {(other) =} } case } for % EXAMPLE 2 {A B C D E} { dup ( ) cvs print ( ) print { /B {(is B) =} /Default {(other) =} } case } forall