DEADSOFTWARE

remove generic parser from DswOpts
[cpc.git] / src / generic / Dsw / Mod / Opts.cp
1 MODULE DswOpts;
3 IMPORT Kernel;
5 TYPE
6 String* = POINTER TO ARRAY OF CHAR;
8 VAR
9 optMode: BOOLEAN;
10 args: POINTER TO ARRAY OF String;
11 argn-, argi-: INTEGER;
12 str-: String;
14 PROCEDURE IsOpt (ch: CHAR): BOOLEAN;
15 BEGIN
16 RETURN (CAP(ch) >= "A") & (CAP(ch) <= "Z") OR (ch >= "0") & (ch <= "9")
17 END IsOpt;
19 PROCEDURE Reset*;
20 BEGIN
21 argn := 1; argi := 0; str := NIL; optMode := FALSE;
22 END Reset;
24 PROCEDURE GetStr;
25 VAR ch: CHAR; i, beg, len: INTEGER;
26 BEGIN
27 str := NIL;
28 IF argn < LEN(args) THEN
29 beg := argi;
30 REPEAT ch := args[argn, argi]; INC(argi) UNTIL ch = 0X;
31 len := argi - beg;
32 NEW(str, len + 1);
33 FOR i := 0 TO len - 1 DO
34 str[i] := args[argn, beg + i] (* zero not copied *)
35 END;
36 INC(argn); argi := 0; optMode := FALSE
37 END
38 END GetStr;
40 PROCEDURE GetOpt* (IN optstring: ARRAY OF CHAR): CHAR;
41 VAR opt, ch: CHAR; i: INTEGER;
42 BEGIN
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;
49 REPEAT
50 ch := optstring[i]; INC(i);
51 IF ch = ":" THEN ch := optstring[i]; INC(i) END
52 UNTIL (ch = opt) OR (ch = 0X);
53 IF ch = opt THEN
54 IF optstring[i] = ":" THEN
55 GetStr;
56 IF str = NIL THEN
57 NEW(str, 2); str[0] := opt; opt := ":" (* missing param *)
58 END
59 END
60 ELSE NEW(str, 2); str[0] := opt; opt := "?" (* unknown option *)
61 END
62 ELSE GetStr; opt := "$" (* string *)
63 END;
64 RETURN opt
65 END GetOpt;
67 PROCEDURE Init;
68 VAR i: INTEGER;
69 BEGIN
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]$
74 END;
75 Reset
76 END Init;
78 BEGIN
79 Init
80 END DswOpts.