1 /* 2 * Copyright 2019 The Hafnium Authors. 3 * 4 * Use of this source code is governed by a BSD-style 5 * license that can be found in the LICENSE file or at 6 * https://opensource.org/licenses/BSD-3-Clause. 7 */ 8 9 #pragma once 10 11 #include <stdbool.h> 12 #include <stddef.h> 13 14 #include "hf/memiter.h" 15 16 /** 17 * Maximum length of a string including the NULL terminator. 18 * This is an arbitrary number and can be adjusted to fit use cases. 19 */ 20 #define STRING_MAX_SIZE 32 21 22 enum string_return_code { 23 STRING_SUCCESS, 24 STRING_ERROR_INVALID_INPUT, 25 STRING_ERROR_TOO_LONG, 26 }; 27 28 /** 29 * Statically-allocated string data structure with input validation to ensure 30 * strings are properly NULL-terminated. 31 * 32 * This is intentionally kept as simple as possible and should not be extended 33 * to perform complex string operations without a good use case. 34 */ 35 struct string { 36 char data[STRING_MAX_SIZE]; 37 }; 38 39 /** 40 * Macro to initialize `struct string` from a string constant. 41 * Triggers a compilation error if the string does not fit into the buffer. 42 */ 43 #define STRING_INIT(str) ((struct string){.data = str}) 44 45 enum string_return_code string_init(struct string *str, 46 const struct memiter *data); 47 void string_init_empty(struct string *str); 48 bool string_is_empty(const struct string *str); 49 const char *string_data(const struct string *str); 50 bool string_eq(const struct string *str, const struct memiter *data); 51