xref: /linux/lib/kunit/string-stream.h (revision 0ea5c948cb64bab5bc7a5516774eb8536f05aa0d)
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 	gfp_t gfp;
27a5abe7b2SRichard Fitzgerald 	bool append_newlines;
28109fb06fSAlan Maguire };
29109fb06fSAlan Maguire 
30109fb06fSAlan Maguire struct kunit;
31109fb06fSAlan Maguire 
3220631e15SRichard Fitzgerald struct string_stream *kunit_alloc_string_stream(struct kunit *test, gfp_t gfp);
3320631e15SRichard Fitzgerald void kunit_free_string_stream(struct kunit *test, struct string_stream *stream);
34109fb06fSAlan Maguire 
35*a3fdf784SRichard Fitzgerald struct string_stream *alloc_string_stream(gfp_t gfp);
36*a3fdf784SRichard Fitzgerald void free_string_stream(struct string_stream *stream);
37*a3fdf784SRichard Fitzgerald 
38109fb06fSAlan Maguire int __printf(2, 3) string_stream_add(struct string_stream *stream,
39109fb06fSAlan Maguire 				     const char *fmt, ...);
40109fb06fSAlan Maguire 
4144acdbb2SDavid Gow int __printf(2, 0) string_stream_vadd(struct string_stream *stream,
42109fb06fSAlan Maguire 				      const char *fmt,
43109fb06fSAlan Maguire 				      va_list args);
44109fb06fSAlan Maguire 
45*a3fdf784SRichard Fitzgerald void string_stream_clear(struct string_stream *stream);
46*a3fdf784SRichard Fitzgerald 
47109fb06fSAlan Maguire char *string_stream_get_string(struct string_stream *stream);
48109fb06fSAlan Maguire 
49109fb06fSAlan Maguire int string_stream_append(struct string_stream *stream,
50109fb06fSAlan Maguire 			 struct string_stream *other);
51109fb06fSAlan Maguire 
52109fb06fSAlan Maguire bool string_stream_is_empty(struct string_stream *stream);
53109fb06fSAlan Maguire 
5478b1c658SDavid Gow void string_stream_destroy(struct string_stream *stream);
55109fb06fSAlan Maguire 
string_stream_set_append_newlines(struct string_stream * stream,bool append_newlines)56a5abe7b2SRichard Fitzgerald static inline void string_stream_set_append_newlines(struct string_stream *stream,
57a5abe7b2SRichard Fitzgerald 						     bool append_newlines)
58a5abe7b2SRichard Fitzgerald {
59a5abe7b2SRichard Fitzgerald 	stream->append_newlines = append_newlines;
60a5abe7b2SRichard Fitzgerald }
61a5abe7b2SRichard Fitzgerald 
62109fb06fSAlan Maguire #endif /* _KUNIT_STRING_STREAM_H */
63