V8/usr/src/cmd/monk/cmd/monk/read_cmpress.c

Compare this file to the similar file:
Show the results in this format:

#include	<stdio.h>
#include	<ctype.h>
#include	"search.h"
#include	"warn.h"
#include	"rd.h"
#include	"dbcompress.h"

/* Read compressed database:
	buffers:
		hash structures for attributes;
		hash structures for definitions;
		attribute_info structures;
		attribute_case structures;
		definition structures;
		def_el structures;
		value structures;
		text strings;
 */

read_buffers(database, database_path)
FILE	*database;
char	*database_path;
{
	int	buf_size[BUF_NUMBER], buf_number, n;
	char	*db_buf[BUF_NUMBER];

	fread(buf_size, sizeof(int), BUF_NUMBER, database);
	for (buf_number = 0; buf_number < BUF_NUMBER; ++buf_number) {
		db_buf[buf_number] = mymalloc(buf_size[buf_number]);
		if ((n = buf_size[buf_number]) == 0)
			continue;
		if ((n = fread(db_buf[buf_number], 1, n, database))
						!= buf_size[buf_number]) {
			fprintf(stderr, "Cannot read compressed %d, read %d\n",
						buf_number, n);
			exit(0);
		}
	}
	for (buf_number = 0; buf_number < BUF_NUMBER; ++buf_number) {
	/* fix pointers in buffers */
		switch(buf_number) {
			case BUF_HASH_ATT:
			case BUF_HASH_DEF:
				fixhash(buf_number, db_buf, buf_size);
				break;
			case BUF_ATT_INFO:
				fixattinfo(buf_number, db_buf, buf_size);
				break;
			case BUF_ATT_CASE:
				fixattcase(buf_number, db_buf, buf_size);
				break;
			case BUF_DEF:
				fixdef(buf_number, db_buf, buf_size);
				break;
			case BUF_DEF_EL:
				fixdef_el(buf_number, db_buf, buf_size);
				break;
			case BUF_COND_DEF_EL:
				fixcond_def_el(buf_number, db_buf, buf_size);
				break;
			case BUF_VALUE:
				fixvalue(buf_number, db_buf, buf_size);
				break;
			case BUF_TEXT:
				break;
			default:
				fprintf(stderr,
				"Reading compressed buffer: %d out of range\n",
							buf_number);
		}
	}
	fixmacros(MACRO_COMP, database_path);
}

fixhash(buf_number, db_buf, buf_size)
short	buf_number;
char	*db_buf[BUF_NUMBER];
int	buf_size[BUF_NUMBER];
{
	DBENTRY	*entry;
	int	hashtable;
	short	nitems;
	char	*data, *text;

	entry = (DBENTRY *) db_buf[buf_number];
	nitems = buf_size[buf_number] / sizeof(ENTRY);

	text = db_buf[BUF_TEXT];
	if (buf_number == BUF_HASH_ATT) {
		data = db_buf[BUF_ATT_INFO];
		hashtable = ATT_TABLE;
	} else
		if (buf_number == BUF_HASH_DEF) {
			data = db_buf[BUF_DEF];
			hashtable = DEF_TABLE;
		} else
			fprintf(stderr,
				"Error in reading database %d\n", buf_number);
	while (nitems--) {
		entry->key.p = ADD_OFFSET(entry->key.i, text);
		entry->data.p = ADD_OFFSET(entry->data.i, data);
		hashenter(hashtable, entry++);
	}
}

fixattinfo(buf_number, db_buf, buf_size)
short	buf_number;
char	*db_buf[BUF_NUMBER];
int	buf_size[BUF_NUMBER];
{
	struct dbattribute_info	*dbai;
	short	nitems;

	dbai = (struct dbattribute_info *) db_buf[buf_number];
	nitems = buf_size[buf_number] / sizeof(struct dbattribute_info);

	while (nitems--) {
		dbai->firstcase.acase = ADD_OFFSET(dbai->firstcase.icase,
			(struct attribute_case *) db_buf[BUF_ATT_CASE]);
		dbai++;
	}
}

