% Copyright (C) 1994, 1996, 1999 Aladdin Enterprises. All rights reserved. % % This software is provided AS-IS with no warranty, either express or % implied. % % This software is distributed under license and may not be copied, % modified or distributed except as expressly authorized under the terms % of the license contained in the file LICENSE in this distribution. % % For more information about licensing, please refer to % http://www.ghostscript.com/licensing/. For information on % commercial licensing, go to http://www.artifex.com/licensing/ or % contact Artifex Software, Inc., 101 Lucas Valley Road #110, % San Rafael, CA 94903, U.S.A., +1(415)492-9861. % $Id: gs_cmdl.ps,v 1.4 2002/02/21 21:49:28 giles Exp $ % Parse and execute the command line. % C code handles the following switches: -h/-? -I -M -v /cmddict 50 dict def cmddict begin % ---------------- Utility procedures ---------------- % % Get the next argument from the parsed argument list. /nextarg % - nextarg true % - nextarg false { argv length 0 eq { false } { argv dup 0 get exch dup length 1 sub 1 exch getinterval /argv exch def } ifelse } bind def % Run a file, under job control if implemented. /runjob % runjob - { end % cmddict /startjob where { pop false () startjob pop } run //cmddict begin } bind def /runfilejob % runfilejob - { findlibfile { exch pop } { (r) file } runjob } bind def % Expand arguments. Free variables: expand@. /expandarg % expandarg { dup () eq { pop } { dup dup (--) eq exch (-+) eq or { pop /expand@ false def } { expand@ { (@) anchorsearch } { false } ifelse { pop findlibfile { exch pop } { (r) file } % let the error happen expandargfile } if } ifelse } } bind def /expandargfile % expandargfile { [ exch cvlit { token not { exit } if dup type /stringtype ne { =string cvs dup length string copy } if expandarg } /exec cvx ] cvx loop } bind def % ---------------- Recognized switches ---------------- % % Switches with arguments are defined as ; % switches without arguments are defined as -. % Switches without arguments /-- { nextarg not { (-- and -+ require a file name.) = flush } { //systemdict /ARGUMENTS argv put /argv [] def runjob } ifelse } bind def /-+ /-- load def /-@ /-- load def /-A { (@) Z } bind def /-c { { argv length 0 eq { exit } if argv 0 get (-) anchorsearch { pop pop exit } if pop nextarg token { exch pop % Probably should check for empty. end exec //cmddict begin } if } loop } bind def /-e { (#) Z } bind def /-E /-e load def /-f { } def /-q { //systemdict /QUIET true put } bind def % Switches with arguments /d { (=) search not { (#) search not { () exch dup } if } if exch pop cvn dup where { pop (Redefining ) print print ( is not allowed.) = flush pop } { exch token { exch pop } % Probably should check for empty. { true } ifelse //systemdict 3 1 roll put } ifelse } bind def /D /d load def /f { dup length 0 ne { runfilejob } if } bind def /g { (x) search { cvi pop exch cvi } { cvi dup } ifelse //systemdict begin /DEVICEHEIGHT exch def /DEVICEWIDTH exch def end } bind def /r { (x) search { cvr pop exch cvr } { cvr dup } ifelse //systemdict begin /DEVICEYRESOLUTION exch def /DEVICEXRESOLUTION exch def end } bind def /s { (=) search not { (#) search not { () exch dup } if } if exch pop cvn dup where { pop dup load } { () } ifelse type /stringtype ne { (Redefining ) print print ( is not allowed.) = flush pop } { exch //systemdict 3 1 roll put } ifelse } bind def /S /s load def /Z { true .setdebug } bind def % ---------------- Main program ---------------- % % We process the command line in two passes. In the first pass, % we read and expand any @-files as necessary. The second pass % does the real work. /cmdstart { //cmddict begin /expand@ true def [ % Process the GS_OPTIONS environment variable. (GS_OPTIONS) getenv { 0 () /SubFileDecode filter expandargfile } if % Process the actual command line. .getargv { expandarg } forall ] readonly /argv exch def % Now interpret the commands. { nextarg not { exit } if dup 0 get (-) 0 get eq { dup length 1 eq { pop (%stdin) (r) file runjob } { dup length 2 gt { dup dup length 2 sub 2 exch getinterval exch 1 1 getinterval } if currentdict .knownget { exec } { (Ignoring unknown switch ) print dup length 1 eq { (-) print print } if print () = flush } ifelse } ifelse } { runfilejob } ifelse } loop end } bind def end % cmddict