|
|
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: 5159 (0x1427)
Types: TextFile
Names: »parse.c«
└─⟦3d0c2be1b⟧ Bits:30001254 ISODE-5.0 Tape
└─⟦eba4602b1⟧ »./isode-5.0.tar.Z«
└─⟦d3ac74d73⟧
└─⟦this⟧ »isode-5.0/quipu/parse.c«
/* parse.c - */
#ifndef lint
static char *rcsid = "$Header: /f/osi/quipu/RCS/parse.c,v 6.0 89/03/18 23:41:47 mrose Rel $";
#endif
/*
* $Header: /f/osi/quipu/RCS/parse.c,v 6.0 89/03/18 23:41:47 mrose Rel $
*
*
* $Log: parse.c,v $
* Revision 6.0 89/03/18 23:41:47 mrose
* Release 5.0
*
*/
/*
* 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 "quipu/util.h"
#include "quipu/entry.h"
#include "quipu/ds_error.h"
#include "cmd_srch.h"
#define PARSE_BUFFER 10000
static char parse_buffer [PARSE_BUFFER];
Entry getentry_block (file,p_parent,fname,check)
FILE * file;
Entry p_parent;
char * fname;
char check;
{
extern char * parse_file;
extern int parse_status;
extern int parse_line;
Entry entryptr;
int dtype;
char *version;
Entry get_entries_aux ();
parse_status = 0;
parse_line = 0;
parse_file = fname;
if (check)
if (get_header (file,&dtype,&version) != OK) {
parse_line = 0;
parse_error ("File %s not loaded",fname);
parse_file = NULLCP;
return (NULLENTRY);
}
entryptr = get_entries_aux (file,p_parent,check,version,dtype);
if (parse_status != 0) {
parse_line = 0;
parse_error ("File %s not loaded",fname);
parse_file = NULLCP;
return (NULLENTRY);
}
if ( p_parent != NULLENTRY ) {
p_parent->e_edbversion = version;
if ((dtype == E_DATA_MASTER) || (dtype == E_TYPE_SLAVE))
p_parent->e_allchildrenpresent = TRUE;
}
parse_file = NULLCP;
return (entryptr);
}
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);
}
get_header (file,typeptr,versionptr)
FILE * file;
int * typeptr;
char ** versionptr;
{
char * ptr;
static CMD_TABLE cmd_header [] = {
"MASTER", E_DATA_MASTER,
"SLAVE", E_TYPE_SLAVE,
"CACHE", E_TYPE_CACHE_FROM_MASTER,
0, -1,
};
if ((ptr = getline (file)) == NULLCP) {
parse_error ("NULL file !!!",NULLCP);
return (NOTOK);
}
if ((*typeptr = cmd_srch (ptr,cmd_header)) == -1) {
parse_error ("File type %s not recognised",ptr);
return (NOTOK);
}
if ((ptr = getline (file)) == NULLCP) {
parse_error ("No verison specified",NULLCP);
return (NOTOK);
}
*versionptr = strdup (ptr);
return (OK);
}
Attr_Sequence get_attributes_aux (file)
FILE * file;
{
Attr_Sequence as = NULLATTR;
char * ptr;
if ((ptr = getline (file)) == NULLCP)
return (NULLATTR);
while ( *ptr != 0 ) {
as = as_merge (as,str2as(ptr));
if ((ptr = getline (file)) == NULLCP)
break;
}
return (as);
}
Attr_Sequence get_attributes (file)
FILE * file;
{
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,check,dtype)
FILE * file;
Entry parent;
char check;
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;
eptr = get_default_entry (parent);
eptr->e_data = dtype;
if ((ptr = getline (file)) == NULLCP)
return (NULLENTRY);
while (*ptr == 0)
if ((ptr = getline (file)) == NULLCP)
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;
return (eptr);
}
Entry get_entry (file,parent,check,dtype)
FILE * file;
Entry parent;
char check;
int dtype;
{
extern int parse_status;
extern int parse_line;
parse_status = 0;
parse_line = 0;
return (get_entry_aux (file,parent,check,dtype));
}
/* ARGSUSED */
Entry get_entries_aux (file,parent,check,version,dtype)
FILE * file;
Entry parent;
char check;
char * version;
int dtype;
{
Entry eptr = NULLENTRY;
Entry top = NULLENTRY;
Entry trail;
while (feof(file) == 0) {
if ((eptr = get_entry_aux (file,parent,check,dtype)) == NULLENTRY)
continue;
if ( top == NULLENTRY) {
top = eptr;
trail = eptr;
} else {
trail->e_sibling = eptr;
trail = eptr;
}
}
return (top);
}
Entry get_entries (file,parent,check,version,dtype)
FILE * file;
Entry parent;
char check;
char * version;
int dtype;
{
extern int parse_status;
extern int parse_line;
parse_status = 0;
parse_line = 0;
return (get_entries_aux (file,parent,check,version,dtype));
}