comparison urogue/dict.h @ 256:c495a4f288c6

Import UltraRogue from the Roguelike Restoration Project (r1490)
author John "Elwin" Edwards
date Tue, 31 Jan 2017 19:56:04 -0500
parents
children 13b482bd9e66
comparison
equal deleted inserted replaced
253:d9badb9c0179 256:c495a4f288c6
1 /*
2 dict.h
3
4 UltraRogue: The Ultimate Adventure in the Dungeons of Doom
5 Copyright (C) 1995 Herb Chong
6 All rights reserved.
7
8 See the file LICENSE.TXT for full copyright and licensing information.
9 */
10
11 /*-----------------
12 Change history:
13 (AK:04/03/95) - Added hook for extensions to dictionary structure.
14 (AK:04/04/95) - Added dictionary signature, table of contents and parameter
15 structure defintions and fields in DICTIONARY structure
16 -------------------*/
17
18 #ifndef dict_h_included
19 #define dict_h_included
20
21 static char dict_sccsid[] = "%W% %G%";
22
23 #ifndef TRUE
24 #define TRUE 1
25 #define FALSE 0
26 #endif
27
28 #define DICT_NONE 0x00000000 /* no flags set */
29 #define DICT_VALIDATE 0xdeadbeef /* look for this in every dictionary structure */
30 #define DICT_ENTRY_NONE -1 /* index of invalid entry */
31
32 typedef unsigned char BOOLEANC;
33
34 /*------------------
35 string table entry
36 ------------------*/
37 typedef struct string_entry {
38 long string_offset; /* offset in string array */
39 long count; /* number of occurrences of string */
40 long next; /* offset of next in hash chain */
41 void *any_ptr; /* free pointer */
42 unsigned long flags; /* user definable flag value for string */
43 unsigned long hash_value; /* hash value of string using hash function */
44 } STRING_ENTRY;
45
46 /*--------------------
47 Dictionary signature (AK:04/04/95)
48 --------------------*/
49 typedef struct dict_sig_ { /* Dictionary signature */
50 unsigned long check_value; /* 0xdeadbeef */
51 int toc_size; /* # of entries in Table of Contents */
52 long nparms; /* # of parameters */
53 unsigned long checksum; /* Checksum for TOC */
54 } DICT_SIG;
55
56 /*----------------------------------
57 Dictionary table of contents entry (AK:04/04/95)
58 ----------------------------------*/
59 typedef struct TOC_entry_ { /* Dictionary table of contents entry */
60 char id[5]; /* Field identifier: */
61 long offset; /* Offset (bytes) of entry in file */
62 long size; /* Size (bytes) of entry */
63 void *ptr; /* Where entry is stored in memory */
64 unsigned long checksum; /* Checksum of entry */
65 int type; /* 0=ordinary ; 1=EVECTOR ; 2=NULL */
66 } DICT_TOC_ENTRY;
67
68 /*--------------------------------
69 Dictionary parameter table entry (AK:04/04/95)
70 --------------------------------*/
71 typedef struct dict_parm_entry_ { /* Dictionary parameter table entry */
72 char id[13]; /* Parameter identifier */
73 unsigned long value; /* Parameter value */
74 } DICT_PARM_ENTRY;
75
76
77 /*---------------------------
78 Hash dictionary information
79 ---------------------------*/
80 typedef struct dictionary {
81 unsigned long check_value; /* check validation value */
82 unsigned long flags; /* flag values */
83 long entry_count; /* number of used entries in each table */
84
85 char *string_array; /* storage for strings */
86 long array_size; /* number of bytes allocated */
87 long array_used; /* number of bytes occupied */
88 int array_growth_count; /* number of times grown */
89
90 STRING_ENTRY *string_table; /* string table */
91 long string_max; /* max number of entries in string table */
92 long scan_string_index; /* current index into string table for scan */
93 int string_growth_count; /* number of times had to grow string table */
94
95 long *chains; /* vector of array indices to hash entries */
96 int longest_chain_length; /* longest chain length in hash table */
97 int allowable_chain_length; /* chain lengths always < this */
98 long table_size; /* number of elements in hash entries vector */
99 unsigned long hash_mask; /* mask for doing mod() function */
100 int hash_growth_count; /* number of times had to grow hash table */
101
102 void *ext; /* Hook for extensions to the dictionary (AK:04/03/95) */
103
104 DICT_SIG *sig; /* Signature (AK:04/04/95) */
105 DICT_TOC_ENTRY *toc; /* Table of contents (AK:04/04/95) */
106 DICT_PARM_ENTRY *parm; /* Parameters (AK:04/04/95) */
107
108 } DICTIONARY;
109
110 /*--------------------------------------------------------------
111 dict_create: create a dictionary and initialize its structures
112 --------------------------------------------------------------*/
113 extern DICTIONARY *dict_create(
114 const long toc_size,
115 const long initial_string_count,
116 const long initial_hash_entries,
117 const long max_chain_length );
118
119 /*-------------------------------------------------
120 dict_delete: deletes an entry from the dictionary
121 -------------------------------------------------*/
122 extern BOOLEANC dict_delete(
123 const DICTIONARY *dict,
124 const char *s,
125 const long count );
126
127 /*---------------------------------------------------
128 dict_destroy: discard a dictionary and its contents
129 ---------------------------------------------------*/
130 extern BOOLEANC dict_destroy(
131 DICTIONARY *dict );
132
133 /*------------------------------------------------
134 dict_export: write a dictionary to an ASCII file
135 ------------------------------------------------*/
136 extern BOOLEANC dict_export(
137 DICTIONARY *dict,
138 const char *fname );
139
140 /*-------------------------------------------------
141 dict_import: read a dictionary from an ASCII file
142 -------------------------------------------------*/
143 extern DICTIONARY *dict_import(
144 const char *dict_fname,
145 const long initial_string_count,
146 const long initial_hash_entries,
147 const long max_chain_length );
148
149 /*------------------------------------------------------------------
150 dict_insert: add entries into the dictionary, growing as necessary
151 ------------------------------------------------------------------*/
152 extern STRING_ENTRY *dict_insert(
153 DICTIONARY *dict,
154 char *s,
155 const long occurences,
156 const unsigned long flags,
157 void *any_ptr,
158 long *number );
159
160 /*----------------------------------------------------
161 dict_load: read a dictionary from a file into memory
162 ----------------------------------------------------*/
163 extern DICTIONARY *dict_load(
164 const char *fname );
165
166 /*-----------------------------------------------------------------
167 dict_merge: merges the contents of a dictionary into another one,
168 updating the contents of the destination
169 -----------------------------------------------------------------*/
170 extern BOOLEANC dict_merge(
171 const DICTIONARY *dst,
172 const DICTIONARY *src,
173 const BOOLEANC move );
174
175 /*----------------------------------------------------
176 dict_save: save a dictionary from memory into a file
177 ----------------------------------------------------*/
178 extern BOOLEANC dict_save(
179 DICTIONARY *dict,
180 const char *fname );
181
182 /*-----------------------------------------------
183 dict_scan_begin: begin a scan of the dictionary
184 -----------------------------------------------*/
185 extern BOOLEANC dict_scan_begin(
186 DICTIONARY *dict );
187
188 /*--------------------------------------------
189 dict_scan_next: get the next entry in a scan
190 --------------------------------------------*/
191 extern STRING_ENTRY *dict_scan_next(
192 DICTIONARY *dict );
193
194 /*-----------------------------------------------
195 dict_search: look for entries in the dictionary
196 -----------------------------------------------*/
197 extern STRING_ENTRY *dict_search(
198 const DICTIONARY *dict,
199 const char *s,
200 long *number );
201
202 /*----------------------------------------------------------------------
203 dict_string_by_number: return string pointer for a given string number
204 ----------------------------------------------------------------------*/
205 extern STRING_ENTRY *dict_string_by_number(
206 const DICTIONARY *dict,
207 const long number );
208
209 /*----------------------------------------------------------
210 dict_union: merges contents of 2 dictionaries into a third
211 ----------------------------------------------------------*/
212 extern DICTIONARY *dict_union(
213 const DICTIONARY *dict1,
214 const DICTIONARY *dict2 );
215
216 #endif /* dict_h_included */