blob: 313e3db5c6a22c2d6027b031dc1df6c6f15587d3 [file] [log] [blame]
// Copyright 2019 The IREE Authors
//
// Licensed under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#ifndef IREE_BASE_STRING_VIEW_H_
#define IREE_BASE_STRING_VIEW_H_
#include <limits.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include "iree/base/attributes.h"
#include "iree/base/config.h"
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
typedef struct iree_status_handle_t* iree_status_t;
#define IREE_STRING_VIEW_NPOS IREE_HOST_SIZE_MAX
// A string view (ala std::string_view) into a non-NUL-terminated string.
typedef struct iree_string_view_t {
const char* data;
iree_host_size_t size;
} iree_string_view_t;
// Returns an empty string view ("").
static inline iree_string_view_t iree_string_view_empty(void) {
iree_string_view_t v = {0, 0};
return v;
}
// Returns true if the given string view is the empty string.
#define iree_string_view_is_empty(sv) (((sv).data == NULL) || ((sv).size == 0))
static inline iree_string_view_t iree_make_string_view(
const char* str, iree_host_size_t str_length) {
iree_string_view_t v = {str, str_length};
return v;
}
// Returns a string view initialized with a reference to the given
// NUL-terminated string literal.
static inline iree_string_view_t iree_make_cstring_view(const char* str) {
iree_string_view_t v = {str, str ? strlen(str) : 0};
return v;
}
// A pair of strings.
typedef struct iree_string_pair_t {
union {
iree_string_view_t first;
iree_string_view_t key;
};
union {
iree_string_view_t second;
iree_string_view_t value;
};
} iree_string_pair_t;
// Returns an empty string pair ("", "").
static inline iree_string_pair_t iree_string_pair_empty(void) {
iree_string_pair_t v = {{iree_string_view_empty()},
{iree_string_view_empty()}};
return v;
}
// Returns a string pair with the given values.
static inline iree_string_pair_t iree_make_string_pair(
iree_string_view_t first, iree_string_view_t second) {
iree_string_pair_t v = {{first}, {second}};
return v;
}
// Returns a string pair initialized with references to the given NUL-terminated
// string literals.
static inline iree_string_pair_t iree_make_cstring_pair(const char* first,
const char* second) {
iree_string_pair_t v = {
{iree_make_cstring_view(first)},
{iree_make_cstring_view(second)},
};
return v;
}
#define iree_string_view_literal(str) \
{ .data = (str), .size = IREE_ARRAYSIZE(str) - 1 }
// Returns a string view initialized with the given cstring.
#define IREE_SV(cstr) iree_make_cstring_view(cstr)
// Returns a string view initialized with the given string literal.
#define IREE_SVL(cstr) iree_string_view_literal(cstr)
// Returns true if the two strings are equal (compare == 0).
IREE_API_EXPORT bool iree_string_view_equal(iree_string_view_t lhs,
iree_string_view_t rhs);
// Returns true if the two strings are equal (compare == 0) ignoring case.
// Equivalent to strcasecmp.
IREE_API_EXPORT bool iree_string_view_equal_case(iree_string_view_t lhs,
iree_string_view_t rhs);
// Like std::string::compare but with iree_string_view_t values.
IREE_API_EXPORT int iree_string_view_compare(iree_string_view_t lhs,
iree_string_view_t rhs);
// Finds the first occurrence of |c| in |value| starting at |pos|.
// Returns the found character position or IREE_STRING_VIEW_NPOS if not found.
IREE_API_EXPORT iree_host_size_t iree_string_view_find_char(
iree_string_view_t value, char c, iree_host_size_t pos);
// Returns the index of the first occurrence of one of the characters in |s| or
// IREE_STRING_VIEW_NPOS if none of the characters were found.
IREE_API_EXPORT iree_host_size_t iree_string_view_find_first_of(
iree_string_view_t value, iree_string_view_t s, iree_host_size_t pos);
// Returns the index of the last occurrence of one of the characters in |s| or
// IREE_STRING_VIEW_NPOS if none of the characters were found.
IREE_API_EXPORT iree_host_size_t iree_string_view_find_last_of(
iree_string_view_t value, iree_string_view_t s, iree_host_size_t pos);
// Returns true if the string starts with the given prefix.
IREE_API_EXPORT bool iree_string_view_starts_with(iree_string_view_t value,
iree_string_view_t prefix);
// Returns true if the string starts with the given suffix.
IREE_API_EXPORT bool iree_string_view_ends_with(iree_string_view_t value,
iree_string_view_t suffix);
// Removes the first |n| characters from the string view (not the data).
IREE_API_EXPORT iree_string_view_t
iree_string_view_remove_prefix(iree_string_view_t value, iree_host_size_t n);
// Removes the last |n| characters from the string view (not the data).
IREE_API_EXPORT iree_string_view_t
iree_string_view_remove_suffix(iree_string_view_t value, iree_host_size_t n);
// Removes the given substring prefix from the string view if present.
IREE_API_EXPORT iree_string_view_t iree_string_view_strip_prefix(
iree_string_view_t value, iree_string_view_t prefix);
// Removes the given substring suffix from the string view if present.
IREE_API_EXPORT iree_string_view_t iree_string_view_strip_suffix(
iree_string_view_t value, iree_string_view_t suffix);
// Removes the given substring prefix from the string view if present in-place.
// Returns true if the strip succeeded.
IREE_API_EXPORT bool iree_string_view_consume_prefix(iree_string_view_t* value,
iree_string_view_t prefix);
// Removes the given substring suffix from the string view if present in-place.
// Returns true if the strip succeeded.
IREE_API_EXPORT bool iree_string_view_consume_suffix(iree_string_view_t* value,
iree_string_view_t suffix);
// Removes leading and trailing whitespace.
IREE_API_EXPORT iree_string_view_t
iree_string_view_trim(iree_string_view_t value);
// Returns a substring of the string view at offset |pos| and length |n|.
// Use |n| == IREE_HOST_SIZE_MAX to take the remainder of the string after
// |pos|. Returns empty string on failure.
IREE_API_EXPORT iree_string_view_t iree_string_view_substr(
iree_string_view_t value, iree_host_size_t pos, iree_host_size_t n);
// Splits |value| into two parts based on the first occurrence of |split_char|.
// Returns the index of the |split_char| in the original |value| or -1 if not
// found.
IREE_API_EXPORT intptr_t iree_string_view_split(iree_string_view_t value,
char split_char,
iree_string_view_t* out_lhs,
iree_string_view_t* out_rhs);
// Replaces all occurrences of |old_char| with |new_char|.
IREE_API_EXPORT void iree_string_view_replace_char(iree_string_view_t value,
char old_char,
char new_char);
// Returns true if the given |value| matches |pattern| (normal * and ? rules).
// This accepts wildcards in the form of '*' and '?' for any delimited value.
// '*' will match zero or more of any character and '?' will match exactly one
// of any character.
//
// For example,
// 'foo-*-bar' matches: 'foo-123-bar', 'foo-456-789-bar'
// 'foo-10?' matches: 'foo-101', 'foo-102'
IREE_API_EXPORT bool iree_string_view_match_pattern(iree_string_view_t value,
iree_string_view_t pattern);
// Copies the string view |value| to |buffer| with |buffer_length| available
// bytes and adds a NUL terminator. Truncates if capacity would be exceeded.
IREE_API_EXPORT void iree_string_view_to_cstring(
iree_string_view_t value, char* buffer, iree_host_size_t buffer_length);
// Copies the string bytes into the target buffer and returns the number of
// characters copied. Does not include a NUL terminator.
IREE_API_EXPORT iree_host_size_t iree_string_view_append_to_buffer(
iree_string_view_t source_value, iree_string_view_t* target_value,
char* buffer);
IREE_API_EXPORT bool iree_string_view_atoi_int32(iree_string_view_t value,
int32_t* out_value);
IREE_API_EXPORT bool iree_string_view_atoi_uint32(iree_string_view_t value,
uint32_t* out_value);
IREE_API_EXPORT bool iree_string_view_atoi_int64(iree_string_view_t value,
int64_t* out_value);
IREE_API_EXPORT bool iree_string_view_atoi_uint64_base(iree_string_view_t value,
int base,
uint64_t* out_value);
IREE_API_EXPORT bool iree_string_view_atoi_uint64(iree_string_view_t value,
uint64_t* out_value);
IREE_API_EXPORT bool iree_string_view_atof(iree_string_view_t value,
float* out_value);
IREE_API_EXPORT bool iree_string_view_atod(iree_string_view_t value,
double* out_value);
// Parses a |buffer_length|-byte hex byte string into |out_buffer|.
// Ignores interior `-` characters and spaces as common in UUIDs.
// Returns true if the entire buffer was successfully parsed.
// Returns false if there are invalid, insufficient, or extra characters.
//
// Examples:
// 754d9ae28df5f8e33502182434a12876
// 754d9ae2-8df5-f8e3-3502-182434a12876
IREE_API_EXPORT bool iree_string_view_parse_hex_bytes(
iree_string_view_t value, iree_host_size_t buffer_length,
uint8_t* out_buffer);
// Parses a byte size in |value| and returns the value in |out_size|.
//
// Examples:
// 1073741824 => 1073741824
// 1gb => 1000000000
// 1gib => 1073741824
IREE_API_EXPORT iree_status_t iree_string_view_parse_device_size(
iree_string_view_t value, iree_device_size_t* out_size);
#ifdef __cplusplus
} // extern "C"
#endif // __cplusplus
#endif // IREE_BASE_STRING_VIEW_H_