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 11 static void nop_helpline__pop(void) 12 { 13 } 14 15 static void nop_helpline__push(const char *msg __maybe_unused) 16 { 17 } 18 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 33 void ui_helpline__pop(void) 34 { 35 helpline_fns->pop(); 36 } 37 38 void ui_helpline__push(const char *msg) 39 { 40 helpline_fns->push(msg); 41 } 42 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 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 64 void ui_helpline__puts(const char *msg) 65 { 66 ui_helpline__pop(); 67 ui_helpline__push(msg); 68 } 69 70 int ui_helpline__vshow(const char *fmt, va_list ap) 71 { 72 return helpline_fns->show(fmt, ap); 73 } 74 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