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
79
80
81
82
83
84
85
86
|
include "../ptkeysdef.h"
# PT_MKREC -- Construct the output record.
procedure pt_mkrec (key, line, nchars, first_rec, recptr, ncontinue)
pointer key # pointer to record structure
char line[ARB] # input line
int nchars # length of line array
int first_rec # first record read
int recptr # line per record index
int ncontinue # number of unique lines per record
int i, cip, nokeys, nckeys, nkeys, nper_line, len_move
pointer op
begin
# Reinitialize if this is the start of a new record.
if (recptr == 1)
nokeys = KY_NPKEYS(key)
# Check repeat character.
if (line[nchars-2] == '*')
ncontinue = ncontinue + 1
else
ncontinue = 0
# Fill in the record.
cip = 1
if (ncontinue < 1) {
nper_line = Memi[KY_NPLINE(key)+recptr-1]
nkeys = nokeys + nper_line
call amovki (int(1), Memi[KY_NELEMS(key)+nokeys], nper_line)
len_move = 0
do i = nokeys + 1, nkeys
len_move = len_move + Memi[KY_KINDICES(key)+i-1]
op = Memi[KY_PTRS(key)+nokeys]
call amovc (line[cip], Memc[op], len_move)
cip = cip + len_move
recptr = recptr + 1
nokeys = nkeys
} else if (ncontinue == 1) {
nckeys = nokeys + 1
nkeys = nokeys + Memi[KY_NPLINE(key)+recptr-1]
if (first_rec == YES) {
Memi[KY_NCONTINUE(key)+recptr-1] = KY_NLINES
do i = nckeys, nkeys
call malloc (Memi[KY_PTRS(key)+i-1], KY_NLINES *
Memi[KY_KINDICES(key)+i-1], TY_CHAR)
}
do i = nckeys, nkeys {
call amovc (line[cip], Memc[Memi[KY_PTRS(key)+i-1]],
Memi[KY_KINDICES(key)+i-1])
cip = cip + Memi[KY_KINDICES(key)+i-1]
}
nokeys = nkeys
recptr = recptr + 1
} else {
if (ncontinue > Memi[KY_NCONTINUE(key)+recptr-2]) {
Memi[KY_NCONTINUE(key)+recptr-2] = Memi[KY_NCONTINUE(key)+
recptr-2] + KY_NLINES
do i = nckeys, nkeys
call realloc (Memi[KY_PTRS(key)+i-1],
Memi[KY_NCONTINUE(key)+recptr-2] *
Memi[KY_KINDICES(key)+i-1], TY_CHAR)
}
do i = nckeys, nkeys {
op = Memi[KY_PTRS(key)+i-1] + (ncontinue - 1) *
Memi[KY_KINDICES(key)+i-1]
call amovc (line[cip], Memc[op], Memi[KY_KINDICES(key)+i-1])
Memi[KY_NELEMS(key)+i-1] = ncontinue
cip = cip + Memi[KY_KINDICES(key)+i-1]
}
}
end
|