Boot Linux faster!

Check our new training course

Boot Linux faster!

Check our new training course
and Creative Commons CC-BY-SA
lecture and lab materials

Bootlin logo

Elixir Cross Referencer

/*
 * Copyright (c) 2018 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#ifndef SHELL_HISTORY_H__
#define SHELL_HISTORY_H__

#include <zephyr.h>
#include <misc/util.h>
#include <misc/dlist.h>
#include <stdbool.h>

#ifdef __cplusplus
extern "C" {
#endif


struct shell_history {
	struct k_mem_slab *mem_slab;
	sys_dlist_t list;
	sys_dnode_t *current;
};

struct shell_history_item {
	sys_dnode_t dnode;
	u16_t len;
	char data[];
};

#if CONFIG_SHELL_HISTORY
#define SHELL_HISTORY_DEFINE(_name, block_size, block_count)	\
								\
	K_MEM_SLAB_DEFINE(_name##_history_memslab,		\
		 ROUND_UP(block_size + sizeof(struct shell_history_item), \
			  sizeof(void *)), block_count, 4);		\
	static struct shell_history _name##_history = {		\
		.mem_slab = &_name##_history_memslab		\
	}
#define SHELL_HISTORY_PTR(_name) (&_name##_history)
#else /* CONFIG_SHELL_HISTORY */
#define SHELL_HISTORY_DEFINE(_name, block_size, block_count) /*empty*/
#define SHELL_HISTORY_PTR(_name) NULL
#endif


void shell_history_init(struct shell_history *history);

void shell_history_purge(struct shell_history *history);

void shell_history_mode_exit(struct shell_history *history);

/* returns true if remains in history mode.*/
bool shell_history_get(struct shell_history *history, bool up,
		       u8_t *dst, u16_t *len);

void shell_history_put(struct shell_history *history, u8_t *line, size_t len);

static inline bool shell_history_active(struct shell_history *history)
{
	return (history->current) ? true : false;
}

#ifdef __cplusplus
}
#endif

#endif /* SHELL_HISTORY_H__ */