/*
 * psql - the PostgreSQL interactive terminal
 *
 * Copyright (c) 2000-2010, PostgreSQL Global Development Group
 *
 * src/bin/psql/variables.h
 */
#ifndef VARIABLES_H
#define VARIABLES_H

/*
 * This implements a sort of variable repository. One could also think of it
 * as a cheap version of an associative array. In each one of these
 * datastructures you can store name/value pairs.  There can also be an
 * "assign hook" function that is called whenever the variable's value is
 * changed.
 *
 * An "unset" operation causes the hook to be called with newval == NULL.
 *
 * Note: if value == NULL then the variable is logically unset, but we are
 * keeping the struct around so as not to forget about its hook function.
 */
typedef void (*VariableAssignHook) (const char *newval);

struct _variable
{
	char	   *name;
	char	   *value;
	VariableAssignHook assign_hook;
	struct _variable *next;
};

typedef struct _variable *VariableSpace;

/* Allowed chars in a variable's name */
#define VALID_VARIABLE_CHARS "abcdefghijklmnopqrstuvwxyz"\
							 "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "0123456789_"

VariableSpace CreateVariableSpace(void);
const char *GetVariable(VariableSpace space, const char *name);

bool		ParseVariableBool(const char *val);
int ParseVariableNum(const char *val,
				 int defaultval,
				 int faultval,
				 bool allowtrail);
int GetVariableNum(VariableSpace space,
			   const char *name,
			   int defaultval,
			   int faultval,
			   bool allowtrail);

void		PrintVariables(VariableSpace space);

bool		SetVariable(VariableSpace space, const char *name, const char *value);
bool		SetVariableAssignHook(VariableSpace space, const char *name, VariableAssignHook hook);
bool		SetVariableBool(VariableSpace space, const char *name);
bool		DeleteVariable(VariableSpace space, const char *name);

#endif   /* VARIABLES_H */
