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 #include "hf/string.h"
10 
11 #include "hf/std.h"
12 
string_init_empty(struct string * str)13 void string_init_empty(struct string *str)
14 {
15 	static_assert(sizeof(str->data) >= 1, "String buffer too small");
16 	str->data[0] = '\0';
17 }
18 
19 /**
20  * Caller must guarantee that `data` points to a NULL-terminated string.
21  * The constructor checks that it fits into the internal buffer and copies
22  * the string there.
23  */
string_init(struct string * str,const struct memiter * data)24 enum string_return_code string_init(struct string *str,
25 				    const struct memiter *data)
26 {
27 	const char *base = memiter_base(data);
28 	size_t size = memiter_size(data);
29 
30 	/*
31 	 * Require that the value contains exactly one NULL character and that
32 	 * it is the last byte.
33 	 */
34 	if (size < 1 || memchr(base, '\0', size) != &base[size - 1]) {
35 		return STRING_ERROR_INVALID_INPUT;
36 	}
37 
38 	if (size > sizeof(str->data)) {
39 		return STRING_ERROR_TOO_LONG;
40 	}
41 
42 	memcpy_s(str->data, sizeof(str->data), base, size);
43 	return STRING_SUCCESS;
44 }
45 
string_is_empty(const struct string * str)46 bool string_is_empty(const struct string *str)
47 {
48 	return str->data[0] == '\0';
49 }
50 
string_data(const struct string * str)51 const char *string_data(const struct string *str)
52 {
53 	return str->data;
54 }
55 
56 /**
57  * Returns true if the iterator `data` contains string `str`.
58  * Only characters until the first null terminator are compared.
59  */
string_eq(const struct string * str,const struct memiter * data)60 bool string_eq(const struct string *str, const struct memiter *data)
61 {
62 	const char *base = memiter_base(data);
63 	size_t len = memiter_size(data);
64 
65 	return (len <= sizeof(str->data)) &&
66 	       (strncmp(str->data, base, len) == 0);
67 }
68