DEADSOFTWARE

cpmake: fix preprocessor selector handling
[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 str := NIL;
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;
50 REPEAT
51 ch := optstring[i]; INC(i);
52 IF ch = ":" THEN ch := optstring[i]; INC(i) END
53 UNTIL (ch = opt) OR (ch = 0X);
54 IF ch = opt THEN
55 IF optstring[i] = ":" THEN
56 GetStr;
57 IF str = NIL THEN
58 NEW(str, 2); str[0] := opt; opt := ":" (* missing param *)
59 END
60 END
61 ELSE NEW(str, 2); str[0] := opt; opt := "?" (* unknown option *)
62 END
63 ELSE GetStr; opt := "$" (* string *)
64 END;
65 RETURN opt
66 END GetOpt;
68 PROCEDURE Init;
69 VAR i: INTEGER;
70 BEGIN
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]$
75 END;
76 Reset
77 END Init;
79 BEGIN
80 Init
81 END DswOpts.