diff options
author | Bruce Momjian <bruce@momjian.us> | 1999-11-04 21:56:02 +0000 |
---|---|---|
committer | Bruce Momjian <bruce@momjian.us> | 1999-11-04 21:56:02 +0000 |
commit | a45195a191eec367a4f305bb71ab541d17a3b9f9 (patch) | |
tree | 99b815a93f6175b0db76c2da0da39e95a0ee6b8d /src/bin/psql/variables.c | |
parent | 2ea3b6d63addeaf07267e2390597645cbf013c36 (diff) | |
download | postgresql-a45195a191eec367a4f305bb71ab541d17a3b9f9.tar.gz postgresql-a45195a191eec367a4f305bb71ab541d17a3b9f9.zip |
Major psql overhaul by Peter Eisentraut.
Diffstat (limited to 'src/bin/psql/variables.c')
-rw-r--r-- | src/bin/psql/variables.c | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/src/bin/psql/variables.c b/src/bin/psql/variables.c new file mode 100644 index 00000000000..ea824cff691 --- /dev/null +++ b/src/bin/psql/variables.c @@ -0,0 +1,132 @@ +#include <config.h> +#include <c.h> +#include "variables.h" + +#include <stdlib.h> +#include <assert.h> + + +VariableSpace CreateVariableSpace(void) +{ + struct _variable *ptr; + + ptr = calloc(1, sizeof *ptr); + if (!ptr) return NULL; + + ptr->name = strdup("@"); + ptr->value = strdup(""); + if (!ptr->name || !ptr->value) { + free(ptr->name); + free(ptr->value); + free(ptr); + return NULL; + } + + return ptr; +} + + + +const char * GetVariable(VariableSpace space, const char * name) +{ + struct _variable *current; + + if (!space) + return NULL; + + if (strspn(name, VALID_VARIABLE_CHARS) != strlen(name)) return NULL; + + for (current = space; current; current = current->next) { +#ifdef USE_ASSERT_CHECKING + assert(current->name); + assert(current->value); +#endif + if (strcmp(current->name, name)==0) + return current->value; + } + + return NULL; +} + + + +bool GetVariableBool(VariableSpace space, const char * name) +{ + return GetVariable(space, name)!=NULL ? true : false; +} + + + +bool SetVariable(VariableSpace space, const char * name, const char * value) +{ + struct _variable *current, *previous; + + if (!space) + return false; + + if (!value) + return DeleteVariable(space, name); + + if (strspn(name, VALID_VARIABLE_CHARS) != strlen(name)) return false; + + for (current = space; current; previous = current, current = current->next) { +#ifdef USE_ASSERT_CHECKING + assert(current->name); + assert(current->value); +#endif + if (strcmp(current->name, name)==0) { + free (current->value); + current->value = strdup(value); + return current->value ? true : false; + } + } + + previous->next = calloc(1, sizeof *(previous->next)); + if (!previous->next) + return false; + previous->next->name = strdup(name); + if (!previous->next->name) + return false; + previous->next->value = strdup(value); + return previous->next->value ? true : false; +} + + + +bool DeleteVariable(VariableSpace space, const char * name) +{ + struct _variable *current, *previous; + + if (!space) + return false; + + if (strspn(name, VALID_VARIABLE_CHARS) != strlen(name)) return false; + + for (current = space, previous = NULL; current; previous = current, current = current->next) { +#ifdef USE_ASSERT_CHECKING + assert(current->name); + assert(current->value); +#endif + if (strcmp(current->name, name)==0) { + free (current->name); + free (current->value); + if (previous) + previous->next = current->next; + free(current); + return true; + } + } + + return true; +} + + + +void DestroyVariableSpace(VariableSpace space) +{ + if (!space) + return; + + DestroyVariableSpace(space->next); + free(space); +} |