| /*------------------------------------------------------------------------- |
| * |
| * 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; |
| } |