181 lines
4.7 KiB
PostScript
181 lines
4.7 KiB
PostScript
|
% 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 <arg> 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 % <file> runjob -
|
||
|
{ end % cmddict
|
||
|
/startjob where { pop false () startjob pop }
|
||
|
run
|
||
|
//cmddict begin
|
||
|
} bind def
|
||
|
/runfilejob % <filename> runfilejob -
|
||
|
{ findlibfile { exch pop } { (r) file } runjob
|
||
|
} bind def
|
||
|
|
||
|
% Expand arguments. Free variables: expand@.
|
||
|
/expandarg % <string> expandarg <args...>
|
||
|
{ 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 % <file> expandargfile <args...>
|
||
|
{ [ 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 <x>;
|
||
|
% switches without arguments are defined as -<x>.
|
||
|
|
||
|
% 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
|