1#ifndef AWS_COMMON_STRING_INL 2#define AWS_COMMON_STRING_INL 3/** 4 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 5 * SPDX-License-Identifier: Apache-2.0. 6 */ 7#include <aws/common/string.h> 8#include <ctype.h> 9 10AWS_EXTERN_C_BEGIN 11/** 12 * Equivalent to str->bytes. 13 */ 14AWS_STATIC_IMPL 15const uint8_t *aws_string_bytes(const struct aws_string *str) { 16 AWS_PRECONDITION(aws_string_is_valid(str)); 17 return str->bytes; 18} 19 20/** 21 * Equivalent to `(const char *)str->bytes`. 22 */ 23AWS_STATIC_IMPL 24const char *aws_string_c_str(const struct aws_string *str) { 25 AWS_PRECONDITION(aws_string_is_valid(str)); 26 return (const char *)str->bytes; 27} 28 29/** 30 * Evaluates the set of properties that define the shape of all valid aws_string structures. 31 * It is also a cheap check, in the sense it run in constant time (i.e., no loops or recursion). 32 */ 33AWS_STATIC_IMPL 34bool aws_string_is_valid(const struct aws_string *str) { 35 return str && AWS_MEM_IS_READABLE(&str->bytes[0], str->len + 1) && str->bytes[str->len] == 0; 36} 37 38/** 39 * Best-effort checks aws_string invariants, when the str->len is unknown 40 */ 41AWS_STATIC_IMPL 42bool aws_c_string_is_valid(const char *str) { 43 /* Knowing the actual length to check would require strlen(), which is 44 * a) linear time in the length of the string 45 * b) could already cause a memory violation for a non-zero-terminated string. 46 * But we know that a c-string must have at least one character, to store the null terminator 47 */ 48 return str && AWS_MEM_IS_READABLE(str, 1); 49} 50 51/** 52 * Evaluates if a char is a white character. 53 */ 54AWS_STATIC_IMPL 55bool aws_char_is_space(uint8_t c) { 56 return aws_isspace(c); 57} 58 59AWS_EXTERN_C_END 60#endif /* AWS_COMMON_STRING_INL */ 61