DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T p

⟦f7dc02d15⟧ TextFile

    Length: 5159 (0x1427)
    Types: TextFile
    Names: »parse.c«

Derivation

└─⟦3d0c2be1b⟧ Bits:30001254 ISODE-5.0 Tape
    └─⟦eba4602b1⟧ »./isode-5.0.tar.Z« 
        └─⟦d3ac74d73⟧ 
            └─⟦this⟧ »isode-5.0/quipu/parse.c« 

TextFile

/* 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));
}