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