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;
44 IF argn
>= LEN(args
) THEN
45 opt
:= 0X
; optMode
:= FALSE (* eof *)
46 ELSIF optMode
& IsOpt(args
[argn
, argi
]) OR (args
[argn
, argi
] = "-") & IsOpt(args
[argn
, argi
+ 1]) THEN
47 IF ~optMode
THEN optMode
:= TRUE
; INC(argi
) END;
48 opt
:= args
[argn
, argi
]; INC(argi
); i
:= 0;
49 IF args
[argn
, argi
] = 0X
THEN INC(argn
); argi
:= 0; optMode
:= FALSE
END;
51 ch
:= optstring
[i
]; INC(i
);
52 IF ch
= ":" THEN ch
:= optstring
[i
]; INC(i
) END
53 UNTIL (ch
= opt
) OR (ch
= 0X
);
55 IF optstring
[i
] = ":" THEN
58 NEW(str
, 2); str
[0] := opt
; opt
:= ":" (* missing param *)
61 ELSE NEW(str
, 2); str
[0] := opt
; opt
:= "?" (* unknown option *)
63 ELSE GetStr
; opt
:= "$" (* string *)
71 NEW(args
, Kernel
.argc
);
72 FOR i
:= 0 TO Kernel
.argc
- 1 DO
73 NEW(args
[i
], LEN(Kernel
.argv
[i
]$
) + 1);
74 args
[i
]^
:= Kernel
.argv
[i
]$