2022-05-19 01:51:26 -07:00
|
|
|
#ifndef DICTIONARY_H
|
|
|
|
#define DICTIONARY_H
|
|
|
|
|
|
|
|
#include "memory_defs.h"
|
|
|
|
|
2022-07-29 06:04:05 -07:00
|
|
|
#include <stdio.h>
|
|
|
|
|
|
|
|
typedef int(DictionaryReadProc)(FILE* stream, void* buffer, unsigned int size, int a4);
|
|
|
|
typedef int(DictionaryWriteProc)(FILE* stream, void* buffer, unsigned int size, int a4);
|
|
|
|
|
|
|
|
// NOTE: Last unnamed fields are likely seek, tell, and filelength.
|
|
|
|
typedef struct DictionaryIO {
|
|
|
|
DictionaryReadProc* readProc;
|
|
|
|
DictionaryWriteProc* writeProc;
|
|
|
|
int field_8;
|
|
|
|
int field_C;
|
|
|
|
int field_10;
|
|
|
|
} DictionaryIO;
|
|
|
|
|
2022-05-19 01:51:26 -07:00
|
|
|
// A tuple containing individual key-value pair of a dictionary.
|
|
|
|
typedef struct DictionaryEntry {
|
|
|
|
char* key;
|
|
|
|
void* value;
|
|
|
|
} DictionaryEntry;
|
|
|
|
|
|
|
|
// A collection of key/value pairs.
|
|
|
|
//
|
|
|
|
// The keys in dictionary are always strings. Internally dictionary entries
|
|
|
|
// are kept sorted by the key. Both keys and values are copied when new entry
|
|
|
|
// is added to dictionary. For this reason the size of the value's type is
|
|
|
|
// provided during dictionary initialization.
|
|
|
|
typedef struct Dictionary {
|
|
|
|
int marker;
|
|
|
|
|
|
|
|
// The number of key/value pairs in the dictionary.
|
|
|
|
int entriesLength;
|
|
|
|
|
|
|
|
// The capacity of key/value pairs in [entries] array.
|
|
|
|
int entriesCapacity;
|
|
|
|
|
|
|
|
// The size of the dictionary values in bytes.
|
|
|
|
size_t valueSize;
|
|
|
|
|
2022-07-29 06:04:05 -07:00
|
|
|
// IO callbacks.
|
|
|
|
DictionaryIO io;
|
2022-05-19 01:51:26 -07:00
|
|
|
|
|
|
|
// The array of key-value pairs.
|
|
|
|
DictionaryEntry* entries;
|
|
|
|
} Dictionary;
|
|
|
|
|
2022-07-29 06:04:05 -07:00
|
|
|
int dictionaryInit(Dictionary* dictionary, int initialCapacity, size_t valueSize, DictionaryIO* io);
|
2022-05-19 01:51:26 -07:00
|
|
|
int dictionarySetCapacity(Dictionary* dictionary, int newCapacity);
|
|
|
|
int dictionaryFree(Dictionary* dictionary);
|
|
|
|
int dictionaryGetIndexByKey(Dictionary* dictionary, const char* key);
|
|
|
|
int dictionaryAddValue(Dictionary* dictionary, const char* key, const void* value);
|
|
|
|
int dictionaryRemoveValue(Dictionary* dictionary, const char* key);
|
2022-07-29 06:04:05 -07:00
|
|
|
int dictionaryCopy(Dictionary* dest, Dictionary* src);
|
|
|
|
int dictionaryReadInt(FILE* stream, int* valuePtr);
|
|
|
|
int dictionaryReadHeader(FILE* stream, Dictionary* dictionary);
|
|
|
|
int dictionaryLoad(FILE* stream, Dictionary* dictionary, int a3);
|
|
|
|
int dictionaryWriteInt(FILE* stream, int value);
|
|
|
|
int dictionaryWriteHeader(FILE* stream, Dictionary* dictionary);
|
|
|
|
int dictionaryWrite(FILE* stream, Dictionary* dictionary, int a3);
|
2022-05-19 01:51:26 -07:00
|
|
|
void dictionarySetMemoryProcs(MallocProc* mallocProc, ReallocProc* reallocProc, FreeProc* freeProc);
|
|
|
|
|
|
|
|
#endif /* DICTIONARY_H */
|