Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.postscript > #3662

getopt.ps

From news@zzo38computer.org.invalid
Newsgroups comp.lang.postscript
Subject getopt.ps
Date 2021-08-01 14:05 -0700
Organization Aioe.org NNTP Server
Message-ID <1627849972.bystand@zzo38computer.org> (permalink)

Show all headers | View raw


I wrote a PostScript program for parsing command-line switches similar to
how the getopt function of UNIX is doing. I might use it myself in some of
my own programs, but it might be useful for other programmers to use, too.
You can also tell me if you have a suggestion for improvement, too.

Long option parameters without = are not implemented, and it will always
use the POSIXLY_CORRECT kind of parsing.

***BEGIN***

% PostScript code for parsing command-line arguments
% (public domain)

<< /V [0 0] /L ARGUMENTS length >> begin
/D exch def
/G {//D 1 index known {//D exch get} {clear //D /Error get exec stop} ifelse} def
/T <<
  /N {
    % No value
    exch pop //null exch exec
  } bind
  /O {
    % Optional value
    //V 1 get 3 -1 roll 1 add 1 index length 1 index sub getinterval
    dup () eq {pop //null} if
    exch exec exit
  } bind
  /R {
    % Required value
    //V 1 get 3 -1 roll 1 add 1 index length 1 index sub getinterval
    dup () eq {
      pop //V 0 get 1 add //V 0 2 index put
      //ARGUMENTS length 1 index eq {//G 5 get exec} if
      //ARGUMENTS exch get
    } if
    exch exec exit
  } bind
>> def
{
  {
    //V 0 get //L ge {exit} if
    //ARGUMENTS //V 0 get get
    dup length 2 lt {pop exit} if
    dup (--) eq {pop //V 0 //V 0 get 1 add put exit} if
    dup 0 get 45 ne {pop exit} if
    dup 1 get 45 eq {
      % Long option
      (=) search {
        exch pop //G exec exec
      } {
        //G exec //null exch exec
      } ifelse
    } {
      % Short option
      //V 1 2 index put
      1 exch 1 exch length 1 sub {
        //V 1 get 1 index 1 getinterval //G exec
        dup 1 get dup type /nametype eq //G if
        exch 0 get //T exch get exec
      } for
    } ifelse
    //V 0 //V 0 get 1 add put
  } loop
  //userdict /ARGUMENTS //ARGUMENTS //V 0 get //L 1 index sub getinterval put
}
end bind exec

***END***

-- 
Don't laugh at the moon when it is day time in France.

Back to comp.lang.postscript | Previous | NextNext in thread | Find similar


Thread

getopt.ps news@zzo38computer.org.invalid - 2021-08-01 14:05 -0700
  Re: getopt.ps luser droog <luser.droog@gmail.com> - 2021-08-04 23:17 -0700
    Re: getopt.ps luser droog <luser.droog@gmail.com> - 2021-08-06 22:15 -0700
    Re: getopt.ps news@zzo38computer.org.invalid - 2021-08-20 13:14 -0700
      Re: getopt.ps ken <ken@spamcop.net> - 2021-08-21 08:31 +0100

csiph-web