|
|
1.1 root 1: /* parse2.c - */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/quipu/RCS/parse2.c,v 7.3 90/07/09 14:46:27 mrose Exp $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/quipu/RCS/parse2.c,v 7.3 90/07/09 14:46:27 mrose Exp $
9: *
10: *
11: * $Log: parse2.c,v $
12: * Revision 7.3 90/07/09 14:46:27 mrose
13: * sync
14: *
15: * Revision 7.2 90/01/11 18:37:23 mrose
16: * real-sync
17: *
18: * Revision 7.1 89/12/19 16:20:42 mrose
19: * sync
20: *
21: * Revision 7.0 89/11/23 22:17:57 mrose
22: * Release 6.0
23: *
24: */
25:
26: /*
27: * NOTICE
28: *
29: * Acquisition, use, and distribution of this module and related
30: * materials are subject to the restrictions of a license agreement.
31: * Consult the Preface in the User's Manual for the full terms of
32: * this agreement.
33: *
34: */
35:
36: #include "quipu/util.h"
37: #include "quipu/entry.h"
38: #include "quipu/config.h"
39: #include "cmd_srch.h"
40: #include "quipu/malloc.h"
41: #ifdef TURBO_DISK
42: #include <gdbm.h>
43: #endif
44:
45: Entry getentry_block_aux (), get_entry_aux();
46: extern LLog * log_dsap;
47: char * getline ();
48: int rdn_print ();
49: int master_edbs = 0;
50: int slave_edbs = 0;
51:
52: #ifdef TURBO_DISK
53: extern datum turbo_header_key;
54: #endif
55:
56: Entry getentry_block (p_parent,fname)
57: Entry p_parent;
58: char * fname;
59: {
60: #ifdef TURBO_DISK
61: GDBM_FILE db;
62: static char gfname[1024];
63: int save_heap;
64:
65: strcpy(gfname, fname);
66: strcat(gfname, ".gdbm");
67: save_heap = mem_heap;
68: GENERAL_HEAP;
69: db = gdbm_open(gfname, 0, GDBM_READER, 0, 0);
70: mem_heap = save_heap;
71: return getentry_block_aux (p_parent, gfname, db);
72: #else
73: return getentry_block_aux (p_parent,fname, fopen (fname, "r"));
74: #endif
75: }
76:
77: Entry getentry_block_aux (p_parent,fname,file)
78: Entry p_parent;
79: char * fname;
80: #ifdef TURBO_DISK
81: GDBM_FILE file;
82: #else
83: FILE *file;
84: #endif
85: {
86: extern char * parse_file;
87: extern int parse_status;
88: extern int parse_line;
89: Entry entryptr;
90: int dtype;
91: char *version;
92: Entry get_entries_aux ();
93: extern int errno;
94:
95: if (file == NULL) {
96: LLOG (log_dsap,LLOG_NOTICE,("WARNING - Can't open \"%s\" (%d)- should I be able to ?",fname,errno));
97: return (NULLENTRY);
98: }
99:
100: LLOG (log_dsap,LLOG_NOTICE,("Loading \"%s\"",fname));
101:
102: parse_status = 0;
103: parse_line = 0;
104: parse_file = fname;
105:
106: if (get_header (file,&dtype,&version) != OK) {
107: parse_line = 0;
108: parse_error ("File %s not loaded",fname);
109: parse_file = NULLCP;
110: #ifdef TURBO_DISK
111: save_heap = mem_heap;
112: GENERAL_HEAP;
113: (void) gdbm_close (file);
114: mem_heap = save_heap;
115: #else
116: (void) fclose (file);
117: #endif
118: return (NULLENTRY);
119: }
120:
121: entryptr = get_entries_aux (file,p_parent,version,dtype);
122:
123: if ((parse_status != 0) || (entryptr == NULLENTRY)) {
124: parse_line = 0;
125: parse_error ("File %s not loaded",fname);
126: parse_file = NULLCP;
127: #ifdef TURBO_DISK
128: save_heap = mem_heap;
129: GENERAL_HEAP;
130: (void) gdbm_close (file);
131: mem_heap = save_heap;
132: #else
133: (void) fclose (file);
134: #endif
135: return (NULLENTRY);
136: }
137:
138: if ( p_parent != NULLENTRY ) {
139: p_parent->e_edbversion = version;
140: if ((dtype == E_DATA_MASTER) || (dtype == E_TYPE_SLAVE))
141: p_parent->e_allchildrenpresent = TRUE;
142: }
143:
144: parse_file = NULLCP;
145:
146: if (dtype == E_DATA_MASTER)
147: master_edbs++;
148: if (dtype == E_TYPE_SLAVE)
149: slave_edbs++;
150:
151: #ifdef TURBO_DISK
152: save_heap = mem_heap;
153: GENERAL_HEAP;
154: (void) gdbm_close (file);
155: mem_heap = save_heap;
156: #else
157: (void) fclose (file);
158: #endif
159: return (entryptr);
160: }
161:
162: #ifdef TURBO_DISK
163:
164: get_header (db, typeptr, versionptr)
165: GDBM_FILE db;
166: int *typeptr;
167: char **versionptr;
168: {
169: char *v;
170: datum h;
171: int save_heap;
172: static CMD_TABLE cmd_header[] = {
173: "MASTER", E_DATA_MASTER,
174: "SLAVE", E_TYPE_SLAVE,
175: "CACHE", E_TYPE_CACHE_FROM_MASTER,
176: 0, -1,
177: };
178: extern char *parse_entry;
179:
180: save_heap = mem_heap;
181: GENERAL_HEAP;
182:
183: parse_entry = turbo_header_key.dptr;
184: if (db == NULL) {
185: parse_error("NULL dbm file!!!", NULLCP);
186: mem_heap = save_heap;
187: return(NOTOK);
188: }
189:
190: h = gdbm_fetch(db, turbo_header_key);
191: if (h.dptr == NULL) {
192: parse_error("File has no header!!!", NULLCP);
193: mem_heap = save_heap;
194: return(NOTOK);
195: }
196:
197: v = index(h.dptr, '\n');
198: if (v == NULLCP) {
199: parse_error("Bad file header", NULLCP);
200: mem_heap = save_heap;
201: return(NOTOK);
202: }
203: *v++ = '\0';
204:
205: if ((*typeptr = cmd_srch(h.dptr, cmd_header)) == -1) {
206: parse_error("File type %s not recognised", h.dptr);
207: mem_heap = save_heap;
208: return(NOTOK);
209: }
210:
211: if (*v == '\0') {
212: parse_error("No version specified", NULLCP);
213: mem_heap = save_heap;
214: return(NOTOK);
215: }
216: *versionptr = strdup(v);
217: free(h.dptr);
218:
219: mem_heap = save_heap;
220: return(OK);
221: }
222:
223: #else
224:
225: get_header (file,typeptr,versionptr)
226: FILE * file;
227: int * typeptr;
228: char ** versionptr;
229: {
230: char * ptr;
231: static CMD_TABLE cmd_header [] = {
232: "MASTER", E_DATA_MASTER,
233: "SLAVE", E_TYPE_SLAVE,
234: "CACHE", E_TYPE_CACHE_FROM_MASTER,
235: 0, -1,
236: };
237:
238: if ((ptr = getline (file)) == NULLCP) {
239: parse_error ("NULL file !!!",NULLCP);
240: return (NOTOK);
241: }
242:
243: if ((*typeptr = cmd_srch (ptr,cmd_header)) == -1) {
244: parse_error ("File type %s not recognised",ptr);
245: return (NOTOK);
246: }
247:
248: if ((ptr = getline (file)) == NULLCP) {
249: parse_error ("No version specified",NULLCP);
250: return (NOTOK);
251: }
252: *versionptr = strdup (ptr);
253:
254: return (OK);
255: }
256:
257: #endif
258:
259: /* ARGSUSED */
260: Entry get_entries_aux (file,parent,version,dtype)
261: #ifdef TURBO_DISK
262: GDBM_FILE file;
263: #else
264: FILE * file;
265: #endif
266: Entry parent;
267: char * version;
268: int dtype;
269: {
270: Entry eptr = NULLENTRY;
271: Entry top = NULLENTRY;
272: Entry trail;
273: Entry find_sibling();
274:
275: #ifdef TURBO_DISK
276: extern int dbmeof;
277: #endif
278: #ifdef TURBO_LOAD
279: if ( ! turbo_start(file)) {
280: parse_error ("Turbo load failed",NULLCP);
281: return NULLENTRY;
282: }
283: #endif
284:
285: #ifdef TURBO_DISK
286: dbmeof = 0;
287: while (dbmeof == 0) {
288: #else
289: while (feof(file) == 0) {
290: #endif
291: if ((eptr = get_entry_aux (file,parent,dtype)) == NULLENTRY)
292: continue;
293: if ( top == NULLENTRY) {
294: top = eptr;
295: trail = eptr;
296: } else {
297: #ifdef TURBO_LOAD
298: if ( turbo_insert(eptr->e_name) != OK )
299: #else
300: if (find_sibling (eptr->e_name,top) != NULLENTRY)
301: #endif
302: {
303: pslog (log_dsap,LLOG_EXCEPTIONS,"Duplicate entry for",rdn_print,(caddr_t)eptr->e_name);
304: parse_error ("Non Unique RDN",NULLCP);
305: }
306: trail->e_sibling = eptr;
307: trail = eptr;
308: }
309: }
310:
311: #ifdef TURBO_LOAD
312: turbo_end();
313: #endif
314:
315: return (top);
316: }
317:
318:
319: Entry get_entries (file,parent,version,dtype)
320: FILE * file;
321: Entry parent;
322: char * version;
323: int dtype;
324: {
325: extern int parse_status;
326: extern int parse_line;
327:
328: parse_status = 0;
329: parse_line = 0;
330:
331: return (get_entries_aux (file,parent,version,dtype));
332: }
333:
334: Entry find_sibling (object,start)
335: RDN object;
336: Entry start;
337: {
338: if (start == NULLENTRY)
339: return (NULLENTRY);
340:
341: while (rdn_cmp (start->e_name, object) != OK) {
342: start = start->e_sibling ;
343: if ( start == NULLENTRY )
344: return (NULLENTRY);
345: }
346: return (start);
347: }
348:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.