diff options
Diffstat (limited to 'src/bin/psql/stringutils.c')
-rw-r--r-- | src/bin/psql/stringutils.c | 198 |
1 files changed, 0 insertions, 198 deletions
diff --git a/src/bin/psql/stringutils.c b/src/bin/psql/stringutils.c deleted file mode 100644 index a3b44e8bf17..00000000000 --- a/src/bin/psql/stringutils.c +++ /dev/null @@ -1,198 +0,0 @@ -/* - * psql - the PostgreSQL interactive terminal - * - * Copyright 2000 by PostgreSQL Global Development Group - * - * $Header: /cvsroot/pgsql/src/bin/psql/stringutils.c,v 1.28 2001/02/27 08:13:27 ishii Exp $ - */ -#include "postgres_fe.h" -#include "stringutils.h" -#include "settings.h" - -#include <ctype.h> -#include <assert.h> - -#include "libpq-fe.h" - - - -static void unescape_quotes(char *source, int quote, int escape); - - -/* - * Replacement for strtok() (a.k.a. poor man's flex) - * - * The calling convention is similar to that of strtok. - * s - string to parse, if NULL continue parsing the last string - * delim - set of characters that delimit tokens (usually whitespace) - * quote - set of characters that quote stuff, they're not part of the token - * escape - character than can quote quotes - * was_quoted - if not NULL, stores the quoting character if any was encountered - * token_pos - if not NULL, receives a count to the start of the token in the - * parsed string - * - * Note that the string s is _not_ overwritten in this implementation. - */ -char * -strtokx(const char *s, - const char *delim, - const char *quote, - int escape, - char *was_quoted, - unsigned int *token_pos, - int encoding) -{ - static char *storage = NULL;/* store the local copy of the users - * string here */ - static char *string = NULL; /* pointer into storage where to continue - * on next call */ - - /* variously abused variables: */ - unsigned int offset; - char *start; - char *cp = NULL; - -#ifndef MULTIBYTE - (void) encoding; /* not used */ -#endif - - if (s) - { - free(storage); - storage = strdup(s); - string = storage; - } - - if (!storage) - return NULL; - - /* skip leading "whitespace" */ - offset = strspn(string, delim); - - /* end of string reached */ - if (string[offset] == '\0') - { - /* technically we don't need to free here, but we're nice */ - free(storage); - storage = NULL; - string = NULL; - return NULL; - } - - /* test if quoting character */ - if (quote) - cp = strchr(quote, string[offset]); - - if (cp) - { - /* okay, we have a quoting character, now scan for the closer */ - char *p; - - start = &string[offset + 1]; - - if (token_pos) - *token_pos = start - storage; - - for (p = start; - *p && (*p != *cp || *(p - 1) == escape); -#ifdef MULTIBYTE - p += PQmblen(p, encoding) -#else - p++ -#endif - ); - - /* not yet end of string? */ - if (*p != '\0') - { - *p = '\0'; - string = p + 1; - if (was_quoted) - *was_quoted = *cp; - unescape_quotes(start, *cp, escape); - return start; - } - else - { - if (was_quoted) - *was_quoted = *cp; - string = p; - - unescape_quotes(start, *cp, escape); - return start; - } - } - - /* otherwise no quoting character. scan till next delimiter */ - start = &string[offset]; - - if (token_pos) - *token_pos = start - storage; - - offset = strcspn(start, delim); - if (was_quoted) - *was_quoted = 0; - - if (start[offset] != '\0') - { - start[offset] = '\0'; - string = &start[offset] + 1; - - return start; - } - else - { - string = &start[offset]; - return start; - } -} - - - - -/* - * unescape_quotes - * - * Resolves escaped quotes. Used by strtokx above. - */ -static void -unescape_quotes(char *source, int quote, int escape) -{ - char *p; - char *destination, - *tmp; - -#ifdef USE_ASSERT_CHECKING - assert(source); -#endif - - destination = calloc(1, strlen(source) + 1); - if (!destination) - { - perror("calloc"); - exit(EXIT_FAILURE); - } - - tmp = destination; - - for (p = source; *p; p++) - { - char c; - - if (*p == escape && *(p + 1) && quote == *(p + 1)) - { - c = *(p + 1); - p++; - } - else - c = *p; - - *tmp = c; - tmp++; - } - - /* Terminating null character */ - *tmp = '\0'; - - strcpy(source, destination); -} |