Mercurial > hg > early-roguelike
view urogue/dict.h @ 280:70aa5808c782
Fix potential segfaults at restore related to ctime().
In some games, restore() passes the result of ctime() to mvprintw() or
some other variadic message-formatting function. If ctime() has not
been declared properly, its return type is inferred to be int instead
of char *. This does not cause a warning because the compiler does not
know the correct type of variadic arguments.
On platforms where ints and pointers are not the same size, this can,
probably depending on alignment, result in a segfault that is not easy
to trace.
Including time.h fixes the problem. Some games manually declared
ctime() and avoided the bug. These declarations have also been
replaced with the include.
author | John "Elwin" Edwards |
---|---|
date | Fri, 15 Sep 2017 20:51:10 -0400 |
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 */