#ifndef EL__BFU_INPHIST_H
#define EL__BFU_INPHIST_H

#include "util/lists.h"

struct dialog_data;


struct input_history_entry {
	LIST_HEAD(struct input_history_entry);
	unsigned char data[1]; /* Must be last. */
};

struct input_history {
	struct list_head entries;
	int size;
	unsigned int dirty:1;
	unsigned int nosave:1;
};

#define INIT_INPUT_HISTORY(history)				\
	struct input_history history = {			\
	/* items: */	{ D_LIST_HEAD(history.entries) },	\
	/* size: */	0,					\
	/* dirty: */	0,					\
	/* nosave: */	0,					\
	}

#define add_to_history_list(history, entry)			\
	do {							\
		add_to_list((history)->entries, entry);		\
		(history)->size++;				\
		if (!(history)->nosave)	(history)->dirty = 1;	\
	} while (0)

#define del_from_history_list(history, entry)			\
	do {							\
		del_from_list((entry));				\
		(history)->size--;				\
		if (!(history)->nosave)	(history)->dirty = 1;	\
	} while (0)

void add_to_input_history(struct input_history *, unsigned char *, int);

void do_tab_compl(struct dialog_data *, struct list_head *);
void do_tab_compl_file(struct dialog_data *, struct list_head *);
void do_tab_compl_unambiguous(struct dialog_data *, struct list_head *);

/* Load history file from elinks home. */
int load_input_history(struct input_history *history, unsigned char *filename);

/* Write history list to @filebane in elinks home. It returns a value different
 * from 0 in case of failure, 0 on success. */
int save_input_history(struct input_history *history, unsigned char *filename);

void dlg_set_history(struct widget_data *);

#endif
