|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T p
Length: 7267 (0x1c63) Types: TextFile Names: »parse.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0 └─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z« └─⟦e5a54fb17⟧ └─⟦this⟧ »pp-5.0/Chans/dirlist/parse.c«
/* parse.c - */ # ifndef lint static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Chans/dirlist/RCS/parse.c,v 5.0 90/09/20 15:46:02 pp Exp Locker: pp $"; # endif /* * $Header: /cs/research/pp/hubris/pp-beta/Chans/dirlist/RCS/parse.c,v 5.0 90/09/20 15:46:02 pp Exp Locker: pp $ * * $Log: parse.c,v $ * Revision 5.0 90/09/20 15:46:02 pp * rcsforce : 5.0 public release * */ /* * NOTICE * * Acquisition, use, and distribution of this module and related * materials are subject to the restrictions of a license agreement. * Consult the Preface in the User's Manual for the full terms of * this agreement. * */ #include <isode/quipu/util.h> #include <isode/quipu/entry.h> #include <isode/quipu/ds_error.h> #include <isode/quipu/malloc.h> #ifdef TURBO_DISK #include <gdbm.h> #endif #ifndef TURBO_DISK #define PARSE_BUFFER 10000 static char parse_buffer [PARSE_BUFFER]; #endif Entry database_root; int local_master_size = 0; int local_slave_size = 0; int local_cache_size = 0; #ifdef TURBO_DISK extern char *parse_entry; int dbmeof; int dbmfirst = 1; datum turbo_header_key = { "HEADER", sizeof("HEADER") }; #endif extern time_t time (); #ifdef TURBO_DISK char *getline (db) GDBM_FILE db; { static datum newkey, key, dat; static char *line, *next, *save; static int new_entry; char *TidyString(); int save_heap; save_heap = mem_heap; GENERAL_HEAP; if (dbmfirst) { dbmfirst = 0; key = gdbm_firstkey(db); parse_entry = key.dptr; new_entry = 1; } else if (line == NULLCP || *line == '\0') { newkey = gdbm_nextkey(db, key); free(key.dptr); key = newkey; parse_entry = key.dptr; new_entry = 1; } if (key.dptr == NULLCP) { dbmeof = 1; dbmfirst = 1; mem_heap = save_heap; return(NULLCP); } if (new_entry) { /* gross, but we have to skip the header datum */ if (strcmp(key.dptr, turbo_header_key.dptr) == 0) { newkey = gdbm_nextkey(db, key); free(key.dptr); key = newkey; if (key.dptr == NULLCP) { parse_entry = key.dptr; dbmeof = 1; dbmfirst = 1; mem_heap = save_heap; return(NULLCP); } } new_entry = 0; parse_entry = key.dptr; dat = gdbm_fetch(db, key); if ((line = dat.dptr) == NULLCP) { parse_error("edb error - null dbm data"); return(NULLCP); } } if (*line == '\n') { line = NULLCP; free(dat.dptr); mem_heap = save_heap; return(""); } line = SkipSpace(line); while (*line == '#') { line = index(line, '\n') + 1; if (*line == '\0') { mem_heap = save_heap; return(NULLCP); } line = SkipSpace(line); } next = index(line, '\n'); *next++ = '\0'; save = line; line = next; mem_heap = save_heap; return(TidyString(save)); } #else char * getline (file) FILE * file; { extern int parse_line; char * ptr; extern char * TidyString (); while ( fgets (parse_buffer,PARSE_BUFFER,file) != NULLCP) { parse_line++; ptr = SkipSpace (parse_buffer); if (*ptr != '#') return (TidyString(ptr)); } return (NULLCP); } #endif Attr_Sequence get_attributes_aux (file) #ifdef TURBO_DISK GDBM_FILE file; #else FILE * file; #endif { Attr_Sequence as = NULLATTR; Attr_Sequence as_combine (); char * ptr; if ((ptr = getline (file)) == NULLCP) return (NULLATTR); while ( *ptr != 0 ) { as = as_combine (as,ptr); if ((ptr = getline (file)) == NULLCP) break; } return (as); } Attr_Sequence get_attributes (file) #ifdef TURBO_DISK GDBM_FILE file; #else FILE * file; #endif { extern int parse_status; extern int parse_line; parse_status = 0; parse_line = 0; return (get_attributes_aux (file)); } Entry get_entry_aux (file,parent,dtype) #ifdef TURBO_DISK GDBM_FILE file; #else FILE * file; #endif Entry parent; int dtype; { Entry eptr; char * ptr; extern RDN parse_rdn; struct DSError err; extern int print_parse_errors; extern int parse_line; int save; extern PS opt; char check = TRUE; DATABASE_HEAP; eptr = get_default_entry (parent); eptr->e_data = dtype; if ((ptr = getline (file)) == NULLCP) { GENERAL_HEAP; return (NULLENTRY); } while (*ptr == 0) if ((ptr = getline (file)) == NULLCP) { GENERAL_HEAP; return (NULLENTRY); } if ((eptr->e_name = str2rdn (ptr)) == NULLRDN) { parse_error ("invalid rdn %s",ptr); check = FALSE; } parse_rdn = eptr->e_name; eptr->e_attributes = get_attributes_aux (file); if (check) { save = parse_line; parse_line = 0; if (unravel_attribute (eptr,&err,FALSE) != OK) { parse_error ("Error in entry ending line %d...",(char *) save); if (print_parse_errors) ds_error (opt,&err); } if (check_schema (eptr,NULLATTR,&err,FALSE) != OK) { parse_error ("Schema error in entry ending line %d...",(char *) save); if (print_parse_errors) ds_error (opt,&err); } parse_line = save; } parse_rdn = NULLRDN; GENERAL_HEAP; switch (dtype) { case E_TYPE_SLAVE: local_slave_size++; break; case E_DATA_MASTER: local_master_size++; break; case E_TYPE_CACHE_FROM_MASTER: eptr->e_age = time ((time_t *)0); local_cache_size++; break; } return (eptr); } Entry get_entry (file,parent,dtype) #ifdef TURBO_DISK GDBM_FILE file; #else FILE * file; #endif Entry parent; int dtype; { extern int parse_status; extern int parse_line; parse_status = 0; parse_line = 0; return (get_entry_aux (file,parent,dtype)); } Entry new_constructor (parent) Entry parent; { Entry constructor; constructor = get_default_entry (parent); constructor->e_leaf = FALSE; constructor->e_complete = FALSE; constructor->e_data = E_TYPE_CONSTRUCTOR; constructor->e_acl = acl_alloc (); constructor->e_acl->ac_child = acl_dflt (); constructor->e_acl->ac_entry = acl_dflt (); constructor->e_acl->ac_default = acl_dflt (); constructor->e_acl->ac_attributes = NULLACL_ATTR; return (constructor); } Entry make_path (dn) DN dn; { Entry ptr; register RDN a_rdn, b_rdn; if ((database_root == NULLENTRY) || (database_root->e_child == NULLENTRY)) { database_root = new_constructor(NULLENTRY); ptr = database_root; for (; dn!= NULLDN; dn=dn->dn_parent) { ptr->e_child = new_constructor(ptr); ptr = ptr->e_child; ptr->e_name = rdn_cpy (dn->dn_rdn); } return (ptr); } else { /* follow links as far as poss, then add new bits */ if (dn == NULLDN) return (database_root); ptr = database_root->e_child; b_rdn = dn->dn_rdn; a_rdn = ptr->e_name ; for(;;) { /* return out */ while (rdn_cmp (a_rdn, b_rdn) != OK) { if (ptr->e_sibling == NULLENTRY) { ptr->e_sibling = new_constructor(ptr->e_parent); ptr = ptr->e_sibling; ptr->e_name = rdn_cpy (dn->dn_rdn); for (dn=dn->dn_parent; dn!= NULLDN; dn=dn->dn_parent) { ptr->e_child = new_constructor(ptr); ptr = ptr->e_child; ptr->e_name = rdn_cpy (dn->dn_rdn); } return (ptr); } ptr = ptr->e_sibling; a_rdn = ptr->e_name ; } if ( dn->dn_parent == NULLDN) return (ptr); dn = dn->dn_parent; b_rdn = dn->dn_rdn; if ( ptr->e_child == NULLENTRY) { for (; dn!= NULLDN; dn=dn->dn_parent) { ptr->e_child = new_constructor(ptr); ptr = ptr->e_child; ptr->e_name = rdn_cpy (dn->dn_rdn); } return (ptr); } ptr = ptr->e_child; a_rdn = ptr->e_name; } } /* NOTREACHED */ }