fixattcase(buf_number, db_buf, buf_size)
short	buf_number;
char	*db_buf[BUF_NUMBER];
int	buf_size[BUF_NUMBER];
{
	struct dbattribute_case	*ac;
	short	nitems;

	ac = (struct dbattribute_case *) db_buf[buf_number];
	nitems = buf_size[buf_number] / sizeof(struct dbattribute_case);

	while (nitems--) {
		ac->troff.string = ADD_OFFSET(ac->troff.istring,
							db_buf[BUF_TEXT]);
		ac->value.value = ADD_OFFSET(ac->value.ivalue,
				(struct value *) db_buf[BUF_VALUE]);
		ac->next.acase = ADD_OFFSET(ac->next.icase,
			(struct attribute_case *) db_buf[BUF_ATT_CASE]);
		++ac;
	}
}

fixdef(buf_number, db_buf, buf_size)
short	buf_number;
char	*db_buf[BUF_NUMBER];
int	buf_size[BUF_NUMBER];
{
	struct dbdefinition	*d;
	short	nitems;

	d = (struct dbdefinition *) db_buf[buf_number];
	nitems = buf_size[buf_number] / sizeof(struct dbdefinition);

	while (nitems--) {
		d->name.string = ADD_OFFSET(d->name.istring, db_buf[BUF_TEXT]);
		d->values.value = ADD_OFFSET(d->values.ivalue,
				(struct value *) db_buf[BUF_VALUE]);
		d->begin_def.def_el = ADD_OFFSET(d->begin_def.idef_el,
				(struct def_element *) db_buf[BUF_DEF_EL]);
		d->end_def.def_el = ADD_OFFSET(d->end_def.idef_el,
				(struct def_element *) db_buf[BUF_DEF_EL]);
		d->sub_def.def = ADD_OFFSET(d->sub_def.idef,
				(struct definition *) db_buf[BUF_DEF]);
		++d;
	}
}

fixdef_el(buf_number, db_buf, buf_size)
short	buf_number;
char	*db_buf[BUF_NUMBER];
int	buf_size[BUF_NUMBER];
{
	struct dbdef_el	*d;
	short	nitems;

	d = (struct dbdef_el *) db_buf[buf_number];
	nitems = buf_size[buf_number] / sizeof(struct dbdef_el);

	while (nitems--) {
		d->attribute.string = ADD_OFFSET(d->attribute.istring,
						db_buf[BUF_TEXT]);
		d->troff.string = ADD_OFFSET(d->troff.istring,
						db_buf[BUF_TEXT]);
		d->value.value = ADD_OFFSET(d->value.ivalue,
				(struct value *) db_buf[BUF_VALUE]);
		d->cdl.cond_def_el = ADD_OFFSET(d->cdl.icond_def_el,
			(struct cond_def_el *) db_buf[BUF_COND_DEF_EL]);
		d->next.def_el = ADD_OFFSET(d->next.idef_el,
				(struct def_element *) db_buf[BUF_DEF_EL]);
		++d;
	}
}

fixcond_def_el(buf_number, db_buf, buf_size)
short	buf_number;
char	*db_buf[BUF_NUMBER];
int	buf_size[BUF_NUMBER];
{
	struct dbcond_def_el	*d;
	short	nitems;

	d = (struct dbcond_def_el *) db_buf[buf_number];
	nitems = buf_size[buf_number] / sizeof(struct dbcond_def_el);

	while (nitems--) {
		d->attribute.string = ADD_OFFSET(d->attribute.istring,
						db_buf[BUF_TEXT]);
		d->value.value = ADD_OFFSET(d->value.ivalue,
				(struct value *) db_buf[BUF_VALUE]);
		d->next_on_fail.def_el = ADD_OFFSET(d->next_on_fail.idef_el,
				(struct def_element *) db_buf[BUF_DEF_EL]);
		++d;
	}
}

fixvalue(buf_number, db_buf, buf_size)
short	buf_number;
char	*db_buf[BUF_NUMBER];
int	buf_size[BUF_NUMBER];
{
	struct dbvalue	*v;
	short	nitems;

	v = (struct dbvalue *) db_buf[buf_number];
	nitems = buf_size[buf_number] / sizeof(struct dbvalue);

	while (nitems--) {
		v->value.string = ADD_OFFSET(v->value.istring,
							db_buf[BUF_TEXT]);
		v->next.value = ADD_OFFSET(v->next.ivalue,
				(struct value *) db_buf[BUF_VALUE]);
		++v;
	}
}

fixmacros(macrofile, database_path)
char	*macrofile, *database_path;
{
	FILE	*macros;
	int	c;

	macros = fopendb(macrofile, database_path, "r", EXIT_ON_FAIL);
	while ((c = mygetc(macros)) != EOF)
		textputc(c, MONK_DB);
	fclosencheck(macros);
}