view urogue/dict.h @ 295:1e1c81fbb533

Rogue V5: fix elemental wands. Bolts often failed to hit, due to some struct members not being initialized. Reported by 'LazyCat' from RogueTemple.
author John "Elwin" Edwards
date Fri, 12 Jan 2018 18:02:39 -0500
parents c495a4f288c6
children 13b482bd9e66
line wrap: on
line source

/*
    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 */