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