162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci#include <stdio.h> 362306a36Sopenharmony_ci#include <stdlib.h> 462306a36Sopenharmony_ci#include <string.h> 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#include "helpline.h" 762306a36Sopenharmony_ci#include "ui.h" 862306a36Sopenharmony_ci 962306a36Sopenharmony_cichar ui_helpline__current[512]; 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_cistatic void nop_helpline__pop(void) 1262306a36Sopenharmony_ci{ 1362306a36Sopenharmony_ci} 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_cistatic void nop_helpline__push(const char *msg __maybe_unused) 1662306a36Sopenharmony_ci{ 1762306a36Sopenharmony_ci} 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_cistatic int nop_helpline__show(const char *fmt __maybe_unused, 2062306a36Sopenharmony_ci va_list ap __maybe_unused) 2162306a36Sopenharmony_ci{ 2262306a36Sopenharmony_ci return 0; 2362306a36Sopenharmony_ci} 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_cistatic struct ui_helpline default_helpline_fns = { 2662306a36Sopenharmony_ci .pop = nop_helpline__pop, 2762306a36Sopenharmony_ci .push = nop_helpline__push, 2862306a36Sopenharmony_ci .show = nop_helpline__show, 2962306a36Sopenharmony_ci}; 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_cistruct ui_helpline *helpline_fns = &default_helpline_fns; 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_civoid ui_helpline__pop(void) 3462306a36Sopenharmony_ci{ 3562306a36Sopenharmony_ci helpline_fns->pop(); 3662306a36Sopenharmony_ci} 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_civoid ui_helpline__push(const char *msg) 3962306a36Sopenharmony_ci{ 4062306a36Sopenharmony_ci helpline_fns->push(msg); 4162306a36Sopenharmony_ci} 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_civoid ui_helpline__vpush(const char *fmt, va_list ap) 4462306a36Sopenharmony_ci{ 4562306a36Sopenharmony_ci char *s; 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci if (vasprintf(&s, fmt, ap) < 0) 4862306a36Sopenharmony_ci vfprintf(stderr, fmt, ap); 4962306a36Sopenharmony_ci else { 5062306a36Sopenharmony_ci ui_helpline__push(s); 5162306a36Sopenharmony_ci free(s); 5262306a36Sopenharmony_ci } 5362306a36Sopenharmony_ci} 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_civoid ui_helpline__fpush(const char *fmt, ...) 5662306a36Sopenharmony_ci{ 5762306a36Sopenharmony_ci va_list ap; 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci va_start(ap, fmt); 6062306a36Sopenharmony_ci ui_helpline__vpush(fmt, ap); 6162306a36Sopenharmony_ci va_end(ap); 6262306a36Sopenharmony_ci} 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_civoid ui_helpline__puts(const char *msg) 6562306a36Sopenharmony_ci{ 6662306a36Sopenharmony_ci ui_helpline__pop(); 6762306a36Sopenharmony_ci ui_helpline__push(msg); 6862306a36Sopenharmony_ci} 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ciint ui_helpline__vshow(const char *fmt, va_list ap) 7162306a36Sopenharmony_ci{ 7262306a36Sopenharmony_ci return helpline_fns->show(fmt, ap); 7362306a36Sopenharmony_ci} 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_civoid ui_helpline__printf(const char *fmt, ...) 7662306a36Sopenharmony_ci{ 7762306a36Sopenharmony_ci va_list ap; 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci ui_helpline__pop(); 8062306a36Sopenharmony_ci va_start(ap, fmt); 8162306a36Sopenharmony_ci ui_helpline__vpush(fmt, ap); 8262306a36Sopenharmony_ci va_end(ap); 8362306a36Sopenharmony_ci} 84