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