aboutsummaryrefslogtreecommitdiff
path: root/src/bin/psql/variables.c
diff options
context:
space:
mode:
authorBruce Momjian <bruce@momjian.us>1999-11-04 21:56:02 +0000
committerBruce Momjian <bruce@momjian.us>1999-11-04 21:56:02 +0000
commita45195a191eec367a4f305bb71ab541d17a3b9f9 (patch)
tree99b815a93f6175b0db76c2da0da39e95a0ee6b8d /src/bin/psql/variables.c
parent2ea3b6d63addeaf07267e2390597645cbf013c36 (diff)
downloadpostgresql-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.c132
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);
+}