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
|
include defs
# makpat --- make pattern from arg (from), terminate at delim
integer function makpat (arg, from, delim, pat)
character arg (MAXARG), delim, pat (MAXPAT)
integer from
character esc
integer i, j, junk, lastcl, lastj, lj,
tagnst, tagnum, tagstk (9)
integer addset, getccl, stclos
j = 1 # pat index
lastj = 1
lastcl = 0
tagnum = 0
tagnst = 0
for (i = from; arg (i) != delim & arg (i) != EOS; i = i + 1) {
lj = j
if (arg (i) == ANY)
junk = addset (ANY, pat, j, MAXPAT)
else if (arg (i) == BOL & i == from)
junk = addset (BOL, pat, j, MAXPAT)
else if (arg (i) == EOL & arg (i + 1) == delim)
junk = addset (EOL, pat, j, MAXPAT)
else if (arg (i) == CCL) {
if (getccl (arg, i, pat, j) == ERR) {
makpat = ERR
return
}
}
else if (arg (i) == CLOSURE & i > from) {
lj = lastj
if (pat (lj) == BOL | pat (lj) == EOL | pat (lj) == CLOSURE |
pat (lj) == START_TAG | pat (lj) == STOP_TAG)
break
lastcl = stclos (pat, j, lastj, lastcl)
}
else if (arg (i) == START_TAG) {
if (tagnum >= 9) # too many tagged sub-patterns
break
tagnum = tagnum + 1
tagnst = tagnst + 1
tagstk (tagnst) = tagnum
junk = addset (START_TAG, pat, j, MAXPAT)
junk = addset (tagnum, pat, j, MAXPAT)
}
else if (arg (i) == STOP_TAG & tagnst > 0) {
junk = addset (STOP_TAG, pat, j, MAXPAT)
junk = addset (tagstk (tagnst), pat, j, MAXPAT)
tagnst = tagnst - 1
}
else {
junk = addset (CHAR, pat, j, MAXPAT)
junk = addset (esc (arg, i), pat, j, MAXPAT)
}
lastj = lj
}
if (arg (i) != delim) # terminated early
makpat = ERR
else if (addset (EOS, pat, j, MAXPAT) == NO) # no room
makpat = ERR
else if (tagnst != 0)
makpat = ERR
else
makpat = i
return
end
|