-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathutil.a68
79 lines (62 loc) · 1.85 KB
/
util.a68
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#
overloaded "container" functions - rows
#
PRIO MEMBER = 9;
OP MEMBER = (STRING word, []STRING row)BOOL:
((STRING s)BOOL: word = s) MEMBER row;
OP MEMBER = (PROC(STRING)BOOL pred, []STRING row)BOOL:
pred INDEX row > 0;
PRIO INDEX = 9;
OP INDEX = (STRING key, []STRING row)INT:
((STRING s)BOOL: key = s) INDEX row;
PRIO RINDEX = 9;
OP RINDEX = (STRING key, []STRING row)INT:
((STRING s)BOOL: key = s) RINDEX row;
OP INDEX = (PROC(STRING)BOOL pred, []STRING row)INT:
BEGIN
[]STRING row mod = row[@1];
INT result := 0;
FOR i TO UPB row mod WHILE result = 0 DO
IF pred(row mod[i]) THEN result := i FI
OD;
result
END;
OP RINDEX = (PROC(STRING)BOOL pred, []STRING row)INT:
BEGIN
[]STRING row mod = row[@1];
INT result := 0;
FOR i FROM UPB row BY -1 TO 1 WHILE result = 0 DO
IF pred(row mod[i]) THEN result := i FI
OD;
result
END;
PRIO INSIDE = 9;
OP INSIDE = (STRING key, REF[]STRING row)REF STRING:
((STRING s)BOOL: key = s) INSIDE row;
OP INSIDE = (PROC(STRING)BOOL pred, REF[]STRING row)REF STRING:
BEGIN
REF STRING result := NIL;
FOR i FROM LWB row TO UPB row DO
IF pred(row[i]) THEN result := row[i]; break FI
OD;
break:
result
END;
#
use multiple debugging levels so we can leave trace statements in our code
#
INT debug level = 5;
PRIO DEBUG = 9;
OP DEBUG = (INT level, PROC VOID what)VOID: (level<debug level|what|~);
INT complaints := 0;
PROC complain = (STRING why, []INT pos)VOID:
( complaints +:= 1;
putf (stand error, ($2(6z,": "),n(UPB why)a,l$,pos,why)) );
PROC no complaints = (STRING when)VOID:
IF complaints > 0 THEN fatal error ("errors encounted during "+when) FI;
PROC fatal error = (STRING why)VOID:
( print ("fatal: "+why); halt );
PROC external program = ([]STRING args)VOID:
BEGIN
wait pid(execve child (args[1], args, ""))
END;