/*
dict.h
UltraRogue: The Ultimate Adventure in the Dungeons of Doom
Copyright (C) 1995 Herb Chong
All rights reserved.
See the file LICENSE.TXT for full copyright and licensing information.
*/
/*-----------------
Change history:
(AK:04/03/95) - Added hook for extensions to dictionary structure.
(AK:04/04/95) - Added dictionary signature, table of contents and parameter
structure defintions and fields in DICTIONARY structure
-------------------*/
#ifndef dict_h_included
#define dict_h_included
static char dict_sccsid[] = "%W% %G%";
#ifndef TRUE
#define TRUE 1
#define FALSE 0
#endif
#define DICT_NONE 0x00000000 /* no flags set */
#define DICT_VALIDATE 0xdeadbeef /* look for this in every dictionary structure */
#define DICT_ENTRY_NONE -1 /* index of invalid entry */
typedef unsigned char BOOLEANC;
/*------------------
string table entry
------------------*/
typedef struct string_entry {
long string_offset; /* offset in string array */
long count; /* number of occurrences of string */
long next; /* offset of next in hash chain */
void *any_ptr; /* free pointer */
unsigned long flags; /* user definable flag value for string */
unsigned long hash_value; /* hash value of string using hash function */
} STRING_ENTRY;
/*--------------------
Dictionary signature (AK:04/04/95)
--------------------*/
typedef struct dict_sig_ { /* Dictionary signature */
unsigned long check_value; /* 0xdeadbeef */
int toc_size; /* # of entries in Table of Contents */
long nparms; /* # of parameters */
unsigned long checksum; /* Checksum for TOC */
} DICT_SIG;
/*----------------------------------
Dictionary table of contents entry (AK:04/04/95)
----------------------------------*/
typedef struct TOC_entry_ { /* Dictionary table of contents entry */
char id[5]; /* Field identifier: */
long offset; /* Offset (bytes) of entry in file */
long size; /* Size (bytes) of entry */
void *ptr; /* Where entry is stored in memory */
unsigned long checksum; /* Checksum of entry */
int type; /* 0=ordinary ; 1=EVECTOR ; 2=NULL */
} DICT_TOC_ENTRY;
/*--------------------------------
Dictionary parameter table entry (AK:04/04/95)
--------------------------------*/
typedef struct dict_parm_entry_ { /* Dictionary parameter table entry */
char id[13]; /* Parameter identifier */
unsigned long value; /* Parameter value */
} DICT_PARM_ENTRY;
/*---------------------------
Hash dictionary information
---------------------------*/
typedef struct dictionary {
unsigned long check_value; /* check validation value */
unsigned long flags; /* flag values */
long entry_count; /* number of used entries in each table */
char *string_array; /* storage for strings */
long array_size; /* number of bytes allocated */
long array_used; /* number of bytes occupied */
int array_growth_count; /* number of times grown */
STRING_ENTRY *string_table; /* string table */
long string_max; /* max number of entries in string table */
long scan_string_index; /* current index into string table for scan */
int string_growth_count; /* number of times had to grow string table */
long *chains; /* vector of array indices to hash entries */
int longest_chain_length; /* longest chain length in hash table */
int allowable_chain_length; /* chain lengths always < this */
long table_size; /* number of elements in hash entries vector */
unsigned long hash_mask; /* mask for doing mod() function */
int hash_growth_count; /* number of times had to grow hash table */
void *ext; /* Hook for extensions to the dictionary (AK:04/03/95) */
DICT_SIG *sig; /* Signature (AK:04/04/95) */
DICT_TOC_ENTRY *toc; /* Table of contents (AK:04/04/95) */
DICT_PARM_ENTRY *parm; /* Parameters (AK:04/04/95) */
} DICTIONARY;
/*--------------------------------------------------------------
dict_create: create a dictionary and initialize its structures
--------------------------------------------------------------*/
extern DICTIONARY *dict_create(
const long toc_size,
const long initial_string_count,
const long initial_hash_entries,
const long max_chain_length );
/*-------------------------------------------------
dict_delete: deletes an entry from the dictionary
-------------------------------------------------*/
extern BOOLEANC dict_delete(
const DICTIONARY *dict,
const char *s,
const long count );
/*---------------------------------------------------
dict_destroy: discard a dictionary and its contents
---------------------------------------------------*/
extern BOOLEANC dict_destroy(
DICTIONARY *dict );
/*------------------------------------------------
dict_export: write a dictionary to an ASCII file
------------------------------------------------*/
extern BOOLEANC dict_export(
DICTIONARY *dict,
const char *fname );
/*-------------------------------------------------
dict_import: read a dictionary from an ASCII file
-------------------------------------------------*/
extern DICTIONARY *dict_import(
const char *dict_fname,
const long initial_string_count,
const long initial_hash_entries,
const long max_chain_length );
/*------------------------------------------------------------------
dict_insert: add entries into the dictionary, growing as necessary
------------------------------------------------------------------*/
extern STRING_ENTRY *dict_insert(
DICTIONARY *dict,
char *s,
const long occurences,
const unsigned long flags,
void *any_ptr,
long *number );
/*----------------------------------------------------
dict_load: read a dictionary from a file into memory
----------------------------------------------------*/
extern DICTIONARY *dict_load(
const char *fname );
/*-----------------------------------------------------------------
dict_merge: merges the contents of a dictionary into another one,
updating the contents of the destination
-----------------------------------------------------------------*/
extern BOOLEANC dict_merge(
const DICTIONARY *dst,
const DICTIONARY *src,
const BOOLEANC move );
/*----------------------------------------------------
dict_save: save a dictionary from memory into a file
----------------------------------------------------*/
extern BOOLEANC dict_save(
DICTIONARY *dict,
const char *fname );
/*-----------------------------------------------
dict_scan_begin: begin a scan of the dictionary
-----------------------------------------------*/
extern BOOLEANC dict_scan_begin(
DICTIONARY *dict );
/*--------------------------------------------
dict_scan_next: get the next entry in a scan
--------------------------------------------*/
extern STRING_ENTRY *dict_scan_next(
DICTIONARY *dict );
/*-----------------------------------------------
dict_search: look for entries in the dictionary
-----------------------------------------------*/
extern STRING_ENTRY *dict_search(
const DICTIONARY *dict,
const char *s,
long *number );
/*----------------------------------------------------------------------
dict_string_by_number: return string pointer for a given string number
----------------------------------------------------------------------*/
extern STRING_ENTRY *dict_string_by_number(
const DICTIONARY *dict,
const long number );
/*----------------------------------------------------------
dict_union: merges contents of 2 dictionaries into a third
----------------------------------------------------------*/
extern DICTIONARY *dict_union(
const DICTIONARY *dict1,
const DICTIONARY *dict2 );
#endif /* dict_h_included */