131 lines
2.9 KiB
C
131 lines
2.9 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* string.c
|
|
* string handling helpers
|
|
*
|
|
*
|
|
* Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
*
|
|
* IDENTIFICATION
|
|
* src/common/string.c
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
|
|
|
|
#ifndef FRONTEND
|
|
#include "postgres.h"
|
|
#else
|
|
#include "postgres_fe.h"
|
|
#endif
|
|
|
|
#include "common/string.h"
|
|
|
|
|
|
/*
|
|
* Returns whether the string `str' has the postfix `end'.
|
|
*/
|
|
bool
|
|
pg_str_endswith(const char *str, const char *end)
|
|
{
|
|
size_t slen = strlen(str);
|
|
size_t elen = strlen(end);
|
|
|
|
/* can't be a postfix if longer */
|
|
if (elen > slen)
|
|
return false;
|
|
|
|
/* compare the end of the strings */
|
|
str += slen - elen;
|
|
return strcmp(str, end) == 0;
|
|
}
|
|
|
|
|
|
/*
|
|
* strtoint --- just like strtol, but returns int not long
|
|
*/
|
|
int
|
|
strtoint(const char *pg_restrict str, char **pg_restrict endptr, int base)
|
|
{
|
|
long val;
|
|
|
|
val = strtol(str, endptr, base);
|
|
if (val != (int) val)
|
|
errno = ERANGE;
|
|
return (int) val;
|
|
}
|
|
|
|
|
|
/*
|
|
* pg_clean_ascii -- Replace any non-ASCII chars with a '?' char
|
|
*
|
|
* Modifies the string passed in which must be '\0'-terminated.
|
|
*
|
|
* This function exists specifically to deal with filtering out
|
|
* non-ASCII characters in a few places where the client can provide an almost
|
|
* arbitrary string (and it isn't checked to ensure it's a valid username or
|
|
* database name or similar) and we don't want to have control characters or other
|
|
* things ending up in the log file where server admins might end up with a
|
|
* messed up terminal when looking at them.
|
|
*
|
|
* In general, this function should NOT be used- instead, consider how to handle
|
|
* the string without needing to filter out the non-ASCII characters.
|
|
*
|
|
* Ultimately, we'd like to improve the situation to not require stripping out
|
|
* all non-ASCII but perform more intelligent filtering which would allow UTF or
|
|
* similar, but it's unclear exactly what we should allow, so stick to ASCII only
|
|
* for now.
|
|
*/
|
|
void
|
|
pg_clean_ascii(char *str)
|
|
{
|
|
/* Only allow clean ASCII chars in the string */
|
|
char *p;
|
|
|
|
for (p = str; *p != '\0'; p++)
|
|
{
|
|
if (*p < 32 || *p > 126)
|
|
*p = '?';
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
* pg_is_ascii -- Check if string is made only of ASCII characters
|
|
*/
|
|
bool
|
|
pg_is_ascii(const char *str)
|
|
{
|
|
while (*str)
|
|
{
|
|
if (IS_HIGHBIT_SET(*str))
|
|
return false;
|
|
str++;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
|
|
/*
|
|
* pg_strip_crlf -- Remove any trailing newline and carriage return
|
|
*
|
|
* Removes any trailing newline and carriage return characters (\r on
|
|
* Windows) in the input string, zero-terminating it.
|
|
*
|
|
* The passed in string must be zero-terminated. This function returns
|
|
* the new length of the string.
|
|
*/
|
|
int
|
|
pg_strip_crlf(char *str)
|
|
{
|
|
int len = strlen(str);
|
|
|
|
while (len > 0 && (str[len - 1] == '\n' ||
|
|
str[len - 1] == '\r'))
|
|
str[--len] = '\0';
|
|
|
|
return len;
|
|
}
|