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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
include <ctype.h>
include "cqdef.h"
# CQ_MAP -- Map a catalog database.
pointer procedure cq_map (database, mode)
char database[ARB] #I The database file
int mode #I The database file access mode
int i, nrec, cq_alloc1, cq_alloc2
pointer cq, str
long note()
int open(), fscan(), strlen()
bool streq()
errchk open()
begin
if (mode != READ_ONLY && mode != NEW_FILE && mode != APPEND)
return (NULL)
iferr (i = open (database, mode, TEXT_FILE))
return (NULL)
call calloc (cq, CQ_LEN, TY_STRUCT)
call strcpy (database, CQ_CATDB(cq), SZ_FNAME)
CQ_FD(cq) = i
if (mode != READ_ONLY)
return (cq)
cq_alloc1 = CQ_ALLOC
cq_alloc2 = CQ_ALLOC * SZ_LINE
call malloc (CQ_OFFSETS(cq), cq_alloc1, TY_LONG)
call malloc (CQ_NAMES(cq), cq_alloc1, TY_INT)
call malloc (CQ_MAP(cq), cq_alloc2, TY_CHAR)
call malloc (str, SZ_LINE, TY_CHAR)
nrec = 1
CQ_NRECS(cq) = 0
CQ_NAMEI(cq, nrec) = 0
while (fscan (CQ_FD(cq)) != EOF) {
call gargwrd (CQ_NAME(cq, nrec), SZ_LINE)
if (streq (CQ_NAME(cq, nrec), "begin")) {
call gargstr (Memc[str], SZ_LINE)
for (i=str; IS_WHITE(Memc[i]); i=i+1)
;
call strcpy (Memc[i], CQ_NAME(cq,nrec), SZ_LINE)
for (i = 1; i < nrec; i = i + 1)
if (streq (CQ_NAME(cq, i), CQ_NAME(cq, nrec)))
break
if (i < nrec)
CQ_OFFSET(cq, i) = note (CQ_FD(cq))
else {
CQ_NRECS(cq) = nrec
CQ_OFFSET(cq, nrec) = note (CQ_FD(cq))
CQ_NAMEI(cq, nrec+1) = CQ_NAMEI(cq, nrec) +
strlen (CQ_NAME(cq, nrec)) + 1
nrec = nrec + 1
}
if (nrec == cq_alloc1) {
cq_alloc1 = cq_alloc1 + CQ_ALLOC
call realloc (CQ_OFFSETS(cq), cq_alloc1, TY_LONG)
call realloc (CQ_NAMES(cq), cq_alloc1, TY_INT)
}
if (CQ_NAMEI(cq, nrec) + SZ_LINE >= cq_alloc2) {
cq_alloc2 = cq_alloc2 + CQ_ALLOC * SZ_LINE
call realloc (CQ_MAP(cq), cq_alloc2, TY_CHAR)
}
}
}
call realloc (CQ_MAP(cq), CQ_NAMEI(cq, nrec), TY_CHAR)
call realloc (CQ_OFFSETS(cq), CQ_NRECS(cq), TY_LONG)
call realloc (CQ_NAMES(cq), CQ_NRECS(cq), TY_INT)
call mfree (str, TY_CHAR)
return (cq)
end
# CQ_UNMAP -- Close the database.
procedure cq_unmap (cq)
pointer cq #U The database file descriptor
begin
if (cq == NULL)
return
# Free the current catalog structure.
call cq_ccfree (cq)
# Close the catalog database file.
if (CQ_FD(cq) != NULL)
call close (CQ_FD(cq))
# Free the record mapping arrays.
call mfree (CQ_MAP(cq), TY_CHAR)
call mfree (CQ_OFFSETS(cq), TY_LONG)
call mfree (CQ_NAMES(cq), TY_INT)
# Free the structure.
call mfree (cq, TY_STRUCT)
end
|