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