1  // SPDX-License-Identifier: GPL-2.0
2  #include <stdio.h>
3  #include <stdlib.h>
4  #include <string.h>
5  
6  #include "helpline.h"
7  #include "ui.h"
8  
9  char ui_helpline__current[512];
10  
nop_helpline__pop(void)11  static void nop_helpline__pop(void)
12  {
13  }
14  
nop_helpline__push(const char * msg __maybe_unused)15  static void nop_helpline__push(const char *msg __maybe_unused)
16  {
17  }
18  
nop_helpline__show(const char * fmt __maybe_unused,va_list ap __maybe_unused)19  static int nop_helpline__show(const char *fmt __maybe_unused,
20  			       va_list ap __maybe_unused)
21  {
22  	return 0;
23  }
24  
25  static struct ui_helpline default_helpline_fns = {
26  	.pop	= nop_helpline__pop,
27  	.push	= nop_helpline__push,
28  	.show	= nop_helpline__show,
29  };
30  
31  struct ui_helpline *helpline_fns = &default_helpline_fns;
32  
ui_helpline__pop(void)33  void ui_helpline__pop(void)
34  {
35  	helpline_fns->pop();
36  }
37  
ui_helpline__push(const char * msg)38  void ui_helpline__push(const char *msg)
39  {
40  	helpline_fns->push(msg);
41  }
42  
ui_helpline__vpush(const char * fmt,va_list ap)43  void ui_helpline__vpush(const char *fmt, va_list ap)
44  {
45  	char *s;
46  
47  	if (vasprintf(&s, fmt, ap) < 0)
48  		vfprintf(stderr, fmt, ap);
49  	else {
50  		ui_helpline__push(s);
51  		free(s);
52  	}
53  }
54  
ui_helpline__fpush(const char * fmt,...)55  void ui_helpline__fpush(const char *fmt, ...)
56  {
57  	va_list ap;
58  
59  	va_start(ap, fmt);
60  	ui_helpline__vpush(fmt, ap);
61  	va_end(ap);
62  }
63  
ui_helpline__puts(const char * msg)64  void ui_helpline__puts(const char *msg)
65  {
66  	ui_helpline__pop();
67  	ui_helpline__push(msg);
68  }
69  
ui_helpline__vshow(const char * fmt,va_list ap)70  int ui_helpline__vshow(const char *fmt, va_list ap)
71  {
72  	return helpline_fns->show(fmt, ap);
73  }
74  
ui_helpline__printf(const char * fmt,...)75  void ui_helpline__printf(const char *fmt, ...)
76  {
77  	va_list ap;
78  
79  	ui_helpline__pop();
80  	va_start(ap, fmt);
81  	ui_helpline__vpush(fmt, ap);
82  	va_end(ap);
83  }
84