xref: /openbmc/linux/lib/kunit/string-stream.h (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
1109fb06fSAlan Maguire /* SPDX-License-Identifier: GPL-2.0 */
2109fb06fSAlan Maguire /*
3109fb06fSAlan Maguire  * C++ stream style string builder used in KUnit for building messages.
4109fb06fSAlan Maguire  *
5109fb06fSAlan Maguire  * Copyright (C) 2019, Google LLC.
6109fb06fSAlan Maguire  * Author: Brendan Higgins <brendanhiggins@google.com>
7109fb06fSAlan Maguire  */
8109fb06fSAlan Maguire 
9109fb06fSAlan Maguire #ifndef _KUNIT_STRING_STREAM_H
10109fb06fSAlan Maguire #define _KUNIT_STRING_STREAM_H
11109fb06fSAlan Maguire 
12109fb06fSAlan Maguire #include <linux/spinlock.h>
13109fb06fSAlan Maguire #include <linux/types.h>
14c0891ac1SAlexey Dobriyan #include <linux/stdarg.h>
15109fb06fSAlan Maguire 
16109fb06fSAlan Maguire struct string_stream_fragment {
17109fb06fSAlan Maguire 	struct list_head node;
18109fb06fSAlan Maguire 	char *fragment;
19109fb06fSAlan Maguire };
20109fb06fSAlan Maguire 
21109fb06fSAlan Maguire struct string_stream {
22109fb06fSAlan Maguire 	size_t length;
23109fb06fSAlan Maguire 	struct list_head fragments;
24109fb06fSAlan Maguire 	/* length and fragments are protected by this lock */
25109fb06fSAlan Maguire 	spinlock_t lock;
26109fb06fSAlan Maguire 	struct kunit *test;
27109fb06fSAlan Maguire 	gfp_t gfp;
28109fb06fSAlan Maguire };
29109fb06fSAlan Maguire 
30109fb06fSAlan Maguire struct kunit;
31109fb06fSAlan Maguire 
32109fb06fSAlan Maguire struct string_stream *alloc_string_stream(struct kunit *test, gfp_t gfp);
33109fb06fSAlan Maguire 
34109fb06fSAlan Maguire int __printf(2, 3) string_stream_add(struct string_stream *stream,
35109fb06fSAlan Maguire 				     const char *fmt, ...);
36109fb06fSAlan Maguire 
3744acdbb2SDavid Gow int __printf(2, 0) string_stream_vadd(struct string_stream *stream,
38109fb06fSAlan Maguire 				      const char *fmt,
39109fb06fSAlan Maguire 				      va_list args);
40109fb06fSAlan Maguire 
41109fb06fSAlan Maguire char *string_stream_get_string(struct string_stream *stream);
42109fb06fSAlan Maguire 
43109fb06fSAlan Maguire int string_stream_append(struct string_stream *stream,
44109fb06fSAlan Maguire 			 struct string_stream *other);
45109fb06fSAlan Maguire 
46109fb06fSAlan Maguire bool string_stream_is_empty(struct string_stream *stream);
47109fb06fSAlan Maguire 
48*78b1c658SDavid Gow void string_stream_destroy(struct string_stream *stream);
49109fb06fSAlan Maguire 
50109fb06fSAlan Maguire #endif /* _KUNIT_STRING_STREAM_H */
51