// Borrowed from https://github.com/b-k/21st-Century-Examples
#include <stdio.h>
#include <stdlib.h>
#include "dict.h"

void *dictionary_not_found;

dictionary *dictionary_new (void){
	static int dnf;
	if (!dictionary_not_found) dictionary_not_found = &dnf;
	dictionary *out= malloc(sizeof(dictionary));
	*out= (dictionary){ .pairs=NULL };                          
	return out;
} 

static void dictionary_add_keyval(dictionary *in, keyval *kv){
	in->length++;
	in->pairs = realloc(in->pairs, sizeof(keyval*)*in->length);
	in->pairs[in->length-1] = kv;
}

void dictionary_add(dictionary *in, char *key, void *value){
	if (!key){fprintf(stderr, "NULL is not a valid key.\n"); abort();}
	dictionary_add_keyval(in, keyval_new(key, value));
}

void *dictionary_find(dictionary const *in, char const *key){
	for (int i=0; i< in->length; i++)
		if (keyval_matches(in->pairs[i], key))    
			return in->pairs[i]->value;
	return NULL;
}

dictionary *dictionary_copy(dictionary *in){
	dictionary *out = dictionary_new();
	for (int i=0; i< in->length; i++)
		dictionary_add_keyval(out, keyval_copy(in->pairs[i]));
	return out;
}

void dictionary_free(dictionary *in){
	for (int i=0; i< in->length; i++)
		keyval_free(in->pairs[i]);
	free(in->pairs);
	free(in);
}
