f4fc7d110d35ace6fab6b5603695e6ab660485a3
6 String
* = POINTER TO ARRAY OF CHAR;
10 args
: POINTER TO ARRAY OF String
;
11 argn
-, argi
-: INTEGER;
14 PROCEDURE IsOpt (ch
: CHAR): BOOLEAN;
16 RETURN (CAP(ch
) >= "A") & (CAP(ch
) <= "Z") OR (ch
>= "0") & (ch
<= "9")
21 argn
:= 1; argi
:= 0; str
:= NIL; optMode
:= FALSE
;
25 VAR ch
: CHAR; i
, beg
, len
: INTEGER;
28 IF argn
< LEN(args
) THEN
30 REPEAT ch
:= args
[argn
, argi
]; INC(argi
) UNTIL ch
= 0X
;
33 FOR i
:= 0 TO len
- 1 DO
34 str
[i
] := args
[argn
, beg
+ i
] (* zero not copied *)
36 INC(argn
); argi
:= 0; optMode
:= FALSE
40 PROCEDURE GetOpt
* (IN optstring
: ARRAY OF CHAR): CHAR;
41 VAR opt
, ch
: CHAR; i
: INTEGER;
43 IF argn
>= LEN(args
) THEN
44 opt
:= 0X
; optMode
:= FALSE (* eof *)
45 ELSIF optMode
& IsOpt(args
[argn
, argi
]) OR (args
[argn
, argi
] = "-") & IsOpt(args
[argn
, argi
+ 1]) THEN
46 IF ~optMode
THEN optMode
:= TRUE
; INC(argi
) END;
47 opt
:= args
[argn
, argi
]; INC(argi
); i
:= 0;
48 IF args
[argn
, argi
] = 0X
THEN INC(argn
); argi
:= 0; optMode
:= FALSE
END;
50 ch
:= optstring
[i
]; INC(i
);
51 IF ch
= ":" THEN ch
:= optstring
[i
]; INC(i
) END
52 UNTIL (ch
= opt
) OR (ch
= 0X
);
54 IF optstring
[i
] = ":" THEN
57 NEW(str
, 2); str
[0] := opt
; opt
:= ":" (* missing param *)
60 ELSE NEW(str
, 2); str
[0] := opt
; opt
:= "?" (* unknown option *)
62 ELSE GetStr
; opt
:= "$" (* string *)
70 NEW(args
, Kernel
.argc
);
71 FOR i
:= 0 TO Kernel
.argc
- 1 DO
72 NEW(args
[i
], LEN(Kernel
.argv
[i
]$
) + 1);
73 args
[i
]^
:= Kernel
.argv
[i
]$